더 나은 옵션이 있는 경우 터미널에 연결되지 않은 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_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와 유사한 경우).