在UNIX中重定向输入以读取命令

Att*_*yak 2 shell

我想使用read命令初始化一个变量,该变量的值来自前一个命令的输出.我希望这有效:

echo some_text | read VAR
Run Code Online (Sandbox Code Playgroud)

但$ VAR是空的."read从标准输入读取一行." 该联机帮助页说.管道将echo的输出发送到read的输入.我哪里错了?

我的工作解决方案是

echo text > file ; read VAR < file
Run Code Online (Sandbox Code Playgroud)

但是它使用了一个文件......

gle*_*man 7

我假设你的shell是bash.当存在管道时,管道中的每个命令都在子shell中执行,并且父shell连接所有适当的文件描述符.因此,read命令获取其stdin并设置VAR变量,然后它的subshel​​l退出并带有变量.

你可以使用here-doc

read VAR << END
text
END
Run Code Online (Sandbox Code Playgroud)

或者,在bash中,这是一个here-string

read VAR <<< "text"
Run Code Online (Sandbox Code Playgroud)

或者进程替换

read VAR < <(echo text)
Run Code Online (Sandbox Code Playgroud)