![파일 내용을 "echo" 명령으로 리디렉션](https://linux55.com/image/28648/%ED%8C%8C%EC%9D%BC%20%EB%82%B4%EC%9A%A9%EC%9D%84%20%22echo%22%20%EB%AA%85%EB%A0%B9%EC%9C%BC%EB%A1%9C%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98.png)
my_file.txt
내용이 문자열인 파일이 있습니다 Hello
. 해당 내용을 명령으로 리디렉션하려면 어떻게 해야 합니까 echo
?
나는 그 명령을 갖고 있다는 것을 알고 있지만 , less
그것을 실행하려면 그 명령을 사용해야 합니다 .cat
more
echo
나는 이것을 시도했습니다 :
$ 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 일관성 구현과 마찬가지로,\0351
echo
하지만 전부는 아니다), 그 다음에printf
차라리 사용 하시겠습니까?:
printf '%b\n' "$(cat my_file.txt)"
대조적으로 echo
, 파일 내용이 -
.
대안 $(cat file)
으로ksh
, zsh
및 를 사용하여 bash
다음을 수행할 수도 있습니다.$(<file)
. 이것은 특수 연산자입니다.껍데기cat
확장을 보상하기 위해 파일 내용을 읽는 것과는 대조적입니다 . 여전히 추가 프로세스를 생성하는 를 제외하고는 후행 줄 바꿈을 제거하고 NUL 바이트를 차단합니다 zsh
. bash
또한 한 가지 차이점은 이 방법으로 디렉터리 유형 파일을 읽으려고 하면 오류가 발생하지 않는다는 것입니다. 또한 $(< file)
특별하지만 ( 다른 쉘을 에뮬레이트하지 않을 때 다음을 실행하여 확장되는 것은 $(< file; other command)
아닙니다)zsh
file
절대적인 $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.txt
STDOUT에서 생성되지만 쉘이 이를 처리하는 방법이 <
변경됩니다 . my_file.txt
이제 my_file.txt
셸은 내용을 인수로 전달하는 대신 STDIN에 내용을 넣습니다. 앞에서 본 것처럼 표준 입력에서 읽지 않기 때문에 아무것도 인쇄하지 않습니다.echo
./my_file.txt
echo
echo
STDIN에서 정말로 읽으려면 다음을 echo
사용해야 합니다 .xargs
xargs echo < my_file.txt
<
매개변수 가 아니라my_file.txt
내용이 STDIN에 배치된 파일의 경로입니다.xargs
echo
STDIN( )에서 읽은 인수를 사용하여 주어진 명령을 실행합니다.
이제 "Hello"가 인쇄됩니다.
비슷하게,
cat my_file.txt | xargs echo
또한 유효합니다:
cat
콘텐츠를 가져와./my_file.txt
STDIN에 넣고 STDOUT에 콘텐츠를 인쇄합니다.- 파이프는
|
STDOUT을 가져와서 터미널에 이 STDOUT을 인쇄하는 대신cat
STDIN에 넣습니다 (기본 동작).echo
xargs
echo
STDIN( )에서 읽은 인수를 사용하여 주어진 명령을 실행합니다.