명령 확장에 포함된 줄 바꿈이 공백으로 바뀌는 이유는 무엇입니까?

명령 확장에 포함된 줄 바꿈이 공백으로 바뀌는 이유는 무엇입니까?

명령 확장에 대한 Bash 매뉴얼의 결과

포함된 개행 문자는 제거되지 않지만 단어 분리 중에 제거될 수 있습니다.

예를 들어

$ cat myfile
1
2
3

$ echo $(cat myfile)
1 2 3

왜 포함된 개행 문자가 공백으로 바뀌는지 궁금합니다. 설명서에는 그렇게 적혀 있지 않나요?

답변1

Bash(및 기타 많은 쉘)에서 $()명령의 출력을 가져와 다른 명령의 인수로 사용하는 데 사용됩니다.

여기에서 수행되는 작업은 다음과 같습니다.

먼저 실행하십시오 cat.

1
2
3

그런 다음 $()해당 블록을 다음으로 바꾸십시오.

echo 1
2
3

이제 쉘은 이 입력을 해석하고 올바른 매개변수를 보내야 합니다 echo. 이를 위해서는 분할해야 합니다. 12, 3여기에서 개행 문자가 제거됩니다.

마지막으로 쉘은 다음을 보냅니다.

프로그램:echo

논쟁:1 2 3

그러면 다음과 같은 내용이 표시됩니다.

1 2 3

echo매개변수가 여러 개인 경우 모든 매개변수를 공백으로 구분하여 표시하기 때문입니다 .

답변2

bew78은 이미 이 질문에 답변했지만 더 명확하게 말하자면 -

에서 시작하다명령 대체소스 코드에서는 다음을 호출합니다.단어목록_분할(), 그러면 그 자체가 호출됩니다.단어 분할(), 어느그 다음에수신 전화목록문자열(), 어느구체적으로IFS 구분 기호를 건너뜁니다. 이는 개별 "단어"를 생성한 다음 list_string() 함수에 의해 스택으로 반환됩니다. 이것이 1, 2, 3이 명령에 대한 별도의 인수로 끝나는 이유입니다 echo.

관련 정보