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

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

またはを使用してコマンドを実行すると、何も変わらない。本当に混乱するのは、シェルスクリプトを実行すると、常にインタラクティブなシェルを取得しているように見えることです。スクリプトに組み込まれている読み取りを使用すると、常にプロンプトが表示されるため、インタラクティブであると想定しています。入力。これによりインタラクティブになりますか?

シェルスクリプトはfedoraでインタラクティブとして実行されますか?-sがもたらす違いの例はありますか?manページを読みましたが、できません。効果のある例を自分で生成しているようです。スクリプトが入力を受け取る方法を変更するためにsを使用しようとしていたため、2つの質問を組み合わせました。一部のチュートリアルでは、効果があると言われています。引数を設定できることはわかっていますが、標準入力から読み取るように変更する方法はわかりません。とにかく常にそうしているようです。

これがテストに使用したものです

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

読み取りは常に非インタラクティブシェルとインタラクティブシェルの両方で機能しました

fd / 0とfd / 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 

回答

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

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

PS1をテストしても、シェルインスタンスがインタラクティブであるかどうかはわかりません。¹PS1の設定を解除できます。インタラクティブシェルで。逆に、非対話型シェルは、多くの場合、その環境からPS1を継承します。シェルがインタラクティブに実行されているかどうかをテストする信頼できる方法は、$-iが含まれているかどうかをテストすることです。

read組み込みは、インタラクティブかどうかに関係なく、任意のシェルから機能します。シェルの標準入力に接続されているものから読み取ります(リダイレクトされない限り)。bashが実行中のスクリプトを読み取っているのと同じファイル記述子から読み取ろうとすると、スクリプトの行をスキップすることになります。 (必ずしも意図した場所である必要はありません)。たとえば、「bashでスクリプトを渡す」標準入力で、端末から行を読み取りたい場合は、read呼び出し:read line </dev/tty

ファイル記述子0、1、および2は常に存在します(閉じられていない限り)。それらはそれぞれ標準入力、標準出力、標準エラーです。シェルがインタラクティブであるかどうかは、fd 0と2が端末であるかどうかがシェルのインタラクティブステータスに影響することを除いて、標準記述子が指すものとは無関係です。

¹はい、私はこれを主張するウェブページがあることに注意してください。それらは「間違っています。

回答

インタラクティブシェルに関するもう少し情報:

シェルがインタラクティブであるかどうかは、$-を確認して確認できます。$-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 

コメント

  • 混乱したのは、bashのドキュメントにあり、非-で読み取りを使用するとハングするということです。インタラクティブシェル

回答

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です