如何在 Ubuntu 中使用 Bash for sh
我正在安裝一個巨大的程序,它的資源作為一個
rpm
文件。它卡在了#!/bin/sh SCITEGICPERLBIN=`dirname $0` SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN` if [ $SCITEGICPERLHOME == "." ]
顯然,使用這種語法在 Red Hat Linux 中
sh
工作bash
,但它給出了unexpected operator
在 Ubuntu 中的錯誤。我無法將腳本更改為,
bash
因為腳本來自rpm
包。我可以提取並重新打rpm
包包,但可能有很多這樣的腳本。有沒有辦法將shell預設更改為
#!/bin/sh
視為bash
或其他任何可以處理[
操作員的東西?
有多個程序可以實現
/bin/sh
. 在 Ubuntu 上,/bin/sh
是 dash,它被設計為快速,使用少量記憶體,並且不支持超過/bin/sh
. 在 RHEL 上,/bin/sh
是 bash,它速度較慢,使用更多記憶體,但具有更多功能。這些功能之一是條件語法的==
運算符。[
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
預設在您的發行版中,切換到 dash 可能會導致腳本失敗,因為 bash 具有比 dash 更多的功能。Bash腳本應該以開頭#!/bin/bash
,並且以可以切換到 dash as並且不希望這些腳本在另一個發行版上工作)。#!/bin/sh``/bin/sh``#!/bin/sh``/bin/sh
要切換
sh
到bash
(而不是dash
預設值),請重新配置dash
(是的,這有點違反直覺):sudo dpkg-reconfigure dash
這會詢問你是否想
dash
成為預設的系統外殼;回答“否”(Tab
則Enter
)bash
並將成為預設值(即/bin/sh
指向/bin/bash
)。