我正在编写一个应该有些安全的shell脚本,即不通过命令参数传递安全数据,最好不使用临时文件。如何将变量传递给命令的stdin?或者,如果不可能,如何正确使用临时文件进行此类任务?
答案 0 :(得分:151)
在stdin上传递值非常简单:
your-command <<< "$your_variable"
始终确保在变量表达式周围加上引号!
答案 1 :(得分:65)
简单的事情:
echo "$blah" | my_cmd
答案 2 :(得分:17)
请注意,'echo "$var" | command
操作意味着标准输入仅限于回显的线路。如果您还希望连接终端,那么您需要成为更高级的终端:
{ echo "$var"; cat - ; } | command
( echo "$var"; cat - ) | command
这意味着第一行将是$var
的内容,但其余部分将来自cat
读取其标准输入。如果命令没有做任何太花哨的事情(尝试打开命令行编辑,或像vim
一样运行)那么它会没问题。否则,你需要变得非常花哨 - 我认为expect
或其中一个衍生物可能是合适的。
命令行符号实际上是相同的 - 但是第二个分号对于括号是必要的,而不是括号。
答案 3 :(得分:15)
(cat <<END
$passwd
END
) | command
不需要cat
,但它有助于更好地构造代码,并允许您在括号中使用更多命令作为命令的输入。
答案 4 :(得分:12)
我喜欢Martin的答案,但根据变量中的内容有一些问题。此
your-command <<< """$your_variable"""
如果变量包含“或!,会更好
答案 5 :(得分:7)
根据Martin的回答,有一个名为 Here Strings 的bash功能(它本身是更广泛支持的 Here Documents 功能的变体)。
http://www.gnu.org/software/bash/manual/bashref.html#Here-Strings
3.6.7这里的字符串
此处文件的变体,格式为:
<<< word
该词被扩展并以其标准提供给命令 输入
请注意,Here Strings似乎只是bash,因此,为了提高可移植性,根据PoltoS的回答,您最好使用原始的Here Documents功能:
( cat <<EOF
$variable
EOF
) | cmd
或者,更简单的上述变体:
(cmd <<EOF
$variable
EOF
)
您可以省略(
和)
,除非您希望将其重定向到其他命令。
答案 6 :(得分:3)
试试这个:
echo "$variable" | command
答案 7 :(得分:0)
这种健壮和可移植的方式已经出现在评论中。它应该是一个独立的答案。
printf '%s' "$var" | my_cmd
或
printf '%s\n' "$var" | my_cmd
注意:
echo
好,原因在这里:Why is printf
better than echo
? printf "$var"
是错误的。第一个参数是格式,其中解释了诸如%s
或\n
之类的各种序列。要正确传递变量,不得将其解释为格式。通常,变量不包含尾随换行符。前一个命令(带有%s
)按原样传递变量。但是,使用文本的工具可能会忽略或抱怨行不完整(请参见Why should text files end with a newline?)。因此,您可能需要后一个命令(带有%s\n
),该命令将换行符附加到变量的内容中。非显而易见的事实:
<<<"$var" my_cmd
)中的字符串确实附加了换行符。my_cmd
的非空stdin,即使该变量为空或未定义。答案 8 :(得分:-1)
只是做:
printf "$my_var" | my_cmd
如果var不包含空格,则可以省略引号 如果使用bash,那么你也可以这样做:
echo -n "$my_var" | my_cmd
避免在没有-n的情况下使用echo,因为它会在最后添加一个换行符来管道变量。