我在 bash 脚本中有一个 xargs 命令。脚本运行,但返回此警告
xargs: warning: options --max-args and --replace/-I/-i are mutually exclusive, ignoring previous --max-args value
Run Code Online (Sandbox Code Playgroud)
脚本:
function post_thing {
token=$2
##check file exists
if [ -f $1.thing.json ];
then
response=`curl -s -o /dev/null -w "%{http_code}" 'https://url.com' --header 'Authorization: Bearer '"$2"'' --header 'Content-Type: application/json' --data @$1.thing.json`
mv $1.thing.json $1.thing.json.$response
else
echo "File not found: $1.thing.json"
fi
}
export -f post_thing
seq 100 200 | xargs -n2 -P100 -I {} bash -c 'token='"$token"'; post_thing "$@" "$token"' _ {}
Run Code Online (Sandbox Code Playgroud)
我不明白这是否会影响脚本,或者我需要做什么。看起来脚本正在按预期工作。使用 xargs 调用函数有问题吗?
我在 Mac 上没有收到此错误,但在 ubuntu 上却出现了。希望你能帮忙,xargs 还很陌生......!
返回此警告
Run Code Online (Sandbox Code Playgroud)xargs: warning: options --max-args and --replace/-I/-i are mutually exclusive, ignoring previous --max-args value
警告的文字对我来说似乎很清楚。唯一的技巧是xargs报告有关 的信息--max-args,其中有问题的命令实际上使用该选项的缩写形式-n。该警告表明给定的选项被忽略。
我在 Mac 上没有收到此错误
在 MacOS 上,您将使用其 BSD 派生版本的xargs. 在 Ubuntu 上,您将使用 GNU xargs。这些并不是 100% 兼容。
这是否是一个问题取决于通过 执行的命令的详细信息xargs。
看起来脚本正在按预期工作。
我对此表示怀疑,至少在 Linux 上是这样。
使用 xargs 调用函数有问题吗?
您没有使用 调用函数xargs。你正在运行一个bash命令。这没有什么特别的问题,该bash命令执行从父 shell 导出的函数也没有特别的问题。
您的post_thing函数取决于接收(至少)两个参数。默认情况下,xargs消耗与您提供的一样多的输入项,最多达到一个非常大的限制,并将它们作为参数提供给同一命令。该-n参数(在 GNU 中xargs也可以拼写为--max-args)设置每次执行指定命令时使用的最大数量。GNUxargs忽略了这一点,这意味着如果您给出四个输入项而不是两个,那么xargs会将它们全部传递给一个 bash命令,而不是将其中两个传递给一个bash命令,将另外两个传递给另一个命令。
正如 GNUxargs所说,问题是-I与--max-args( -n) 冲突。该-I选项指定将被一个输入项替换的符号,这意味着在每次执行指定命令时仅使用一个输入项。这显然不是你想要的。但你不需要-I这里。默认是将xargs参数放在命令末尾,这正是您想要的。因此,对于 Linux,您应该删除-I {}{}命令末尾的选项和相应的标记:
seq 100 200 | xargs -n2 -P100 bash -c 'token='"$token"'; post_thing "$@" "$token"' _
Run Code Online (Sandbox Code Playgroud)
对于 MacOS 来说xargs,-I和-n两者的含义略有不同。指定一个符号,该符号将被同一行中的-I一定数量的输入项替换,并指定将从任何输入行消耗的最大项数。两者一起工作,但它们没有实现您将两个参数传递给每个子命令的明显目标。为了实现这一点,您需要将每行两个项目分组。我认为你可以编写一个在两个地方都有效的命令,如下所示:-nbash
seq 100 200 |
sed -e 'N; s/\n/ /' |
xargs -L1 -P100 bash -c 'token='"$token"'; post_thing "$@" "$token"' _
Run Code Online (Sandbox Code Playgroud)
该sed命令使用空格字符连接连续的行对。指示-L1两个版本xargs仅使用其执行的每个命令中一行的输入项。-n2两个版本的这些争议的组合xargs,尽管原因略有不同。
请注意,即使如此,如果输入项的总数是奇数,您仍然会遇到最后一个命令的问题。