我看过很多帖子,指出shell别名不支持args。在一个环境中,CentOS 6.10,Bash 4.1.2,我有这个:
alias hist='source ~/scripts/hist "@$"'
(〜/ scripts / hist是一个shell脚本) 这可行。该脚本准确地从别名接收传递的参数。在另一个环境中-RHEL Server 7.5,Bash 4.2.46具有相似的别名-唯一的区别是别名中的显式路径:
alias hist='source /full/path/to/hist "@$"'
不起作用。当脚本运行时,它认为它已收到如下参数:“ uid = nnnn(用户名)gid = nnnn(grpname)groups = nnnn(grp)”
两个地方的脚本完全相同。我只是想知道可能会有什么解释。
答案 0 :(得分:2)
它没有按预期运行,这是一个最小的示例
alias print_args='printf "<%s>\n" "$@"'
print_args "hello" "world"
可以打印
<hello>
<world>
但仅当未设置当前shell参数时(有时在交互式shell中为true,但并非总是如此)
例如在set 1 2 3
之后
set -- 1 2 3
print_args "hello" "world"
打印
<1>
<2>
<3>
<hello>
<world>
命令行位置参数在当前位置参数旁边。
以下(没有"$@"
)正确传递了命令行参数
alias print_args='printf "<%s>\n"'
print_args "hello" "world"