아래와 같이 사용 가능한 메모리와 총 메모리를 스크립트 파일의 변수에 저장하려고 합니다.
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
아직 존재하지 않는 경우 출력 끝에 최종 개행 문자를 추가합니다 .