反引号或此处字符串或读取在 RHEL 8 中未按预期工作

反引号或此处字符串或读取在 RHEL 8 中未按预期工作

我正在尝试将 python 脚本的输出重定向为交互式 shell 脚本的输入。

测试.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)

读取&此处字符串在两种情况下都可以正常工作,如下所示

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

答案1

read a b从中读取两个单词行(由$IFS字符分隔的单词以及用 转义的单词和行分隔符\)。

您的python脚本输出 2 行。

旧版本bash有一个错误,cmd <<< $var或者正在将分词应用于andcmd <<< $(cmd2)的扩展,并将结果元素用空格重新连接起来,确实构成了此处字符串的内容(例如,参见$var$(cmd2)为什么 bash 的 cut 会失败,而 zsh 则不会?)。

这个问题在 4.4 版本中得到了修复,这解释了为什么你没有得到什么期待更多。

要将命令输出的前两行读入$aand$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[*]}"

相关内容