2.1 レッスン 1
Certificate: |
Linux Essentials |
---|---|
Version: |
1.6 |
Topic: |
2 Linuxでのやりかたを見つける |
Objective: |
2.1 コマンドラインの基本 |
Lesson: |
1 of 2 |
はじめに
最近の Linux ディストリビューションには様々なグラフィカルユーザインタフェースがありますが、管理者はコマンドラインや シェル(shell)と呼ばれるものを操作できる必要があります。シェルは、オペレーティングシステムとユーザの間で、テキストベースのやりとりを行うプログラムです。通常はテキストモードのプログラムで、ユーザからの入力を読み取って、それをシステムへのコマンドとして解釈します。
Linux にはいくつかの異なるシェルがあり、ほんの一部を紹介します。
-
Bash(Bourne-again shell/バッシュ)
-
Cシェル(csh ないし tcsh、csh改良版)
-
ksh(Korn shell/コーンシェル)
-
zsh(ズィーシェル)
Linuxで最も一般的なのはBashです。このレッスンの例や演習では、これを使っています。
対話型シェルを使用する場合、いわゆるプロンプトに対して、ユーザがコマンドを入力します。Linuxディストリビューションごとにデフォルトのプロンプトは少し異なりますが、概ね以下のような構造になっています。
ユーザー名@ホスト名 作業ディレクトリ 種別
Ubuntu や Debian GNU/Linux では、一般ユーザーは次のようになります:
carol@mycomputer:~$
スーパーユーザー(root)のプロンプトは次のようになります:
root@mycomputer:~#
CentOS や Red Hat Linux では、一般ユーザーは次のようになります:
[dave@mycomputer ~]$
そして、スーパーユーザーでは次のようになります:
[root@mycomputer ~]#
それぞれの構成要素を説明しましょう:
ユーザー名
-
シェルを実行しているユーザーの名前(ログイン名)です。
ホスト名
-
シェルを実行しているホストの名前です。
hostname
というコマンドがあり、システムのホスト名を表示や設定できます。 作業ディレクトリ
-
シェルが「居る」ディレクトリです。文字
~
は、シェルがユーザーのホームディレクトリに居ることを意味しています。 種別
-
文字
$
は、一般ユーザーがシェルを実行していることを示します。文字
#
は、スーパーユーザー(root
)がシェルを実行していることを示します。
以下の例では特別な権限は必要ないので、特権のないプロンプトを使用します。簡潔にプロンプトとして $
のみを使用します。
コマンドラインの構造
ほとんどのコマンドは、次のような基本的な構造のコマンドラインを使います。
コマンド [オプション/パラメータ...] [引数...]
次のコマンドを例にとりあげます:
$ ls -l /home
それぞれの構成要素の目的を説明しましょう:
- コマンド
-
ユーザーが実行しようとするプログラムです 〜 上記の例では
ls
です。 - オプション/パラメータ
-
コマンドの振る舞いを変更するための “スイッチ” です。 上記の例では
-l
です。オプションには、短い表記方法と、長い表記方法があります。例えば、-l
は--format=long
と同じです。短い表記方法では、複数のオプションを1つにまとめることができ、複数の文字を続けて指定できます。例えば、以下に示すコマンドは、すべて同じ働きをします。
$ ls -al $ ls -a -l $ ls --all --format=long
- 引数
-
ファイル名やパスなど、プログラムが必要とするデータです。上記の例では、
/home
です。
構成要素の内、必ず必要なのは「コマンド」だけです。他の構成要素はプログラムによって異なり、無い場合もありますし、特定のオプションやパラメータ、あるいは引数を必要とするものもあります。
Note
|
ほとんどのコマンドは |
コマンド種別
シェルには2種類のコマンドがあります:
- 内蔵(組み込み)コマンド
-
シェル自体に組み込まれているコマンドで、30前後あります。シェルの内部で処理が行なわれます(例:
cd
、set
、export
)。 - 外部コマンド
-
それぞれのファイルに格納されているコマンドです。通常は、バイナリプログラムやスクリプトです。シェルに組み込まれていないコマンドを実行するときに、シェルは
PATH
変数を使って、コマンドと同じ名前の実行可能ファイルを探します。ディストリビューションのパッケージマネージャでインストールされたプログラムだけではなく、ユーザは独自の外部コマンドを作成することもできます。
type
コマンドは、コマンドの種別を表示します。
$ type echo echo is a shell builtin $ type man man is /usr/bin/man
クオーティング(Quoting)
Linuxユーザは、様々な方法でファイルや変数を作成したり操作できる必要があります。短いファイル名や1ワードを扱う場合には簡単ですが、例えばスペースや特殊文字、変数などが含まれている場合には複雑になります。シェルにはクォート(quote/引用)と呼ばれる機能があり、このようなデータを様々な種類のクォート(" ", ' ') を使ってカプセル化します。Bash では、3種類のクオート(引用符)があります。
-
ダブルクオート
-
シングルクオート
-
エスケープ文字
たとえば、次のコマンドは、クオーティングにより動作が異なっています:
$ TWOWORDS="two words" $ touch $TWOWORDS $ ls -l -rw-r--r-- 1 carol carol 0 Mar 10 14:56 two -rw-r--r-- 1 carol carol 0 Mar 10 14:56 words $ touch "$TWOWORDS" $ ls -l -rw-r--r-- 1 carol carol 0 Mar 10 14:56 two -rw-r--r-- 1 carol carol 0 Mar 10 14:58 'two words' -rw-r--r-- 1 carol carol 0 Mar 10 14:56 words $ touch '$TWOWORDS' $ ls -l -rw-r--r-- 1 carol carol 0 Mar 10 15:00 '$TWOWORDS' -rw-r--r-- 1 carol carol 0 Mar 10 14:56 two -rw-r--r-- 1 carol carol 0 Mar 10 14:58 'two words' -rw-r--r-- 1 carol carol 0 Mar 10 14:56 words
Note
|
|
ダブルクオート
ダブルクオート(二重引用符)は、挟まれているテキスト("...")を、通常の文字として解釈するようにシェルに指示します。$
(ドル記号)、\
(バックスラッシュ)、および `
(バッククォート)を除いて、すべての特殊文字は意味を失います。つまり、変数、コマンド置換、および算術式を使用できます。(訳注: 日本語環境では、バッククオート \
が円マーク ¥
で表示されます。使用しているキーボードやフォント、OSの言語設定によって異なります)。
例えば、変数 $USER
は、ダブルクオートの影響を受けません:
$ echo I am $USER I am tom $ echo "I am $USER" I am tom
一方、空白文字は、引数の区切りとしての意味を失います:
$ touch new file $ ls -l -rw-rw-r-- 1 tom students 0 Oct 8 15:18 file -rw-rw-r-- 1 tom students 0 Oct 8 15:18 new $ touch "new file" $ ls -l -rw-rw-r-- 1 tom students 0 Oct 8 15:19 new file
最初の例では touch
コマンドは2つのファイルを別々に作成し、2番目の例ではコマンドが2つの単語をひとつの引数として解釈するため、1つのファイルのみが作成されます。ただし、ファイル名に空白文字を使用することはお勧めできません。代わりに、アンダースコア( _
)やドット( .
)を使用するとよいでしょう。
シングルクオート
シングルクオート(一重引用符)には、二重引用符のような例外はありません。それらは、すべての文字から特別な意味を取り消します。前述の最初の例を1つ取り上げましょう。
$ echo I am $USER I am tom
シングルクオートで囲むと、違う結果になります:
$ echo 'I am $USER' I am $USER
今度は、変数置換を行わずに、そのままの文字列を表示しました。
エスケープ文字
Bashでは、 エスケープ文字 を使用して、文字から特別な意味を取り除くことができます。環境変数 $USER
の例に戻りましょう。
$ echo $USER carol
デフォルトでは、変数の内容がターミナルに表示されます。ただし、ドル記号の前にバックスラッシュ( \
)を付けると、ドル記号の特別な意味が無効になります。これにより、Bashは変数の値をコマンドを実行しているユーザー名に展開せず、代わりに変数名を文字通りに解釈します。
$ echo \$USER $USER
シングルクオートを使用して、これと同様の結果を得ることができることを思い出しましょう。シングルクオートに囲まれた内容をそのまま出力するのでした。エスケープキャラクターの場合は、続く文字が持つ特別な意味を無視するようにBashに指示します。
演習
-
行の構成要素を、コマンド、オプション(パラメータ)、引数に分類しましょう:
-
例:
cat -n /etc/passwd
コマンド:
cat
オプション:
-n
引数:
/etc/passwd
-
ls -l /etc
コマンド:
オプション:
引数:
-
ls -l -a
コマンド:
オプション:
引数:
-
cd /home/user
コマンド:
オプション:
引数:
-
-
以下のコマンドの種類を答えてください:
例:
pwd
シェル内蔵
mv
外部コマンド
cd
cat
exit
-
クオートを展開して、次のコマンドの結果を考えましょう:
例:
echo "$HOME is my home directory"
echo /home/user is my home directory
touch "$USER"
touch 'touch'
発展演習
-
Bashにおいて、ブレース(
{ }
)展開(Bashのマニュアルの Brace expansion を参照のこと)を使って、プレフィックスgame
に1〜5の数値を続けた名前のファイルを、1つのコマンドだけで作成しましょう(game1
、game2
、…)。 -
特別な意味を持つ文字(Bashマニュアルの パス名の拡張(Pathname Expansion)を参照のこと)を使った1つのコマンドで、前問で作成した5つのファイルをすべて削除しましょう。
-
2つのコマンドを相互に作用させる方法はありますか? それは何ですか?
まとめ
このレッスンでは、次のことを学びました。
-
Linuxシェルの概念
-
Bashシェルとは何か
-
コマンドラインの構成
-
クオーティングの紹介
演習で使用したコマンド:
bash
-
Linuxシステムで、最もポピュラーなシェル
echo
-
ターミナルにテキストを出力する
ls
-
ディレクトリの内容を一覧表示する
type
-
指定したコマンドがどのように実行されるかを表示する
touch
-
空のファイルを作成する。もしくは、既存ファイルの更新時刻を更新する
hostname
-
システムのホスト名を表示または変更する
演習の解答
-
行の構成要素を、コマンド、オプション(パラメータ)、引数に分類しましょう:
-
ls -l /etc
コマンド:
ls
オプション:
-l
引数:
/etc
-
ls -l -a
コマンド:
ls
オプション:
-l -a
引数:
-
cd /home/user
コマンド:
cd
オプション:
引数:
/home/user
-
-
以下のコマンドの種類を答えてください:
cd
シェル内蔵
cat
外部コマンド
exit
シェル内蔵
-
クオートを展開して、次のコマンドの結果を考えましょう:
touch "$USER"
ユーザー名のファイルが作られる
touch 'touch'
touch
というファイルが作られる
発展演習の解答
-
Bashにおいて、ブレース(
{ }
)展開(Bashのマニュアルの Brace expansion を参照のこと)を使って、プレフィックスgame
に1〜5の数値を続けた名前のファイルを、1つのコマンドだけで作成しましょう(game1
、game2
、…)。1つのコマンド内で、範囲を使用して 1〜5の数字を表現することができます。
$ touch game{1..5} $ ls game1 game2 game3 game4 game5
-
特別な意味を持つ文字(Bashマニュアルの パス名の拡張(Pathname Expansion)を参照のこと)を使った1つのコマンドで、前問で作成した5つのファイルをすべて削除しましょう。
すべてのファイルは
game
から始まり、1文字(この場合は数字の1〜5)で終わります。ファイル名の最後の一文字を示すために、特別な文字?
を使用します。$ rm game?
-
2つのコマンドを相互に作用させる方法はありますか? それは何ですか?
あります。例えば、ひとつのコマンドがデータをファイルに出力し、他のコマンドで処理することができます。Linuxでは、あるコマンドの出力をまとめて、他のコマンドの入力とすることができます。これを パイプ と呼び、後のレッスンで学びます。