【问题标题】:input from terminal <<<?从终端输入 <<<?
【发布时间】:2014-07-08 10:52:15
【问题描述】:

我看到了为使用终端输入测试我们的代码而编写的代码:

./spellcheck corpus_colors <<< rend

corpus_colors 是文件名,我猜rend 是终端输入。

&lt;&lt;&lt; 充当终端输入?

【问题讨论】:

  • “终端输入”是一个很具体的东西;并非标准输入的所有内容都是终端输入。例如,对于出于安全原因直接从终端读取密码的程序,使用&lt;&lt;&lt; 重定向(或任何其他类型的标准输入重定向)将不起作用。这就是为什么您不能使用 &lt;&lt;&lt;&lt; 将密码重定向到 sudo(使用默认/安全配置)或 ssh。

标签: bash shell


【解决方案1】:

&lt;&lt;&lt; 是一个 bash 扩展(在基线 POSIX shell 中不可用),它将文字内容重定向到标准输入(添加了尾随换行符)。它是由实现定义的,它看起来是管道还是临时文件。它不充当终端——也就是说,isatty() 将失败。

对比

echo rend | ./spellcheck corpus_colors

...使用

./spellcheck corpus_colors <<<rend

可以稍微更有效率,避免设置管道所需的额外子shell。避免这个子shell也意味着一个操作可以是一个改变shell状态的shell函数,这些状态变化可以持续到函数执行结束。

请参阅the wikipedia article on "here strings",或(更好)the relevant component of the bash manual

【讨论】:

  • @thatotherguy, ...您输入时我正在编辑的信息。 :)
  • 嗨,但是当我输入这个时,它说 Missing name for redirect.why
  • @user3495562,因为这是一个仅限 bash 的功能,所以您只能在 bash shell 中使用它。如果您的脚本以#!/bin/sh 开头,或者以sh somescript 开头,则此处的字符串将不可用。
  • 无论如何 echo 有效。它有三个
  • @user3495562,是的,这里的字符串是三个&lt;&lt;&lt;s。如果它不起作用,请检查您是否正在使用 bash(以 bash 启动,而不是在 POSIX 兼容模式下)。
【解决方案2】:

在 BASH 下,&lt;&lt;&lt; 用于指定“此处字符串”。它是“Here Document”的内联版本。 &lt;&lt;&lt; 之后的内容被输入到调用程序的标准输入中。它类似于通过管道回显命令。更多信息可以在这里找到: http://tldp.org/LDP/abs/html/x17837.html

【讨论】:

  • 仅供参考 - ABS 经常表现出糟糕的做法,并且没有响应式维护(很难纠正此类错误)。 Wooedge.org 上的 wiki 得到更积极的维护(由 freenode.org #bash 频道常客),并有另一篇关于该主题的文章:mywiki.wooledge.org/HereDocument
【解决方案3】:

您可以使用某些字符来重定向输入和输出。

例子...

./someprogram > foo.txt

将替换文件foo.txt(或创建它)并添加someprogram的标准输出

./someprogram >> foo.txt

会将someprogram 的标准输出追加到文件foo.txt(如果需要,创建它)

./someprogram < foo.txt

将使用foo.txt 的内容作为someprogram 的标准输入

./someprogram | someotherprogram

将重定向someprogram的标准输出并将其用作someotherprogram的标准输入

./someprogram < foo.txt > bar.txt

将使用foo.txt的内容和someprogram的标准输入,并将someprogram的标准输出重定向到文件bar.txt

./someprogram <<< rends

将使用“rends\n”(不带引号)作为someprogram 的标准输入

This page 有一些关于该主题的好信息。

【讨论】:

  • 请在您的回答中包含该页面的重要信息。链接可能会消失,这意味着您的答案将毫无用处。
  • 这包含大量与理解&lt;&lt;&lt; 无关的信息,并且(目前已编辑)只是一个明确解释它的链接。
  • (已删除-1,现在这个答案确实讨论了&lt;&lt;&lt;)。
  • @CharlesDuffy 我最初的回答是指出 OP 的正确方向,因为我认为这是一个普遍问题。我在这方面做得很差,无论如何我都不应该做出那种假设。不过,感谢您删除 -1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 2014-04-07
相关资源
最近更新 更多