我正在使用輸出作業目前狀態的腳本來監視 FreeBSD 中的進程。
使用csh
內建命令repeat
,我想每 2 秒運行一次腳本,所以我天真地想做這樣的事情:
repeat 100000 ./dumpstatus ; sleep 2
顯然分號不會按預期工作,但我找不到包含它的正確語法。
我可以透過在以下位置呼叫新的 shell 實例來解決此問題repeat
:
repeat 100000 sh -c 'path/to/script/dumpstatus ; sleep 2'
但這並不理想,而且pwd
也沒有從當前的路徑中走出來,這很煩人:)
我也嘗試過repeat 10000 ( ./dumpstatus ; sleep 2)
使用或不使用轉義括號,這也不起作用,我也不完全確定為什麼。
在不調用的情況下執行此操作的正確方法是什麼sh -c
,以便分號被解釋為我希望的那樣?
答案1
我相信不呼叫 shell 是不可能的,正如 csh 手冊頁所述(部分):
重複計數命令
指定的指令與上面一行 if 語句中的指令受到相同的限制,被執行 count 次。 …
結合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
....顯示 script.sh 從父親 shell 的 $PWD 執行。
答案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.