如何在Ubuntu中使用Bash for sh


14

我正在安装一个巨大的程序,该程序具有作为rpm文件的资源。它卡在了

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

显然,sh可以bash使用这种语法在Red Hat Linux中工作,但是会unexpected operator在Ubuntu中产生错误。

我无法将脚本更改bash为脚本来自rpm软件包。我可以提取并重新rpm打包程序包,但是可能有很多这样的脚本。

有没有一种方法可以将Shell默认值更改#!/bin/sh为as bash或其他任何可以处理[操作符的方法?


5
唯一的错误是==应该的=。那,并且变量扩展应该用双引号引起来。
库萨兰达

4
[不是运算符,而是称为的内置命令test。意外的运算符为,==并且应替换为=它,因为它不符合POSIX。
schily

第二件事是错误的是$SCITEGICPERLHOME应该引用。
l0b0

12
您应该向程序作者投诉。如果使用#!/bin/sh,则应确保仅使用POSIX Shell功能,而不使用bash扩展。这个程序员很草率。他应该修正自己的代码或使用#!/bin/bash
巴马尔

对于那些想知道其他类似问题的人来说,这里是“ Bashisms ” 列表。也看到这个问题
上尉曼

Answers:


21

有多种程序可实现的语言/bin/sh。在Ubuntu上,/bin/sh破折号(dash)设计用于快速运行,只占用少量内存,并且不支持超过的最低要求/bin/sh。在RHEL上/bin/sh是bash,它速度较慢,使用的内存更多,但功能更多。这些功能之一是条件语法的==运算符[。Dash support [是基本的sh功能,但没有==bash(以及ksh和zsh)扩展程序。

您可以将系统切换为使用bash。在Ubuntu上,/bin/sh是的符号链接dash。您可以bash改为使其成为符号链接。当前版本的Debian和Ubuntu(及其衍生版本)使它成为破折号的安装选项。要更改它,请运行

sudo dpkg-reconfigure dash

并回答“是”以保持破折号/bin/sh或“否”以切换为bash。

您可以将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/shln -sf不是原子。在此操作过程中您的计算机崩溃诚然不太可能的情况下,你需要从应急媒体启动,恢复它。相反,mv是原子的。)

要将破折号还原为/bin/sh

sudo ln -s dash /bin/sh.dash
sudo mv /bin/sh.dash /bin/sh

请注意,如果/bin/bash在您的发行版中默认将sh 切换为破折号,则脚本可能会失败,因为bash比破折号具有更多功能。Bash脚本应以开头#!/bin/bash,而以Bash开头的脚本#!/bin/sh不应使用bash特有的功能,但是bash附带的发行版/bin/sh可能会在#!/bin/sh特定于该发行版的脚本中使用bash特有的功能(只要您不期望用户可以切换为破折号,/bin/sh并且不期望这些脚本可以在其他发行版上运行)。


以我不太卑鄙的观点,如果某些脚本在/bin/shBash 时失败,那么这是系统(带有脚本的程序包)或Bash的sh-mode中的错误。就像史蒂芬(Stephen)所说的那样,系统明确允许通过设置/bin/sh回Bash dpkg-reconfigure。在此问题上,Ubuntu Wiki中也提到了这种可能性:wiki.ubuntu.com/DashAsBinSh
ilkkachu,

5
@ilkkachu是的,如果/bin/shbash 脚本失败,那就是一个错误。但是,会发生错误。如果您没有能力并愿意诊断此类错误,因为其他人已经为您测试过,我建议您坚持使用默认值。我像/bin/sh在Debian上得到正式支持之前一样使用破折号,但是这是我冒的风险,因为我知道如果发生了什么我可以应付。
吉尔斯(Gilles)'所以

请注意,手动覆盖的符号链接将还原为debconf下次dash更新时存储的任何配置。显然,对于运行Debian稳定版的系统来说,这种情况不会经常发生(如果有的话,在给定的发行版中)。
斯蒂芬·基特

36

要切换shbash(而不是dash默认值),请重新配置dash(是的,这有点违反直觉):

sudo dpkg-reconfigure dash

这将询问您是否要dash成为默认的系统外壳程序;回答“否”(Tab然后Enter),bash它将成为默认值( /bin/sh指向/bin/bash)。


1
您的解决方案确实是最合理的解决方案,但是由于详细说明使问题更加清晰,因此我接受了另一个答案。任何不便敬请谅解。
Googlebot '18年

@Googlebot无需道歉,选择接受的答案是请求者的特权。我从中拿出了金牌;-)。
斯蒂芬·基特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.