我的默认 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/bash
到su
命令中。