Bash에서 외부 프로그램을 대화식으로 실행하는 방법은 무엇입니까?

Bash에서 외부 프로그램을 대화식으로 실행하는 방법은 무엇입니까?

예를 들어, 쉘 스크립트에서 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사용( forperlgawk-e표현하다) 바꾸다 -c(암호/주문하다)).

(짧은 스크립트만 해당(Linux에서는 128KiB 이하).

또는 다른 파일 설명자를 통해 여기에 문서화되어 있습니다.

python2 /dev/fd/3 3<< 'EOF'
name = raw_input("Enter your name:")
EOF

관련 정보