Bash

如何在 Ubuntu 中使用 Bash for sh

  • September 12, 2018

我正在安裝一個巨大的程序,它的資源作為一個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

要切換shbash(而不是dash預設值),請重新配置dash(是的,這有點違反直覺):

sudo dpkg-reconfigure dash

這會詢問你是否想dash成為預設的系統外殼;回答“否”(TabEnterbash並將成為預設值( /bin/sh指向/bin/bash)。

引用自:https://unix.stackexchange.com/questions/442510