예를 들어, 쉘 스크립트에서 Python으로 무언가를 실행하려면 다음을 수행합니다.
echo 'print("hello world")' | python2
이제 대화형 작업을 실행하고 싶다고 상상해 보세요. 즉, 나로부터의 입력이 필요합니다.
name = raw_input("Enter your name:")
다음을 수행하여:
echo 'name = raw_input("Enter your name:")' | python2
오류가 발생합니다. 그렇다면 bash에서 상호작용할 수 있는 것을 실행하는 올바른 방법은 무엇입니까?
추신 - 이것은 단지 예일 뿐입니다. Python이 아닌 다른 외부 프로그램에서 일련의 스크립트를 실행해야 하는데, 그 중 일부는 사용자의 입력이 필요합니다. 입력이 필요할 때까지 모든 것이 원활하게 실행되며 현재 스크립트가 충돌하고 다음 스크립트로 전달됩니다.
감사해요:)
답변1
프로그램을 문자열로 명령 인터프리터에 파이프하면 인터프리터는 표준 입력에서 이를 읽어 표준 입력이 파이프의 읽기 끝 부분에 바인딩되도록 합니다. 제공된 정보와 상호 작용하려는 명령은 일반적으로 EOF.
예를 들어:
$ echo 'read x; echo "$x"' | bash
# Just prints an empty line, doesn't wait for input
이것이 작동하려면 다음이 필요합니다.
전체 파이프라인을 실행하는 프로세스의 표준 입력 복사본으로 생성된 다른 파일 설명자에서 대화형으로 제공된 입력을 읽도록 스크립트를 다시 작성합니다.
{ echo '0<&3 read x; echo "$x"' | bash; } 3<&0
Python을 예로 들면 다음과 같습니다(단순 설명 목적으로 저는 Python 프로그래머가 아닙니다).
{ echo 'import sys; \ sys.stdin = open("/dev/fd/3"); \ name = raw_input("Enter your name:")' | python2 } 3<&0
또는
인터프리터가 다른 파일 설명자를 읽도록 하고, 읽은 합계를 파이프에 바인딩하고, 전체 파이프를 실행하는 프로세스의 표준 입력을 사용할 수 있도록 일부 파일 설명자 섞기를 수행합니다. 인터프리터가 스크립트를 인수로 받아들이고 플랫폼이
/dev/fd/n
파일 설명자에 액세스하는 방법을 지원한다고 가정합니다.{ echo 'read x; echo "$x"' | bash /dev/fd/3 3<&0 0<&4; } 4<&0
샘플 Python 스크립트의 경우:
{ echo 'name = raw_input("Enter your name:")' | { python2 /dev/fd/3 } 3<&0 0<&4 } 4<&0
또는
외부 프로그램이 스크립트를 인수로 허용하지 않고( 와 같은 문자열도
bash -c 'echo "foo"'
, 과 같은 파일 이름도 아님bash /dev/fd/3
) 표준 입력에서 스크립트와 대화형으로 제공되는 입력을 읽어야 하는 경우 다음 줄에서 Something을 사용할 수 있습니다. :{ echo 'echo start; echo "foo? "; read x; echo "$x"; echo end' | bash -c '0<&3 cat - while IFS= read -r x do printf "%s\n" "$x" done' 3<&0 0<&4 | bash } 4<&0
답변2
간단한 코드(이해하시기 바랍니다):
read i && echo $i|python3
답변3
stdin 대신 스크립트를 인수로 전달합니다.
python2 -c 'name = raw_input("Enter your name:")'
다음과 같이 이 스크립트를 몇 줄에 입력하는 것을 방해하는 것은 없습니다.
python2 -c '
# my fancy inline script
name = raw_input("Enter your name:")
'
(단, 포함된 Python 코드의 경우 '
로 입력해야 합니다 '\''
.)
이 interpreter -c <code>
구문은 일부 인터프리터에 공통적으로 사용됩니다. 예를 들어, 쉘이 대부분의 경우 ( system("some shell code")
실제로 ) 실행되는 방식은 다음과 같습니다. sh -c "some shell code"
다른 인터프리터( // sed
사용( forperl
gawk
-e
표현하다) 바꾸다 -c
(암호/주문하다)).
(짧은 스크립트만 해당(Linux에서는 128KiB 이하).
또는 다른 파일 설명자를 통해 여기에 문서화되어 있습니다.
python2 /dev/fd/3 3<< 'EOF'
name = raw_input("Enter your name:")
EOF