Bash

為什麼大括號中的參數在這種情況下不展開?

  • November 15, 2012

例如,我想將一些文件名放在大括號內進行擴展,如下所示:

$ ls
blue_texture  blue_waves  green_light
$ ls -m | tr -d ' \n'
blue_texture,blue_waves,green_light 
$ echo foo/bar/{`ls -m | tr -d ' \n'`}
foo/bar/{blue_texture,blue_waves,green_light}

我的問題為什麼支撐擴展在這裡不起作用?我希望它按以下方式工作:

$ echo foo/bar/{blue_texture,blue_waves,green_light}
foo/bar/blue_texture foo/bar/blue_waves foo/bar/green_light

這不起作用的原因是在命令替換之前bash執行大括號擴展( Bash 參考手冊有一些關於此的資訊)。直到已經發生大括號擴展之後才會執行替換。

您可以做到這一點的唯一方法是使用eval,但在這種情況下要這樣做,因為您將允許執行任意命令。

相反,您必須尋求其他方法。這應該會產生您尋求的輸出:

for file in *; do
   printf '%s ' "foo/bar/$file"
done; echo

引用自:https://unix.stackexchange.com/questions/55804