명령 문자열에 세미콜론이 포함된 "반복" 구문이 있습니까?

명령 문자열에 세미콜론이 포함된 "반복" 구문이 있습니까?

작업의 현재 상태를 출력하는 스크립트를 사용하여 FreeBSD에서 프로세스를 모니터링하고 있습니다.

csh내장 명령을 사용하여 repeat2초마다 스크립트를 실행하고 싶기 때문에 순진하게 다음과 같은 작업을 수행하고 싶습니다.

  • repeat 100000 ./dumpstatus ; sleep 2

분명히 세미콜론이 예상대로 작동하지 않지만 이를 포함할 올바른 구문을 찾을 수 없습니다.

다음 위치에서 새 셸 인스턴스를 호출하여 이 문제를 해결할 수 있었습니다 repeat.

  • repeat 100000 sh -c 'path/to/script/dumpstatus ; sleep 2'

하지만 이는 이상적이지 않으며 pwd현재 경로에서 벗어나지 않아 짜증스럽습니다. :)

또한 이스케이프 대괄호를 사용하거나 사용하지 않고 시도했지만 repeat 10000 ( ./dumpstatus ; sleep 2)작동하지 않으며 이유를 완전히 모르겠습니다.

sh -c세미콜론이 내가 원하는 대로 해석되도록 호출하지 않고 이 작업을 수행하는 올바른 방법은 무엇입니까 ?

답변1

csh 매뉴얼 페이지에 (부분적으로) 명시되어 있듯이 셸을 호출하지 않으면 불가능하다고 생각합니다.

반복하다계산 명령

지정된 명령에는 위 if 문의 명령과 동일한 제한이 적용되며 횟수만큼 실행됩니다. ...

결합된 if설명:

만약에 (표현)주문하다

...명령은 별칭, 파이프, 명령 목록 또는 괄호로 묶인 명령 목록이 아닌 간단한 명령이어야 하지만 인수를 가질 수 있습니다.

...제 생각에는 다른 옵션이 배제됩니다.

귀하의 예에서는 $PWD 오류를 재현할 수 없습니다 sh -c. 내 홈 디렉토리에 다음 스크립트가 제공됩니다.

$ cat ~/script.sh
#!/bin/sh
echo $0 pwd is $PWD

그리고 예제를 실행해 보세요:

$ csh
$ echo $version
tcsh 6.18.01 (Astron) 2012-02-14 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,color,filec

$ cd /tmp
$ repeat 2 sh -c '~/script.sh; sleep 2'
/home/me/script.sh pwd is /tmp
/home/me/script.sh pwd is /tmp

...부모 쉘의 $PWD에서 실행되는 script.sh를 보여줍니다.

답변2

repeat명령 목록을 구문 분석할 수 없기 때문에 완료할 수 없습니다. 나는 csh man이렇게 분명히 말할 수 있었으면 좋겠다 .

 repeat count command
         The specified command must be a simple command, (not a pipeline, not a
         command list, nor a parenthesized command list), and is executed count
         times.  I/O redirections occur exactly once, even if count is 0.

while루프 해결 방법을 사용하는 것이 실용적이지 않게 만드는 단일 리디렉션 제한에 유의하세요 . 예, 9개의 생명을 인쇄하지 않는 경우:

echo lives | repeat 9 cat | wc -l
1

원천: 실제 인용문 man csh(항목을 먼저 읽은 repeat다음 if항목을 읽음)은 약간 우회적입니다.

COLUMNS=90 man csh | egrep -A 7 ' (repeat|if).*and$' | sed -n '1,13{s/^ \{10\}//p}'
 if (expr) command
         If the specified expression evaluates to true, then the single
         command with arguments is executed.  Variable substitution on
         command happens early, at the same time it does for the rest of the
         if command.  command must be a simple command, not a pipeline, a
         command list, or a parenthesized command list.  Input/output redi‐
         rection occurs even if expr is false, i.e., when command is not exe‐
         cuted (this is a bug).
 repeat count command
         The specified command, which is subject to the same restrictions as
         the command in the one line if statement above, is executed count
         times.  I/O redirections occur exactly once, even if count is 0.

관련 정보