巨大なプログラムをインストールしていますが、そのリソースはファイルrpm
です。それは並んでいる
#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]
明らかに、この構文を使用するとRed Hat Linuxでは機能しますsh
が、Ubuntuではエラーが発生しますbash
。unexpected operator
bash
スクリプトはrpm
パッケージから提供されるため、スクリプトを変更することはできません。パッケージを抽出して再パッケージすることもrpm
できますが、おそらくこのようなスクリプトが多いでしょう。
演算子を処理できる他のものとして#!/bin/sh
扱うようにシェルのデフォルトを変更する方法はありますか?bash
[
答え1
Ubuntu 22.04(およびDebian 11)までは、再構成を介して(デフォルトではなく)sh
切り替えることができます(たとえば、これはやや直感に反します)。bash
dash
dash
sudo dpkg-reconfigure dash
dash
デフォルトのシステムシェルとして設定するかどうかを尋ねられます。 「いいえ」と答えると(TabそれからEnter)bash
基本システムシェルになります(つまり /bin/sh
)を指します/bin/bash
。
Ubuntu 22.10とDebian 12以降、この機能はサポートされなくなりました。/bin/sh
この機能に切り替えるには、/bin/bash
手動でシンボリックリンクを歩く必要があります。バラよりザイルズの答えもっと学ぶ。
答え2
これを実装するいくつかのプログラムがあります/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(およびその派生バージョン)の現在のバージョンでは、Dashをインストールオプションとして提供しています。変更するには、以下を実行してください。
sudo dpkg-reconfigure dash
ダッシュを維持するには「はい」と答え、/bin/sh
bashに切り替えるには「いいえ」と答えます。
bashをそのままにしておくことはできますが、/bin/sh
そうするとシステムが少し遅くなります。一部のシステムスクリプトはbashと互換性がないかもしれませんが、bashは主にdashの親セットであるため、そうではありません。
実装から選択できるインタフェースがないディストリビューションの場合、/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関連の機能を使用しないでください。ただし、bashに付属のディストリビューションは、/bin/sh
そのディストリビューションに関連するスクリプトでbash固有の機能を使用できます#!/bin/sh
(ユーザーが期待しない限り)。ダッシュに切り替えて、/bin/sh
これらのスクリプトが他のディストリビューションで動作することを望まない)。