at(1) 및 배치(1) 명령에 대한 세부 옵션 설정

at(1) 및 배치(1) 명령에 대한 세부 옵션 설정

더 나은 옵션이 있는 경우 터미널에 연결되지 않은 stdin에서 명령을 읽는 쉘에 대해 verbose 및 xtrace 옵션을 자동으로 설정하려고 합니다(테스트는 at(1) 및 배치(1)에 의해 수행되는 프록시입니다). 또한 허용됩니다).

원래 하고 싶었는데

if [[ -o SHIN_STDIN ]] && ! test -t 0 ; then
    PS4="> "
    setopt verbose xtrace
fi

[[ -o SHIN_STDIN ]] && !test -t 0 && echo OK내 .zshenv에서는 이 문제를 해결할 수 있지만 .zshenv가 올바르게 실행되고 일괄 시작 시 예상되는 이메일을 받았는지 확인했지만 그렇지 않습니다 .

내가 무엇을 놓치고 있나요?

tcsh는 이러한 쉘을 대화형으로 간주합니다(프롬프트를 null이 아닌 값으로 설정함). zsh는 그렇지 않습니다(테스트를 위해 -o Interactive를 사용하고 .zprofile, .zshrc를 읽지 않음). 내가 이상하게 생각하는 점은 -o SHIN_STDIN 값이 .zshenv와 일괄 등록 명령 실행 사이에서 변경된다는 것입니다.

답변1

sh_in_stdinon소스 파일을 해석하거나 해석할 때는 그렇지 않습니다 ~/.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원할 때 대신 이를 사용하십시오 .atbatch

$SHELL모든 시스템이 설명에 제공된 코드를 사용하는 것은 아닙니다 . 데비안은 at그렇지 않습니다.POSIX는 구현 정의를 유지합니다.. 위의 방법은 사용된 셸에 관계없이 작동합니다(Korn/POSIX와 유사한 경우).

관련 정보