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


41

my_file.txt내용이 문자열 인 파일 이 있습니다 Hello. 내용을 명령으로 echo어떻게 리디렉션 할 수 있습니까?

내가 명령을 알고 less, cat, more...하지만 난 그것을 할 필요 echo.

나는 이것을 시도했다 :

$ cat my_file.txt | echo

또한 이것 :

$ echo < my_file.txt

그러나 두 경우 모두 my_file.txt의 내용이 아닌 stdout에 공백으로 만 나타납니다.

내가 어떻게 할 수 있습니까?


7
왜 사용을 주장 echo합니까?
케빈

7
@Kevin는 아마도 결국 그는 ANSI C 이스케이프 시퀀스 (확장하고자 \n, b유효한 사용 될 파일의 ...), echo(적어도 기준 echo). 또는 아마도 그것이 왜 그렇게 작동하지 않는지를 이해하고 싶을 것입니다. 어쨌든 IMO를 공감할 이유가 없습니다.
Stéphane Chazelas

3
echo <file.txt를 수행 할 때 왜 작동하지 않는지 궁금해서 여기에 왔습니다. SE에서해야 할 합리적인 질문 인 것 같습니다. 그 대답은 매우 도움이되었습니다. 나에게서 +1
neuronet

답변:


53

원하는 모든 것을 리디렉션 할 수는 echo있지만 아무것도하지 않습니다. echo표준 입력을 읽지 않습니다. 그것은이하는 모든 표준 출력에 쓰기입니다 인수는 공백 문자로 구분하고 개행 문자로 종료 (및 일부 echo그들의 일부 이스케이프 시퀀스 구현 확장 및 / 또는 함께 인수는 시작 -가능한 옵션으로 처리).

당신이 원하는 경우 echo파일의 내용을 표시하려면 인수로 콘텐츠를 전달해야합니다 echo. 다음과 같은 것 :

echo "$(cat my_file.txt)"

참고 $(...)후행 개행 문자 스트립 그 출력에서 cat명령 및 echo추가 다시.

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

당신이 원하기 때문에 그렇게하고 싶은 이유 인 경우 echo을 확장 \n, \b, \0351(UNIX의 준수의로 ... 파일의 이스케이프 시퀀스는 echo구현, 이렇게 전부는 아니지만 ) 다음, 당신은 오히려 사용하는 것 printf대신 :

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

반대로 echo, 파일은 휴대용이며 파일의 내용이로 시작하면 문제가 없습니다 -.


에 대한 대안으로 $(cat file), ksh, zshbash, 하나는도 수행 할 수 있습니다$(<file) . 그것은 확장을 구성하기 위해 파일의 내용 을 읽는 것과 반대로 이 특수 연산자 cat입니다. 여전히 후행 줄 바꿈을 제거하고에서를 제외하고 NUL 바이트를 질식 zsh시킵니다. 에서 bash여전히 추가 프로세스가 중단됩니다. 또한 디렉토리 유형의 파일을 그런 식으로 읽으려고하면 오류가 발생하지 않습니다. 또한 $(< file)특별 $(< file; other command)하지는 않지만 ( zsh다른 쉘을 에뮬레이션하지 않는 file경우 암시 적 $READNULLCMD 명령 (일반적으로 호출기) 을 실행하여 여전히)의 내용을 확장합니다 ).


3
bash와 zsh 모두에서를 건너 뛰고 cat셸에서 직접 읽도록 할 수 있습니다 echo "$(<my_file.txt)".
케빈

1
예, ksh , zshbash 와 함께 사용할 수 있습니다 $(<filename).
Dimitre Radoulov

정말 고마워요, 그게 내가 필요했고 효과가 있었어요! :-)
danielmbcn

@Kevin, Dimitre가 추가되었습니다.
Stéphane Chazelas

4

다른 답변에 추가하는 대신 입력 리디렉션을 시도 할 수도 있습니다 cat

echo $(<my_file.txt)

또는

echo `<my_file.txt`

$()``같은 작업을 수행하면 해당 범위 내에서 명령을 실행하고 마치 사용자가 입력 한 것처럼 출력을 셸에 제공합니다. 이 두 가지의 유일한 차이점은 $ ()이 재귀적일 수 있고``재귀적일 수 없다는 것입니다.


2

간단한 대답 : 할 수 없습니다. echo(쉘 내장 또는 일반 바이너리) 표준 입력을 처리하지 않습니다. 단 한 가지 방법 일뿐입니다.


질문은 왜 실제로 이것을하고 싶습니까?
peterph

2

말했듯이

당신이 원하는 경우 echo파일의 내용을 표시하려면 인수로 콘텐츠를 통과해야echo

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

$ cat my_file.txt | xargs echo -e

또는 단순히 당신이 요구 한 것 ( 이스케이프 시퀀스의 해석없이 ) :

$ cat my_file.txt | xargs echo

그러나 사용하는 경우 xargs echo( 기본 명령 인 xargsbtw와 동일 echo) echo쉘의 내장 echo명령이 아니라 파일 시스템의 명령입니다. 또한 xargs매우 구체적인 형식으로 입력 해야 합니다 (공백, 줄 바꿈, 따옴표, 백 슬래시는 특별한 의미가 있음). cat같은 연결하는 하나의 파일 (거기에 여기에 많은 이해가되지 않습니다 < file.txt xargs echo. 유닉스 준수합니다 echo의 기본 출력으로 백 슬래시 이스케이프 확장을 할 -eecho -e.
스테판 Chazelas가

0

bash에서는 다음이 작동해야합니다.

echo `cat my_file.txt`

백틱의 부분은 해당 명령의 출력으로 대체됩니다.이 경우 파일 내용으로 대체됩니다.


사실, 백틱은 다음과 같이 작동 $( . . . )합니다. $()당신이 그들을 중첩 할 수 있기 때문에 일반적으로 사용 하는 사람들이 그들을 선호합니다. 이 질문은 오래되었지만 아직 대답하지 않은 질문에 대답하는 것이 훨씬 더 만족 스럽습니다!
법률 29

좀 빠지는. 미묘한 차이가 있습니다. 백틱 양식이 사용될 때 백 슬래시는 $,`또는 \가 뒤에 오는 경우를 제외하고 문자 그대로의 의미를 유지합니다. 백 슬래시 앞에 있지 않은 첫 번째 백틱은 명령을 종료합니다. $ (,,,) 양식을 사용할 때 괄호 안의 모든 문자가 명령을 구성합니다.
fpmurphy

해당 명령 대체는 인용되지 않았으므로 split + glob 연산자가 적용됩니다. 예를 들어 my_file.txtcontains가 있으면 *현재 디렉토리의 파일 이름 목록이 인쇄됩니다.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.