如何将字符发送到命令,就像它们来自文件一样?
例如我尝试过:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
答案1
在支持的 shell 中这里是字符串,包括bash
、zsh
和ksh93
,您可以使用
wc <<< "apple pear orange"
答案2
另外两种方法(允许多行输入,无需额外的努力):
使用“此处文档”:
$ wc << EOF 苹果 梨 橙子 EOF 1 3 18 $
该
EOF
字符串是一个分隔符。您可以使用任何字符串;EOF
只是一个常规选择。使用 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