shとbashの場合に異なる出力が得られるのはなぜですか?


8

次の簡単なスクリプトがあります。

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {1..99..2}
do
        echo $i
done

私が実行した場合の出力sh file.sh

Bash version ...
{1..99..2}

私が実行した場合の出力bash file.sh

Bash version 4.2.25(1)-release...
1
3
5
.
.
.
99

2つのクエリがあります。

  1. 私はシェルを指定shabang行を記述した場合、それは私が使用しているかどうかはbashで実行するべきではありませんsh file.shbash file.sh

  2. それ$BASH_VERSIONはshによって認識されないことを理解していますが、forループの問題は何ですか?なぜ数字が印刷されないのですか?

回答:


16

sh、Bourneシェルは古いです。その動作はPOSIX標準で指定されています。新しい動作が必要な場合bashは、Bourne Againシェルを使用します。これにより、常に新しい機能が追加されます。多くのシステムでshは、だけでbashbashその名前で実行すると互換モードがオンになります。Ubuntuでは、shis dashはDebian Almquistシェルです。

ブレースの拡張は比較的新しい機能であり、以前のバスでは利用できません。それは確かに中にあるべきではありませんsh

シバン行は、スクリプトを実行可能ファイルとして呼び出す場合にのみ尊重されます。

./myscript.sh

スクリプトに任意のシバンを与えても、次のコマンドを実行することでPythonで開いたままにすることができます。

python myscript.sh

UnixとLinuxに関する次の優れた質問をご覧ください。


5

SHはバカです。何もできません。

最も基本的なコマンドのみを認識します。それ以外には何もしません。

{1..99}を数値として理解できません。それを文字列として理解します。

SH / Dashは開発されていません。これは、DIREの状況(対話モード)での緊急プロンプトを意味します。それ以外の場合は、スクリプトにとって非常に便利です。)

Bashは、SHで可能なすべてのことができるほか、最新のカスタマイズ機能と強力な機能を備えているため、推奨されます。

#1への回答として、#!は、プログラムが直接呼び出された場合にのみ解析されます。(のように./program.sh


6
これは、DIRE状況の緊急プロンプトになることを目的としています。dashsh、Ubuntuで提供されているように、主に「DIRE状況の緊急プロンプトになること」ではなく、システムを高速に実行および開始できるようにするためのものではありません。。このように、dashモダンなOSでの使用に適しているが、何それは非常に適していますのためには、ロープロファイル、スクリプト用の高速シェルとしてある-大きな、複雑な、近代的なOSの起動中、特に、最小限で、システムのスクリプトを実行していますパフォーマンスのオーバーヘッド。
Eliah Kagan 2014

@EliahKagan SHは本当にひどく間違っているときにのみ使用します。
Kaz Wolfe

1
shUbuntuの起動時に、かなり頻繁に、特に集中的に使用します。これは主に、自動化されたスクリプトの使用にとって重要であり、Ubuntuでは非常に重要な使用例です。(シンボリックリンクを削除する/bin/shと、実際には「SHがありません」と表示され、状況はひどく悪くなります
。Ubuntu

@EliahKaganいつ最後にSHを優先端末として使用しましたか?スクリプトで使用していることはわかっていますが、実際にインタラクティブモードで使用するのはいつですか。
Kaz Wolfe

2
昨日、コマンドの移植性を確認しました。しかし、ダッシュのインタラクティブな使用はまれであるというあなたの主張は有効です。(とにかく、私のインタラクティブな使用のコンテキストは依然としてスクリプト指向でした。)....しかし、「使用」は「インタラクティブな使用」を意味するものではなく、さらに重要なことに、この質問のユースケースはインタラクティブではありません。
Eliah Kagan 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.