예상대로 작동합니다.
$> cat ./readfromstdin.sh
echo reading
cat /dev/stdin
$> echo hello | ./readfromstdin.sh
reading
hello
임시 파일 없이 비슷한 것을 달성하려고 합니다. 나의 첫 번째 시도는
echo hello | (echo cat /dev/stdin|sh)
이것은 작동하지 않습니다. heredoc을 사용하면 작동하지 않습니다(올바른 구문이 무엇인지는 모르겠지만:
echo hello | (cat << EOF | sh
cat /dev/stdin
EOF)
pipe cmdsubst pipe heredoc>
쉘에 파이프된 스크립트를 사용하여 stdin에서 데이터를 읽을 수 있습니까?
답변1
서브셸에 파이프를 연결하면 비교적 쉽게 설명하는 작업을 수행할 수 있습니다.
$ echo hello | ( echo reading; cat /dev/stdin )
reading
hello
나는 이것에 대한 어떤 사용 사례도 상상할 수 없다는 것을 인정합니다. 그냥 하면 안되는 이유:
$ echo hello | ( echo reading; read var; echo "$var")
reading
hello
이를 통해 표준 입력의 내용을 변수로 저장하고 여가 시간에 조작할 수 있습니다.
답변2
$ echo 'world' | { echo 'hello'; cat }
hello
world
다른 피연산자가 지정되지 않으면 기본적 으로 연산이 수행되므로 이를 명시적 /dev/stdin
으로 지정할 필요가 없습니다 .cat
cat
자신의 코드에서 다음을 전달하려는 것 같습니다.주문하다출력할 문자열이 아닌 sh
어쨌든, 이것이 코드의 존재를 해석하는 방법입니다. 하지만 이것이 당신에게 필요한지 완전히 확신할 수는 없습니다.
이 작업을 수행할 때 발생하는 문제는 스크립트에 sh
표준 입력을 제공함으로써 발생합니다. 따라서 표준 입력은 명령용으로 예약되므로 여기에 문자열을 파이프하는 것은 작동하지 않습니다.
답변3
상위 프로세스에서 전달된 stdin을 참조하는 stdin을 통해 명령이 전달된 하위 쉘에서 stdin에 액세스한다는 의미입니까?
이것은 정말 한 입의 이야기입니다. 이것이 무슨 뜻입니까?
$ cat ~/.tmp/test.sh
#!/bin/bash
set -eu
echo i am stdin from pipe | {
echo '0</dev/fd/100 cat -' | sh -x
} 100<&0
$ ~/.tmp/test.sh
+ cat -
i am stdin from pipe
echo i am stdin from pipe
100<&0
참조 손실을 방지하려면 fd로 리디렉션하세요 .'0</dev/fd/100 cat -'
표준 입력에 문자열로 전달되어sh -x
평가 및 실행됩니다.- 표준 입력 참조는 표준 출력에 문자열을 쓰는 프로세스로
/dev/fd/100
리디렉션됩니다 ./dev/stdin
cat -
i am stdin from pipe
분명히 말씀드리자면 절대 하지 마세요^^.