백틱 또는 여기 문자열 또는 읽기가 RHEL 8에서 예상대로 작동하지 않습니다.

백틱 또는 여기 문자열 또는 읽기가 RHEL 8에서 예상대로 작동하지 않습니다.

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[*]}".

관련 정보