什么';“What’”结尾的论点的目的是什么;bash-c命令参数";?

什么';“What’”结尾的论点的目的是什么;bash-c命令参数";?,bash,shell,arguments,command,single-quotes,Bash,Shell,Arguments,Command,Single Quotes,从manbash: 如果存在-c选项,则从中读取命令 第一个非选项参数命令\u字符串。如果有 是命令字符串(第一个参数)之后的参数 将分配给$0,并分配所有剩余参数 设置位置参数。对$0的赋值将设置 shell的名称,用于警告和错误消息。 我不明白$0作业的目的 我正在探索使用xargs将参数传递给多个命令的方法。以下解决方案效果不错(灵感来源于),但我无法理解为什么最后需要一个论点: [编辑:接下来,参数不必为空,它实际上可以是任何东西,但它必须存在] $ cat test abc def

manbash

如果存在-c选项,则从中读取命令
第一个非选项参数命令\u字符串。如果有
是命令字符串(第一个参数)之后的参数
将分配给$0,并分配所有剩余参数
设置位置参数。对$0的赋值将设置
shell的名称,用于警告和错误消息。
我不明白
$0
作业的目的

我正在探索使用xargs将参数传递给多个命令的方法。以下解决方案效果不错(灵感来源于),但我无法理解为什么最后需要一个论点:

[编辑:接下来,参数不必为空,它实际上可以是任何东西,但它必须存在]

$ cat test
abc
def
ghi

$ cat test | xargs -n 1 /bin/bash -c 'echo "1-$@"; echo "2-$@";' 'dummyArgument'
1-abc
2-abc
1-def
2-def
1-ghi
2-ghi
显然,
'dummyArgument'
对于
bash-c
能够解释
$@
(它甚至可以是空的
'
),因为没有它我会得到以下结果:

$ cat test | xargs -n 1 /bin/bash -c 'echo "1-$@"; echo "2-$@";'
1-
2-
1-
2-
1-
2-

但是它是如何工作的呢?为什么我需要
'dummyArgument'

它不必是空引号(这就是提供空字符串作为具体值的方式)。如果您实际上不关心命令中
$0
的值,则它可以是任何值。如果您真的在意,那么您将提供所需的值,而不是空字符串

但无论第一个参数是什么,它都将用于设置
$0
。没有选项将
$0
保留为未设置状态并将参数应用于
$1
等intead

其他常见的“虚拟”值包括
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

查看空参数和无参数之间差异的一种简单方法是使用
set
命令,然后查看
$\code>的值。首先,没有位置参数:

$ set --
$ echo "$#"
0
现在,只有一个空参数

$ set -- ''
$ echo "$#"
1

它不必是空引号(这就是提供空字符串作为具体值的方式)。如果您实际上不关心命令中
$0
的值,则它可以是任何值。如果您真的在意,那么您将提供所需的值,而不是空字符串

但无论第一个参数是什么,它都将用于设置
$0
。没有选项将
$0
保留为未设置状态并将参数应用于
$1
等intead

其他常见的“虚拟”值包括
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

查看空参数和无参数之间差异的一种简单方法是使用
set
命令,然后查看
$\code>的值。首先,没有位置参数:

$ set --
$ echo "$#"
0
现在,只有一个空参数

$ set -- ''
$ echo "$#"
1
我不明白
$0
作业的目的

它的目的是让您为内联脚本命名,可能用于修饰诊断消息。这一点也不有趣

$ cat foo.sh
echo my name is $0
$
$ bash foo.sh a b c
my name is foo.sh
$
$ bash -c 'echo my name is $0' foo a b c
my name is foo
我不明白
$0
作业的目的

它的目的是让您为内联脚本命名,可能用于修饰诊断消息。这一点也不有趣

$ cat foo.sh
echo my name is $0
$
$ bash foo.sh a b c
my name is foo.sh
$
$ bash -c 'echo my name is $0' foo a b c
my name is foo

好的,我明白了。是的,我测试过,参数不必为空,它可以是任何字符串。但是我仍然不明白为什么
bash-c
在命令字符串之后需要一个参数才能解释
$@
我更新了我的问题。现在我知道参数不必是空的,实际上我真正的问题是:为什么我们需要
'dummyArgument'
?指定
$0
的值不是可选的。如果您决定提供一个值,则没有像
-0
这样的单独选项可供使用<代码>$0
$1
等只需使用给定的位置参数按给定的顺序设置即可。如果您不考虑这一点,那么您认为用于
$1
的值将实际分配给
$0
,等等。好的,我明白了。是的,我测试过,参数不必为空,它可以是任何字符串。但是我仍然不明白为什么
bash-c
在命令字符串之后需要一个参数才能解释
$@
我更新了我的问题。现在我知道参数不必是空的,实际上我真正的问题是:为什么我们需要
'dummyArgument'
?指定
$0
的值不是可选的。如果您决定提供一个值,则没有像
-0
这样的单独选项可供使用<代码>$0
$1
等只需使用给定的位置参数按给定的顺序设置即可。如果您不考虑这一点,那么您认为用于
$1
的值将实际分配给
$0
,等等。是的,我知道了
xargs
有助于区分传递给
bash-c
的不同参数。无论如何,如果有人偶然发现这篇文章时提出了同样的问题,比较以下命令的输出将有助于了解发生了什么:
$echo foo bar baz | xargs bash-c'echo$0-$@
$echo foo bar baz | xargs bash-c'echo$0-$@'dummy'
。再次感谢,你给我指出了正确的方向是的,我明白了
xargs
有助于区分传递给
bash-c
的不同参数。无论如何,如果有人偶然发现这篇文章时提出了同样的问题,比较以下命令的输出将有助于了解发生了什么:
$echo foo bar baz | xargs bash-c'echo$0-$@
$echo foo bar baz | xargs bash-c'echo$0-$@'dummy'
。再次感谢,你为我指明了正确的方向