为什么bash alias没有';你不能用脚本吗?

为什么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

我使用的是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 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
执行脚本的方法(两行都没有帮助)。