为什么bash alias没有';你不能用脚本吗?
我使用的是Mac,我在为什么bash alias没有';你不能用脚本吗?,bash,alias,environment,Bash,Alias,Environment,我使用的是Mac,我在中定义了这个别名。bashrc: $cat .bashrc | grep la alias la='ls -la' 然后我尝试在脚本中使用它: $cat ./mytest.sh #!/bin/bash la 它运行并表示找不到la: ./mytest.sh: line 2: la: command not found 为什么会这样?我在Mac和Linux上都试过了,同样的错误 在~/.bashrc文件的开头通常可以找到两行,如下所示: # If not runni
中定义了这个别名。bashrc
:
$cat .bashrc | grep la
alias la='ls -la'
然后我尝试在脚本中使用它:
$cat ./mytest.sh
#!/bin/bash
la
它运行并表示找不到la
:
./mytest.sh: line 2: la: command not found
为什么会这样?我在Mac和Linux上都试过了,同样的错误 在~/.bashrc文件的开头通常可以找到两行,如下所示:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
此行中止包含无论如何都不推荐使用的脚本。对于可移植性问题,您通常编写完整命令或在脚本本身中定义别名。您的
。bashrc
仅由交互式shell使用。说:
以非交互方式调用
例如,当以非交互方式启动Bash时,为了运行shell脚本,它会在环境中查找变量Bash_ENV
,如果变量出现,则展开其值,并使用展开的值作为要读取和执行的文件名。Bash的行为就像执行了以下命令一样:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
但是PATH
变量的值不用于搜索文件名
如上所述,如果使用--login
选项调用非交互式shell,Bash将尝试从登录shell启动文件中读取和执行命令
正如您所看到的,那里没有关于.bashrc
的内容。您的别名在脚本中根本不存在
但即使阅读了
.bashrc
,也有:
除非使用shopt
设置了expand\u alias
shell选项,否则shell不交互时,别名不会展开
因此,如果您想让别名在脚本中工作,您必须首先执行shopt-s expand_alias
。或者只使用shell函数而不是别名:
la() {
ls -la
}
解决这个问题最简单的方法就是在脚本中做两件重要的事情——或者如果你只做一件事,它就不起作用了
#!/bin/bash -i
# Expand aliases defined in the shell ~/.bashrc
shopt -s expand_aliases
在此之后,在~/.bashrc中定义的别名将在shell脚本(giga.sh或any.sh)中以及脚本中的任何函数或子shell中可用
如果不这样做,您将得到一个错误:
your_cool_alias: command not found
@阿努巴瓦:“地下地狱”是一个艺术术语,在这里似乎不适用。我猜你的意思是“调用的shell脚本”,但在这种情况下,你只是描述OP观察到的行为,而不是解释它。在脚本中使用别名不是一个好的做法。改用函数。此外,使脚本依赖于
.bashrc
也不理想。请参阅本文:在shopt-s expand\u alias
行之后,我的脚本还必须为包含别名定义的文件包含source~/.bash\u profile
。您好!shopt-s expand\u alias
行对我似乎没有任何影响。实际上,#已经足够了/当我在图形终端(kde Konsole)内使用/script.sh
执行脚本时,没有shopt-s expand_别名的bin/bash-i
行。类似地,它使用bash-i script.sh
运行脚本,即交互地(使用-i)运行脚本,而不是使用bash script.sh
运行脚本,这两行都没有。尽管我没有找到使用bash script.sh
执行脚本的方法(两行都没有帮助)。