답변:
다른 두 가지 접근법 (추가 노력없이 여러 줄 입력 허용) :
"여기 문서"를 사용하십시오 :
$ 화장실 << EOF 사과 배 오렌지 EOF 1 3 18 $
EOF
문자열은 분리 문자입니다. 어떤 문자열이든 사용할 수 있습니다. EOF
단지 일반적인 선택입니다.
tty를 입력으로 사용하십시오.
화장실 사과 배 오렌지 Ctrl+D 1 3 18 $
여기에는 프로그램 실행이 시작되고 이름을 입력하자마자 입력 읽기가 시작되는 단점이 있습니다. 이것은 당황 스러울 수 있습니다. 예를 들면 다음과 같습니다.
$ grep v 빠른 갈색 여우 (타이핑) 점프 (타이핑) 뛰어 넘다 (이것은 grep에서 출력됩니다!) 게으른 개. (타이핑 된) Ctrl + D (여기에 출력이 없습니다) $
<<<
양식은 추가 노력없이 여러 줄 입력을 허용 "
합니다. 물론 << EOF
여러 줄로 입력 하면 양식 (원본 here-doc 구문)을 쉽게 읽을 수 있습니다.
<<<
word
물론 쉘의 맥락에서 word
공백과 개행을 포함하는 인용 된 문자열 일 수 있다고 말합니다 . 도! 그것은 말도없이 진행된다는 것이 너무 분명합니다 (사실 맨 페이지에 언급되지 않았습니다). :-( 나에게 이것을 지적 해 주셔서 감사합니다!
word
는 맨 페이지에서 "쉘에서 단일 단위로 간주되는 일련의 문자"(일명 "토큰")로 정의되며 인용 된 문자열은 관련 의미에서 "단일 단위"로 처리된다는 것을 알아야합니다 (이후 백 슬래시 처리, 변수 확장 등. "그러나 실제로 이것은 쉘에서 큰 따옴표로 묶는 것의 목적입니다. (한 따옴표도 확장으로부터 보호합니다.) 쉘의 처리 모델은 매우 잘 알려져 있으며 단순합니다.
여기에는 몇 가지 유효한 솔루션이 있지만 때때로 유용 할 수있는 또 다른 구문은에서 명령을 실행하는 것입니다 <()
. 이를 통해 명령 행에 둘 이상의 파일 디스크립터 오브젝트를 작성할 수 있습니다.
긴 텍스트 문자열을 비교하는 등의 작업을 수행하거나 파일에없는 일부 내용을 비교하려는 경우에 유용합니다.
예를 들어, 호스트 파일을 로컬 호스트에 복사하지 않고 두 노드에서 호스트 파일을 비교합니다.
diff -Naur <(cat /etc/hosts) <(ssh -q otherhost 'cat /etc/hosts')
은 <
STDIN에 파일을 리디렉션하고는 ()
괄호 사이의 명령을 실행할 수있는 서브 쉘을 만들 수 있습니다. 실행중인 명령의 STDIN으로 전달되는 서브 쉘의 STDOUT입니다.
여러 개의 문서를 사용하거나 여러 명령을 파이프 라인에 최종 명령으로 에코하는 것보다 명령에 하나 이상의 입력 "파일"을 작성하는 것이 더 쉬운 방법입니다.
<fileorpathname
stdin을 리디렉션하지만 <(subcmd)
그렇지 않습니다. 프로그램에 의해 열릴 때 subcmd에서 stdout을 읽을 수있는 이름을 대체합니다. < <(subcmd)
(필요한 공간)은 거의 같은 파일에서 stdin을 리디렉션 subcmd |
합니다. 귀하의 diff
읽을 수있는 하나 의 인수를 지정하여 표준 입력으로부터의 입력을 -
하지만 둘.
cmd <(cmd2 ...)
와 cmd < <(cmd2 ...)
. 전자는 파생 데이터 (cmd2의 출력)를 파일 이름 대신 사용할 수 있도록합니다. 후자는와 같습니다 cmd2 ... | cmd
. stdin 입력을 명시 적으로 허용하도록 명령을 작성해야하지만 대부분은 그렇지 않습니다. 이것은 특히 쉘 스크립트의 경우에 해당됩니다.