Bash

反引號中的嵌套 echo 命令

  • December 5, 2015

我想知道為什麼我的外殼會列印一個額外的迴聲。我正在使用bash版本 4.2.46(1)。

echo `echo `echo $SHELL``

一個有趣的問題是,如果我用它替換'``'$()不會列印額外的迴聲:

echo $(echo `echo $SHELL`)

我發現它以奇數echo命令號列印額外的迴聲:

echo `echo `echo `echo `echo $SHELL````

你的兩個版本:

echo `echo `echo $SHELL``

echo $(echo `echo $SHELL`)

不等價。一旦看到另一個反引號,第一個反引號命令替換就會結束:

當使用舊式的反引號替換形式時,

$$ … $$前面沒有反斜杠的第一個反引號終止命令替換。

您的第一個版本實際上相當於:

echo $(echo )echo $SHELL$()

這就是為什麼您在輸出中得到“迴聲”的原因 - 您最終執行的命令(在替換後並刪除了額外的空格)只是:

echo echo /bin/bash

所以輸出是“echo /bin/bash”,就像你直接寫出那個命令一樣。


如果你必須嵌套反引號,你可以反斜杠內部對來逃避它們。您的第一個命令可以正確編寫為:

echo `echo \`echo $SHELL\``

雖然我不推薦它——它$( ... )是為嵌套而設計的。

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