バックティック内のネストエコーコマンド

バックティック内のネストエコーコマンド

私のシェルに追加のエコーが印刷される理由を知りたいです。bashバージョン4.2.46(1)を使用しています。

echo `echo `echo $SHELL``

興味深い問題は、交換すると追加のエコーが印刷されない'``'ことです。$()

echo $(echo `echo $SHELL`)

echo奇数命令番号に追加のエコーが印刷されることがわかりました。

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

答え1

2つのバージョン:

echo `echo `echo $SHELL``

そして

echo $(echo `echo $SHELL`)

同等ではありません。最初バックティックコマンドの置き換え別のバックティックが表示されたらすぐに終了してください。

以前のバックティック置換形式を使用している場合、[...]先行バックスラッシュのない最初のバックティックはコマンド置換を終了します。

最初のバージョンは実際には次のとおりです。

echo $(echo )echo $SHELL$()

そのため、出力に「echo」と表示されます。 (交換後に余分なスペースを削除した後)実行するコマンドは次のとおりです。

echo echo /bin/bash

したがって、コマンドを直接書いたように、出力は "echo /bin/bash"です。


バックティックを入れ子にする必要がある場合は、内部ペアをバックスラッシュしてエスケープできます。最初のコマンドは、次のように正しく作成できます。

echo `echo \`echo $SHELL\``

しかし、お勧めしません。$( ... )ネスト用に設計されています。

答え2

等しい

echo $(echo `echo $SHELL`)

または、より良い方法は次のとおりです。

echo $(echo $(echo $SHELL))

バックティックでは、次のようになります。

$ echo `echo \`echo $SHELL\``
/bin/sh

これがバックティックの主な問題です。

 Where exactly does a backtick start or end?

これがシェルが行を正しく理解していない理由です。シェルはこの行を次のように解釈します。

echo echo `echo $SHELL`

関連情報