当默认 shell 与 bash 不兼容时,为什么 bash 脚本无法正常工作?

当默认 shell 与 bash 不兼容时,为什么 bash 脚本无法正常工作?

我的默认 shell 是 fish,因为它好用多了。但是我经常在运行脚本时收到错误,这些错误似乎是由 fish 处理的 bash 脚本引起的。我认为这是因为脚本编写者假设默认 shell 是 bash,但我不明白其中的机制。

例如,CrashPlan install.sh 脚本以 bash shebang 开始:

~/CrashPlan-install> head install.sh
#!/bin/bash

#############################################################
# Linux Client Installer Script
#############################################################

所以当我运行./install.sh它时应该由 bash 处理,对吗?默认终端 shell 应该无关紧要。但是,当我的默认 shell 是 fish 时,运行这样的脚本会导致 fish 返回错误,就好像它正在处理脚本一样:

fish: Expected a command name, got token of type “Run job in background”. Did you mean
 “COMMAND; and COMMAND”? See the help section for the “and” builtin command by typing “help and”.
Standard input: sed -imod "s|Exec=.*|Exec=/usr/local/crashplan/bin/CrashPlanDesktop|" 
 /home/username/Desktop/CrashPlan.desktop && rm -rf /home/username/Desktop/CrashPlan.desktopmod 

这是因为我的计算机配置错误还是因为脚本是以不可移植的方式编写的?

答案1

所以当我运行./install.sh它时应该由 bash 处理,对吗?

确实如此。这正是 Shebang 的目的。

故障排除

  • 将以下内容保存为test.sh并尝试从 fish 运行它。

    #!/bin/bash
    
    true && true
    

    它可以在了我的电脑上运行,并且应该也可以在你的电脑上运行。

  • 检查的第一行是否install.sh仅包含字符#!/bin/bash

    不可见的字符(例如 CR 换行符)可能会让鱼感到困惑。

  • 跑步

    /bin/bash --version
    

    检查 bash 是否确实是 bash,并且随着时间的推移没有被意外替换或修改。

安装文件

$SRC_USER只是脚本为其创建的同义词$SUDO_USER

因此,当以 root 权限运行该脚本时,命令

su ${SRC_USER} -c "sed -imod \"s|Exec=.*|Exec=${GUISCRIPT}|\" ${DESKTOP_LAUNCHER} && rm -rf ${DESKTOP_LAUNCHER}mod"

自动使用 sudo 用户的默认 shell,即 fish。

要覆盖此默认值,请将指令添加-s /bin/bashsu命令中。

相关内容