我执行了一个远程 Bash 脚本bash <(curl -s URL/script.sh | tr -d '\r')
,该脚本执行以下 3 个操作:
- 将另一个带有别名列表的脚本(
aliases.sh
)下载到当前目录。 - 执行
source ./aliases.sh
命令。 - 在获取脚本后执行列表中的别名之一。此别名是
rss
,旨在重新启动 Web 服务器服务。
由于某种原因,脚本的别名执行总是失败,而手动执行总是成功。
当前状态是,rss
别名(实际上还有列表中的所有其他别名)在执行时将被忽略并被视为“不存在”,script.sh
即使它们的文件aliases.sh
是源文件,并且如果我手动执行它们(键入并按 Enter),rss
所有其他别名的执行都会完美成功。rss
为什么存在这种“执行歧视”,导致脚本别名执行失败,而手动别名执行却成功?
我在几个不同的 Ubuntu 环境中重现了这个问题。我无法解释这一点,希望您能对此发表看法。
答案1
如果您从 shell 脚本“a”运行 shell 脚本“b”,则脚本“b”中设置的所有别名和变量仅适用于该 shell 环境,它们不会传回 shell 脚本“a”。
答案2
别名是为了交互使用而创建的。在脚本中,您可以通过在脚本本身中输入相应的命令来获得相同的结果(与使用别名获得的结果相同)。
如果想多次使用它,可以创建一个函数,并在脚本中调用它。
例子:
alias alidr='sudo lsblk -o model,name,size,fstype,label,mountpoint'
可以在 bash 脚本中替换为
function flidr {
sudo lsblk -o model,name,size,fstype,label,mountpoint $*
}
并且可以在脚本中调用它
flidr
或仅显示带有参数的指定驱动器
flidr /dev/sda /dev/sdb