使用命令替換生成全域模式的嵌套部分

使用命令替換生成全域模式的嵌套部分

讓我們從一個簡單的文件名生成範例開始:

echo (xx|yy|zz)*.txt  # Example 1

這列出了所有以 xx 或 yy 或 zz 開頭的 txt 檔案。現在讓我們使用命令來替換動態生成這些替代方案;我echo在這裡只是為了說明我要去的地方;在「現實世界」的例子中,這當然是一些程式:

echo $(echo '(xx|yy|zz)')*.txt  # Example 2

這會像上面一樣工作。現在是棘手的部分:命令替換應該只提供替代清單的一部分:

echo ($(echo 'xx|yy')|zz)*.txt  # Example 3 (does not work)

這不再有效:它將找到以 zz 開頭的文件,但找不到以 yy 開頭的文件。我猜 Zsh 正在搜尋從xx|yy這裡開始的檔案。

如果我們使用輔助變量,我們就可以讓它運作:

list=$(echo 'xx|yy')
echo (${~list}|zz)*.txt   # Example 4

現在回答我的問題:

不使用臨時變數是否可以達到例4的效果?

答案1

只需使用:

echo (${~"$(echo 'xx|yy')"}|zz)*.txt

請注意命令替換周圍的引號,就像zsh執行分詞一樣,如果在命令替換時預設不進行通配,這在以下情況下會很方便:

echo (${~${(j:|:)$(cmd)}}).txt

cmd連接with輸出中的單字|並將其解釋為一個 glob。b如果您不希望這些單字本身被視為模式,請另參閱參數擴充標誌:

echo (${~${(j:|:)${(b)$(cmd)}}}).txt

相關內容