명령 대체를 사용할 때 bash가 [를 테스트 문자로 처리하지 않도록 하려면 어떻게 해야 합니까? [복사]

명령 대체를 사용할 때 bash가 [를 테스트 문자로 처리하지 않도록 하려면 어떻게 해야 합니까? [복사]

$()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]이름이 정확히 한 문자이고 , , 또는 중 하나인 모든 파일과 일치합니다(이 패턴은 쉘, 무시 및 디렉토리 링크에만 일치합니다). 이라는 파일을 만들 때 결과를 복제할 수 있습니다.1270....1

명령 대체 결과가 와일드카드의 영향을 받지 않도록 하려면 명령을 큰따옴표로 묶어야 합니다.

echo "$(echo "This will show an IP address in square brackets: [127.0.0.1]")"

또한 Greg의 Wiki에서 다음 관련 기사를 참조하십시오(특히 내부 및 외부 큰따옴표를 대체하는 명령의 필요성을 다루는 첫 번째 기사).

관련 정보