Bash에서 명령이 완료되면 지속적으로 명령을 다시 실행


62

어떤 이유로 (오류 또는 다른 이유로) 명령이 완료 될 때마다 명령을 계속 다시 실행하는 간단한 방법을 찾으려고합니다.

이것에 접근하는 가장 좋은 방법은 무엇입니까?

편집 : 나는 충분히 명확하지 않았다. 이전 실행이 끝날 때까지 다음 실행을 기다려야 합니다.

편집 2 : 거의 모든 답변이 훌륭하게 작동합니다. 실수로 대부분의 답변이 프로세스를 포크하거나 다시 한 번만 다시 실행한다고 생각했습니다.

linux  bash 

1
여전히 명확하지 않습니다. 어떤 프로그램을 실행하고 있는지 언급하면 ​​도움이 될 것입니다.
Daniel Beck

1
-1이 질문은 사용자가 제안한 내용을 실제로 시도하는 대신 답변이 효과가 없다고 언급 한 것처럼 연구 노력을 보여주지 않습니다.
다니엘 벡

답변:


39

이것은 계속 반복해서 실행되는 무한 루프를 만듭니다 command.

while :
    do
        command
done

원래 질문에 대한 수정 사항을 참조하십시오. 한 번이 아니라 계속해서 다시 실행해야합니다.

8
@ calcifer이 답변은 아주 잘 작동합니다. 프로그램에 특이한 점이 있는데, 지금까지 네 명의 사용자 중 아무도 대답하지 않았으며 언급하지 못했습니다.
다니엘 벡

@ calcifer 이것은 무한 루프입니다. 시간이 끝날 때까지 계속 반복됩니다 (물론 스크립트가 종료 될 때까지)
Nate Koppenhaver

1
내 나쁜, 나는 이것이 (그리고 다른 모든 대답들) 프로세스를 포크하거나 한 번만 다시 실행할 것이라고 생각했다. 예,이 대답은 효과가 있습니다. 감사.

1
: 버전은 한 줄 while true; do echo 'Hit CTRL+C'; sleep 1; done, 감사하는 cyberciti.biz/faq/bash-infinite-loop
jk2K

107

watch명령은 지정된 간격으로 영원히 명령을 반복합니다 :

watch -n0 <command>

-n0으로 설정 하면 간격이 전혀 없어집니다 (실제로는 0.1 초라고 생각합니다).

watch 또한 시각적 변경 사항을 쉽게 볼 수 있도록 출력을 정렬 할 수있는 추가 이점이 있으며 마지막 실행의 변경 사항을 강조 표시하는 스위치가 있습니다.

참조 : watch man page :

watch는 명령을 반복해서 실행하여 출력을 표시합니다 (첫 번째 화면 가득 참). 이를 통해 시간에 따른 프로그램 출력 변경을 볼 수 있습니다. 기본적으로 프로그램은 2 초마다 실행됩니다. 다른 간격을 지정하려면 -n 또는 --interval을 사용하십시오.

중단 될 때까지 시계가 실행됩니다.


원래 질문에 대한 수정 사항을 참조하십시오.

6
이 답변을 포함하여 지금까지 모든 답변 이이 작업을 수행합니다. 특별히 요청하지 않는 한 리눅스는 포크하지 않습니다.
Paul

포크에 대해서는 몰랐어요. 감사합니다.

이 방법을 사용하여 출력을 볼 수 없습니다.
Raffi Khatchadourian

@RaffiKhatchadourian watch ls파일이 들어있는 디렉토리에 있다면 아무 것도 얻지 못한다고 말하는가 ?
Paul

17

간단한 해결책은 다음과 같습니다.

yourcommand; !#

;명령을 분리하여 한 줄에 여러 명령을 허용합니다 ( Bash : Lists )

!#bash에게 "지금까지 쓴 모든 내용을 반복합니다"( Bash : Event-Designators )


1
미안, 나는 충분히 명확하지 않았다. 한 번이 아니라 계속해서 다시 실행해야합니다.

고마워, 나는 그것을 찾고있었습니다. 특히 yourcommand; !!실제로 같은 줄에서 명령으로 작동하지 않기 때문에 !#그렇게 보입니다. 건배!
sdaau

; !#
ZSH에서

7

대화식이 아닌 경우 명령 실행 중에 미리 계획 !!하고 이전 명령을 다시 실행할 명령을 입력 할 수 있습니다. 이것은 예를 들어 동안 작동합니다 ping -c 5.


다음에서 함수를 정의 할 수도 있습니다 bash.

function repeat { "$@"; "$@"; }

이를 유지하려면에 저장하십시오 ~/.bashrc.

그런 다음 다음과 같이 명령을 실행할 수 있습니다.

repeat ping -c5 heise.de

당신이 반복적으로 실행 (그리고 예하지하고자하는 특정 명령이라면 어떤 명령을), 당신은 대체 할 수있는 "$@"실제 명령으로 그 코드에서, 그리고 기능 등의 이름을 repeat_ping대신.


