변수에서 명령 출력을 캡처할 때 줄 바꿈(\n)을 유지하는 방법

변수에서 명령 출력을 캡처할 때 줄 바꿈(\n)을 유지하는 방법

간단한 예로, 소스 코드 파일이 많이 있습니다. 이 모든 파일의 "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%/}

일부 문자의 인코딩이 의 인코딩으로 끝나는 일부 로케일에서 사용되는 것보다 일부 문자 세트를 사용하는 것이 /더 안전하다는 점에 유의하십시오 (반면 의 인코딩은 일반적으로 다른 문자에서 발견되지 않으므로 경로 조회에 문제가 발생할 수 있습니다).xx/

관련 정보