1. 概要

このチュートリアルでは、 sh とBashの違い、およびそれらが提供する機能について説明します。 最後に、使用するシェルについて説明します。

2. シェルとは何ですか?

シェルは、コマンドを受け取り、解釈し、オペレーティングシステムに渡して処理するコンピュータプログラムです。 つまり、は、ユーザーとオペレーティングシステムの間のインターフェイスであり、ユーザーはこれを介してコンピューターと対話できます。 シェルと対話するには、 gnome-terminal konsole st。などのターミナルエミュレーターが必要です。

ほとんどのLinuxベースのオペレーティングシステムには、少なくとも1つのシェルプログラムが付属しています。 シェルプログラムはおそらくDash Bash 、またはその両方になります。

2.1. 現在のシェル

grepを使用して/etc / passwd ファイルを読み取るだけで、現在使用しているシェルを確認できます。

$ grep $USER /etc/passwd
hey:x:1000:998::/home/hey:/bin/bash
  • grep コマンドは、パターンとファイルの読み取りを想定しています
  • $ USER 環境変数は、現在ログインしているユーザーに展開されます
  • / etc /passwdファイルにはユーザーアカウント情報が保存されます

コマンドを発行すると、使用中のデフォルトのシェルがbashであることがわかります。 したがって、ターミナルエミュレータを使用する場合、コマンドはbashによって解釈されます。

2.2. インストールされたシェル

/ etc / shell ファイルを読み取ることにより、現在マシンにインストールされているすべてのシェルを一覧表示できます。

$ cat /etc/shells
# Pathnames of valid login shells.
# See shells(5) for details.

/bin/sh
/bin/bash
/bin/dash

マシンに3つのシェルがインストールされていることがわかります。 技術的には、2つのシェルがあり、その理由は次のセクションで説明します。

3. sh

sh、はBourne Shellとも呼ばれ、POSIX標準で定義されているUNIXライクなシステム用のコマンドプログラミング言語です。 sh は、キーボードまたは一般にスクリプトファイルと呼ばれるファイルのいずれかから入力を受け取ることができます。 ほとんどのLinuxシステムでは、元の Bourne Shell dash kshなどのプログラムによって実装されます。

3.1. POSIXシステム上のsh

POSIXは、ベンダーがオペレーティングシステムと互換性を持たせるためにIEEEによって定義された標準のファミリです。 したがって、一連のガイドラインに従うことで、複数のオペレーティングシステム用のクロスプラットフォームソフトウェアを開発するのに役立ちます。 shはこれらの規格に準拠しています。

ほとんどのLinuxシステムでは、shはBourneShellの実際の実装へのシンボリックリンクです。 次のコマンドで確認できます。

$ file -h /bin/sh
/bin/sh: symbolic link to dash

ご覧のとおり、 / bin / sh は、Debianベースのディストリビューションで使用されるPOSIX準拠のシェルである dash、にシンボリックにリンクされています。 シェルスクリプトでは、最初の行として#!/ bin / sh を配置できます。これは、dashによって実行されます。

#!/bin/sh

echo Hello, World!

スクリプトは、#! / bin / sh行が指すもの(この場合は dash )によって実行されます。 そのため、私たちのスクリプトはPOSIX標準に準拠しているため、他のPOSIX準拠のオペレーティングシステムに移植できます。

3.2. 一般的な落とし穴

ほとんどのシェルスクリプトの最初の行には#!/ bin / sh がありますが、 / bin /shはBourne準拠のシェルへのシンボリックリンクではない可能性があることに注意してください。 スクリプト作成者は、 / bin /sh/bin /bashまたは/bin /dashを指していると想定することがあります。

そのため、スクリプトを記述して実行する前に、 / bin /shのタイプを確認することをお勧めします。

4. バッシュ

sh と同様に、Bash(Bourne Again Shell)はコマンド言語プロセッサーおよびシェルです。 これは、ほとんどのLinuxディストリビューションのデフォルトのログインシェルです。 Bashはshのスーパーセットです。つまり、Bashはshの機能をサポートし、その上にさらに多くの拡張機能を提供します。 ただし、ほとんどのコマンドはshと同様に機能します。

Bashのリリース以来、これはLinuxオペレーティングシステムの事実上のシェルでした。

4.1. POSIX準拠のシェルとしてのBash

長い間、 / bin /sh/bin / bashにリンクされていました。時間が経つにつれて、 bash はより多くの機能と拡張機能を開発し、その一部はPOSIX標準に準拠していませんでした。 その結果、ほとんどのLinuxディストリビューションではオプションではなくなり、他のPOSIX準拠のシェルがそれに取って代わりました。

それでも、POSIX準拠モードでBashを使用できます。これは、 bashコマンドを使用して–posixフラグで呼び出すことができます。

$ bash --posix

または、BashスクリプトをPOSIX標準に準拠させることもできます。

#!/bin/bash

set -o posix

echo Hello, World

set コマンドは、スクリプト内のオプションを有効にします。この場合、スクリプトはPOSIXモードで実行されます。 したがって、スクリプトはFreeBSDやUNIXライクなシステムなどの他のオペレーティングシステムに移植可能になります。

4.2. 特徴

Bashは、現代のプログラミング言語によく似た多くの柔軟性と構文を提供します。 Bashで導入された注目すべき機能のいくつかは次のとおりです。

  • コマンドライン補完を使用すると、コマンドを使用してコマンドをすばやく補完できます。
  • コマンド履歴を使用して、以前に実行されたコマンドをすばやく検索できます。 矢印キーまたは
  • 外部プログラムを使用せずに算術評価
  • 文字列インデックスを使用して配列を作成できる連想配列
  • コマンドライン編集用のキーボードショートカット
  • カスタマイズ可能性により、Bashが提供するデフォルトのプレゼンテーションを変更できます

4.3. Bashスクリプトを書く

Bashは、ファイルからコマンドを読み取ることもできます。 最初の行として#!/ bin / bash Shebangを指定し、その後にスクリプトを指定します。

#!/bin/bash

# Finds out whether a number is even or odd

read -p "Enter a number: " number

if [ `expr $number % 2` -eq 0 ]; then
    echo "${number} is even"
else
    echo "${number} is odd"
fi

スクリプトファイルを保存して実行可能にします。

$ chmod +x is_even.sh
$ ./is_even
Enter a number: 13
13 is odd

このスクリプトはほとんどのLinuxディストリビューションで実行されますが、 FreeBSDで同じスクリプトを実行すると、問題が発生する可能性があります。

5. どちらを使用しますか?

どちらのシェルも便利で、さまざまな状況で活用できます。 たとえば、スクリプトに複数のシステム間で互換性を持たせたい場合は、shを使用できます。 一方、Bashは流動的な構文とより魅力的な機能を提供するため、Bashを選択する可能性があります。

それでも、移植性と互換性に関心がある場合は、Bashを使用して純粋なPOSIXモードで実行できます。 それとは別に、 sh スクリプトを作成すると、Bashは sh と下位互換性があるため、変更せずにBashで実行される可能性が高くなります。

6. 結論

この記事では、シェルプログラムの概要と、システムに現在インストールされているシェルを見つける方法について説明しました。 次に、Bashと sh の機能と、POSIXとのコンフォメーションの違いについて説明しました。