무한 루프로 만들기 위해 @Dennis가 제안하는 것을 할 수 있습니다. 다음과 같이 대화식 쉘에서 이것을 사용하려면 대기 시간을 추가하는 것이 좋습니다.

function repeat { while 1 ; do "$@" ; sleep 1 ; done; }

그렇지 않으면를 사용하여이 무한 루프를 중단하는 것이 다소 불편합니다 Ctrl-Z.


원래 질문에 대한 수정 사항을 참조하십시오.

6
@calcifer이 실행은 프로그램 호출이 반환 될 때까지 기다립니다. 프로그램이 쉘에서 분리되어 종료되기 전에 리턴됩니까?
Daniel Beck

내 나쁜, 나는 이것이 (그리고 다른 모든 대답들) 프로세스를 포크하거나 한 번만 다시 실행할 것이라고 생각했다. 예,이 대답은 효과가 있습니다. 감사.

4

while루프에 다음과 같은 부울 조건을 제공하십시오 .

#!/bin/bash

while true; do

    do_something && wait

done

이것은 bash가 프로세스를 종료하라는 신호를받을 때까지 계속해서 실행됩니다. 일반적으로의 형태로 ctrl+c.

watch명령을 사용하여 스크립트를 반복적으로 실행할 수도 있습니다 . 예를 들어 bash 터미널의 간단한 시계 watch는 다음과 같습니다.

$ watch -t -n1 date +%T

-t옵션 watch은 실행중인 프로세스의 제목을 표시하지 않도록 지시 합니다. 반복되는 명령 만 깔끔하게 출력합니다. 이 -n1옵션은 매초마다 시계가 반복되도록합니다 n. 이 경우 초 -n1간격이 1됩니다. 그런 다음 date +%T명령은 명령 완료시 시간을 표시합니다. 이 명령을 수행하면 터미널에서 활성 시계가 제공됩니다.

그리고 다른 답변에없는 또 다른 방법은 무한 함수 호출입니다.

do_something() { do_something }; do_something && wait

이것은 while재귀 함수 호출 만 사용 하는 부울 루프 와 본질적으로 동일 합니다.

(편집) 머신의 리소스를 염두에두고 && wait프로세스를 실행할 때마다 다음 반복 전에 프로세스가 종료 상태 0으로 끝날 때까지 루프가 "대기"되도록 추가했습니다 . 이것은 대화식 쉘 스크립트에서 유용합니다.


1
거기에있다 while루프 예는하지만 부울 사용하지 않는 true구문을. 거기에있다 watch예는하지만 많은 유용한 구문을 제공하지 않습니다. 나는 그것이 도움이 될 수있는 사람들을 위해 이것들을 설명하고 있습니다. 나는 이것들에 실질적인 유용성을주고 싶었다. while루프 부울도 할 수 있습니다 false및 허위 조건이 충족 될 때까지 실행할 수 없습니다. 꽤 편리합니다.

1
@ Spittin'IT 귀하의 편의를 위해 다른 답변에 사용되지 않는 방법을 추가했습니다.

충분히 공정하고 이해합니다 ... 리뷰 모듈을 통해 갔지만 편집하고 후속 조치를 취하면서 댓글을 달았습니다.
Pimp Juice IT

if재실행 은 어떻게 계속됩니까?
Kamil Maciorowski

좋은 지적 카밀. 재귀 롤을 만드는 것을 잊었습니다. if명령문 에서 자신을 호출하는 함수를 사용하여 편집 할 때 수정되었습니다 .

0

이것은 bash에서 명령을 반복하는 데 사용하는 또 다른 방법입니다. 스크립트 작성과 관련이 없으며 많은 사람들에게 알려지기 때문에 일부에게는 어리석게 들릴 수 있습니다. 그러나 기억해야 할 구문이 많지 않다는 점에서 빠르고 초보자에게 친숙하기 때문에 언급 할 가치가 있다고 생각합니다. 우분투의 그놈 터미널에서만 이것을 테스트했으며 다른 터미널은 이것을 지원하지 않을 수 있습니다.

  1. 터미널에 명령을 한 번 입력하십시오.
  2. 마우스로 개행 문자를 포함하는 명령을 선택하십시오.
  3. Ctrl-Insert 또는 상황에 맞는 메뉴 (일반적으로 마우스 오른쪽 버튼으로 액세스)를 사용하여 선택 항목을 복사하십시오.
  4. Shift-Insert를 사용하여 명령을 실행하려는 횟수만큼 붙여 넣으십시오.

각 명령이 완료 될 때까지 붙여 넣기를 기다릴 필요가 없습니다. 붙여 넣은 명령이 대기열에 들어가고 차례로 실행됩니다.


0

오늘 기분이 좋아

무한 스트림 중 하나에서 읽고 파이프 xargs

cat /dev/zero | xargs --null echo hello there

거기에 약간의 휴식을 취해야한다면 실행해야 할 것입니다. sh

cat /dev/zero | xargs --null sh -c "echo hello there && sleep 3"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.