2016-12-30 20 views
4

誰かが現象を説明することができると考えています。タイトルが示すように、私はファイル記述子のリダイレクトについて学習しています。途中で、リダイレクト記号の使用を取り巻く問題、特に永続的なリダイレクトを設定するときに、私は質問に出くわしました。私は、特定のケースでは、<>のどちらを使用するかは問題ではないようです。たとえば、次のスクリプトでの作業:私の驚きにBash:ファイル記述子のリダイレクト

#!/bin/bash 

#Setting file descriptor 3 to redirect to STDIN 
exec 3<&0 

#Setting STDIN to read from input file 
exec 0<inputFile 


while read var 
do 
    echo "$var" 

done 

#Setting STDIN to read from file descriptor 3 which is redirected to the default STDIN 
exec 0<&3 

read -p "Enter a word:" word 

echo "$word" 

が、私が文exec 3<&0またはexec 0<&3><を使用している場合は関係していないようです。これらのステートメントのいずれかで、リダイレクトシンボルを交換すると、まったく同じ結果が得られるようです。それは私には明白なようで、その行への変更の同じ種類を作る:

exec 0<inputFile 

exec 0>inputFile 

ファイルにSTDINをリダイレクトすると、同じものではありませんので、同じ結果が得られませんファイルをSTDINにリダイレクトします。

だから私の質問は以下のとおりです。>

  1. <

    0<&3
    # Why aren't there any differences between these two statements? 
    exec 3<&0 
    exec 3>&0 
    
  2. 3<&0

    # Why is there a difference between these two statements? 
    exec 3<&0 
    exec 0<&3 
    

このタイプのリダイレクトは、私の頭を包み込み、これらのタイプの不一致なしにまっすぐに保つのに十分なほど難しいです。すべての説明は非常に高く評価されます。

+1

私は穏やかにあなたが尋ねた質問の両方を反映するためにあなたのポストを編集した:あなたは簡単にstraceていることを確認することができます。私の変更が気に入らなければ、自由にロールバックしたり編集してください。 –

答えて

5

ときファイル記述子を複製し、それは問題ではない、dup2が呼び出され、あなたが<>を使用している場合に関係なく。

ファイル記述子を閉じるときも同じことが起こります。 n>&-またはn<&-を使用できます。


しかし、なぜ、その後3<&00<&3同じものではありませんか?引数がある

[EBADF]

fildesで:私はリンクdup2仕様で説明しています

は、次の場合

int dup2(int fildes, int fildes2); 

dup2の()関数は失敗するもの有効なオープンファイル記述子または引数ではありませんfildes2は負または{OPEN_MAX}以上です。exec 0<&3の場合

、bashはdup2(3,0)を呼び出し、実際に(その時点で有効なオープンファイル記述子ではありません、我々は場合にしているので、fildesで = 3)EBADFエラーを受け取ります。

$ strace -e dup2 bash -c 'exec 0>&3' 
dup2(3, 0)        = -1 EBADF (Bad file descriptor) 
bash: 3: Bad file descriptor 
dup2(10, 0)        = 0 
+++ exited with 1 +++ 
+0

わかりました。おそらく私の混乱の中には、ファイルディスクリプタを「リダイレクトする」ものとして記述した私の本から、それらを「複製する」と考えるべきであろうか?しかし、なぜ '0 <&3'は '3 <&0'と同じではないのですか? –

+1

@ Dr.Tautology:あなたの質問に答えるために投稿が編集されました! –

+0

さて、私は今完全に理解していると思います。あなたの編集では、 "fildes = 3はその時点で有効なオープンファイル記述子ではありません"と言います。これは、スクリプト内の最後のexec文には当てはまりません。その時点で、3つのファイル記述子が開いていますか?しかし、あなたがここに書いたことを考えれば、これをすべて考えて考える最良の方法は、リダイレクトするのではなく、複製するということです。そのように考えると、すべての混乱がなくなると思われます。複製3は複製0と同じではないため、 "0 <&3"は "3 <&0"と同じではありません。 –

関連する問題