![명령 대체를 사용할 때 bash가 [를 테스트 문자로 처리하지 않도록 하려면 어떻게 해야 합니까? [복사]](https://linux55.com/image/139747/%EB%AA%85%EB%A0%B9%20%EB%8C%80%EC%B2%B4%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EB%95%8C%20bash%EA%B0%80%20%5B%EB%A5%BC%20%ED%85%8C%EC%8A%A4%ED%8A%B8%20%EB%AC%B8%EC%9E%90%EB%A1%9C%20%EC%B2%98%EB%A6%AC%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8F%84%EB%A1%9D%20%ED%95%98%EB%A0%A4%EB%A9%B4%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
$()
bash에서 수정되지 않은 출력을 얻는 방법은 무엇입니까 ?
$(command)
bash가 명령 대체 결과( 또는 를 통해)를 반환하도록 해야 `command`
하지만 bash는 여는 대괄호를 test
내장으로 처리하고 텍스트를 평가합니다.
> echo "This shows an IP in brackets [127.0.0.1] when not in the command substitution context."
This shows an IP in brackets [127.0.0.1] when not in the command substitution context.
> echo $(echo "This should show an IP in brackets [127.0.0.1] but instead evaluates to '1'.")
This should show an IP in brackets 1 but instead evaluates to '1'.
> echo $(echo "The subtle addition of a space causes [127.0.0.1 ] to behave differently.")
The subtle addition of a space causes [127.0.0.1 ] to behave differently.
배경
echo
위에 제공된 최소 예제를 사용하는 것이 전부 입니다. 최종 사용에는 이 호스트의 출력이 포함 ping
되거나 tracert
이 호스트에서 표시되는 호스트의 IP가 표시됩니다(즉, 모든 호스트 항목 존중). 이 사용법에서는 명령의 문자열 출력을 거의 제어할 수 없습니다.
> grep -E "^[^#].*stackoverflow" /c/Windows/System32/drivers/etc/hosts
127.0.0.1 stackoverflow.com
> tracert -h 1 -w 1 stackoverflow.com | awk '/Tracing/'
Tracing route to stackoverflow.com [127.0.0.1]
> ping -n 1 -w 1 stackoverflow.com | awk '/Pinging/'
Pinging stackoverflow.com [127.0.0.1] with 32 bytes of data:
# Using dig or nslookup would show a real IP rather than the forced IP from the hosts entry.
> dig @ns1 +nocmd stackoverflow.com +noall +answer
stackoverflow.com. 118 IN A 151.101.129.69
stackoverflow.com. 118 IN A 151.101.193.69
stackoverflow.com. 118 IN A 151.101.1.69
stackoverflow.com. 118 IN A 151.101.65.69
> echo $(ping -n 1 -w 1 stackoverflow.com | awk '/Pinging/')
Pinging stackoverflow.com 1 with 32 bytes of data:
> echo $(ping -n 1 -w 1 stackoverflow.com | awk '/Pinging/ {print $3}')
1
> ping -n 1 -w 1 stackoverflow.com | awk '/Pinging/ {print $3}'
[127.0.0.1]
답변1
문제는 명령 대체 자체가 인용되지 않는다는 것입니다. 명령 대체가 명령의 출력을 echo
두 번째 명령의 인수로 사용하는 경우 echo
명령 결과는 단어 분할 및 파일 글로빙의 영향을 받습니다. 주석에서 언급했듯이 대괄호 안의 문자는 [127.0.0.1]
이름이 정확히 한 문자이고 , , 또는 중 하나인 모든 파일과 일치합니다(이 패턴은 쉘, 무시 및 디렉토리 링크에만 일치합니다). 이라는 파일을 만들 때 결과를 복제할 수 있습니다.1
2
7
0
.
.
..
1
명령 대체 결과가 와일드카드의 영향을 받지 않도록 하려면 명령을 큰따옴표로 묶어야 합니다.
echo "$(echo "This will show an IP address in square brackets: [127.0.0.1]")"
또한 Greg의 Wiki에서 다음 관련 기사를 참조하십시오(특히 내부 및 외부 큰따옴표를 대체하는 명령의 필요성을 다루는 첫 번째 기사).