Sh と Bash の違い
このチュートリアルでは、シェルとは何か、現在使用されているシェルを知っていること、使用可能なすべてのシェルのリストを確認すること、および sh
と bash
の違いについて説明します。
シェルとは何ですか
シェルは、コマンドを受け取るコンピュータプログラムです。また、コマンドを解釈し、処理のためにオペレーティングシステムに渡します。これは、ユーザーとオペレーティングシステム間のインターフェイスとして機能し、ユーザーがオペレーティングシステムと対話できるようにします。
ほとんどの Linux オペレーティングシステムには、少なくとも 1つのシェルプログラムが付属しています。シェルプログラムは、Bash
、Dash
、またはその両方になります。
現在のシェルを見つける方法
Linux システムで現在使用されているシェルを知るために、ユーザーアカウント情報が格納されている/etc/passwd
ファイルを読み取ることができます。以下のコマンドを実行して、現在のシェルを確認しましょう。
grep
コマンドは、指定されたファイル内の文字列を検索するために使用されます。以下のコマンドは、/etc
にある passwd
ファイルでユーザーfumba
を検索します。grep
コマンドが一致するものを見つけると、結果を含む行を出力します。
$ grep fumba /etc/passwd
W は、以下の出力から、ユーザーfumba
のデフォルトのシェルが bash であることがわかります。
fumba:x:1000:1000:,,,:/home/fumba:/bin/bash
利用可能なシェルを見つける方法
Linux システムで使用可能なすべてのシェルは、/etc/shells
ファイルにリストされています。以下の cat
コマンドを使用して、/etc/shells
ファイルの内容を表示します。
cat /etc/shells
以下の出力は、システムで使用可能なすべてのシェルのリストを示しています。
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen
sh
コマンドとその使用
sh
は Bourne シェルのコマンド名です。これは、Unix ライクなオペレーティングシステム用の標準のコマンド言語インタプリタです。コマンドライン文字列、標準入力、または指定されたファイルからコマンドを実行します。sh
は POSIX 標準に準拠しています。
Portable Operating System Interface(POSIX)は、オペレーティングシステム間の互換性を維持するために IEEE ComputerSociety によって指定された標準のファミリです。これらの標準は、標準に準拠した後、複数のオペレーティングシステム用のクロスプラットフォームソフトウェアの開発に役立ちます。
ほとんどのシステムには/bin/sh
ファイルがありますが、これはシンボリックリンクであり、sh
を呼び出しません。Ubuntu では、/bin/sh
は Dash
シェルへのシンボリックリンクです。以下のコマンドを実行して確認できます。
$ file -h /bin/sh
以下の出力は、/bin/sh
が dash
へのシンボリックリンクであることを示しています。
/bin/sh: symbolic link to dash
スクリプトに #!/bin/sh
を追加しましょう。
#!/bin/sh
printf "sh points to dash!\n"
上記のスクリプトは、インタプリタとして/bin/sh
を指定しています。ただし、/bin/sh
は dash
を指しているため、dash
シェルはスクリプトをインタープリターとして実行します。
Bash
とその使用
Bash
は Bourne Again Shell
の略です。sh
のように、それはコマンド言語プロセッサとシェルです。ただし、bash は sh
のスーパーセットです。sh
の機能をサポートし、より多くの拡張機能と機能を提供します。Bash
は、Linux オペレーティングシステムのデフォルトのシェルです。
当初、Bash
は POSIX 標準に準拠していましたが、機能や拡張機能が追加されるにつれて、POSIX 標準に準拠しなくなりました。ただし、以下に示すように、-posix
フラグを設定することにより、bash を POSIX モードで引き続き使用できます。
$ bash --posix
POSIX 標準に準拠する bash スクリプトを書いてみましょう。
#!/bin/bash
set -o posix
printf "we are using bash shell!\n"
bash
インタープリターは、最初の行 #!/bin/bash
で指定されているため、上記のスクリプトを実行します。
set
コマンドは、スクリプトのオプションを有効にします。この場合、bash シェルがスクリプトを POSIX モードで実行できるようにします。