Answers:
简单的事情如下:
echo "$blah" | my_cmd
echo "$blah"
更好。
printf '%s\n' "$blah"
呢?有了这一更改(避免了echo
规范中的许多陷阱,在Unix和Linux上,Stephane的出色答案详细地解释了“ 为什么printf
比echo
?更好”,或者在echo
规范的“应用程序使用”部分中进行了简要介绍),这是一个完美的选择合理的答案。
stdin
在bash中向传递值很简单:
your-command <<< "$your_variable"
始终确保在变量表达式两边加上引号!
请注意,这可能仅在中
bash
起作用而在中不起作用sh
。
<<<
据我所知,herestrings 不能保证可用,它们不是基于POSIX的。只要您仅在中运行它们,它们就会按预期工作bash
。我只提到它,因为他们说OP是“壳”而不是“重击”。尽管他确实用bash
... 标记了问题,所以这显然还是可以接受的答案。
echo
方法,由于创建了管道,敏感信息很可能更容易泄漏。herestring命令将完全由处理bash
,尽管在这种情况下(如前所述),您最好知道它可以在bash上运行,否则由于不支持herestrings而产生的任何错误消息也会泄漏上述信息。
echo
是内置的。那里没有管道,对吗?它是Unix,但不能那么多Unix。
printf '%s\n' "$var"
产生的结果与@StevenLu 产生的结果相同,echo "$var"
但不会中断,var=-en
甚至不需要bash。
请注意,“” echo "$var" | command
操作表示标准输入仅限于回显的行。如果您还希望连接终端,则需要更高级:
{ echo "$var"; cat - ; } | command
( echo "$var"; cat - ) | command
这意味着第一行将是的内容,$var
其余的将来自于cat
读取其标准输入。如果该命令没有做任何花哨的事情(尝试打开命令行编辑或像vim
执行命令那样运行),那将很好。否则,您需要真正看中-我认为expect
或其一种衍生产品可能是合适的。
命令行符号实际上是相同的-但是括号中的第二个分号是必需的,而括号中则不需要。
( echo "$LIST"; cat - ) | sed 1q
这对我有用,但是运行此脚本时我需要按ctrl d?
cat -
继续从键盘,直到EOF或中断阅读,因此,您需要通过键入控制d EOF告诉它。
cat
如第一行所示,如果您不需要终端输入,则根本不需要使用。或者您可以使用cat
列出文件。或者...如果要让命令读取终端输入,则必须在到达输入末尾时告诉它。或者你可以用( echo "$var"; sed /quit/q - ) | command
; 这一直持续到您键入包含“ quit”的行。您将如何无休止地创新。当用户开始使用厄瓜多尔时,请注意该程序停止运行的古老的城市传说。他们输入大写字母Quito的名称,程序退出。
echo "$LIST" | sed 1q | ...
呢?这一切都取决于您要做什么。该<<EOF
符号应在文件下方某处的行首处要求EOF。我认为我不会使用它-但我仍然不确定您要达到的目标。一个简单的echo "$LIST" | command
或echo $LIST | command
可能在实践中就足够了(重要的是,您必须了解两者之间的区别的重要性)。
(cat <<END
$passwd
END
) | command
的cat
是不是真的需要,但它有助于更好地结构中的代码,并允许您在括号中使用更多的指令输入到你的命令。
$passwd
按照Martin的回答,有一个bash功能叫做Here Strings(它本身是更广泛支持的Here Documents功能的一种变体)。
http://www.gnu.org/software/bash/manual/bashref.html#Here-Strings
3.6.7此处字符串
这里文档的一种变体,格式为:
<<< word
该单词将被扩展并通过其标准输入提供给命令。
请注意,此处字符串似乎仅适用于bash,因此,为了提高可移植性,按照PoltoS的回答,您可能最好使用原始的此处文档功能:
( cat <<EOF
$variable
EOF
) | cmd
或者,上述的一个更简单的变体:
(cmd <<EOF
$variable
EOF
)
您可以省略(
和)
,除非您希望将其进一步重定向到其他命令。
这种健壮和可移植的方式已经出现在评论中。它应该是一个独立的答案。
printf '%s' "$var" | my_cmd
要么
printf '%s\n' "$var" | my_cmd
笔记:
echo
,原因在这里:为什么printf
胜于echo
?printf "$var"
是错的。第一个参数是格式,在该格式中会解释%s
或\n
表示各种序列。要正确传递变量,不得将其解释为格式。通常,变量不包含尾随换行符。前一个命令(带有%s
)按原样传递变量。但是,使用文本的工具可能会忽略或抱怨行不完整(请参阅为什么文本文件应以换行符结尾?)。因此,您可能需要后面的命令(带有%s\n
),该命令将换行符附加到变量的内容中。非显而易见的事实:
<<<"$var" my_cmd
)中的字符串确实会添加换行符。my_cmd
,即使变量为空或未定义。试试这个:
echo "$variable" | command
echo
是内置的,因此没有以ps显示的过程
echo "$variable"
更好。
做就是了:
printf "$my_var" | my_cmd
如果var不包含空格,则可以省略引号。
如果使用bash,那么您也可以执行以下操作:
echo -n "$my_var" | my_cmd
避免在不使用-n的情况下使用echo,因为它将通过管道在末尾添加换行符。
%s
,printf将不打印任何内容。my_var="%s"; printf "$my_var";
-也许试试printf "%s" "$my_var" | my_cmd
?
$PATH
吗?这样cat
可以替换为/bin/cat "$@" | tee /attacker/can/read/this/file