如何将variables的值传递给命令的stdin?
我正在编写一个shell脚本,应该有点安全,即不通过命令的parameter passing安全的数据,最好不使用临时文件。 我如何将一个variables传递给命令的stdin? 或者,如果不可能,如何正确使用临时文件来完成这样的任务?
一些简单的事情:
echo "$blah" | my_cmd
在stdin上传递一个值很简单:
your-command <<< "$your_variable"
总是确保你把variablesexpression式引号!
请注意,“ echo "$var" | command
echo "$var" | command
操作意味着标准input仅限于回显的行。 如果你还想要连接terminal,那么你需要更有趣:
{ echo "$var"; cat - ; } | command ( echo "$var"; cat - ) | command
这意味着第一行将是$var
的内容,但其余部分将来自cat
阅读其标准input。 如果这个命令没有做任何事情(尝试打开命令行编辑,或者像vim
那样运行),那就没事了。 否则,你需要变得很花哨 – 我认为expect
或其衍生工具可能是适当的。
命令行符号实际上是相同的 – 但第二个分号对于大括号是必要的,而不是括号。
我喜欢马丁的答案,但根据variables中的内容,它有一些问题。 这个
your-command <<< """$your_variable"""
如果你的variables包含“或!
(cat <<END $passwd END ) | command
cat
并不是真的需要,但它有助于更好地构build代码,并允许在括号中使用更多的命令作为命令的input。
尝试这个:
echo "$variable" | command
根据Martin的回答,有一个叫做Here Strings的bash特性(它本身是更广泛支持的Here Documents特性的一个变体)。
http://www.gnu.org/software/bash/manual/bashref.html#Here-Strings
3.6.7这里string
这里的一个变种文件,格式是:
<<< word
这个词被扩展并提供给它的标准input命令。
请注意,这里的string看起来只是bash,所以为了提高可移植性,根据PoltoS的回答,最好使用原始的“Here Documents”function:
( cat <<EOF $variable EOF ) | cmd
或者,上面的一个简单的变体:
(cmd <<EOF $variable EOF )
您可以省略(
和)
,除非您希望将其redirect到其他命令。