例如,如果我用管道输入“1\n2\n”以使用选项A和B进行cal,如下所示:
cat file-with-content.txt | xargs cal -A (1 here) -B (2 here).
使用-I选项只会执行两次cal。
ql3eal8s1#
实际上不可能直接使用xargs来执行此操作,但可以通过调用sh来绕过此操作:
sh
$ seq 1 10 | xargs -n2 sh -c 'echo arg1 "$1" arg2 "$2"' - arg1 1 arg2 2 arg1 3 arg2 4 arg1 5 arg2 6 arg1 7 arg2 8 arg1 9 arg2 10
因此,在OP的情况下,这将变为:
$ cat -- file-with-content.txt | xargs -n2 sh -c 'cal -A "$1" -B "$2"' -
hkmswyz62#
使用BashFAQ #1循环:
while IFS= read -r a && IFS= read -r b; do cal -A "$a" -B "$b" done <file-with-content.txt
当然,这也适用于管道,尽管不必要地使用它们是次优的:
cat file-with-content.txt | while IFS= read -r a && IFS= read -r b; do cal -A "$a" -B "$b" done
以上假设管道中可以有两个以上的项,并且只要有更多的项,您就希望重复。这与xargs的行为一致,但如果在您的 * 真实的 * 情况下只有两个项,您可以简化:
# again, better to replace this with <file-with-content.txt cat file-with-content | ( IFS= read -r a && IFS= read -r b && exec cal -A "$a" -B "$b" )
exec使用由圆括号创建的子shell,以避免因加速而导致性能损失。
exec
2条答案
按热度按时间ql3eal8s1#
实际上不可能直接使用xargs来执行此操作,但可以通过调用
sh
来绕过此操作:因此,在OP的情况下,这将变为:
hkmswyz62#
使用BashFAQ #1循环:
当然,这也适用于管道,尽管不必要地使用它们是次优的:
以上假设管道中可以有两个以上的项,并且只要有更多的项,您就希望重复。这与xargs的行为一致,但如果在您的 * 真实的 * 情况下只有两个项,您可以简化:
exec
使用由圆括号创建的子shell,以避免因加速而导致性能损失。