ファイル列の各エントリに対してコマンドを実行したいと思います。現在、次のことを行っていますが、あいまいなリダイレクトエラーが発生します。
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
簡単な例を目的としてエラーがないため、cat
asを使用できます。cmd
cmd
それ自体しかし、入力リダイレクトがあります。
私が実行した実際の命令は生物情報学ツールでした。カリスト、具体的に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
シェルスクリプトを実行するたびに、subshellという新しいプロセスが作成され、スクリプトはsubshellを使用して実行されます。ただし、並列処理にはSubshellを使用できます。現在のシェルの上に別のシェルを起動している場合は、それをサブシェルと呼ぶことができます。サブシェル値を表示するには、次のコマンドを入力します。
echo $BASH_SUBSHELL
または
echo "Current shell: $BASH_SUBSHELL"; ( echo "Running du in subshell: $BASH_SUBSHELL" ;cd /tmp; du 2>/tmp/error 1>/tmp/output)
括弧内のすべてのコマンドはサブシェルで実行されます。