stdin에 문자열 보내기


158

bash에서 이것을 효과적으로 수행하는 방법이 있습니까?

/my/bash/script < echo 'This string will be sent to stdin.'

나는 다음과 같이 에코에서 출력을 파이프 할 수 있음을 알고 있습니다.

echo 'This string will be piped to stdin.' | /my/bash/script

1
당신은 무엇을 의미합니까 효과적으로 , 왜 관이 할 수있는 방법이 아니다?
Andy

나열한 두 명령 모두 정확히 동일한 작업을 수행해야합니다. 어떤 문제가 있습니까?
Flimzy 2016 년

5
@Flimzy : afaik, 첫 번째 파일이 예상대로 작동하지 않습니다.echo
Andy

아 맞다. 두 번째 양식에 어떤 문제가 있습니까?
Flimzy 2016 년

2
@Flimzy : >리디렉션 형식은 파일 설명자를 fd 0(stdin)로 |여는 반면, opens 는 자식 프로세스를 시작하고 stdout (fd 1)을 다른 프로세스의 stdin에 연결합니다. 이 사실은 사소한 결과를 초래할 수 있습니다 (환경 변수 공유에 대해 생각하십니까?)
sehe

답변:


262

당신은 한 줄을 사용할 수 있습니다 heredoc

cat <<< "This is coming from the stdin"

위와 동일

cat <<EOF
This is coming from the stdin
EOF

또는 명령의 출력을 다음과 같이 리디렉션 할 수 있습니다

diff <(ls /bin) <(ls /usr/bin)

또는 당신은 같이 읽을 수 있습니다

while read line
do
   echo =$line=
done < some_file

또는 단순히

echo something | read param

이 방법으로 이진 값을 입력하는 방법은 무엇입니까? 파이프를 사용하지 않고 (이하 나는 파이프와 함께 할 수있어 : echo -e "\x01\x02..." | ./script)
cprcrack

나는 다른 방법으로 쓰는 것을 좋아한다 : <<< "이것은 stdin에서 온다"perl ..., 이런 식으로 파이프의 왼쪽처럼 보입니다.
Pyrolistical

@Pyrolistical 예! 명령 행에서 펄 원 라이너를 마스터 링 할 때 특히 유용합니다. 커서로 뒤로 이동하지 않고도 펄의 인수를 쉽게 편집 할 수 있습니다. :)
jm666

@ jm666 슬프게도 bash 별칭을 사용하면 어제 배운 것입니다. command_alias <<< "stdin string"형식을 사용하면 명령을 찾을 수 없습니다.
Pyrolistical

@ jm666 더 배울 수있는 곳이 <<<있습니까? 나는 그것을 전에 본 적이 없다는 것을 인정하고 부끄럽다. 그리고 나는 그것에 의해 완전히 신비화되었다. 나는 인터넷 검색을 시도했지만 결과는 관련이 없습니다.
wpcarro

66

당신은 가까이 있었다

/my/bash/script <<< 'This string will be sent to stdin.'

여러 줄 입력의 경우 다음 문서가 적합합니다.

/my/bash/script <<STDIN -o other --options
line 1
line 2
STDIN

주석 편집 :

이진 입력을 달성하려면

xxd -r -p <<BINARY | iconv -f UCS-4BE -t UTF-8 | /my/bash/script
0000 79c1 0000 306f 0000 3061 0000 3093 0000 3077 0000 3093 0000 304b 0000 3093 0000 3077 0000 3093 0000 306a 0000 8a71 0000 306b 0000 30ca 0000 30f3 0000 30bb
0000 30f3 0000 30b9 0000 3092 0000 7ffb 0000 8a33 0000 3059 0000 308b 0000 3053 0000 3068 0000 304c 0000 3067 0000 304d 0000 000a
BINARY

당신이 대체 할 경우 cat를 위해 /my/bash/script(또는 실제로 지난 파이프를 드롭)이 인쇄 :

