bash 쉘을 사용하여 명령을 여러 번 실행하는 방법은 무엇입니까?


153

명령 (예를 실행할 수있는 방법이 있나요 ps aux|grep someprocess용) n 개의 시간은?

다음과 같은 것 :

run -n 10  'ps aux|grep someprocess'

대화식으로 사용하고 싶습니다. 스크립트를 게시하지 마십시오.

업데이트 : 내가 묻는 이유는 많은 컴퓨터에서 작업하고 모든 컴퓨터에서 동일한 기능을 얻기 위해 모든 스크립트로 모든 스크립트를 가져오고 싶지 않기 때문입니다.


답변:


197

Bourne 쉘 for루프가 설계된 것의 사소한 하위 세트이므로 이와 같은 명령 또는 셸 내장이 존재한다고 생각하지 않으므로 이와 같은 명령을 구현하는 것은 매우 간단합니다.

우선 더미 for루프를 사용할 수 있습니다 .

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

또는 시퀀스를 생성하기 위해 Bash 내장을 사용하여 JimB의 제안과 동일합니다.

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

이것은 실행 열 번 반복 할 command때마다 - 그것은 파이프 나에 의해 분리되는 일련의 명령이 될 수 ;또는 &&. $i변수를 사용하여 현재 반복을 알 수 있습니다 .

이 한 줄짜리 스크립트를 스크립트로 간주하고 바람직하지 않은 (그러나 아마도 유효한) 이유로 인해 .bashrc (unested)에서 다음과 같은 명령으로 구현 할 수 있습니다.

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

용법:

run 10 command

예:

run 5 echo 'Hello World!'

16
@mahatmanich, 루프는 스크립트가 아닙니다. 대화 형 터미널에서 ...를 사용하는 데 방해가되는 것은 없습니다.
Zoredache

3
글쎄, 위의 하나의 라이너는 그것을하는 표준 방법의 일종이며 상당히 간단합니다. 왜 안 좋은가요? 어쩌면 당신은 잘못된 질문을하고 있습니까? 여러 번 반복하려는 스크립트 또는 작업의 주요 목표는 무엇입니까? 문제를 다른 방식으로 놓으면 더 나은 해결책이있을 수 있습니다.
Patkos Csaba 8:25에

6
@mahatmanich - for 이다 내장 반복하는의 배쉬.
JimB

3
@Eduardo Ivanec-참고로, bash는 seq다음 과 같은 내장 범위를 가지고 있습니다 . {1..10}
JimB

1
내장 브래킷 시퀀스는 변수 대체를 지원하지 않는 것 같습니다 ( stackoverflow.com/a/3737773/713554 참조 ). 당신이 준 기능은 .bashrcif {1..$number} 와 교환 될 때 완벽하게 작동합니다 `seq $number`.
Leo

29

ps aux | grep someprocess일정 시간 동안 프로그램 변경 사항을보고 싶은 것 같습니다. Eduardo는 귀하의 질문에 정확하게 대답하는 대답을 주었지만 대안이 있습니다. watch:

watch 'ps aux | grep someprocess'

쉘이 명령을 "run watch ps aux"로 해석하지 않고 결과를 파이프하는 것을 피하기 위해 명령을 작은 따옴표로 묶었습니다 grep someprocess. 이전 명령을 수행하는 다른 방법은 다음과 같습니다.

watch ps aux \| grep someprocess

기본적으로 watch2 초마다 새로 고침되며 -n옵션을 사용하여 변경할 수 있습니다 . 예를 들어 1 초 간격을 유지하려는 경우 :

watch -n 1 'ps aux | grep someprocess'

21

재미로

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

누군가 이것을 설명해 주시겠습니까? 매우 흥미로운 것 같습니다.
Daniel Vartanov

4
; 그냥 명령 구분자입니다. !! bash에서 마지막 명령을 재생하십시오. 따라서 'pgrep ssh'를 실행 한 다음 6 번 재생하십시오.
Piotr Kukielka

그것은 유익하지만 직관적이지 않습니다. 한 줄짜리 for가 가장 좋습니다. 어쨌든 대답 주셔서 감사합니다.
erm3nda

1
cmd ;!!한 줄 에 현재 줄 앞에 입력 한 명령을 반복 하지 않습니까? 두 개의 별도 history항목 이어야 합니다.
Joel Purra

교체 ;와 함께 &&첫 번째 실패에 중지 할 수 있습니다.
user881300

16

이전 답변과 비슷하지만 for 루프가 필요하지 않습니다.

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

인수 또는 옵션이없는 xargs에 seq의 파이프 출력


2
이것은 한 번만 실행 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

16

이 시도:

yes ls | head -n5 | bash

이를 위해서는 약간의 성능 저하로 하위 셸에서 명령을 실행해야합니다. YMMV. 기본적으로 문자열 "ls"를 N 번 반복하기 위해 "yes"명령을받습니다. "head -n5"는 루프를 5 번 반복하여 종료합니다. 최종 파이프는 선택한 쉘로 명령을 보냅니다.

우연히도 csh같은 쉘에는 기본 제공 repeat명령이 있습니다. 이것을 사용하여 bash 서브 쉘에서 명령을 실행할 수 있습니다!


5

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 : //.com/questions/169511/how-do-i-iterate-over-a-range-of-numbers-defined-by-variables-in-bash


GNU Parallel은 이식성이 매우 뛰어납니다. sh, zsh, ksh그리고 bash잘 대부분의 플랫폼에서 지원됩니다. csh, tcsh, fish약간의 지원이 있습니다. 또한 parallel --embedGNU Parallel이 설치되어 있지 않은 다른 시스템으로 쉽게 이동할 수있는 스크립트를 작성할 수도 있습니다.
Ole Tange

2

의 @ eduardo-ivanec run함수 의 피쉬 쉘 구현

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

0

그것은 'watch'일 것입니다-procps를 사용하는 거의 모든 유닉스 시스템의 일부 여야합니다

시스템에서 fs 변경이나 흥미로운 움직임을 볼 수 있습니다. 예를 들어

watch "df -hP | grep /tmp" 

명령을 인수로 입력하십시오 (참조 man watch).


시계 대답은 ... 바로 아래 참조 ... 이미 있습니다
mahatmanich

0

macOS에서는 repeat명령을 사용할 수 있습니다 .

repeat 10 ps aux | grep someprocess
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.