Shell
如何根據輸入(多個 FIFO)創建動態程序替換?
我正在嘗試根據另一個命令的輸出創建多個程序替換,但是我不確定如何實現這一點。
作為範例場景,我給出了文件列表:
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 列表是硬編碼的,所以我的目標是找到某種方法來替代動態數量的命令(如萬用字元、使用
eval
或xargs
以某種方式)。此處描述了另一種情況。
我對上述問題的特定解決方案(解決方法)不感興趣,因為這只是一種情況。我對如何在 shell 中動態創建程序替換或我可以使用哪些其他工具來實現這一點很感興趣。
另請參閱:如何創建匿名 FIFO?
動態建構字元串並對其進行評估很容易:
eval "$(echo -n 'pr -mt '; while read ext; do echo "<(ls -1 *.$ext)"; done < list |tr '\n' ' ' )"
list
代表您要從中建構命令的副檔名列表的文件(可能是 fifo)在哪裡。
<()
本質上創建了未命名的 FIFO。一個 eval-less 的替代方法可能是使用命名的: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”結尾的文件名。