간단한 예로, 소스 코드 파일이 많이 있습니다. 이 모든 파일의 "head" 명령 출력을 변수에 저장하고 싶습니다.
나는 시도했다:
output=$(head $file)
그러나 \n
출력을 변수에 저장할 때 자동으로 모든 문자가 잘립니다.
문자를 제거하지 않고 명령 출력을 그대로 저장하려면 어떻게 해야 합니까 \n
?
답변1
이것은 "명령 확장"의 알려진 버그 $(...)
이거나 `...`
마지막 줄 바꿈이 잘리는 버그입니다.
귀하의 상황이 다음과 같은 경우:
$ output="$(head -- "$file"; echo x)" ### capture the text with an x added.
$ output="${output%?}" ### remove the last character (the x).
출력값이 수정됩니다.
답변2
output=$(head $file)
유지하다임베디드값에 줄바꿈 문자를 넣고 output
다듬습니다.모두후행 개행 문자.
차이점은 변수를 참조하는 방식에 있습니다.
변수 참조를 큰따옴표 안에 넣습니다. 예를 들면 다음과 같습니다.
echo "$output"
포함된 개행 문자를 인쇄하지만아니요후행 개행 문자는 명령 확장에 의해 제거됩니다 $(...)
.
이는 쉘이 $(...)
큰따옴표 안에 있는 달러 기호, 명령 확장(백틱 및 ) 및 백슬래시만 해석하기 때문에 작동합니다. 큰따옴표 안에 있는 경우 쉘은 공백(줄바꿈 포함)을 필드 구분 기호로 해석하지 않습니다.
답변3
또한 종료 상태를 유지합니다.
output=$(head < "$file"; r=$?; echo /; exit "$r")
exit_status=$?
output=${output%/}
일부 문자의 인코딩이 의 인코딩으로 끝나는 일부 로케일에서 사용되는 것보다 일부 문자 세트를 사용하는 것이 /
더 안전하다는 점에 유의하십시오 (반면 의 인코딩은 일반적으로 다른 문자에서 발견되지 않으므로 경로 조회에 문제가 발생할 수 있습니다).x
x
/