我有一个非常奇怪的情况...如果我使用 /bin/bash 运行脚本,它甚至无法识别我在脚本内设置的别名。而最奇怪的是
$ cat -n test.sh
1 #!/bin/bash
2 alias somecommand='ls -alF'
3 alias
4 somecommand
$ ./test.sh
alias somecommand='ls -alF'
./test.sh: line 4: somecommand: command not found
...如上所示,如果我在脚本中运行命令“alias”,结果表明 bash 已采取某个命令进入别名,但如果我运行某个命令本身它仍然不会被识别!
如果我使用命令“sh”运行脚本,一切都是正确的..那么这是bash的错误吗?或者我缺少什么?
任何帮助表示赞赏!
答案1
根本不使用脚本中的别名。在脚本中使用专为交互式使用而设计的功能没有什么意义。相反,使用函数:
somecommand () {
ls -alF
}
函数比别名灵活得多。以下内容将ls
使用始终执行的版本重载通常的版本ls -F
(参数传入$@
,包括您使用的任何标志),几乎与别名一样alias ls="ls -F"
:
ls () {
command ls -F "$@"
}
这里command
可以防止 shell 进入无限递归,否则它会这样做,因为该函数也被称为ls
。
别名永远无法做这样的事情:
select_edit () (
dir=${1:-.}
if [ ! -d "$dir" ]; then
echo 'Not a directory' >&2
return 1
fi
shopt -s dotglob nullglob
set --
for name in "$dir"/*; do
[ -f "$name" ] && set -- "$@" "$name"
done
select file in "$@"; do
"${EDITOR:-vi}" "$file"
break
done
)
这将创建一个函数select_edit
,该函数将目录作为参数,并要求用户在该目录中选择一个文件。所选文件将在编辑器中打开进行编辑。
手册bash
包含以下声明
对于几乎所有用途,别名都被 shell 函数取代。
答案2
要在 bash 脚本中使用别名等交互式功能,您必须在交互式 bash shell 中运行它。为此,更改第一行以包含-i
.所以你的新脚本文件变成
#!/bin/bash -i
alias somecommand='ls -alF'
alias
somecommand
答案3
有点重复上一个问题然而那里的答案有点罗嗦。简而言之,由于神秘的原因,默认情况下 bash 不会查看脚本内定义的别名。您必须通过shopt -s expand_aliases
所述脚本顶部的一行明确告诉它这样做。这样做然后你的脚本就会发现某个命令。
答案4
shopt -sq expand_aliases
例如,使用UTF-8 编码的以下代码:
#!/bin/bash
function запрещать() {
if [ $1 -eq 3 ]
then
echo -n "Запрещено. Код ошибки: "
echo `expr 2 \* 3 \* 47`
else
echo -n "."
запрещать `expr $1 + 1`
fi
}
#function запретить() {
# запрещать 1
#}
shopt -sq expand_aliases
alias запретить='запрещать 1'
запретить