쉘 스크립트의 혼합 코드. 공유 변수

쉘 스크립트의 혼합 코드. 공유 변수

이 답변터미널의 명령줄에서 여러 줄의 Python 코드 조각을 실행하는 방법을 설명합니다. 나는 중첩된 들여쓰기를 사용하더라도 쉘 스크립트에서 대답이 잘 작동한다는 것을 알았습니다.

#!/bin/bash
some_text="Hello world"
echo $some_text

cat <<EOF | python -
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
EOF

인쇄:

0 
hello
hello
1
hello
hello
2
hello
hello

그러나 쉘 스크립트와 Python 코드 조각 간에 변수를 공유하는 데 문제가 있습니다.

  1. Bash 스크립트에서 Python 첨자의 출력을 수집하는 방법은 무엇입니까? (예: 와 같은 변수에서 $output).

  2. bash 변수(예: $some_text)를 Python 스크립트에 어떻게 전달합니까?

답변1

Python 변수 가져오기

EOF( 토큰이 인용되지 않은 경우 ) python텍스트가 구분 기호에서 표준 입력으로 전달되기 전에 변수 대체가 발생하므로 변수를 스크립트에 직접 던질 수 있습니다.

python - <<EOF
some_text = "$some_text"
EOF

만약 some_text그렇다면 test, 파이썬은 그것을 보게 될 것입니다 some_text = "test". 하지만 이는 코드 주입 취약점으로 간주될 수 있다는 점에 유의하세요. 예를 들어, some_textwas 인 경우 Python은 다음을 확인합니다."; import os; os.system("evil-command"); x = "

some_text = ""; import os; os.system("evil-command"); x = ""

그리고 그 사악한 명령을 실행하세요.

수정 없이 Python 코드를 스크립트로 직접 가져오려면 변수를 내보낼 수 있습니다.

export some_text

os.environ그것을 검색하는 데 사용되었습니다 .

some_text = os.environ['some_text']

이것은 더 똑똑하고 안전한 접근 방식입니다.


Python에서 출력 가져오기

명령 대체를 사용하여 스크립트의 출력을 수집할 수 있습니다.

output=$(
python - <<EOF
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
EOF
)

(후행 줄 바꿈은 제거됩니다.)

답변2

귀하의 접근 방식의 문제점은 내장된 Python 스크립트가 더 이상 원래 표준 입력에 액세스할 수 없다는 것입니다(표준 입력이 ... 자체이기 때문입니다).

이것이 문제라면 다음과 같이 작성할 수 있습니다.

python -c '
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
'

또는 Python 스크립트에 작은따옴표가 포함될 수 있는 경우:

python -c "$(cat << 'EOF'
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
EOF
)"

또는:

python <(cat << 'EOF'
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
EOF
)

답변3

파일 이름으로 대시를 사용하십시오.

ruby - a b <<'END'
puts ARGV.join(",")
END

python - a b <<'END'
import sys
print ",".join(sys.argv[1:])
END

sys.argv[1:]이것이 Python에서 하는 것이 올바른 일인지 모르겠습니다 . -e/-c의 경우 --를 사용하여 인수의 끝을 지정할 수 있습니다.

set -- -a -b -c
ruby -e 'puts ARGV.join(",")' -- "$@"
python -c 'import sys; print ",".join(sys.argv[2:])' -- "$@"

출력 캡처 및 STDERR 리디렉션:

x=$(ruby <<'END' 2> /dev/null
puts "a"
abort "b"
END
)

답변4

1) Python에서 파일에 변수 할당을 작성한 다음 bash 스크립트에서 파일을 가져올 수 있습니다.

2) 귀하의 단어(EOF)가 인용되지 않았기 때문에 여기 문서의 모든 줄은 매개변수 확장의 대상입니다. 이를 사용하여 콘텐츠를 Python 스크립트에 전달할 수 있습니다.

관련 정보