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

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

有没有办法运行命令(例如ps aux|grep someprocessn次?

就像是:

run -n 10  'ps aux|grep someprocess'

我想以交互方式使用它。

更新:我之所以问这个问题是因为我确实在很多机器上工作,并且我不想将所有适应的脚本等导入到每个机器上,以便在每台机器上获得相同的功能。

答案1

我认为不存在用于此的命令或 shell 内置命令,因为它只是 Bourne shellfor循环设计的一个简单的子集,因此自己实现这样的命令非常简单。

根据 JimB 的建议,使用 Bash 内置函数生成序列:

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

对于非常老版本的 bash,可以使用以下seq命令:

for i in `seq 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!'

答案2

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'

答案3

只是为了好玩

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

笔记:您必须先单独运行命令pgrep ssh,然后输入字符串!!;!!;!!;!!;!!;!!。否则,它们!!将被替换为先前执行的命令。

;是命令分隔符,!!在 bash 中重放最后一个命令。因此,这将运行pgrep ssh并重放 6 次。

答案4

尝试这个:

yes ls | head -n5 | bash

这要求在子 shell 中执行命令,这会稍微降低性能。YMMV。基本上,您使用“yes”命令重复字符串“ls”N 次;而“head -n5”在重复 5 次时终止循环。最后一个管道将命令发送到您选择的 shell。

顺便说一句csh,类似 shell 有一个内置repeat命令。您可以使用它在 bash 子 shell 中执行命令!

相关内容