我正在安装一个巨大的程序,它的资源作为一个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
或其他任何可以处理[
操作员的东西?
要切换
sh
到bash
(而不是dash
默认值),请重新配置dash
(是的,这有点违反直觉):这会询问你是否想
dash
成为默认的系统外壳;回答“否”(Tab则Enter)bash
并将成为默认值(即/bin/sh
指向/bin/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 的安装选项。要更改它,请运行并回答“是”以保持破折号
/bin/sh
或“否”以切换到 bash。您可以将 bash 保留为
/bin/sh
,但它会使您的系统变慢一些。甚至可以想象某些系统脚本与 bash 不兼容,尽管这不太可能,因为 bash 主要是 dash 的超集。对于没有接口在 的实现之间进行选择的发行版
/bin/sh
,这里是如何切换到 bash。保持终端打开并检查
sh
之后您是否仍然可以运行一些脚本。如果您弄乱了此命令,它将使您的系统无法使用。(顺便说一句,我使用上面的多个命令而不是简单的命令的原因sudo ln -sf bash /bin/sh
是它ln -sf
不是原子的。在公认的不太可能的情况下,您的计算机在此操作期间崩溃了,您需要从应急媒体启动以恢复它。相反,mv
是原子的。)要将破折号恢复为
/bin/sh
:请注意,如果 sh
/bin/bash
默认在您的发行版中,切换到 dash 可能会导致脚本失败,因为 bash 具有比 dash 更多的功能。Bash脚本应该以开头#!/bin/bash
,并且以可以切换到 dash as并且不希望这些脚本在另一个发行版上工作)。#!/bin/sh
/bin/sh
#!/bin/sh
/bin/sh