シェルとは

しぇる

利用者が入力したコマンドを読み取って解釈し、プログラムを起動したり結果を表示したりするプログラム。Linuxでは bash や zsh がよく使われる。ワイルドカードの展開、変数、リダイレクトやパイプ、ジョブの操作などの機能をもち、コマンドを並べたファイル(シェルスクリプト)を実行して作業を自動化することもできる。OSの中心部分であるカーネルを包む「殻」として利用者との間に立つことから、この名前で呼ばれる。

「シェル」は、2分野の10問の練習問題に出てきます(Linuxとコマンドラインの基礎, リンカ・ローダと実行形式など)。

この用語の分野: Linuxとコマンドラインの基礎

コマンドが実行されるまで

シェルは入力された1行を読み、変数の展開、ワイルドカードの展開(グロブ)、引用符の処理を行ってから、コマンド名と引数に分けます。コマンド名にスラッシュがなければ、組み込みコマンドか、環境変数 PATH のディレクトリを順に探して見つかった実行ファイルを起動します。リダイレクトやパイプの指定に従って、標準入力・標準出力・標準エラー出力の行き先をつなぎ替えるのもシェルの仕事です。

シェルスクリプト

コマンドを並べたファイルの1行目に #!/bin/bash のようなシバンを書き、実行の権限を付けると、プログラムと同じように実行できます。引数は $1、$2、引数の数は $#、直前のコマンドの終了ステータスは $? で参照し、if や for、while で条件分岐や繰り返しを書けます。シミュレーションの一括実行やログの集計など、決まった手順の自動化によく使われます。

いろいろなシェル

Linuxで広く使われる bash のほか、対話的な機能が豊富な zsh や fish、軽くて起動の速い dash などがあります。POSIX という規格で定められた sh の文法だけで書いたスクリプトは、多くのシェルで動きます。EDAツールの環境設定のスクリプトには、csh 系(csh・tcsh)の文法で書かれたものも今なお見られ、source で読み込む設定ファイルはシェルの種類に合わせる必要があります。

シェルの練習問題に挑戦

touch は新しいファイルを 666 から、mkdir は新しいディレクトリを 777 から、umask のビットを取り除いた権限で作る。umask が 027 のシェルで新しいファイルと新しいディレクトリを作ったときの、それぞれの権限の組み合わせとして、正しいものはどれか。

  1. Aファイル 637、ディレクトリ 750
  2. Bファイル 640、ディレクトリ 750
  3. Cファイル 750、ディレクトリ 750
答えと解説を見る

正解:B. ファイル 640、ディレクトリ 750

umask は、新しく作るファイルやディレクトリから「取り除く」権限のビットを表します。027 はグループから書き込み(2)を、その他から読み取り・書き込み・実行(7)を取り除くので、ファイルは 666 から rw-r-----(640)、ディレクトリは 777 から rwxr-x---(750)になります。これは8進数の引き算ではなく、ビットごとに取り除く計算です(666 AND NOT 027)。よく使われる umask 022 では、同じ計算でファイルが 644、ディレクトリが 755 になります。

よくある質問

シェルとターミナル(端末)は何が違いますか?

ターミナル(端末エミュレータ)は、文字を表示し、キーボードの入力を受け取る窓の役目をするプログラムです。シェルはその中で動き、受け取った文字列をコマンドとして解釈して実行します。同じターミナルの中で、bash から zsh に切り替えて使うこともできます。

「source ファイル名」と「./ファイル名」で実行するのは何が違いますか?

./ファイル名 で実行すると、新しいシェルのプロセスがスクリプトを実行するので、その中で変えた変数やカレントディレクトリは、終わると元のシェルには残りません。source(または .)は、今のシェルの中でファイルの内容を実行するので、環境変数の設定などがそのまま残ります。ツールの環境を整える設定ファイルを source で読み込むのはこのためです。

解説の中の「シェル」

「シェル」が出てくる問題(10問)

  1. touch は新しいファイルを 666 から、mkdir は新しいディレクトリを 777 から、umask のビットを取り除いた権限で作る。umask が 027 のシェルで新しいファイルと新しいディレクトリを作ったときの、それぞれの権限の組み合わせとして、正しいものはどれか。
  2. 上の2行をシェルで実行したとき、表示される文字として、正しいものはどれか。
  3. C言語のmain関数が「return 3;」で終わったとき、その値3は一般にどうなるか。
  4. ホームディレクトリで「ls」を実行すると notes.txt だけが表示され、「ls -a」を実行すると「.」「..」「.bashrc」「notes.txt」が表示された。この結果の説明として、正しいものはどれか。
  5. あるディレクトリに a1.txt、a2.txt、a10.txt、b1.txt、c1.txt、a1.csv の6つのファイルがある。このディレクトリで「ls [ab]?.txt」を実行したときに表示されるファイルの数として、正しいものはどれか。
  6. GNU の find で「find /data -name "*.log" -mtime +7 -size +100M」を実行したときに見つかるファイルの説明として、正しいものはどれか。
  7. SSH で接続したサーバで、時間のかかる処理を「./run.sh &」で起動してから接続を切ったところ、処理も止まってしまった。接続を切った後も処理を続けさせる起動のしかたとして、最も適切なものはどれか。
  8. 上のコマンドを順に実行したときの、2つの echo の出力として、正しいものはどれか。
  9. カレントディレクトリにある実行の権限が付いたスクリプト run.sh を、「run.sh」と入力して実行しようとすると「command not found」になり、「./run.sh」と入力すると実行できた。理由として、正しいものはどれか。
  10. 上のコマンドを順に実行したときの、2つの bash -c の出力の組み合わせとして、正しいものはどれか。

Linuxとコマンドラインの基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

変数 環境変数 戻り値 パーミッション SSH 入出力のリダイレクト 引数 inode Git grep

用語集の一覧へ