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\``"
내부 확장을 억제합니다.
bash
POSIX 쉘과 POSIX 쉘(대시) 에서는 $()
중첩 친화적인 대안으로 백틱을 사용할 수 있습니다.
$()
흥미롭게도 프로세스 내 대체는 인용 여부 또는 내부 대체가 백틱 또는 다음을 사용하는지 여부에 관계없이 확장되지 않습니다 $()
.
$ echo $(echo \$\(echo uh\))
$(echo uh)
$ echo $(echo \`echo uh\`)
`echo uh`
백틱을 사용한 암시적 확장은 안전하지 않은 것으로 보입니다. $()
특히 둥지를 짓고 싶다면 더욱 그렇습니다 .