확인된 IP 주소를 변수에 할당하려고 합니다.
ip=$(ping -q -c1 -W1 google.com | grep -Eo "([0-9]+\.?){4}" | head -n 1) | echo $ip
또는
ip=`resolveip google.com | head -n 1` | echo $ip
두 에코 모두 빈 출력을 반환합니다. 이 명령은 변수에 할당하지 않고도 제대로 작동합니다. 내가 뭘 잘못했나요?
답변1
$ip
달성하려는 것은 명령 내용을 쉘 변수에 할당한 후 출력하는 것 같습니다 ping
.첫 번째명령 출력을 변수에 할당하고그 다음에콘솔에 결과 변수의 내용을 인쇄합니다.
그러나 파이프( |
) 연산자를 사용하여 두 명령을 연결하고 있습니다. 이는 두 가지 이유로 잘못된 연산자입니다.
- 첫째, 이 연산자는 한 명령의 출력을 다른 명령의 입력으로 리디렉션하는 데 사용됩니다. 그러나 변수 할당은 출력을 생성하지 않으며 명령은 에서
echo
변경되지 않습니다stdin
.|
연산자를 사용할 때 더 복잡한 상황에서는 문제가 발생할 수 있습니다. - 더 심각한 점(관찰된 동작의 실제 원인일 수 있음)은 이러한 파이프라인의 양쪽 끝에 있는 명령이 동시에 시작되어 수신 명령이 전송 명령의 출력을 "즉시" 처리할 수 있다는 것입니다. (특히, 전체 출력을 버퍼링할 필요가 없습니다). 귀하의 경우 이는
echo $ip
쉘에 시간이 있는 동안 명령이 즉시 실행된다는 것을 의미합니다ping
.
따라서 두 문제에 대한 해결책은 ;
reverse를 사용하여 같은 줄에만 쓰여진 두 명령을 순차적으로 실행하는 것입니다.
ip=$(ping -q -c1 -W1 google.com | grep -Eo "([0-9]+\.?){4}" | head -n 1) ; echo $ip