シェルスクリプトが対話的に実行されているかどうかを確認するのに混乱があります。

シェルスクリプトが対話的に実行されているかどうかを確認するのに混乱があります。

POSIXシェルスクリプトがインタラクティブに実行されていることを確認したいのですが、何らかの理由で次の機能が実行されていることを確認したいと思います。

running_interactively()
{
    printf '%s' ${-} | grep -F i > /dev/null 2>&1
}

端末でスクリプトを実行しても false が返されます。私は何か間違っているのでしょうか、それとも端末でユーザーがスクリプトを実行するという単純な考え方と対話型スクリプトの定義が異なるのでしょうか?


コードセグメント:

#!/bin/sh

set -u

running_interactively()
{
#   echo $- returns only u
    printf '%s' ${-} | grep i > /dev/null 2>&1
}

print_error_and_exit()
{
    # redirect all output from this function to standard error stream
    if running_interactively
    then
        exec >&2
    else
        echo wrong again, smart ass
    fi
...
}

print_error_and_exit someArgs

ベストアンサー1

シェルスクリプトは、インタラクティブシェルで起動しない限り、インタラクティブシェル環境ではほとんど実行されません。これは$-含まれないことを意味しますi

あなたは何ですかできるチェックの目的は、標準入力が端末に接続されていることを確認することです。これは-t、引数(標準入力ストリームのファイル記述子)を含む0テストを使用して行われます。

running_interactively () { [ -t 0 ]; }

これは、「対話的に実行」が「端末から直接入力を読み取ることができる」ことを意味すると仮定する。

スクリプト内の完全なユーザー対話テストでは、ファイル記述子2(標準エラー)に対して追加のテストを実行できます。ユーザーの対話は、主に標準入力(ユーザー入力)と標準エラー(プロンプト、診断メッセージなど)で発生します。

running_interactively () { [ -t 0 ] && [ -t 2 ]; }

ただし、スクリプトの出力がリダイレクトまたはパイプされている場合、ファイル記述子1(標準出力)のテストは失敗します。

おすすめ記事