터미널에 연결되지 않은 표준 입력에서 명령을 읽는 쉘에 대해 verbose 및 xtrace 옵션을 자동으로 설정하려고합니다 (이 테스트는 at (1) 및 batch (1)에 의해 실행되는 프록시입니다. 명령, 더 나은 명령이있는 경우에도 허용됩니다).
그래도 가질거야
if [[ -o SHIN_STDIN ]] && ! test -t 0 ; then
PS4="> "
setopt verbose xtrace
fi
내 .zshenv에서 트릭을 수행하지만 .zshenv가 실제로 올바르게 실행되고 [[ -o SHIN_STDIN ]] && !test -t 0 && echo OK
배치로 시작할 때 예상 이메일을 수신 하는지 확인했지만 그렇지 않습니다 .
내가 무엇을 놓치고 있습니까?
참고 tcsh는 이러한 쉘을 대화식으로 간주합니다 (프롬프트를 널이 아닌 값으로 설정). zsh는 그렇지 않습니다 (-o interactive를 사용한 테스트, .zprofile, .zshrc는 읽지 않음). 이상한 점은 -o SHIN_STDIN .zshenv와 일괄 처리로 등록 된 명령 실행 사이의 값 변경입니다.
sh_in_stdin
on
해석하는 동안 ~/.zshenv
또는 소스 파일을 해석 할 때가 아닙니다 (이 경우 쉘 코드는 stdin에서 나오지 않습니다). 당신은 추가하여 확인할 수 있습니다 echo $options[shinstdin]
당신에게 ~/.zshenv
, 또는 실행 :
$ echo 'echo $options[shinstdin]; source =(<<<"echo \$options[shinstdin]")' | zsh
on
off
대신 $PPID
실행 중인지 확인할 수 있습니다 atd
.
if [[ $(ps -o comm= -p $PPID) = atd ]]; then...
개인적으로 저는 zsh
atd에서 실행되는 모든 호출에 대해 무조건적으로 수행한다는 생각이 마음에 들지 않습니다 .
항상 다음을 수행하는 debug-at
명령을 정의 할 수 있습니다 .
debug-at() {
{
echo 'PS4="> "; set -o verbose -o xtrace'
cat
} | at "$@"
}
그리고 디버깅을 켜고 / 작업을 실행 at
하려는 경우 대신 사용하십시오 .at
batch
모든 시스템 $SHELL
이 제공된 코드를 해석하는 데 사용하는 것은 아닙니다 . 데비안은 at
그렇지 않습니다. POSIX는 구현 정의 상태로 둡니다 . 위의 접근 방식은 어떤 쉘이 사용되는지에 관계없이 작동합니다 (Korn / POSIX와 유사한 경우).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다