我正在尝试将 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 版本中得到了修复,这解释了为什么你没有得到什么你期待更多。
要将命令输出的前两行读入$a
and$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[*]}"
。