有没有办法连续运行一次命令(例如ps aux|grep someprocess)?

类似的东西:

run -n 10  'ps aux|grep someprocess'


我想交互使用它,请不要张贴脚本。在每台机器上获得相同的功能。

评论

stackoverflow.com/questions/3737740 / ...

#1 楼

我不认为有内置的命令或shell,因为它只是Bourne shell for循环所设计的琐碎子集,因此自己实现这样的命令非常简单。用于生成序列的Bash内置函数:
for i in {1..10}; do command; done

对于非常老版本的bash,可以使用seq命令:是由command;分隔的管道或一系列命令。您可以使用&&变量来知道您正在进行的迭代。像在您的.bashrc上这样(未试用):
for i in `seq 10`; do command; done

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

示例:
run 10 command


评论


@mahatmanich,循环不是脚本。没有什么可以阻止您在交互式终端上使用...。

– Zoredache
2011年5月24日18:10



好吧,上面的单行是执行此操作的一种标准方法,并且非常简单。为什么对您不利?也许您问错了问题?您的脚本或要多次重复执行的操作的主要目标是什么?如果我们以不同的方式提出问题,也许会有更好的解决方案。

– Patkos Csaba
2011年5月25日晚上8:43

@mahatmanich-是用于迭代的内置bash。

– JimB
2011年5月25日12:58

@Eduardo Ivanec-仅供参考,bash具有类似seq的内置范围:{1..10}

– JimB
11年5月25日在13:03

似乎内置的括号序列不支持变量替换(请参阅stackoverflow.com/a/3737773/713554)。如果将{1 .. $ number}交换为`seq $ number`,则放置在.bashrc中时,您提供的功能将完美工作。

–狮子座
2012年3月29日13:36

#2 楼

ps aux | grep someprocess看起来您想在固定时间内观看程序的更改。 Eduardo给出了一个答案,可以准确地回答您的问题,但是还有一个替代方法:将命令解释为“ run watch ps aux”,并将结果通过watch传递。另一种执行上一个命令的方法是:默认情况下,grep someprocess每两秒钟刷新一次,可以使用watch选项进行更改。例如,如果要间隔1秒:

watch 'ps aux | grep someprocess'


#3 楼

只是为了好玩

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


评论


有人可以解释一下吗?看起来很有趣。

–丹尼尔·瓦塔诺夫(Daniel Vartanov)
14年2月24日在16:31

;只是命令分隔符。 !!重播bash中的最后一个命令。因此,运行“ pgrep ssh”,然后重播6次。

– Piotr Kukielka
2014-09-21 19:11



虽然这很有启发性,但不是很直观。一线似乎是最好的方法。无论如何,谢谢你的回答。

– m3nda
15年3月21日在6:27

不会cmd; !!只需在一行上重复在当前行之前输入的命令?它必须是两个单独的历史记录条目。

–乔尔·普拉(Joel Purra)
2015年4月28日在7:16



更换;使用&&可以在第一次失败时停止。

–user881300
19-10-6在8:41

#4 楼

与以前的答复类似,但不需要for循环:

评论


这只会执行一次执行echo“ hello” 1 2 3 4 5 6 7 8 910。您需要为每个输入(数字)的一个进程运行带有-n 1的xargs,为并行执行(10并行运行)使用-P 10流程)。以seq 10结尾| xargs -n 1 -P 10回显。

–亚历山大·克里姆采切克(Alexander Klimetschek)
17-4-26在22:08



#5 楼

尝试以下操作:

yes ls | head -n5 | bash


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

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

#6 楼

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 {}

并行命令,并且有很多很酷的选择。
用变量定义

评论


GNU Parallel的构建具有很高的可移植性。大多数平台都很好地支持sh,zsh,ksh和bash。 csh,tcsh,fish有一些支持。使用parallel --embed,您甚至可以构建一个可以轻松移动到未安装GNU Parallel的系统的脚本。

–奥雷·丹吉(Ole Tange)
18/12/19在0:35

#7 楼

在macOS上,可以使用repeat命令。

repeat 10 ps aux | grep someprocess


#8 楼

上面的@ eduardo-ivanec run函数的鱼壳实现

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


#9 楼

那将是“监视”-应该几乎是所有使用procps的unix系统的一部分。例如,

watch "df -hP | grep /tmp" 


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

评论


手表已经有答案了...见右下方...

– mahatmanich
18年6月22日在6:57