#! /bin/bash
while read line
do
tty
done < file
i=1
while [ $i -lt 5 ]; do
tty
let i=$i+1
done
まずループとして出力を与える:ないのttywhileループ内でターミナルの名前を取得できないのはなぜですか?
第二のループを与える出力として:私は第一ループ内で端末名を取得していない午前理由は/ dev// 14
PTS?
#! /bin/bash
while read line
do
tty
done < file
i=1
while [ $i -lt 5 ]; do
tty
let i=$i+1
done
まずループとして出力を与える:ないのttywhileループ内でターミナルの名前を取得できないのはなぜですか?
第二のループを与える出力として:私は第一ループ内で端末名を取得していない午前理由は/ dev// 14
PTS?
あなたがthe tty
manual pageを読めば、あなたはそれが言う表示されます。
標準入力に接続された端末のファイル名を印刷します。
重点鉱山
あなたがファイルであることを、標準入力をリダイレクトしているので、その後tty
コマンドは、それがttyに接続されていないことを報告します。
tty
は、標準入力がファイルからリダイレクトされたループ内にあるため、標準入力が指示されていることがわかります。
「標準」と見なされるファイル記述子(ファイル記述子0)ではなく、別のファイル記述子を使用して、実行しようとしていることを達成できます。
while IFS= read -r -u 5 line
do
tty
done 5< file
-u 5
オプションは、ときに非常に便利です。この技術ファイルディスクリプタで5
のファイルの内容を取得し、それを利用できるようにバッシュを伝えるファイルディスクリプタ5から5<
リダイレクトを読むためにread
を伝えますユーザー入力が必要な場合など、ループ内の標準入力をキャプチャしないようにする必要があります。
また、任意のコマンドの出力をリダイレクトすることができ、プロセス置換で動作:<()
は、FIFO特殊ファイルを作成する式で規定されたコマンドを実行し、フィード、この場合
while IFS= read -r -u 5 line
do
tty
done 5< <(any_command with arguments)
そのコマンドをFIFOへの入力として出力する。式はファイル名(FIFOへの実際のパス)を生成し、このファイルは他のファイルと同様にリダイレクションのために読み込まれます。
これは通常ループの内部がスクリプトの残りの部分と同じコンテキストで実行されるため、サブシェルを避けてパイプを使用するよりも優れています。したがって、ループ内で行われる変数の割り当ては、ループが終了します。