저는 매우 간단한 Cygwin 스크립트를 작업 중이지만 알아낼 수 없습니다. 누군가가 나를 도울 수 있기를 바랍니다.
스크립트는 다음과 같습니다.
h=www.ibm.com
for ip in $(dig $h +short); do echo "XX ${ip} XX"; done
예상 출력(Debian Buster Linux 및 bash 5.0.3(1) 릴리스를 사용하여 테스트됨:
XX www.ibm.com.cs186.net. XX
XX outer-global-dual.ibmcom-tls12.edgekey.net. XX
XX e7817.dscx.akamaiedge.net. XX
XX 37.26.112.89 XX
bash 4.4.12(3) 릴리스를 사용하여 Cygwin에서 동일한 스크립트를 실행하면 출력이 완전히 다릅니다.
XXwww.ibm.com.cs186.net.
XXouter-global-dual.ibmcom-tls12.edgekey.net.
XXe7817.dscx.akamaiedge.net.
XX37.26.112.89
무슨 일이 일어났는지 믿을 수가 없어요. 이것은 분명한 것임에 틀림없지만 나는 그것을 볼 수 없습니다. Cygwin의 bash가 마지막 "XX"와 선행 공백을 자르는 이유는 무엇입니까?
인사,
답변1
이 dig
유틸리티는 Cygwin에서 캐리지 리턴으로 끝나는 행을 출력하는 것 같습니다(테스트할 수 없음). 해당 문자가 출력되면 커서가 줄의 시작 부분으로 다시 이동하여 이상한 형식의 출력이 발생합니다.
이 문제를 해결하려면 다음 출력에서 후행 캐리지 리턴을 제거하십시오 dig
.
query=www.ibm.com
dig "$query" +short | sed 's/[[:space:]]*$//' |
while IFS= read -r response; do
printf 'XX %s XX\n' "$response"
done
이는 의 출력에서 sed
일치하는 항목을 제거하는 데 사용됩니다. 이 패턴은 줄 끝에서 캐리지 리턴이 1인 0개 이상의 공백 유사 문자와 일치합니다.[[:space:]]*$
dig
나는 while
당신 대신에 루프를 사용하기로 결정했습니다 for
. 개념적으로 while
루프는 데이터가 도착할 때 길이가 불확실한 데이터 스트림에서 행을 읽는 데 사용됩니다. A for
반면에 루프는 항상변화 없는문자열 세트. for
이는 쉘이 모든 출력을 읽고 dig
이를 단어로 분할할 때까지(그리고 각 단어에 파일 이름 글로빙을 적용할 때까지) 루프를 시작할 수 없음 을 의미합니다 . 일반적으로 for
프로그램을 사용하여 출력 줄을 읽는 것은 잠재적인 인용 문제로 인해 문제가 있고, 우아하지 않으며, 많은 메모리를 차지할 수 있습니다(모든 출력이 셸에 저장되어야 하기 때문에).