5

特定の ksh 呼び出しが対話型シェルを実行しているかどうかを判断するための推奨される方法は何ですか?

ENV非対話型の ksh 呼び出し (シェル スクリプトの実行時など) でスキップしたいコマンドがファイルにいくつかあります。

私は次の範囲提案を見てきました:

if [[ $- = *i* ]]; then
    # do interactive stuff
fi

...シェルがこの不可解な呪文.kshrcを使用してインタラクティブであると判断されない限り、調達さえしないように:

ENVIRON=$HOME/.kshrc                                    export ENVIRON
ENV='${ENVIRON[(_$-=1)+(_=0)-(_$-!=_${-%%*i*})]}'       export ENV
4

4 に答える 4

5

$- 変数の 'i' フラグをチェックすることが、ksh での最良の方法であることがわかりました。

if [[ $- = *i* ]]; then
    #do interactive stuff     
fi
于 2011-07-22T19:43:57.933 に答える
2

bashでは、これら 2 つのメソッドが内部でよく使用されます~/.bashrc

  • stdinttyかどうかを確認します。

    [ -t 0 ] || return
    

    また

    if [ -t 0 ]; then
        # do interactive stuff
    fi
    
  • プロンプト ( $PS1) が設定されているかどうかを確認します。

    [ -z "$PS1" ] || return
    

しかし、kshでそれを行う方法がわかりません。

于 2009-06-03T15:08:04.913 に答える
0

「tty -s」を使用することもできます。

The following exit values are returned:

  0        Standard input is a terminal.

  1        Standard input is not a terminal.
于 2012-06-13T15:56:13.020 に答える
0

適切な KSH シェルは、スクリプトの実行時に $ENV を呼び出すべきではありません。ただし、これは Sun の方言に長い間存在するバグでksh88あり、実際には Solaris 10 の後半にパッチが適用されました。勝った。)

スクリプトの実行時に Sun の ksh88 が $ENV を読み取らないようにするために、回避策を使用するのが一般的であり、ぶらぶらし#!/bin/ksh -pていなければ安全でした。/etc/suid_profile

ただし、 $-、偽造しない限り、対話型シェルの信頼できる指標です。

$ cat interactive.sh
echo \$- = $-
[[ $- == *i* ]] && echo interactive || echo not interactive

スクリプトとして実行すると、次のようになります。

$ ksh  interactive.sh
$- = hB
not interactive

フラグを偽造すると-i、あなたが求めるものが得られます。

$ ksh  -i interactive.sh
$- = imBE
interactive

そして、対話型シェルから供給された場合、それは正しいことを行います:

$ . ./interactive.sh
$- = imsBEl
interactive
于 2012-09-07T09:32:38.687 に答える