문자가 파일에서 온 것처럼 명령에 문자를 보내려면 어떻게해야합니까?


22

문자가 파일에서 온 것처럼 명령에 문자를 보내려면 어떻게해야합니까?

예를 들어 시도했습니다.

wc < "apple pear orange"
-bash: apple pear orange: No such file or directory

답변:



18

다른 두 가지 접근법 (추가 노력없이 여러 줄 입력 허용) :

  1. "여기 문서"를 사용하십시오 :

    $ 화장실 << EOF
    사과 배 오렌지
    EOF
      1 3 18
    $

    EOF문자열은 분리 문자입니다. 어떤 문자열이든 사용할 수 있습니다. EOF단지 일반적인 선택입니다.

  2. tty를 입력으로 사용하십시오.

    화장실
    사과 배 오렌지
    Ctrl+D
      1 3 18
    $

    여기에는 프로그램 실행이 시작되고 이름을 입력하자마자 입력 읽기가 시작되는 단점이 있습니다. 이것은 당황 스러울 수 있습니다. 예를 들면 다음과 같습니다.

    $ grep v
    빠른 갈색 여우              (타이핑) 
    점프                       (타이핑) 
    뛰어 넘다                       (이것은 grep에서 출력됩니다!) 
    게으른 개.                   (타이핑 된)
    Ctrl + D
                                    (여기에 출력이 없습니다) 
    $

레코드의 경우 : -닫힌 문자열은 개행을 포함 할 수 있으므로이 <<<양식은 추가 노력없이 여러 줄 입력을 허용 "합니다. 물론 << EOF여러 줄로 입력 하면 양식 (원본 here-doc 구문)을 쉽게 읽을 수 있습니다.
Alexis

맨 페이지는 문자열 구문은 <<< word물론 쉘의 맥락에서 word공백과 개행을 포함하는 인용 된 문자열 일 수 있다고 말합니다 . 도! 그것은 말도없이 진행된다는 것이 너무 분명합니다 (사실 맨 페이지에 언급되지 않았습니다). :-( 나에게 이것을 지적 해 주셔서 감사합니다!
G-Man은 '복귀 모니카'라고

나는 그것을 간단하거나 명백하게 부르지 않을 것입니다. A word는 맨 페이지에서 "쉘에서 단일 단위로 간주되는 일련의 문자"(일명 "토큰")로 정의되며 인용 된 문자열은 관련 의미에서 "단일 단위"로 처리된다는 것을 알아야합니다 (이후 백 슬래시 처리, 변수 확장 등. "그러나 실제로 이것은 쉘에서 큰 따옴표로 묶는 것의 목적입니다. (한 따옴표도 확장으로부터 보호합니다.) 쉘의 처리 모델은 매우 잘 알려져 있으며 단순합니다.
Alexis

@alexis : 나는 그런 상단을 통해 갈 때 이모티콘을 포함, 하나는 내가 아이러니 해요 가능성을 고려해야한다.
G-Man, 'Reinstate

10

여기에는 몇 가지 유효한 솔루션이 있지만 때때로 유용 할 수있는 또 다른 구문은에서 명령을 실행하는 것입니다 <(). 이를 통해 명령 행에 둘 이상의 파일 디스크립터 오브젝트를 작성할 수 있습니다.

긴 텍스트 문자열을 비교하는 등의 작업을 수행하거나 파일에없는 일부 내용을 비교하려는 경우에 유용합니다.

예를 들어, 호스트 파일을 로컬 호스트에 복사하지 않고 두 노드에서 호스트 파일을 비교합니다.

diff -Naur <(cat /etc/hosts) <(ssh -q otherhost 'cat /etc/hosts')

<STDIN에 파일을 리디렉션하고는 ()괄호 사이의 명령을 실행할 수있는 서브 쉘을 만들 수 있습니다. 실행중인 명령의 STDIN으로 전달되는 서브 쉘의 STDOUT입니다.

여러 개의 문서를 사용하거나 여러 명령을 파이프 라인에 최종 명령으로 에코하는 것보다 명령에 하나 이상의 입력 "파일"을 작성하는 것이 더 쉬운 방법입니다.


<fileorpathnamestdin을 리디렉션하지만 <(subcmd)그렇지 않습니다. 프로그램에 의해 열릴 때 subcmd에서 stdout을 읽을 수있는 이름을 대체합니다. < <(subcmd)(필요한 공간)은 거의 같은 파일에서 stdin을 리디렉션 subcmd |합니다. 귀하의 diff읽을 수있는 하나 의 인수를 지정하여 표준 입력으로부터의 입력을 -하지만 둘.
dave_thompson_085

그것은 당신이 주장하는 부분과 달리 지원되지 않는 프로세스 대체입니다 (그러나 dave가 설명하지 않았습니다).
phk

1
내 diff는 Ubuntu 16.04 및 테스트 해야하는 Solaris 11.2 시스템의 bash에서 제대로 작동합니다. 모든 운영 체제의 모든 쉘에서 작동하지 않을 수 있습니다. 실제로 파일을 읽는 것처럼 하위 프로세스의 출력을 읽는 데 사용할 수있는 파일 설명자를 만듭니다. diff는 두 개의 파일 인수를 취하므로 작성된 파일 디스크립터를 통해 두 서브 프로세스의 출력을 읽고 비교할 수 있습니다.
팀 케네디

당신은 사이 당신의 대답에 차이를 추가 할 수 있습니다 cmd <(cmd2 ...)cmd < <(cmd2 ...). 전자는 파생 데이터 (cmd2의 출력)를 파일 이름 대신 사용할 수 있도록합니다. 후자는와 같습니다 cmd2 ... | cmd. stdin 입력을 명시 적으로 허용하도록 명령을 작성해야하지만 대부분은 그렇지 않습니다. 이것은 특히 쉘 스크립트의 경우에 해당됩니다.
DocSalvager

8

파이프를 사용할 수 있습니다

echo "apple pear orange" | wc

8
파이프는 "파일에서 읽기"와 다릅니다. 예를 들어 파이프에서는 뒤로 탐색 할 수 없지만 파일에서는 탐색 할 수 없습니다.
rbialon

0

예상과 비슷한 것을 사용하고 싶을 수도 있습니다. 다음은 원격 텔넷 세션 열기, 프롬프트 대기, 데이터 전송, 응답 대기, 휴면 및 종료의 간단한 예입니다.

#!/usr/bin/expect
spawn telnet localhost 8555
expect "Escape character is '^]'."
send "Hello World\n"
expect "Connection closed by foreign host."
sleep 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.