6.1 コマンドラインの基本
Linux Essentials Online Text | 2021/07/21

基本的なシェル

ユーザはコマンドを用いてLinuxシステムと対話します。コマンドは文字通り「命令」のことで設定値を組み合わせて入力します。この時OSはユーザの入力操作を解釈してカーネルとの橋渡しを行い、適切な結果を返すわけですが、この一連の動作を行なってくれるプログラムが「シェル」です。

このシェルと呼ばれるプログラムが、コマンドの入力を受け付け、そのコマンドを実行し、入力したユーザに対しその結果を返す事で、私たちはLinuxの様々な機能を利用することができます。

例えば、lsコマンドを実行すると、以下のように指定したディレクトリにあるファイルが表示されるようになります。

$ ls /var
adm    crash  empty  gopher    lib    lock  mail  opt       run    tmp
cache  db     games  kerberos  local  log   nis   preserve  spool  yp

シェルは $ と表示した後にコマンドの入力を待っています。上記では、ls コマンドが入力され[Enter]キーが押されたので、ls コマンドをカーネルに渡し、処理結果である「adm crash …」を受け取り画面に出力した、という事になります。

ちなみに、この「シェル」の語源は貝殻(=Shell)で、OSの特にカーネル部分を包み込んでいる機能ということから名づけられています。私達が一般的に使用しているのはBシェル(bash)と呼ばれるシェルで、Linux の標準シェルとして採用されています。他に、Cシェル(csh)、Zシェル(zsh)、tcsh等があります。

また、シェル自体には大きく2つの機能があります。1つは前述の通りコマンド入力を受け付けること。もう1つは、シェルスクリプトの実行、つまり自動化です。シェルを使うことで本来手入力のコマンドを自動実行させることが可能です。

コマンドラインの構文

コマンドはそれぞれに書式が決まっています。書式はそのコマンドを実行するための形式を示ししており、コマンド実行に必要な要素をどのように列挙するかを示します。
大きく分けて、「実行コマンド」「オプション」「引数」の3つに別れていて、これらは、通常「半角スペース」で区切ります。システムはこのスペースの位置を見て、どこまでが一区切りかを判断します。書式を誤ると、システムがその指示を解釈できなくなり、こちらの意図したとおりに動いてくれなくなるので注意して下さい。

例外はありますが、原則、下記のような順序で記述します。

「オプション」はほとんどのコマンドに存在します。オプションをつけることで、そのコマンドの動作を変えることができます。オプションの種類や数はコマンドによって様々です。全てを覚える必要はありませんが、主要なものは覚える必要があります。
コマンドによっては多くのオプションを覚えなければならない場合がありますが、大抵の場合オプションには意味があり、多くの場合英単語の頭文字がとられていますので、それを参考に覚えると良いでしょう。また、動きが似ているコマンドは、同じようなオプションを使用するケースが多く見られるので、セットで覚えると良いでしょう。

「引数」とはパラメータのことです。コマンドによって入力されるものが異なり、ファイル名だったり、数値だったり、オン、オフのスイッチだったり、決められている単語だったり、様々なものが入ります。

コマンドには大きく分けて2種類あります。1つは情報の表示を要求するコマンド。システムに格納された情報や、処理結果の表示を求めるコマンドです。2つ目は、こちらが意図した作業を実施してもらうコマンドです。実施したい作業がある場合に使用します。この時、コマンドの実行に成功しても何も表示されません。「$」マークまたは「#」マークに戻れば正常に実行された事になります。

効率的なコマンド入力

Linuxの操作はコマンド入力によって行いますが、場合によっては同じコマンドや似たようなコマンドを何度も入力するケースがあります。短いコマンドであれば良いですが、場合によっては複数のコマンドを連結して長いコマンドを入力することもありえます。
この時、たった1箇所でも入力ミスがあれば、そのコマンドはシステムが解釈できないためエラーとなってしまい、それまでの入力したことがすべて無駄になる可能性があります。Linuxには、このような状況にならないよう、いくつかの解決策を持っています。

コマンドライン履歴

[↑]および[↓]キーでスクロールすることにより、それまでに入力したコマンドが表示されます (入力ミスも含みます)。以前に入力したコマンドをそのまま実行したい場合や、前回入力したコマンドの一部を変更して実行したい場合などに利用できます。コマンドの履歴数は通常1000行分保管されます。

コマンドライン履歴は下記のコマンドで確認できます。

$ env | grep HIST
HISTSIZE=1000
HISTCONTROL=ignoredups

「HISTSIZE」はコマンドラインの上限を示す環境変数です。結果からも、1000行の履歴が残せることがわかります。
※コマンドの説明については後述します。

コマンドライン履歴はhistoryコマンドで確認する事が可能です。

$ history
1 ls /var
2  env | grep HIST

historyを実行すると、古い順番にナンバリングされて表示されます。この時、[!]の後に番号を入力すると、入力した番号のコマンドが実行されます。例えば、上記の例だと「!1」と入力すると1行目の「ls /var」が実行されます。

