题 如何使用bash shell多次运行命令?


有没有办法运行命令(例如 ps aux|grep someprocess)为 ñ 次?

就像是:

run -n 10  'ps aux|grep someprocess'

我想以交互方式使用它,请不要发布脚本。

更新:我之所以这样说的原因是,我在许多机器上工作,我不想将所有我的adaped脚本等导入到每个盒子中,以便在每台机器上获得相同的功能。


132
2018-05-24 15:55




很棒,答案得到这么多的赞成,没有问题,即使收到一个。让我们改变那个+1 :) - Lekensteyn
@Lekensteyn谢谢 - mahatmanich
stackoverflow.com/questions/3737740/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


答案:


我不认为内置的命令或shell存在,因为它是Bourne shell的一个微不足道的子集 for 循环是为这样的命令设计和实现的,因此你自己很简单。

对于初学者,你可以使用假人 for 环:

for i in `seq 10`; do command; done

或者根据JimB的建议等效,使用Bash内置来生成序列:

for i in {1..10}; do command; done

这迭代执行十次 command 每次 - 它可以是一个管道或一系列命令分隔 ; 要么 &&。你可以使用 $i 变量以了解您所处的迭代。

如果你认为这个单线程是一个脚本,所以对于某些未指定(但也许是有效)的原因,你可以将它作为一个命令实现,或许你的.bashrc(未经测试)就是这样的:

#function run
run() {
    number=$1
    shift
    for i in `seq $number`; do
      $@
    done
}

用法:

run 10 command

例:

run 5 echo 'Hello World!'

170
2018-05-24 15:57



@mahatmanich,一个循环不是一个脚本。没有什么能阻止你在交互式终端上使用... - Zoredache
好吧,上面的单行是一种标准的方法,它很简单。为什么对你不好?也许你问的是错误的问题?您想要重复多次的脚本或操作的主要目标是什么?如果我们以不同的方式解决问题,也许有更好的解决方案。 - Patkos Csaba
@mahatmanich - for  是 用于迭代的bash内置。 - JimB
@Eduardo Ivanec - 仅供参考,bash有内置的范围 seq: {1..10} - JimB
似乎内置的括号序列不支持变量替换(参见 stackoverflow.com/a/3737773/713554)。您放置的功能完美无缺 .bashrc 如果 {1..$number} 交换 `seq $number` 虽然。 - Leo


ps aux | grep someprocess 看起来你想要在固定的时间内观看节目的变化。 Eduardo给出了一个完全回答你问题的答案,但有一个替代方案: watch

watch 'ps aux | grep someprocess'

请注意,我已将命令放在单引号中,以避免shell将命令解释为“run watch ps aux”并通过管道输出结果 grep someprocess。执行上一个命令的另一种方法是:

watch ps aux \| grep someprocess

默认情况下, watch 每两秒刷新一次,可以使用 -n 选项。例如,如果想要间隔1秒:

watch -n 1 'ps aux | grep someprocess'

29
2018-05-26 15:07



是的,这就像一个魅力。 - Jānis Gruzis


纯娱乐

pgrep ssh ;!!;!!;!!;!!;!!;!!

21
2018-06-27 13:04



有人可以解释一下吗?看起来很有趣。 - Daniel Vartanov
;只是命令分隔符。 !重播bash中的最后一个命令。所以这运行'pgrep ssh',然后重播6次。 - Piotr Kukielka
虽然这是有益的,但并不直观。一衬垫 for 似乎是最好的方式。无论如何,谢谢你的回答。 - erm3nda
惯于 cmd ;!! 在一行上只需重复输入的命令 之前 目前的路线?它必须是两个独立的 history 条目。 - Joel Purra


试试这个:

yes ls | head -n5 | bash

这要求命令在子shell中执行,性能略有下降。因人而异。基本上,你得到“是”命令重复字符串“ls”N次;而“head -n5”以5次重复结束循环。最终管道将命令发送到您选择的shell。

偶然 csh类似的贝壳有一个内置的 repeat 命令。您可以使用它在bash子shell中执行命令!


14
2018-01-31 00:04





与之前的回复类似,但不需要for循环:

seq 10 | xargs -I -- echo "hello"

seq到xargs的管道输出没有参数或选项


11
2017-11-18 14:36



这只会执行一次 echo "hello" 1 2 3 4 5 6 7 8 9 10。你需要运行xargs -n 1 对于每个输入(数字)和一个进程 -P 10 用于并行执行(10个并行进程)。结束了 seq 10 | xargs -n 1 -P 10 echo。 - Alexander Klimetschek


POSIX方式

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01

x=10
while [ $x -gt 0 ]; do
    command
    x=$(($x-1))
done

当然可以做成一个班轮:

x=10; while [ $x -gt 0 ]; do command; x=$(($x-1)); done

并且似乎是最便携的方式,因此不太可能使您安装程序。

以下是不太便携:

  • 支撑扩张 {1..10}:bash具体,如果参数很大,会产生一个巨大的行
  • seq:GNU
  • yes:GNU

如果您厌倦了可移植性,请考虑GNU parallel

sudo apt-get install parallel
seq 100 | parallel echo {}

它并行运行命令,并有很多很酷的选择。

也可以看看: https://stackoverflow.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-defined-by-variables-in-bash


4
2018-06-15 09:39





@ eduardo-ivanec的鱼壳实现 run 功能 以上

function run
  set number $argv[1]
  for i in (seq $number)
    eval $argv[2..-1]
  end
end

2
2018-06-20 18:44





这将是“观察” - 应该是几乎每个使用procps的unix系统的一部分

您可以在系统中查看fs更改或其他有趣的移动。例如,

watch "df -hP | grep /tmp" 

只需将命令作为参数(参见 man watch


0



手表已有答案......见右下方...... - mahatmanich