2017-01-04 7 views
1

私のLaTeXワークフローのための単純な "明確な目標"を書いている間、私は過去に受け入れたばかりの細部に気づいた。

私はこのようなfind機能使用whileに標準入力からのリダイレクトを使用して長い時間前から働いていた例:

while ... ; do ... done < <(find ... ... ...)を。自分の無知で

私はそのためと予想さ:

while ... ; do ... done < $(find ... ... ...)

はそうではありません同じことを、やりました。

私はいくつかしました面白いグーグルが、私が見つけたのは説明なしの例でした。多分、誰かがこれをうまく乗っ取っているのでしょうか、あるいは違いが描かれている場所に私を向けることができますか?

教祖のために

touch asdf.aux asdf.bbl asdf.idx asdf.glo 

AUXFILES=(aux bbl idx glo) 

for AUXFILE in "${AUXFILES[@]}"; do\ 
    while IFS= read -r -d '' FILE; do\ 
    echo "deleting ${FILE}\n";\ 
    done < <(find . -maxdepth 1 -type f -name "*.${AUXFILE}" -print0);\ 
done 

最小例:あなたはそれをより具体的にするために合うようにタイトルを編集すること自由に感じなさい。

+0

aside - all-capsの名前は、オペレーティングシステムやシェルにとって意味のある変数によって使用されます。 [spec](http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html)を引用するために、アプリケーション用に予約されているため、小文字の名前を独自の変数に使用することを検討してください。小文字を含む環境変数名の名前空間は、アプリケーション用に予約されています。アプリケーションは、標準ユーティリティの動作を変更することなく、この名前空間の名前を持つ任意の環境変数を定義できます。* –

+0

(...なぜこれは明示的な環境変数だけでなくシェル変数にも当てはまりますか?あなたが喜んで尋ねた!既存の環境変数の名前でシェル変数を設定することは、暗黙のうちに後者を上書きすることになります。したがって、 'export PATH'を使っている人は、' PATH'があらかじめ環境になければ、本当にそうしています。 –

+0

別のノートでは、常にNULで区切られたストリームを使用してファイル名を渡します。現在のコードでは、名前に改行が付いたファイル、つまり 'touch $ 'foo \ nbar'で作成されたファイルを扱うことはできません。/$/n/etc/passwd \ n/hello.aux '' - あなたのコードが'/etc/passwd'を削除しようとしたくないのであれば、それは特に重要です。どの改行がファイル名の一部であったのか、ファイル間の区切り文字の一部だったのか? –

答えて

3

私たちは何が起こっているかを示すはるかに簡単な例を使用することができます。

$ echo Hello > somefile 
$ find . -name somefile 
./somefile 
$ cat < $(find . -name somefile) 
Hello 
$ cat < <(find . -name somefile) 
./somefile 

$()構築物は、単に内部のコマンドを実行し、コマンドの出力に自身を置き換えます。

$ cat < $(find . -name somefile) 

としてはbashによって書き換えられます:コマンドcatsomefileの内容をフィード

$ cat < ./somefile 
    Hello 

<()の構成は、少しトリッキーです。 <()内のコマンドが実行され、その結果がコマンドの入力として供給されます。したがって、このコマンド:bashで実際のメカニズムはもう少し微妙これより

$ find . -name somefile > /tmp/results 
    $ cat < /tmp/results 
    ./somefile 

$ cat < <(find . -name somefile) 

はそうのようなbashので解釈されます。結果は実際のファイルに保存されません。パイプを使用してfindの出力をcatの入力に接続し、両方のコマンドを同時に実行します(catの入力を読むとfindとなります)。

関連する問題