shell 在Linux中,管道传输时是否可以在命令的不同位置插入参数

nmpmafwu  于 2023-02-13  发布在  Shell
关注(0)|答案(2)|浏览(135)

例如,如果我用管道输入“1\n2\n”以使用选项A和B进行cal,如下所示:

cat file-with-content.txt | xargs cal -A (1 here) -B (2 here).

使用-I选项只会执行两次cal。

ql3eal8s

ql3eal8s1#

实际上不可能直接使用xargs来执行此操作,但可以通过调用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"' -
hkmswyz6

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,以避免因加速而导致性能损失。

相关问题