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 モードで実行できるようにします。
