stdinをwhileループにあいまいにリダイレクトする[閉じる]

stdinをwhileループにあいまいにリダイレクトする[閉じる]

ファイル列の各エントリに対してコマンドを実行したいと思います。現在、次のことを行っていますが、あいまいなリダイレクトエラーが発生します。

while read -r entry;
do
  cmd "$entry" ;
done < $(cut -f2 file.tsv)

私も試しました

done <(cut -f2 file.tsv)

予期しないトークン構文エラーが発生します。

これを行う正しい構文は何ですか?


入力例

タブで区切られた値は、目的の列のファイルパスを持つファイルです。

1    file1.txt    ...
2    file2.txt    ...
3    file3.txt    ...

予想される結果

スクリプトは次のコマンドを実行する必要があります。

cmd file1.txt
cmd file2.txt
cmd file3.txt

簡単な例を目的としてエラーがないため、catasを使用できます。cmdcmd それ自体しかし、入力リダイレクトがあります。

私が実行した実際の命令は生物情報学ツールでした。カリスト、具体的にkallisto quant

答え1

これが正しいアプローチのようです。

while read -r entry;
do
  cmd "$entry" ;
done < <(cut -f2 file.tsv)

~によるとこのbashリダイレクトチートシート、この構文はの出力をcut -f2 file.tsv匿名fifoに渡し、それをstdinに渡します。

答え2

コードは次のように変更できます。

cut -f2  file.tsv | while read -a entry;
do
  cmd "$entry" ;

done

シェルスクリプトを実行するたびに、subshel​​lという新しいプロセスが作成され、スクリプトはsubshel​​lを使用して実行されます。ただし、並列処理にはSubshel​​lを使用できます。現在のシェルの上に別のシェルを起動している場合は、それをサブシェルと呼ぶことができます。サブシェル値を表示するには、次のコマンドを入力します。

echo $BASH_SUBSHELL

または

echo "Current shell: $BASH_SUBSHELL"; ( echo "Running du in subshell: $BASH_SUBSHELL" ;cd /tmp; du 2>/tmp/error 1>/tmp/output)

括弧内のすべてのコマンドはサブシェルで実行されます。

関連情報