Python 스크립트의 출력을 대화형 쉘 스크립트의 입력으로 리디렉션하려고 합니다.
test.py
print('Hello')
print('world')
위에 인쇄된 대로 test.py를 말하세요."안녕하세요 세계"이는 두 가지 변수를 사용하여 제공됩니다.여기에 있는 문자열다음과 같이 리디렉션
대화형 스크립트: read a b <<< `python3 test.py`
Rhel 8 서버에서는 예상대로 작동하지 않지만 Rhel 7에서는 제대로 작동합니다.
리엘 8:
tmp> read a b <<< `python3 test.py`
tmp> echo $a $b
Hello
tmp> cat /etc/redhat-release
Red Hat Enterprise Linux release 8.3 (Ootpa)
변수 b가 비어 있습니다.RHEL 8에서
리엘 7:
tmp> read a b <<< `python3 test.py`
tmp> echo $a $b
Hello world
tmp> cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.8 (Maipo)
그리고여기에서 문자열 읽기(&H)아래 그림과 같이 두 경우 모두 잘 작동합니다.
tmp> read a b <<< Hello world"
tmp> echo $a $b
Hello world
답변1
read a b
에서 두 단어를 읽어하나줄( $IFS
문자로 구분된 단어, 이스케이프된 단어 및 줄 구분 기호 \
)
스크립트 python
는 2줄을 출력합니다.
이전 버전에는 bash
버그가 있거나 cmd <<< $var
토큰화를 확장에 적용 cmd <<< $(cmd2)
하고 결과 요소를 공백으로 다시 연결했습니다. 이는 실제로 여기 문자열의 내용을 구성합니다(예를 참조하세요).$var
$(cmd2)
bash의 컷은 실패하는데 zsh는 실패하는 이유는 무엇입니까?).
이 문제는 버전 4.4에서 해결되었으며 이로 인해 아무것도 얻지 못한 이유가 설명됩니다.너더 많은 것을 기대합니다.
명령 출력의 처음 두 줄을 $a
및 $b
변수 로 읽으려면 bash
다음을 사용합니다.
{
IFS= read -r a
IFS= read -r b
} < <(cmd)
또는 (대화형 쉘이 아닌 경우):
shopt -s lastpipe
cmd | {
IFS= read -r a
IFS= read -r b
}
아니면 lastpipe
:
cmd | {
IFS= read -r a
IFS= read -r b
something with "$a" and "$b"
}
# $a and $b will be lost after the `{...}` command group returns
명령 출력 행을 공백으로 연결하려면 다음을 사용하십시오 cmd | paste -sd ' ' -
. 그러면 다음과 같이 할 수 있습니다:
IFS=' ' read -r a b < <(cmd | paste -sd ' ' -)
당신이 원한다면.
다음을 사용하여 행을 배열 요소로 읽을 수도 있습니다.
readarray -t array < <(cmd)
그리고 배열의 요소를 첫 번째 문자 $IFS
(기본값은 공백) 와 연결합니다 "${array[*]}"
.