Bash

反引號或此處字元串或讀取在 RHEL 8 中未按預期工作

  • April 2, 2021

我正在嘗試將 python 腳本的輸出重定向為互動式 shell 腳本的輸入。

test.py

print('Hello')
print('world')

說 test.py 如上所述列印*“Hello world” ,它使用*Here 字元串重定向提供給兩個變數,如下所示

互動式腳本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)

read & Here 字元串在兩種情況下都可以正常工作,如下所示

tmp> read a b <<< Hello world"
tmp> echo $a $b
Hello world

read a b從一行中讀取兩個單詞(由$IFS字元分隔的單詞以及使用 轉義的單詞和行分隔符\)。

您的python腳本輸出 2 行。

舊版本bash有一個錯誤,cmd <<< $var或者cmd <<< $(cmd2)正在將分詞應用於擴展,$var$(cmd2)用空格將結果元素連接回來確實構成了here-string的內容(例如,參見Why does cut fail with bash and not zsh?)。

這已在 4.4 版中得到修復,這解釋了為什麼您不再得到所期望的。

要將命令輸出的前兩行讀入in$a$b變數中bash,請使用:

{
 IFS= read -r a
 IFS= read -r b
} < <(cmd)

或者(不在互動式 shell 中):

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

引用自:https://unix.stackexchange.com/questions/643191