it-swarm.cn

为什么我的Bash脚本无法识别别名?

我的~/.bashrc文件中包含两个定义:

  1. commandA,这是较长路径的别名
  2. commandB,它是Bash脚本的别名

我想使用这两个命令处理相同的文件,因此我编写了以下Bash脚本:


#!/bin/bash

for file in "[email protected]"
    do
    commandA $file
    commandB $file
done

即使注销了会话并重新登录后,当我运行此脚本时,Bash也会针对两个命令以command not found错误提示我。

我究竟做错了什么?

237
Zaid

首先,正如ddeimeke所说,默认情况下,别名不会在非交互式shell中扩展。

其次,除非您设置.bashrc环境变量,否则非交互式shell不会读取BASH_ENV

但最重要的是:不要那样做!请?有一天,您将把该脚本移到未设置必要别名的地方,它将再次中断。

而是在脚本中设置环境变量并将其用作快捷方式:

#!/bin/bash

CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh

for file in "[email protected]"
do
    $CMDA "$file"
    $CMDB "$file"
done
125
user601

如果您查看bash手册页,则会发现:

当Shell不交互时,别名不会扩展,除非使用shopt设置expand_aliases Shell选项(请参阅下面的Shell BUILTIN COMMANDS下的shopt描述)。

所以放一个

shopt -s expand_aliases

在您的脚本中。

在脚本中设置别名文件后,请确保来源文件。

shopt -s expand_aliases
source ~/.bash_aliases
175
ddeimeke

别名无法导出,因此在未定义别名的Shell脚本中不可用。换句话说,如果您在~/.bashrc中定义它们,则它们对your_script.sh不可用(除非您在脚本中提供~/.bashrc,我不建议这样做,但是有很多方法可以正确)。

但是,可以导出函数,并且这些函数对于在定义它们的环境中运行的Shell脚本可用。可以通过将其放在您的bashrc中来完成:

 foo()
 {
 echo“ Hello World!” 
} 
 export -f foo 

正如Bash手册所说:“几乎所有目的,Shell函数都比别名更受青睐。”

48
[cmd line] > bash -i [your script's file path]

i用于交互,并为您提供bash个人资料。

11
user65576