작업의 현재 상태를 출력하는 스크립트를 사용하여 FreeBSD의 프로세스를 주시하고 있습니다.
csh
내장 명령을 사용하여 repeat
2초마다 스크립트를 실행하고 싶으므로 순진하게 다음과 같은 작업을 수행하고 싶습니다.
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.