Heredoc에서 stdin 읽기를 사용하여 변수 정의

Heredoc에서 stdin 읽기를 사용하여 변수 정의

아래와 같이 사용 가능한 메모리와 총 메모리를 스크립트 파일의 변수에 저장하려고 합니다.

read -r Available Total <<EOT
$(free -m | awk '/^Mem/{print $7; print $2;}')
EOT

$ echo $Total

$ echo $Available
1437

하지만 $Total 변수를 저장할 수 없습니다.

하지만 내가 이렇게 하면:

$ read Available Total <<EOT
$(echo $(free -m | awk '/^Mem/{print $7; print $2;}'))
EOT

$ echo $Available
1309
$ echo $Total
7865

효과가있다. 그러나 shellcheck는 나에게 다음과 같은 조언을 해주었습니다.

Useless echo? Instead of 'echo $(cmd)', just use 'cmd'. [SC2005]

첫 번째 예가 작동하지 않는 이유는 무엇입니까? 두 번째는 왜 작동합니까?

답변1

이 명령은 두 개의 필드를 찾을 것으로 예상되는 줄을 읽는 awk동안 두 개의 별도 줄에 두 개의 값을 인쇄합니다 .read

같은 줄에 숫자를 인쇄 print하도록 명령을 변경하십시오 . print $7, $2;Bash를 사용하여 태그를 지정했으므로 여기 문서 대신 여기에 있는 문자열을 사용하여 전체 명령을 더 간결하게 만들 수 있습니다.

$ read -r Available Total <<< $( free -m | awk '/^Mem/{print $7, $2;}' )

또는 프로세스 대체를 사용하십시오.

$ read -r Available Total <   <( free -m | awk '/^Mem/{print $7, $2;}' )

명령 대체 주위에 따옴표 없이 명령을 사용하는 경우 echo $(...)명령의 출력이 토큰화되고 echo개별 줄이 개별 인수로 처리됩니다. 공백으로 연결된 모든 인수를 한 줄에 인쇄합니다.

echo $(foo)foo일반적으로 쓸모없는 일이지만 바로 그 이유 때문에 동일하지는 않습니다. 또한 foo아직 존재하지 않는 경우 출력 끝에 최종 개행 문자를 추가합니다 .

관련 정보