他のコマンドの出力に基づいて複数のプロセス置換を作成しようとしていますが、これを行う方法がわかりません。
例のシナリオとして、次のファイルのリストを提供しました。
touch a.txt b.txt c.txt d.doc e.doc f.pdf g.pdf h.xls i.xls
私は仕事をします。利用可能なファイル拡張子のリスト:
ls -1 *.* | awk -F. '{if (NF>1) {print $NF}}' | sort | uniq
次に、動的リストに基づいて次のようなFIFOを生成しようとします。たとえば、次のようになります。
pr -mt <(ls -1 *.doc) <(ls -1 *.pdf) <(ls -1 *.txt) <(ls -1 *.xls)
これにより、各グループを別の列に印刷できます。しかし、上記のFIFOリストはハードコーディングされているので、私の目標は動的コマンドの数(ワイルドカード、usingなど)を置き換える方法を見つけることeval
ですxargs
。
別の状況は、以下で説明される。ここ。
上記の問題に対する具体的な解決策(解決方法)には興味がありません。これは1つの状況にすぎないからです。私はシェルでプロセス交換を動的に生成する方法や、これを達成するために使用できる他のツールに興味があります。
また見なさい:匿名FIFOを生成する方法は?
ベストアンサー1
文字列を動的に作成して評価するのは簡単です。
eval "$(echo -n 'pr -mt '; while read ext; do echo "<(ls -1 *.$ext)"; done < list |tr '\n' ' ' )"
コマンドを構築する拡張リストを表すlist
ファイル(おそらくfifo)。
<()
デフォルトでは、名前のないFIFOを生成します。評価を必要としない代替案は、次の名前を使用することです。
while read ext; do mkfifo ${ext}.pipe; ls -1 *.$ext > ${ext}.pipe & done
pr -mt *.pipe
rm *.pipe #remove the named pipes when done
上記は、ディレクトリに「.pipe」で終わる他のファイル名がないと仮定しています。