如何将字符发送到命令,就像它们来自文件一样?

如何将字符发送到命令,就像它们来自文件一样?

如何将字符发送到命令,就像它们来自文件一样?

例如我尝试过:

wc < "apple pear orange"
-bash: apple pear orange: No such file or directory

答案1

在支持的 shell 中这里是字符串,包括bashzshksh93,您可以使用

wc <<< "apple pear orange"

答案2

另外两种方法(允许多行输入,无需额外的努力):

  1. 使用“此处文档”:

    $ wc << EOF
    苹果 梨 橙子
    EOF
      1 3 18
    $

    EOF字符串是一个分隔符。您可以使用任何字符串;EOF只是一个常规选择。

  2. 使用 tty 作为输入:

    $厕所
    苹果 梨 橙子
    Ctrl+D
      1 3 18
    $

    这样做的缺点是,一旦您键入程序名称,程序就会开始运行并开始读取输入。这可能会令人不安;例如:

    $ grep v
    敏捷的棕色狐狸             (打字)
    跳过                      (打字)
    跳过                      (这是 grep 的输出!)
    懒狗。                   (打字)
    Ctrl+D
                                    (这里没有输出)
    $

答案3

尽管这里有几个有效的解决方案,但有时有用的另一种语法是在<().这将允许您在命令行上创建多个文件描述符对象。

当您执行比较长文本字符串之类的操作,或者想要比较文件中不存在的某些内容时,这会很有用。

例如,比较两个节点上的主机文件,而无需将主机文件复制到本地主机:

diff -Naur <(cat /etc/hosts) <(ssh -q otherhost 'cat /etc/hosts')

<文件重定向到 STDIN,并()创建一个子 shell 来运行括号之间的命令。它是来自子 shell 的 STDOUT,传递到正在运行的命令的 STDIN。

与尝试使用多个文档或尝试将多个命令回显到最终命令的管道相比,为命令创建多个输入“文件”是一种更简单的方法。

答案4

您可能想使用类似于预期的东西。以下是打开远程 telnet 会话、等待提示、发送一些数据、等待响应、睡眠和退出的简单示例。

#!/usr/bin/expect
spawn telnet localhost 8555
expect "Escape character is '^]'."
send "Hello World\n"
expect "Connection closed by foreign host."
sleep 1

相关内容