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

おすすめ記事