왜 'echo $(cat /path/to/fileName)'이 내 파일과 방향을 나열합니까?

왜 'echo $(cat /path/to/fileName)'이 내 파일과 방향을 나열합니까?

로 파일 내용을 인쇄하면 echo $(cat /path/to/filename)내 파일과 방향도 나열됩니다. 하지만 내가 할 때는 printf "$(cat /path/to/filename)\n"잘 작동합니다.

변수 content='cat /path/to/filename'(또한 content=$(cat /path/to/filename)에 저장한 다음 로 인쇄하려고 시도했지만 echo $content동일한 결과(파일 및 방향 목록)를 얻었습니다.

파일 내용을 변수에 저장하고 변수를 다음 명령의 입력으로 내 스크립트에 전달하고 싶습니다.

내 파일의 내용에는 특수 문자가 있습니다 *.

답변1

명령 대체를 수행한 후 인용 부호를 사용하지 않으면 쉘이 결과에 대해 단어 분할(또는 필드 분할)을 수행하기 때문입니다.

POSIX 정의단어 확장처럼:

단어 확장 순서는 다음과 같습니다.

  1. 물결표 확장(물결표 확장 참조), 매개변수 확장(매개변수 확장 참조), 명령 대체(명령 대체 참조) 및 산술 확장(산술 확장 참조)은 처음부터 끝까지 수행되어야 합니다. 토큰 인식의 항목 5를 참조하세요.

  2. IFS가 null이 아닌 한, 필드 분할(필드 분할 참조)은 1단계에서 생성된 필드 부분에 대해 수행됩니다..

  3. set -f가 적용되지 않는 한 경로 이름 확장(경로 이름 확장 참조)이 수행됩니다.

  4. 견적 제거(인용 제거 참조)는 항상 마지막에 수행되어야 합니다.

귀하의 경우 *현재 작업 디렉토리의 모든 항목과 일치합니다. 예상되는 출력을 얻으려면 결과를 인용해야 합니다.

echo "$(cat /path/to/fileName)"

답변2

인용해 보세요:

$ echo "*" >> test
$ echo $(cat test)
bash43-001 bash43-002 bash43-003 bash43-004 bash43-005 test
$ echo "$(cat test)"
*

첫 번째 규칙으로 항상 명령 대체를 인용하십시오.

globbing( 또는 ) 을 끄 거나 인용/이스케이프 하지 않는 한 베어는 *에서 확장됩니다 . 명령 출력의 경우 항상 인용을 사용하는 것이 가장 좋습니다.bashset -fsetopt noglob"*" \*

관련 정보