bash 管道中的重复命令

Loo*_*oom 5 command-line bash pipe

有时命令在管道命令中重复。例如(只是为了说明):

$ grep -lF 'pattern' ./foo/**/*.bar | xargs dirname | xargs dirname
Run Code Online (Sandbox Code Playgroud)

有没有办法缩短链接命令?例如,我有一个命令:

$ ... | some-command | some-command | some-command | ...
Run Code Online (Sandbox Code Playgroud)

I'd like to get same result with something like to the following

$ ... | (some-command) ^ 3 | ...
Run Code Online (Sandbox Code Playgroud)

Of course, it wouldn't work, but it illustrates what I'd like to make.

slm*_*slm 0

不太漂亮,但我相信你可以使用 while 和 for 循环来做你想做的事。

$ seq 5 | while read -r f; do for i in {1..3}; do echo "[$i]: blah $f";done; done
[1]: blah 1
[2]: blah 1
[3]: blah 1
[1]: blah 2
[2]: blah 2
[3]: blah 2
[1]: blah 3
[2]: blah 3
[3]: blah 3
[1]: blah 4
[2]: blah 4
[3]: blah 4
[1]: blah 5
[2]: blah 5
[3]: blah 5
Run Code Online (Sandbox Code Playgroud)

这是分解的结构:

$ <CMD> | while read -r f; do 
    for i in <range>; do 
        ...do command some num. of times...
    done 
done
Run Code Online (Sandbox Code Playgroud)

其他方法

  1. 查看此问题的另一种方法是创建一个 shell 函数 ( function () {...}) 并调用它而不是xargs ...多次。该函数可以接受 2 个参数、运行次数参数和运行参数。

  2. 您还可以创建一个包含 for 循环的 shell 脚本,您可以向其中传递 2 个参数。运行 X 的次数,以及对 X 进行操作的参数。