Bash
反引號或此處字元串或讀取在 RHEL 8 中未按預期工作
我正在嘗試將 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[*]}"
.