在我的~/.bashrc文件中有两个定义:
commandA,这是更长路径的别名commandB,这是 Bash 脚本的别名我想用这两个命令处理同一个文件,所以我写了以下 Bash 脚本:
#!/bin/bash
for file in "$@"
do
commandA $file
commandB $file
done
Run Code Online (Sandbox Code Playgroud)
即使在退出会话并重新登录后,command not found当我运行此脚本时,Bash 仍会提示我输入两个命令的错误。
我究竟做错了什么?
dde*_*eke 214
如果您查看 bash 联机帮助页,您会发现:
当 shell 不是交互式时,别名不会扩展,除非使用 shopt 设置 expand_aliases shell 选项(请参阅下面的 SHELL BUILTIN COMMANDS 下的 shopt 描述)。
所以放一个
shopt -s expand_aliases
Run Code Online (Sandbox Code Playgroud)
在你的脚本中。
在您的脚本中设置此文件后,请确保获取您的别名文件。
shopt -s expand_aliases
source ~/.bash_aliases
Run Code Online (Sandbox Code Playgroud)
小智 148
首先,正如 ddeimeke 所说,默认情况下,别名不会在非交互式 shell 中展开。
其次,.bashrc除非您设置了BASH_ENV环境变量,否则不会被非交互式 shell 读取。
但最重要的是:不要那样做!请?有一天你会将该脚本移动到没有设置必要别名的地方,它会再次中断。
而是在脚本中设置和使用变量作为快捷方式:
#!/bin/bash
CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh
for file in "$@"
do
$CMDA "$file"
$CMDB "$file"
done
Run Code Online (Sandbox Code Playgroud)
Den*_*son 58
别名无法导出,因此它们在未定义别名的 shell 脚本中不可用。换句话说,如果您在~/.bashrc它们中定义它们,则它们不可用your_script.sh(除非您~/.bashrc在脚本中提供源代码,我不建议这样做,但有一些方法可以正确执行此操作)。
但是,函数可以导出,并且可用于从定义它们的环境中运行的 shell 脚本。这可以通过将它放在你的 bashrc 中来完成:
富()
{
回声“世界你好!”
}
导出 -f foo
正如 Bash 手册所说,“对于几乎所有用途,shell 函数都比别名更受欢迎。”
小智 16
[cmd line] > bash -i [your script's file path]
Run Code Online (Sandbox Code Playgroud)
这i是用于交互式并bash为您提供您的个人资料。
Ton*_*Nam 16
您也可以.在脚本之前使用。运行它作为:
. /path/to/your/script.sh
Run Code Online (Sandbox Code Playgroud)
您可以在 bash 脚本中检查此情况,如下所示:
if [[ $- == *i* ]]
then
echo "running on interactive mode. aliases will work!"
fi
Run Code Online (Sandbox Code Playgroud)