相当多的 Linux 命令都有一个试运行选项,可以向您展示它们将要做什么而不需要执行。我在 xargs 手册页中没有看到任何内容可以做到这一点,也没有明显的方法来模拟它。
(我的具体用例是对长管道进行故障排除,尽管我确信还有其他用例)
我错过了什么吗?
答案1
您可能会受益于-p
或-t
标志。
xargs -p
或者xargs --interactive
会打印出要执行的命令,然后在执行命令之前提示输入(y/n)进行确认。
% cat list
one
two
three
% ls
list
% cat list | xargs -p -I {} touch {}
touch one ?...y
touch two ?...n
touch three ?...y
% ls
list
one
three
xargs -t
或者xargs --verbose
将打印每个命令,然后立即执行它:
% cat list | xargs -t -I {} touch {}
touch one
touch two
touch three
% ls
list
one
three
two
答案2
echo
在要运行的命令前面加一个?
$ echo a b c d e | xargs -n2 echo rm
rm a b
rm c d
rm e
答案3
用您最喜欢的编程语言检查参数
xargs
在您要执行的命令之间插入以下任何命令。
ruby -e 'p ARGV'
node -e 'console.log(process.argv)'
python -c 'import sys; print sys.argv'
在这个答案中,我将用于ruby -e 'p ARGV'
每个示例。
用法
假设您要调试脚本:
echo 1 2 3 4 | xargs echo
要调试,请放在ruby -e 'p ARGV'
前面echo
:
echo 1 2 3 4 | xargs ruby -e 'p ARGV' echo
["echo", "1", "2", "3", "4"]
正如我们所看到的,很明显echo
收到了 2 个参数。
这是另一个使用的示例-I
:
echo 1 2 3 4 | xargs -I@ ruby -e 'p ARGV' echo @
["echo", "1 2 3 4"]
现在我们知道echo
只收到一个参数。
为什么不xargs -t -p
?
因为当命令参数中有空格时-t
和确实很不明确,例如:-p
printf 'hello world\0goodbye world' | xargs -0 -t echo
echo hello world goodbye world
hello world goodbye world
当查看 时echo hello world goodbye world
,很难判断是否echo
收到了 2 个或 4 个参数。
通过使用该解决方案,很容易理解如何xargs
处理每个参数:
printf 'hello world\0goodbye world' | xargs -0 ruby -e 'p ARGV' echo
["echo", "hello world", "goodbye world"]