Ctrl-C를 사용하여 수동으로 종료 할 때까지 여러 명령을 실행할 수있는 "영구"함수를 작성하고 싶습니다. 기본적으로 zsh 명령 줄에서이 작업을 수행 할 수 있으며 제대로 작동합니다.
$ while {} { ls ; sleep 1 }
반복되는 전화 ls
와 sleep 1
, 영원히.
그런 것을 함수로 바꾸는 구문을 알아낼 수 없습니다. 다음과 같은 것 :
forever() { while {} { "${@}" } }
그런 다음 다음과 같이 호출하고 싶습니다.
$ forever ( ls ; sleep 1 )
아마 바보 같다 때 while {} {<commands>}
와 forever {<commands>}
거의 매우 차이가 없습니다. 하지만 최종 목표로서 제가 정말로 원하는 것은 "영원히 잠자기"기능입니다.
$ forever-sleep 5 ls -l
$ forever-sleep 5 ( ls -l a ; ls -l b )
그리고 $1
명령을 실행 한 후 몇 초 후에 영원히 잠을 자게 됩니다 (Ctrl-C로 수동으로 죽일 때까지).
(나는 조합을 많이하고 중첩을 시도했습니다 ()
, (())
, {}
, []
, [[]]
, ""
, ''
, 등, 난 그냥 기능과 구문 오류, 구문 분석 errrors 등을하지 않는 명령 줄을 모두 활용하는 방법을 알아낼 수 없습니다를 )
그래서,
.zshrc
별도의 실행 가능한 쉘 스크립트를 사용하는 것보다 내가 넣을 수있는 함수를 선호합니다 .)거의 완료되었습니다.
forever-sleep() {
if [[ ! $1 -gt 0 ]]; then
print "Usage $0 [time in sec] command -parameter"
return 2
fi
local time=$1
shift 1
while true; do
eval "$@"
print -- "### finished: $(date) ###############################################"
sleep $time
done
}
구문은 다음 forever-sleep [time in sec] command -parameters
과 같습니다.
$ forever-sleep 2 date +%s
1373873888
1373873890
1373873892
1373873894
...
몇 가지 언급 :
$1 -gt 0
첫 번째 매개 변수가을 평가하여 수치 적으로 표시되는 경우 기초적인 검사를 구현합니다 $1 > 0
. 부정적인 대기 시간은 합리적이지 않은 것 같습니다.while true; do ... done
했지만 while {} {...}
구문도 작동합니다.shift 1
함수의 첫 번째 인수를 버리는 데 사용됩니다 (에 저장되어 $time
나중에 "$@"
편의를 위해 변수를 사용할 수 있음).eval "$@"
단순한 것과는 대조적으로 다음 "$@"
과 같은 고급 작업을 수행 할 수 있습니다.
forever-sleep 2 'foo=$(date); echo $foo'
후자의 명령에서 작은 따옴표를 확인하십시오!
;)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다