bash는 왜 $ (cat file)에서 \ n을 제거합니까?


24

내가 input.txt포함 된 파일이있는 경우 :

hello
world
!

그런 다음 bash 명령 echo $(cat input.txt)을 실행하면 다음 이 출력됩니다.

hello world !

파일에있는 내용을 파일에있는 그대로 출력하도록 수정하는 이유와 방법은 무엇입니까?

답변:


32

당신이 사용하는 경우

echo "$(cat input.txt)"

제대로 작동합니다.

아마 에코의 입력을 바꿈에 의해 분리되고, 그 결과는 개행없는 것 그래서, 별도의 명령으로 처리하는 것이다.


좋은! 그렇다면 $ ()와 백틱의 차이점은 무엇입니까? (이것이 너무 접선 인 경우 미안합니다)
Chan Chan Suh

$ (...)가 중첩하기 쉽다는 것을 제외하고는 동등합니다. 두 경우 모두 결과를 인용하지 않으면 공백에서 여러 인수로 토큰 화됩니다.
James Henstridge

3
그러나 마지막 줄 바꿈 문자는 큰 따옴표로도 생략됩니다. 이와 대조적으로 Perl의 백틱 연산자는 모든 줄 바꿈을 포함하여 명령의 전체 출력으로 확장됩니다.
Keith Thompson

6
@KeithThompson 예, 명령 대체는 출력에서 ​​모든 후행 줄 바꿈을 제거합니다. 예를 들어 echo "$(date) something"후행 줄 바꿈을 날짜 출력에서 ​​제거하여 에코 출력을 날짜와 같은 줄에서 "무언가"로 만들 수 있다는 이점이 있습니다. 파일 또는 명령 출력을 "있는 그대로"저장해야하는 경우 mapfile ( help mapfile) read -rd ''또는 while 읽기 루프를 사용하십시오.
geirha

모두 감사합니다 :-) 나는 모든 의견에서 무언가를 배웠습니다!
Chan Chan Ho

2

bash 매뉴얼 페이지, 섹션에서 인용 Command Substitution:

포함 된 줄 바꿈은 삭제되지 않지만 단어 분리 중에 제거 될 수 있습니다.

조금 더 같은 섹션 :

큰 따옴표 안에 대체가 나타나면 단어 분리 및 경로 이름 확장이 결과에서 수행되지 않습니다.

그것이 echo "$(cat /etc/passwd)" 작동하는 이유 입니다.

또한 POSIX 사양으로 명령을 대체 하면 후행 줄 바꿈이 제거됩니다.

$ echo "$(printf "one\ntwo\n\n\n")"
one
two

따라서 파일을 통해 출력하면 줄 $(cat file.txt)바꿈 줄이 손실 될 수 있으며 전체 파일 무결성이 우선 순위 인 경우 문제가 될 수 있습니다.


2

예를 들어 IFS를 비워두면 개행을 유지할 수 있습니다.

$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.