首页 > 解决方案 > sh 调用中的额外参数会发生什么?

问题描述

如果我运行,sh -c "prog arg1 arg2 arg3"那么 prog 将使用传递给它的参数运行。这很简单。如果我错过了引号,sh -c prog arg1 arg2 arg3那么 prog 将在没有参数的情况下运行。但是争论会发生什么?sh 只是默默地忽略它们,还是它们提供某些功能?手册页(在我看来)有点不清楚

-c 字符串

如果存在 -c 选项,则从字符串中读取命令。如果字符串后面有参数,则将它们分配给位置参数,从 $0 开始。

据我所知,“字符串后的参数”没有分配给位置参数。

标签: sh

解决方案


额外的参数确实分配给了位置参数。$1,$2等在正在执行的命令中可用。

$ sh -c 'echo "0=$0; 1=$1; 2=$2"' foo bar baz
0=foo; 1=bar; 2=baz

如果您希望将它们传递prog,则必须编写如下内容:

sh -c 'prog "$1" "$2" "$3"' sh arg1 arg2 arg3

或者,更一般地说:

sh -c 'prog "$@"' sh arg1 arg2 arg3

(请注意,我已将参数列表添加sh到参数列表中,以确保$0设置为 shell 的名称而不是arg1.)


推荐阅读