より良いオプションがある場合は、ターミナルに接続されていない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
すべてのシステムが説明に記載されているコードを使用するわけではありません。 Debian はat
そうではありません。POSIX は実装定義を保持します。。上記の方法は、使用されているシェルに関係なく機能します(Korn / POSIXに似ている場合)。