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

Tyl*_*den 22 shell

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

例如我试过:

wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 32

在支持此处字符串(包括bash,zsh和 )的外壳中ksh93,您可以使用

wc <<< "apple pear orange"
Run Code Online (Sandbox Code Playgroud)


G-M*_*ca' 18

另外两种方法(允许多行输入而无需额外工作):

  1. 使用“此处文档”:

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

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

  2. 使用 tty 作为输入:

    $ wc
    苹果梨橙
    Ctrl+D
      1 3 18
    $

    这有一个缺点,即程序开始运行,并在您键入其名称后立即开始读取输入。这可能令人不安;例如:

    $ grep v
    敏捷的棕色狐狸             (打字)
    跳过                      (打字)
    跳过                      (这是grep的输出!)
    懒狗。                   (输入)
    Ctrl + D
                                    (此处无输出) 
    $


Tim*_*edy 10

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

当您执行诸如比较长文本字符串之类的操作时,或者如果您想区分一些不在文件中的内容时,这会很有用。

例如,比较两个节点上的 hosts 文件,而不必将 hosts 文件复制到 localhost:

diff -Naur <(cat /etc/hosts) <(ssh -q otherhost 'cat /etc/hosts')
Run Code Online (Sandbox Code Playgroud)

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

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


小智 8

你可以使用管道

echo "apple pear orange" | wc
Run Code Online (Sandbox Code Playgroud)

  • 管道与“从文件中读取”不同。例如,您不能在管道中向后查找,而可以在文件中查找。 (8认同)