백틱 명령 캡슐화

백틱 명령 캡슐화
test@debian:~$ echo `echo \`echo "uh!"\``
uh!

Bash는 이를 어떻게 수행합니까? 먼저 이스케이프되지 않은 역따옴표로 표현식을 실행하여 다음을 반환하는 것처럼 보입니다(큰따옴표 ""는 제거됩니다. 그렇죠?).

`echo uh!`

따라서 다음과 같은 입력이 있습니다.

test@debian:~$ echo `echo uh!`

(참고: 실제로 왜 작동합니까? 왜냐하면:

test@debian:~$ echo `echo uh!`
-bash: !`: event not found

)

그런 다음 Bash는 역따옴표 안의 표현식을 다시 실행하여 다음을 얻습니다.

test@debian:~$ echo uh!

마지막으로 출력을 제공합니다.

uh!

맞아? 그리고 캡슐화하는 방법4개 echo- 백틱 표현식을 서로 변환하거나 반대로 변환하시겠습니까?

답변1

버전에 따라 다릅니다 bash.

bash-4.2$ echo `echo \`echo "uh!"\``
bash: !"\``: event not found
bash-4.3$ echo `echo \`echo "uh!"\``
uh!

에서는 더 bash-4.3이상 !"역사적 사건 지표로 적합하지 않으므로 역사적 확장이 적용되지 않습니다.

그 외에는 일반적인 백틱 중첩 구문입니다. 백틱 내에서 백슬래시 문자는 다시 중첩된 확장을 위해 오버로드됩니다.

원하는 만큼 레벨을 중첩할 수 있습니다.

echo `echo \`echo \\\`echo \\\\\\\`echo whatever\\\\\\\`\\\`\``

이는 다음과 같습니다.

echo $(echo $(echo $(echo $(echo whatever))))

그러나 두 버전 모두에서 명령 대체는 단어 분리의 영향을 받습니다. 따라서 이러한 일이 발생하지 않도록 하려면 이를 참조해야 합니다.

bash, dash, pdksh, yash, 를 사용하는 것은 zsh비교적 쉽습니다.

echo "`echo "\`echo "\\\`echo "\\\\\\\`echo whatever\\\\\\\`"\\\`"\`"`"

Bourne 또는 Korn 쉘을 사용하면 "다음과 같이 while을 이스케이프해야 합니다.

echo "`echo \"\`echo \\\"\\\`echo \\\\\\\"\\\\\\\`echo whatever\\\\\\\`\\\\\\\"\\\`\\\"\`\"`"

비교:

echo "$(echo "$(echo "$(echo "$(echo whatever)")")")" 

답변2

흥미 롭군.

이는 다음으로 확장됩니다.

echo `echo \`echo uh\``

심지어

echo "`echo \`echo uh\``"

내부 확장을 억제합니다.

bashPOSIX 쉘과 POSIX 쉘(대시) 에서는 $()중첩 친화적인 대안으로 백틱을 사용할 수 있습니다.

$() 흥미롭게도 프로세스 내 대체는 인용 여부 또는 내부 대체가 백틱 또는 다음을 사용하는지 여부에 관계없이 확장되지 않습니다 $().

$ echo $(echo \$\(echo uh\))
  $(echo uh)
$ echo $(echo \`echo uh\`)
  `echo uh`

백틱을 사용한 암시적 확장은 안전하지 않은 것으로 보입니다. $()특히 둥지를 짓고 싶다면 더욱 그렇습니다 .

관련 정보