파일을 기대하는 프로그램에 텍스트 전달


30

내가 스택 오버플로에 대해 질문 한 내용 : wsadmin.sh에 여러 줄의 코드를 전달 하시겠습니까? .

나는 문자열로 명령에 공급 해야하는 몇 줄의 입력을 가지고 있습니다. 그러나이 명령은 입력으로 가득 찬 파일 만 허용합니다.

실제로 디스크에 쓰여지지 않고 프로그램에 직접 공급하는 임시 파일이나 파이프에 줄을 저장할 수있는 방법이 있습니까?

파이프를 가져 와서 입력을 공급하고 파이프를 명령에 전달한 다음 파이프를 제거하려면 어떻게해야합니까?


2
사용중인 명령의 예와 호출 방법을 추가 할 수 있습니까?
획기적인

2
그것은 프로그램이 stdin을 받아들이지 않는다는 것을 의미합니까?
Léo Lam

위의 두 의견 자 모두에 동의합니다. 프로그램의 사양을 모른 채 작동 할 수있는 것을 제안하는 것은 불가능합니다.
Larssend

답변:


27

또 다른 해결책은 Bash에서 프로세스 대체 를 사용하는 것 입니다. 시스템에 명명 된 파이프가있는 경우이 기능을 사용할 수 있습니다.

다음과 같이 사용됩니다 :

program_expecting_a_file <(list)

여기서 list일련의 쉘 명령 (실제로 파이프 라인; 자세한 내용은 여기 )을 참조 하십시오 . list실행되고 출력이 파이프에 연결됩니다. 그런 다음 파이프 이름이 프로그램으로 전달됩니다.

참고 :< 및 사이에는 공백이 허용되지 않습니다 (.

(다른 대체물 >(list)도 예상대로 작동합니다.)

특정의 경우에, 당신은 사용할 수 있습니다

program_expecting_a_file <(echo "$your_strings")

@meuh의 솔루션이 더 우아하다는 것을 알 수 있습니다.

업데이트 : Advanced Bash Scripting Guide 에서 많은 사용 예를 찾을 수 있습니다 .


다른 두 개는 아주 사소한 경우에도 효과가 없었습니다. 너는 내가 지금까지 던진 테스트를 통과했다. 나는 지금 당신을 옹호했습니다. 필요한 모든 작업을 수행하면 다시 돌아와서 승인 된 것으로 표시합니다.
ArtOfWarfare

당신은 완벽하게 작동합니다. 원하는 경우 StackOverflow의 관련 질문에 추가 할 수 있으며 거기에서도 받아 들일 수 있습니다. stackoverflow.com/questions/31374202/…
ArtOfWarfare

@ArtOfWarfare 님, 안녕하세요. 기꺼이 도와 드리겠습니다. 거기에 이미 제안 된 동일한 솔루션에 대한 의견이 있으므로 거기에 답변을 게시하는 것이 옳지 않습니다.
에드워드

그 전에 솔루션을 게시했습니다. 어쨌든, 나는 그의 의견을 대답으로 바꿔서 받아 들일 수 있도록 요청했습니다. 해당 질문에 ~ 24 시간 이내에 답변을 게시 한 사람이 없다면 답변을 직접 게시하여 답변을받을 수 있습니다. 미래의 독자 / 질문에 대한 잠재적 인 답변자에게 나쁜 태도.)
ArtOfWarfare

안녕하세요 @ArtOfWarfare, 나는 당신이 제안하는 것에 절대적으로 좋습니다!
Edward

15

bash here-doc을 사용할 수 있습니다 . 예를 들어

$ cat -n <<<'a
> b'
 1  a
 2  b

bash 변수에 무언가가있는 경우 보간 할 수도 있습니다 (예 :) <<<"path is $PATH".


명령이 파일 이름을 요구하면 파일 이름을 지정할 수 있습니다 /dev/stdin. 예 :

$ sed -f /dev/stdin <<<'s/a/b/'

출력을 생성합니다 s/b/b/.


명령이에 대한 입력을 수락하는지 여부는 확실하지 않으며 stdin그렇지 않은 경우 작동하지 않습니다. OP가 명확히하기를 바랍니다.
David Z

1
:( -이 약속 슈퍼 듯,하지만 난 그것을 시도 할 때, 나는 오류 메시지가 있어요"-f" option must be followed by a file name.
ArtOfWarfare

here-doc은 stdin 용입니다. 명령에 절대적 -f으로 파일 이름이 필요한 경우 filename을 제공하십시오 /dev/stdin. 내 편집을 참조하십시오.
meuh

편집 후 절대적으로 실행 가능한 옵션이라고 생각합니다!
Edward

1
/dev/stdin제안에 +1 내가 호출하려고하는 프로그램은 파일 이름 만 허용하므로 /dev/stdinheredoc과 결합 했습니다.
휴 월터스

7

스크립트의 내용에 따라 stdin 을 나타내는 특수 파일 이름-(빼기)를 사용할 있습니다

$ mycmd -
Line 1
Line 2
^D

또 다른 방법 /dev/fd/0stdin을 나타내는 파일을 여는 것 입니다.

세 번째 옵션은 FIFO ( 선입 선출) 를 만드는 것 입니다. 그것은 파일과 같지만 두 개의 끝이 있습니다. 한 쪽 끝을 쓰고 다른 쪽 끝을 읽습니다.

-- Process 1 --                  -- Process 2 --
$ mkfifo foo
$ cat foo
<waits>                          $ echo hello > foo
hello                            $
$ rm foo

3
-이 방법 을 해석하기 위해 프로그램을 작성해야한다는 점에 주목할 가치가 있습니다. 쉘이나 운영 체제의 기능이 아닙니다. 물론 대부분의 표준 Linux 유틸리티는 내가 아는 한이 규칙을 따릅니다.
David Z

1
아니. 이 프로그램에서는 작동하지 않습니다. 대화 형 모드가 있지만 다른 프로그램 에서이 프로그램으로 실행할 명령을 전달하고 싶고 토끼 구멍에 들어가고 싶지 않습니다 expect.
ArtOfWarfare

@ArtOfWarfare 방금 작동 할 수있는 세 번째 옵션을 추가했습니다.
Majenko

좋은 대답입니다! 두 번째 및 세 번째 옵션은 기본적으로 <()솔루션과 비슷하지만 더 명시 적입니다. 매우 유용 할 수 있습니다!
에드워드

4

mycmd -솔루션 과 비슷한 또 다른 옵션이 있지만 -구체적으로 처리하지 않는 프로그램의 경우도 있습니다 .

$ mycmd /dev/stdin
Line 1
Line 2
^D

/dev/stdin OS와 관련이 있으며 데비안 GNU / 리눅스에서 작동하지만 다른 곳에서도 잘 작동하는지 잘 모르겠습니다.


1
이것은 작동하는 것처럼 보이지만 무엇 ^D입니까?
ArtOfWarfare

^DCtrl-D를 누르기위한 일반적인 표기법입니다. ^ D에는 "입력 스트림의 끝"이라는 의미가 있습니다. Ctrl-Z를 누르기 위해 각각 Ctrl-C를 누르는 것을 의미 ^C하거나 더 자주 볼 수 ^Z있습니다.
Axel Beckert

1
그것은 효과가있는 것처럼 보이지만 프로그래밍 방식으로 물건을 넣은 /dev/stdin다음 닫는 방법은 무엇입니까?
ArtOfWarfare

1
그 명령으로 무언가를 파이프하면 작동 cat content | mycmd /dev/stdin합니다. cat여기 와 다른 명령을 상상해보십시오 .
Axel Beckert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.