$ history
1 ls /var
2  env | grep HIST
$ !1
ls /var
adm    crash  empty  gopher    lib    lock  mail  opt       run    tmp
cache  db     games  kerberos  local  log   nis   preserve  spool  yp

実は、ホームディレクトリに「.bash_history」というファイルが格納されており、実行したコマンドはこのファイルに書きこまれます。ただし、ログイン中に実行したコマンドは、ログアウトする時に「.bash_history」に書き込まれますので、次回ログイン時に確認することになります。

コマンド補完

コマンド入力の手間を省くもう1つの方法はコマンド補完という機能です。コマンド補完とは、ファイル、コマンド、またはパス名の一部を入力して[Tab]キーを押すと、ファイル名やパス名の残りの部分を表示してくれる機能です。

例えば、catコマンドを使って /var/log/dmesgというファイルにアクセスします。
まず、catコマンドの後に「/v」と入力し[Tab]キーを押してみてください。「ar/」が表示されます。

$ cat /v   ← [Tab]キーを押す
$ cat /var/   ← ここまで表示されます

これは、「/」というディレクトリの中に「v」で始まるものが「var/」しか無かったためです。
次に、「l」を入力して[Tab]キーを押してみましょう。
今度は何も表示されずエラー音が鳴ります。

$ cat /var/l   ← [Tab]キーを押す
$ cat /var/l   ← 今度は文字が表示されず、何も変わらない。

ではもう一度[Tab]キーを押してみましょう。画面に変化がない人は2回連続で[Tab]キーを押してみて下さい。
今度は「l」で始まるディレクトリが4つ表示されます。

$ cat /var/l   ← [Tab]キーを2回押す
lib/   local/ lock/  log/    ← 「l」で始まるディレクトリが表示される。

つまり、[Tab]キーが効かなかったのではなく、「l」で始まるものが複数あったために補完できなかったということです。このように候補が複数存在する場合は、エラー音が鳴った後にもう一度[Tab]キーを押すことで、その後に続くファイルやパスの候補一覧が表示されます。

ちなみに今回のケースでは「/var/lo」まで指定しても「local」「lock」「log」が候補として残ってしまうため、補完できません。ここは「log/」まで入力し、最後に「d」を入力して[Tab]キーを押します。

$ cat /var/log/d   ← [Tab]キーを押す
$ cat /var/log/dmesg   ← 「mesg」が補完される。

いかがでしょうか。コマンド補完機能はコマンド・ファイル・ディレクトリ全てを保管します。これらの2つの機能を有効活用することで、コマンド入力を早く正確に行う事が可能になります。

大文字と小文字

Windows及びmacOSは、基本的にファイルやディレクトリに使用される名前の大文字、小文字を区別していません(例外はありますが、旧システムとの互換性のため区別しないように設定してあることが多い)が、Linuxでは大文字、小文字を区別します。

厳密に言うと、大文字、小文字を区別するか否かは、ファイルシステムに依存します。Linuxの場合は独自に採用されたファイルシステムを使用している場合があり、全てにおいて区別するとは言えませんが、一般に使用されるファイルシステム(ext2/ext3/ext4、XFS、JFS、UFS、ZFS、Btrfs等)であれば区別されます。

簡単なグロビング(globbing)

Linuxシステムを使用する中で、特定のファイルやディレクトリを探したり、単一の操作で複数のファイルやディレクトリを指定しなければならないケースが出てきます。個人のホームディレクトリであればファイルやディレクトリの数が少なく、簡単な作業ですが、これがOS全体を対象とする場合は、非常に困難な作業になります。

この様な場合は、ワイルドカードを利用して解決します。これは「グロビング (globbing)」とも呼ばれており (当初、/etc/glob という名前のプログラムとして実装されたため)、ワイルドカード・パターンを使って複数のファイルを指定することができます。
グロビングには、「?」、「*」または「[」のいずれかを使用します。マッチングは以下のように行われます。

<よく使うグロビング>

記号説明
?
(クエスチョン)
任意の 1 文字と一致します。
*
(アスタリスク)
空の文字列を含め、任意の文字列と一致します。
[]
(角括弧、大括弧)
[]で囲んだ文字、いずれかに一致します。 [-(ハイフン)]を用いて[a-z]、[A-Z]もしくは[0-9]のようにアルファベットや数字で範囲を示し、範囲内文字と一致します。

複数コマンドの実行制御

通常、コマンドの実行は1コマンド1ラインです。そのため、2つのコマンドを実行するとなると、1コマンドづつ実行するため、2行にわたることになりますが、特殊な記号を用いることで、2つの処理を1ラインで実行することができます。

記号名説明
① ; ②コマンド①を実行後(成否は問わず)にコマンド②を実行する。
① && ②コマンド①が成功したら、コマンド②を実行する。
① || ②コマンド①が失敗したら、コマンド②を実行する。
PAGE TOP