Hin*_*sum 4 bash environment alias
我正在使用Mac,我在下面定义了这个别名.bashrc:
$cat .bashrc | grep la
alias la='ls -la'
Run Code Online (Sandbox Code Playgroud)
然后我尝试在脚本中使用它:
$cat ./mytest.sh
#!/bin/bash
la
Run Code Online (Sandbox Code Playgroud)
它运行并说它找不到la:
./mytest.sh: line 2: la: command not found
Run Code Online (Sandbox Code Playgroud)
为什么是这样?我试过Mac和Linux,同样的错误!
您.bashrc只能使用交互式shell.https://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files说:
非交互式调用
例如,当以非交互方式启动Bash以运行shell脚本时,它会
BASH_ENV在环境中查找变量,如果它出现在那里则展开其值,并使用展开的值作为要读取和执行的文件的名称.Bash的行为就像执行了以下命令一样:Run Code Online (Sandbox Code Playgroud)if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi但是
PATH变量的值不用于搜索文件名.如上所述,如果使用该
--login选项调用非交互式shell ,则Bash会尝试从登录shell启动文件中读取和执行命令.
如你所见,那里什么都.bashrc没有.您的别名在脚本中根本不存在.
但即使.bashrc被阅读,还有另一个问题:
除非使用
expand_aliasesshell设置shell ,否则当shell不是交互式时,别名不会展开shopt.
因此,如果您希望别名在脚本中工作,则必须先执行此操作shopt -s expand_aliases.或者只使用shell函数而不是别名.
解决这个问题的最简单的答案是在脚本中做两件重要的事情——否则它不会工作,如果你只做一件事。
#!/bin/bash -i
# Expand aliases defined in the shell ~/.bashrc
shopt -s expand_aliases
Run Code Online (Sandbox Code Playgroud)
在此之后,您在 ~/.bashrc 中定义的别名将在您的 shell 脚本(giga.sh 或 any.sh)以及此类脚本中的任何函数或子 shell 中可用。
如果你不这样做,你会得到一个错误:
your_cool_alias: command not found
Run Code Online (Sandbox Code Playgroud)