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

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

巨大なプログラムをインストールしていますが、そのリソースはファイルrpmです。それは並んでいる

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

明らかに、この構文を使用するとRed Hat Linuxでは機能しますshが、Ubuntuではエラーが発生しますbashunexpected operator

bashスクリプトはrpmパッケージから提供されるため、スクリプトを変更することはできません。パッケージを抽出して再パッケージすることもrpmできますが、おそらくこのようなスクリプトが多いでしょう。

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

答え1

Ubuntu 22.04(およびDebian 11)までは、再構成を介して(デフォルトではなく)sh切り替えることができます(たとえば、これはやや直感に反します)。bashdashdash

sudo dpkg-reconfigure dash

dashデフォルトのシステムシェルとして設定するかどうかを尋ねられます。 「いいえ」と答えると(TabそれからEnterbash基本システムシェルになります(つまり /bin/sh)を指します/bin/bash

Ubuntu 22.10とDebian 12以降、この機能はサポートされなくなりました。/bin/shこの機能に切り替えるには、/bin/bash手動でシンボリックリンクを歩く必要があります。バラよりザイルズの答えもっと学ぶ。

答え2

これを実装するいくつかのプログラムがあります/bin/sh。 Ubuntuは/bin/sh高速で少量のメモリを使用するように設計されており、/bin/shRHELでは/bin/shより遅く、より多くのメモリを使用するbashです。より多くの機能。これらの機能の1つは条件構文==演算子です[。 Dashは[ネイティブsh機能であるこれをサポートしますが、==bash(およびkshおよびzsh)拡張演算子としては提供されません。

bashを使用するようにシステムを切り替えることができます。 Ubuntuでは/bin/shこれを指してdashシンボリックリンクにすることができますbash。 DebianとUbuntu(およびその派生バージョン)の現在のバージョンでは、Dashをインストールオプションとして提供しています。変更するには、以下を実行してください。

sudo dpkg-reconfigure dash

ダッシュを維持するには「はい」と答え、/bin/shbashに切り替えるには「いいえ」と答えます。

bashをそのままにしておくことはできますが、/bin/shそうするとシステムが少し遅くなります。一部のシステムスクリプトはbashと互換性がないかもしれませんが、bashは主にdashの親セットであるため、そうではありません。


実装から選択できるインタフェースがないディストリビューションの場合、/bin/shbashに切り替える方法は次のとおりです。

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/bashbashにはダッシュよりも多くの機能があるため、ダッシュに切り替えるとスクリプトが失敗する可能性があります。 Bashスクリプトはで始まる必要があり#!/bin/bash、で始まるスクリプトは#!/bin/shbash関連の機能を使用しないでください。ただし、bashに付属のディストリビューションは、/bin/shそのディストリビューションに関連するスクリプトでbash固有の機能を使用できます#!/bin/sh(ユーザーが期待しない限り)。ダッシュに切り替えて、/bin/shこれらのスクリプトが他のディストリビューションで動作することを望まない)。

関連情報