私はちんぷんかんぷんな話にナンセンスを翻訳することができ

또는 좀 더 괴상한 것을 원한다면 :

0000000: 0000 0000 bef9 0e3c 59f8 8e3c 0a71 d63c  .......<Y..<.q.<
0000010: c6f2 0e3d 3eaa 323d 3a5e 563d 090e 7a3d  ...=>.2=:^V=..z=
0000020: 7bdc 8e3d 2aaf a03d b67e b23d c74a c43d  {..=*..=.~.=.J.=
0000030: 0513 d63d 16d7 e73d a296 f93d a8a8 053e  ...=...=...=...>
0000040: 6583 0e3e 5a5b 173e 5b30 203e 3d02 293e  e..>Z[.>[0 >=.)>
0000050: d4d0 313e f39b 3a3e 6f63 433e 1c27 4c3e  ..1>..:>ocC>.'L>
0000060: cde6 543e 59a2 5d3e 9259 663e 4d0c 6f3e  ..T>Y.]>.Yf>M.o>
0000070: 60ba 773e cf31 803e ee83 843e 78d3 883e  `.w>.1.>...>x..>
0000080: 5720 8d3e 766a 913e beb1 953e 1cf6 993e  W .>vj.>...>...>
0000090: 7a37 9e3e c275 a23e dfb0 a63e bce8 aa3e  z7.>.u.>...>...>
00000a0: 441d af3e 624e b33e 017c b73e 0ca6 bb3e  D..>bN.>.|.>...>
00000b0: 6fcc bf3e 15ef c33e e90d c83e d728 cc3e  o..>...>...>.(.>
00000c0: c93f d03e ac52 d43e 6c61 d83e f36b dc3e  .?.>.R.>la.>.k.>
00000d0: 2f72 e03e 0a74 e43e 7171 e83e 506a ec3e  /r.>.t.>qq.>Pj.>
00000e0: 945e f03e 274e f43e f738 f83e f11e fc3e  .^.>'N.>.8.>...>
00000f0: 0000 003f 09ee 013f 89d9 033f 77c2 053f  ...?...?...?w..?
0000100: caa8 073f 788c 093f 776d 0b3f be4b 0d3f  ...?x..?wm.?.K.?
0000110: 4427 0f3f 0000 113f e8d5 123f f3a8 143f  D'.?...?...?...?
0000120: 1879 163f 4e46 183f 8d10 1a3f cad7 1b3f  .y.?NF.?...?...?
0000130: fe9b 1d3f 1f5d 1f3f 241b 213f 06d6 223f  ...?.].?$.!?.."?
0000140: bb8d 243f 3a42 263f 7cf3 273f 78a1 293f  ..$?:B&?|.'?x.)?
0000150: 254c 2b3f 7bf3 2c3f 7297 2e3f 0138 303f  %L+?{.,?r..?.80?
0000160: 22d5 313f ca6e 333f                      ".1?.n3?

4 바이트 바이너리 플로트에서 처음 90 도의 사인은 무엇입니까?


이 방법으로 이진 값을 입력하는 방법은 무엇입니까?
cprcrack

HERE 문서를 필터링하기 위해 xxd -r(또는 od)를 사용 합니다
sehe

예를 들어 설명해 주시겠습니까? 나는 그것을하지 못했습니다.
cprcrack

1
수정 된 답변을 참조하십시오. 요점은 스크립트에 원시 이진 데이터를 포함시키지 않고 대신 xxd와 같은 프로그램을 통해 필터링하는 것입니다.
sehe

"/ my / bash / script <<< '이 문자열은 stdin으로 전송됩니다.'": "/ my / bash / script '이 문자열은 stdin으로 전송됩니다. ' "?
Baiyan Huang

2

당신은 또한 사용할 수있는 read다음과 같은

echo "enter your name"
read name
echo $name

2

해결책

(1) 한 프로세스에서 stdout 출력을 작성 echo '…'하고 (2) 해당 출력을 다른 프로세스의 stdin 입력으로 리디렉션하지만 (3) bash 파이프 메커니즘을 사용하지 않습니다. 다음은 세 가지 조건에 모두 맞는 솔루션입니다.

/my/bash/script < <(echo 'This string will be sent to stdin.')

<표준 입력 정상적인 재 입력된다. 는 <(…)배시 교체 프로세스이다. 대략 그것은 생성 /dev/fd/…대입 명령의 출력 파일과 대신에 그 이름을 전달 <(…), 예를 들어 여기에 그 결과 script < /dev/fd/123. 자세한 내용은 이 답변을 참조하십시오

다른 솔루션과 비교

  • stdin으로 보낸 한 줄 heredoc script <<< 'string'은 다른 명령의 출력이 아닌 정적 문자열 만 보낼 수 있습니다.

  • in과 같은 프로세스 대체만으로는 diff <(ls /bin) <(ls /usr/bin)stdin에 아무것도 보내지 않습니다. 대신 프로세스 출력은 백그라운드에서 작성된 파일의 내용으로 전달됩니다 (예 :와 동일) diff /dev/fd/10 /dev/fd/11. 이 명령 diff에서 stdin으로부터 입력을받지 않습니다.

사용 사례

파이프 메커니즘과 달리이 < <(…)메커니즘을 사용하면 명령 줄 옵션의 입력 표준과 마찬가지로 명령을 먼저 입력하고 그 뒤에 모든 입력을 넣을 수 있습니다.

그러나 명령 줄 미학을 넘어서 파이프 메커니즘을 사용할 수없는 경우가 있습니다. 예를 들어, 특정 명령과 같은 다른 명령의 인수로서 제공되어야 이 예sshpass .


재미있는 대안. POSIX 호환과 달리 발생 <<<합니까?
모든 근로자는 필수입니다

0
cat | /my/bash/script

입력을 내역에 저장하거나에 표시하지 않고 프로그램에 여러 줄을 입력 할 수 있습니다 ps. 입력을 마치면 Ctrl + C를 눌러 종료하십시오 cat.


-1

별칭은 파이프 stdin을 처리 할 수없고 처리 할 수 ​​없습니다 ...

여기서 우리는 3 줄의 출력을 만듭니다.

$ echo -e "line 1\nline 2\nline 3"
line 1
line 2
line 3

그런 다음 출력을 sed 명령의 stdin으로 파이프하여 한 줄에 모두 배치합니다.

$ echo -e "line 1\nline 2\nline 3" |  sed -e ":a;N;\$!ba ;s?\n? ?g"
line 1 line 2 line 3

동일한 sed 명령의 별칭을 정의하면

$ alias oline='sed -e ":a;N;\$!ba ;s?\n? ?g"'

출력을 별칭의 표준 입력으로 파이프 할 수 있으며 정확히 동일하게 동작합니다

$ echo -e "line 1\nline 2\nline 3" |  oline
line 1 line 2 line 3

별명을 함수로 정의하려고 할 때 문제가 발생합니다.

$ alias oline='function _oline(){ sed -e ":a;N;\$!ba ;s?\n? ?g";}_oline'

기능으로 별명을 정의하면 파이프가 파손됩니다.

$ echo -e "line 1\nline 2\nline 3" |  oline
>

첫째, 이것은 질문에 대답하지 않습니다. 아마도 잘못된 질문에 대답했을까요? 둘째, 별칭 안에 함수를 정의한 이유는 무엇입니까? 당신은해야합니다 function oline() { sed -e ":a;N;\$!ba ;s?\n? ?g"; }. 셋째,이 sed는 awk로 훨씬 더 이해할 수 있습니다.awk -F '\n' 'ORS=" " { print } END { printf "\n"}'
Leonardo Dagnino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.