Bashオプションとインタラクティブシェル

Bashオプションとインタラクティブシェル

bashの-sオプションは実際には何もしないようです。

コマンドを実行しても何の変更もありません。本当に混乱しているのは、シェルスクリプトを実行すると常にインタラクティブシェルが表示されるようです。スクリプトで読み取り組み込み関数を使用すると、常に入力するように求められますので、対話型であるとします。これで対話型になりますか?

シェルスクリプトはFedoraでインタラクティブに実行されますか? -sが違いを生み出す例はありますか?マニュアルページを読んだが効果的な例を直接生成することはできないようです。 sを使用してスクリプトが入力を受け取る方法を変更しようとしているので、両方の質問をマージし、いくつかのチュートリアルでは効果があると言います。私はそれがパラメータを設定できることを知っています。私が理解していないのは、常にやっているように見えるstdinで読むように変更する方法です。

私がテストした内容です。

if [ -v $PS1 ]
then
  echo non-interactive
else
  echo interactive
fi
read ; echo $REPLY

読み取りは常に非対話型シェルで動作します。

非対話型シェルでfd / 0とfd / 1の存在をテストしてもまだ存在します。

事前にありがとう

答え1

Bashは、入力/出力が端末に接続されていることを確認して、対話型であるかどうかを判断します。

非対話-s型スイッチを使用すると、bashスクリプトがファイルからコマンドを読み取るときに位置引数を処理できます。たとえば、

$ cat demo.sh
echo '$0 = ' $0
echo '$1 = ' $1
echo '$2 = ' $2

$ bash < demo.sh foo bar
bash: foo: No such file or directory

$ bash -s < demo.sh foo bar
$0 =  bash
$1 =  foo
$2 =  bar

答え2

この-sオプションを使用すると、bashは標準入力からコマンドを読み込みます。このオプションがない場合、bash は最初の引数を実行するスクリプトの名前として扱います。このオプションを使用すると、bashはすべての引数を標準入力から読み取るスクリプトの引数として扱います。この-sオプションは、シェルインスタンスが対話型かどうかではなく、bashがコマンドライン引数を解釈する方法のみを決定します。

このオプションを使用してbashインスタンスを-i起動すると、常に対話型になります。それ以外の場合は、-iスクリプト名が渡されず(これに影響を与える)、標準入力と標準エラーの両方が端末に接続されている場合-sにのみインタラクティブになります。

テストでは、PS1シェルインスタンスが対話型であるかどうかはわかりません。PS1対話型シェルから設定を解除できます。対照的に、非対話型シェルは一般にPS1環境を継承する。シェルが対話的に実行されているかどうかをテストする安定した方法は、含まれているかどうかをテストすること$-ですi

このread組み込み関数は、対話式であるかどうかにかかわらず、どのシェルでも実行できます。 (リダイレクトされない限り)シェルの標準入力に接続されているすべてのものから読み込みます。 bashが実行中のスクリプトから読み取っているのと同じファイル記述子から読み取ろうとすると、最終的にスクリプトから1行をスキップします(必ずしも必要な場所ではありません)。たとえば、bashにいる場合はスクリプトを渡します。標準入力に対して端末から1行を読むには、呼び出しをリダイレクトする必要がありますreadread line </dev/tty

ファイル記述子0、1、2は常に存在します(閉じていない場合)。これらはそれぞれ標準入力、標準出力、標準エラーです。シェルが対話型であるかどうかは、fd 0 と 2 が端末であるかどうかがシェルの対話型状態に影響することを除いて、標準記述子が指すものとは何の関係もありません。

1はい、これについて説明するWebページがあることを知っています。彼らは間違っていた。

答え3

対話型シェルに関する追加情報:

シェルが対話型であることを確認できます$-$-含まれている場合、iシェルは対話型です。

シェルがユーザーの入力を直接読み取る場合は対話型です。非対話型シェルは、ファイルから1行ずつコマンドを読み取り、実行します。スクリプト内のstdinから何かを読むとき、「スクリプトはシェルではなく入力を読み取るので」シェルをインタラクティブにしません(これをよりよく説明する方法がわかりません)。

    labdebian# cat ./test
    #!/bin/bash
    echo Hello World
    echo $-
    read; echo $REPLY
    echo $-

    labdebian# bash test
    Hello World
    hB
    I'm typing this
    I'm typing this
    hB

    labdebian# bash -i test
    Hello World
    himB
    I'm typing this
    I'm typing this
    himB

答え4

-sシェルをインタラクティブにしません。代わりに使用してください-i

関連情報