里面工作,我有一个可执行文件command.sh别名没有一个bash脚本
#/bin/bash
alias my_command='echo ok'
my_command
我的终端是bash的。
当我运行它像./command.sh
,它工作正常。
当我像/bin/bash ./command.sh
那样运行它时,它找不到my_command可执行文件。
当我运行它像/bin/sh ./command.sh
,它工作正常。
我很困惑。问题在哪里?
里面工作,我有一个可执行文件command.sh别名没有一个bash脚本
#/bin/bash
alias my_command='echo ok'
my_command
我的终端是bash的。
当我运行它像./command.sh
,它工作正常。
当我像/bin/bash ./command.sh
那样运行它时,它找不到my_command可执行文件。
当我运行它像/bin/sh ./command.sh
,它工作正常。
我很困惑。问题在哪里?
从bash
手册页:
别名没有扩展的时候shell不是交互,除非
expand_aliases
外壳选择是使用shopt
设置(参见下shell内建的shopt
的 描述下面的命令)。
换句话说,缺省情况下,bash shell脚本中未启用别名。当您使用bash
运行脚本时,它将失败。
您的sh
似乎默认允许在脚本中使用别名。当您使用sh
运行脚本时,它会成功。
./command.sh
恰好工作,因为您的朋友格式不正确(您错过在#!/bin/bash
)。
稍后在同一节中:“对于几乎所有目的而言,shell函数都优于别名。”我从来没有意识到别名在非交互式shell中没有扩展。这是避免它们的另一个理由。相对于csh/tcsh别名,Bash别名似乎相当残废。另一方面,csh/tcsh没有函数。 –
实际上,我试图简化另一个问题 - 为什么我的/etc/bash.bashrc中的别名或〜/ profile没有被使用。所以功能在这里不是一个选项。 –
另外,我在执行之前正在执行'shopt -s expand_aliases',甚至在'shopt -s expand_aliases; ......但它仍然没有得到它。 –
别名用于交互式shell,您需要的是一个函数,例如
#!/bin/bash
function my_command() {
echo ok
}
my_command
“我的终端是bash。”不,你的* shell *是bash。 –