大家都說eval是邪惡的,你應該用$()作爲替代。但是我遇到了沒有在$()中處理相同的處理的情況。
背景是,我被它們中的空間文件路徑燒得太頻繁,所以想引用所有這些路徑。想要知道我的所有可執行文件來自何處的更多偏執狂。更偏執,不信任自己,就像能夠顯示我即將運行的創建命令一樣。
下面我嘗試變化上使用eval與$(),和命令名是否被引用(因爲真的可以包含空格)
BIN_LS="/bin/ls"
thefile="arf"
thecmd="\"${BIN_LS}\" -ld -- \"${thefile}\""
echo -e "\n Running command '${thecmd}'"
$($thecmd)
Running command '"/bin/ls" -ld -- "arf"'
./foo.sh: line 8: "/bin/ls": No such file or directory
echo -e "\n Eval'ing command '${thecmd}'"
eval $thecmd
Eval'ing command '"/bin/ls" -ld -- "arf"'
/bin/ls: cannot access arf: No such file or directory
thecmd="${BIN_LS} -ld -- \"${thefile}\""
echo -e "\n Running command '${thecmd}'"
$($thecmd)
Running command '/bin/ls -ld -- "arf"'
/bin/ls: cannot access "arf": No such file or directory
echo -e "\n Eval'ing command '${thecmd}'"
eval $thecmd
Eval'ing command '/bin/ls -ld -- "arf"'
/bin/ls: cannot access arf: No such file or directory
$("/bin/ls" -ld -- "${thefile}")
/bin/ls: cannot access arf: No such file or directory
所以...這是令人困惑的。引用的命令路徑在除了$()構造之外的任何地方都是有效的?更短,更直接的例子:
$ c="\"/bin/ls\" arf"
$ $($c)
-bash: "/bin/ls": No such file or directory
$ eval $c
/bin/ls: cannot access arf: No such file or directory
$ $("/bin/ls" arf)
/bin/ls: cannot access arf: No such file or directory
$ "/bin/ls" arf
/bin/ls: cannot access arf: No such file or directory
如何解釋簡單情況?
未加引號的字符串會立即進行評估。 c =(「/ bin/ls」/ bin/l *)與想要的完全不同。 (用echo「'$ {c [@]}'」)c =(「/ bin/ls」「/ bin/l *」)然後z = $(「$ {c [@]}」)失敗。 $()不能很好地使用參數數組? – Shenme
然而,c =(「/ bin/ls」「/ bin/l *」)然後z = $($ {c [@]})似乎工作得很好。這是你想給我看的可執行形式$()嗎? – Shenme