在 bash 脚本中运行别名会给出“<arguments>:命令未找到”

Dro*_*ess 3 bash alias

我有一个带有别名的脚本_test。它工作正常,但在打印输出之前,它确实如此<arguments>: command not found。例如,_test -h给出line 49: -h: command not found

这是一个最小的例子:

alias _test='
echo Hi
'
shopt -s expand_aliases

_test -h
Run Code Online (Sandbox Code Playgroud)

编辑:对于那些询问使用函数的人,事实上,我曾经使用过一个函数——但它开始导致递归问题。我只是想要一些类似于宏的东西——就像文本被插入到脚本中一样。

编辑2:我刚刚意识到为什么我一直对我的函数/别名进行递归。我修复了它,然后切换回函数,但这个问题可能对其他人有帮助。

Joh*_*ica 5

删除换行符。如所写,_test -h扩展到此,在 echo 的上方和下方各有一个空行:

\n
\necho Hi\n-h\n
Run Code Online (Sandbox Code Playgroud)\n

使其成为单行别名:

\n
alias _test='echo Hi'\n
Run Code Online (Sandbox Code Playgroud)\n
\n

但一般来说,应避免使用别名。它们的真正目的是为了方便交互式 shell。在脚本中\xe2\x80\x94或者哎呀,即使在交互式shell中\xe2\x80\x94,最好还是使用函数。例如:

\n
_test() {\n    echo Hi "$@"\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

对于那些询问如何使用函数的人,事实上,我曾经用过一个函数来代替——但它开始导致递归问题。我只是想要一些类似于宏的东西——就像文本被插入到脚本中一样。

\n
\n

您是否尝试像这样包装现有命令?

\n
alias ls='ls --color=auto -F'\n
Run Code Online (Sandbox Code Playgroud)\n

如果是这样,您可以使用它command来防止函数递归调用自身。等效函数是:

\n
ls() {\n    command ls --color=auto -F "$@"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

command ls调用ls命令而不是ls我们刚刚定义的函数,这样我们就不会陷入无限递归循环。

\n