파일 내용을 "echo" 명령으로 리디렉션

파일 내용을 "echo" 명령으로 리디렉션

my_file.txt내용이 문자열인 파일이 있습니다 Hello. 해당 내용을 명령으로 리디렉션하려면 어떻게 해야 합니까 echo?

나는 그 명령을 갖고 있다는 것을 알고 있지만 , less그것을 실행하려면 그 명령을 사용해야 합니다 .catmoreecho

나는 이것을 시도했습니다 :

$ cat my_file.txt | echo

이:

$ echo < my_file.txt

그러나 두 경우 모두 표준 출력에서는 공백으로만 표시되고 my_file.txt의 내용은 표시되지 않습니다.

어떻게 해야 하나요?

답변1

원하는 모든 것을 리디렉션할 수 있지만 echo아무 작업도 수행되지 않습니다. echo표준 입력을 읽지 않습니다. 표준 출력에 쓰는 것이 전부입니다.논쟁공백 문자로 구분되고 개행 문자로 종료됩니다(그리고 일부 echo구현에는 확장된 이스케이프 시퀀스가 ​​제공되거나 -옵션으로 처리될 수 있는 인수로 시작됩니다).

echo파일의 내용을 표시 하려면 해당 내용을 echo다음과 같은 매개변수로 전달해야 합니다.

echo "$(cat my_file.txt)"

후행 $(...)개행 문자는 제거됩니다.에스이 명령의 출력 에서 cat​​추가echo하나물러서세요.

또한 를 제외하고 zsh명령에 대한 인수로 NUL 문자를 전달할 수 없으므로 위 명령은 일반적으로 이진 파일에서 작동하지 않습니다. yash유효한 문자의 일부를 형성하지 않는 바이트도 제거됩니다.

이를 수행하려는 이유가 echo파일에서 \n, , ... 이스케이프 시퀀스를 확장하기 때문인 경우 \b(UNIX 일관성 구현과 마찬가지로,\0351echo하지만 전부는 아니다), 그 다음에printf차라리 사용 하시겠습니까?:

printf '%b\n' "$(cat my_file.txt)"

대조적으로 echo, 파일 내용이 -.


대안 $(cat file)으로ksh, zsh및 를 사용하여 bash다음을 수행할 수도 있습니다.$(<file). 이것은 특수 연산자입니다.껍데기cat확장을 보상하기 위해 파일 내용을 읽는 것과는 대조적입니다 . 여전히 추가 프로세스를 생성하는 를 제외하고는 후행 줄 바꿈을 제거하고 NUL 바이트를 차단합니다 zsh. bash또한 한 가지 차이점은 이 방법으로 디렉터리 유형 파일을 읽으려고 하면 오류가 발생하지 않는다는 것입니다. 또한 $(< file)특별하지만 ( 다른 쉘을 에뮬레이트하지 않을 때 다음을 실행하여 확장되는 것은 $(< file; other command)아닙니다)zshfile절대적인 $READNULLCMD명령(보통 호출기)).

답변2

다른 답변에 추가하여 대신 리디렉션을 입력해 볼 수도 있습니다.cat

echo "$(<my_file.txt)"

또는

echo "`<my_file.txt`"

$(...)`...`동일한 작업을 수행합니다. 명령 대체입니다 . 이는 해당 범위 내에서 명령을 실행하고 사용자가 입력으로 제공한 것처럼 출력을 셸에 제공합니다. 둘 사이의 유일한 차이점은 $(...)간단하게 중첩될 수 있으며 `...`중첩되려면 이스케이프해야 한다는 것입니다.

명령 대체에 대한 따옴표는 공백을 보존합니다.

답변3

말한 바와 같이,

echo파일의 내용을 표시 하려면 해당 내용을 매개변수로 전달해야 합니다.echo

예를 들어 다음과 같이 할 수 있습니다 xargs(활성화해야 한다는 점을 고려).백슬래시 이스케이프):

$ cat my_file.txt | xargs echo -e

아니면 그냥 질문하신 내용(설명 없이)이스케이프 시퀀스):

$ cat my_file.txt | xargs echo

답변4

리디렉션과 관련하여 Linux 명령은 전달한 인수를 다르게 해석하여 결과적으로 다른 동작이 발생할 수 있다는 점에 유의하는 것이 중요합니다. 중요한 부분은 이해하는 것입니다.

  • 일부 명령에는 파일 경로가 필요하며 파일 내용을 STDIN에 넣습니다. 그런 다음 해당 명령은 이를 읽고 처리하고 출력을 생성합니다. 예를 들어 cat이렇게 해보세요.
  • 다른 명령은 STDIN에 아무것도 넣지 않으며 거기에서 읽지 않습니다. 즉, STDIN은 단순히 무시됩니다. 대신 매개변수를 직접 읽고 출력을 생성합니다.

따라서 일부 명령은 STDIN의 내용에 전적으로 의존할 수 있지만 다른 명령은 STDIN 내용에 신경 쓰지 않습니다. 이는 리디렉션에 중요합니다. STDOUT을 무시하는 명령의 STDIN으로 리디렉션하면 원하는 동작을 얻을 수 없기 때문입니다.

당신이 달리면

cat

마치 매달려서 무언가를 기다리고 있는 것처럼 보입니다 cat. 이는 STDIN에 아무것도 전달되지 않으면 기본적으로 표준 입력이 키보드에 연결되기 때문에 발생합니다. 즉, cat우리가 무엇이든 입력하기를 기다리고 Enter 키를 눌러 전송합니다.

반면에,

echo

이 명령은 STDIN에서 읽히지 않으므로 그대로 유지하세요. 매개변수가 없으므로 인쇄할 내용이 없습니다.

그래서 입력하면

echo < my_file.txt

일반적으로 echo이는 my_file.txt매개변수로 처리되고 단순히 my_file.txtSTDOUT에서 생성되지만 쉘이 이를 처리하는 방법이 <변경됩니다 . my_file.txt이제 my_file.txt셸은 내용을 인수로 전달하는 대신 STDIN에 내용을 넣습니다. 앞에서 본 것처럼 표준 입력에서 읽지 않기 때문에 아무것도 인쇄하지 않습니다.echo./my_file.txtechoecho

STDIN에서 정말로 읽으려면 다음을 echo사용해야 합니다 .xargs

xargs echo < my_file.txt
  • <매개변수 가 아니라 my_file.txt내용이 STDIN에 배치된 파일의 경로입니다.
  • xargsechoSTDIN( )에서 읽은 인수를 사용하여 주어진 명령을 실행합니다.

이제 "Hello"가 인쇄됩니다.

비슷하게,

cat my_file.txt | xargs echo

또한 유효합니다:

  • cat콘텐츠를 가져와 ./my_file.txtSTDIN에 넣고 STDOUT에 콘텐츠를 인쇄합니다.
  • 파이프는 |STDOUT을 가져와서 터미널에 이 STDOUT을 인쇄하는 대신 catSTDIN에 넣습니다 (기본 동작).echo
  • xargsechoSTDIN( )에서 읽은 인수를 사용하여 주어진 명령을 실행합니다.

관련 정보