リソースをrpm
ファイルとして持つ巨大なプログラムをインストールしています。の線にこだわった
#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]
どうやら、sh
はRed Hat Linuxのbash
でこの構文で機能しますが、Ubuntuではunexpected operator
のエラーが発生します。
スクリプトはbash
パッケージからのものであるため、スクリプトをrpm
に変更できません。 rpm
パッケージを抽出して再パックすることはできますが、そのようなスクリプトが多数ある可能性があります。
シェルのデフォルトを変更して、#!/bin/sh
をbash
または[
演算子を処理できる他の何かとして扱う方法はありますか?
_/bin/sh
_の言語を実装する複数のプログラムがあります。 Ubuntuでは、_/bin/sh
_はダッシュであり、高速で、少量のメモリを使用するように設計されており、_/bin/sh
_で期待される最小値をはるかに超えてサポートしていません。 RHELでは、_/bin/sh
_はbashです。これは低速で、より多くのメモリを使用しますが、より多くの機能を備えています。これらの機能の1つは、_==
_条件構文の_[
_演算子です。 Dashは基本的なsh機能である_[
_をサポートしますが、bash(およびkshおよびzsh)拡張である_==
_演算子はありません。
システムをbashを使用するように切り替えることができます。 Ubuntuでは、_/bin/sh
_はdash
へのシンボリックリンクです。代わりにbash
へのシンボリックリンクにすることができます。 DebianとUbuntu(および派生物)の現在のバージョンでは、これがダッシュのインストールオプションになっています。変更するには、
_Sudo dpkg-reconfigure dash
_
ダッシュを_/bin/sh
_のままにするには「yes」と答え、bashに切り替えるには「no」と答えます。
Bashを_/bin/sh
_として保持できますが、システムが少し遅くなります。一部のシステムスクリプトがbashと互換性がないことも考えられますが、bashはほとんどがダッシュのスーパーセットであるため、そうなることはほとんどありません。
_/bin/sh
_の実装から選択するインターフェースを持たないディストリビューションの場合、bashに切り替える方法は次のとおりです。
_Sudo ln -s bash /bin/sh.bash
Sudo mv /bin/sh.bash /bin/sh
_
ターミナルを開いたままにし、その後でもいくつかのsh
スクリプトを実行できることを確認します。このコマンドを失敗すると、システムが使用できなくなります。 (ちなみに、単純に見える_Sudo ln -sf bash /bin/sh
_ではなく上記の複数のコマンドを使用した理由は、_ln -sf
_がアトミックではないためです。この操作中にコンピューターがクラッシュしたことは確かにありませんが、復元するには、レスキューメディアから起動する必要があります。対照的に、mv
はアトミックです。)
ダッシュを_/bin/sh
_として復元するには:
_Sudo ln -s dash /bin/sh.dash
Sudo mv /bin/sh.dash /bin/sh
_
ディストリビューションのデフォルトでshが_/bin/bash
_の場合、ダッシュに切り替えるとスクリプトが失敗する可能性があります。bashにはダッシュよりも多くの機能があるためです。 Bashスクリプトは_#!/bin/bash
_で始まる必要があり、_#!/bin/sh
_で始まるスクリプトはbash固有の機能を使用しないでください。ただし、_/bin/sh
_としてbashに同梱されているディストリビューションは_#!/bin/sh
_そのディストリビューションに固有のスクリプト(ユーザーが_/bin/sh
_としてダッシュに切り替えることができるという期待がなく、これらのスクリプトが別のディストリビューションで機能するという期待がない限り、問題ありません)。
sh
をbash
に切り替えるには(デフォルトのdash
ではなく)、dash
を再構成します(そうです、直観に反しています)。
Sudo dpkg-reconfigure dash
これにより、dash
をデフォルトのシステムシェルにするかどうかを尋ねられます。 「いいえ」(Tab その後 Enter)とbash
がデフォルトになります(つまり/bin/sh
は/bin/bash
を指します)。