web-dev-qa-db-ja.com

UbuntuでBash for shを使用する方法

リソースをrpmファイルとして持つ巨大なプログラムをインストールしています。の線にこだわった

#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]

どうやら、shはRed Hat Linuxのbashでこの構文で機能しますが、Ubuntuではunexpected operatorのエラーが発生します。

スクリプトはbashパッケージからのものであるため、スクリプトをrpmに変更できません。 rpmパッケージを抽出して再パックすることはできますが、そのようなスクリプトが多数ある可能性があります。

シェルのデフォルトを変更して、#!/bin/shbashまたは[演算子を処理できる他の何かとして扱う方法はありますか?

14
Googlebot

_/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_としてダッシュに切り替えることができるという期待がなく、これらのスクリプトが別のディストリビューションで機能するという期待がない限り、問題ありません)。

shbashに切り替えるには(デフォルトのdashではなく)、dashを再構成します(そうです、直観に反しています)。

Sudo dpkg-reconfigure dash

これにより、dashをデフォルトのシステムシェルにするかどうかを尋ねられます。 「いいえ」(Tab その後 Enter)とbashがデフォルトになります(つまり/bin/sh/bin/bashを指します)。

36
Stephen Kitt