重定向命令的输出,就好像它是文件输入一样

Mad*_*vad 3 pipe io-redirection

我发现自己总是必须在命令行中向上箭头并向后移动,以更改先前命令的一部分,该部分会被转移到稍后的命令grephead其他命令。

举一个简单的例子:搜索dmesg给定的字符串并且只想要最后 5 个出现的字符串。

我会这样做:

dmesg | grep -i USB | tail -n 5
Run Code Online (Sandbox Code Playgroud)

但如果我想更改搜索词或我正在搜索的内容或来源,我会等待光标回溯到该行的相关部分。我想将其移至行尾,以便上面的示例可以表示为(我知道这是不正确的):

tail -n 5 < dmesg | grep -i USB(然后我可以搜索sda

正如我所说,这是一个粗略的例子,表明了我想做的事情,但实际上并不是我想做的事情,即。这不是关于anddmesg的使用,而是如何在这些程序之间进行交互,并将“变量”放在末尾。greptail

这可以进一步以获取 DNS 查询的查找时间为例:

dig google.com | grep msec(让我们移动google.com到最后,以便我可以测试另一个域)通过
grep msec < dig google.com

再次,糟糕的例子。我更多地讨论的是当我在多个程序之间有输入/输出流动时

我承认我对管道和重定向只有基本的了解,可以总结为:

  • 管道 ( |)使用stdout一个程序的输入到stdin另一个程序的 输入
  • 重定向(>获取stdout一个程序的并将其输入到一个文件中(旁白:除了我能想到的唯一明显的程序之外,它是否可以重定向到其他地方,
    > /dev/null 或者
    > /dev/sda 或者
    > {said file}
    ,而管道是程序输出,作为从左到右的程序输入。
  • 重定向(< (我称之为“文件作为输入”)获取文件的内容并使用它们,就像在命令行中键入它们一样

PSk*_*cik 8

在支持<()(bash、ksh、zsh)的shell中,您可以转换

$ cmd1 | cmd2 
Run Code Online (Sandbox Code Playgroud)

进入

$ cmd2 < <(cmd1)
Run Code Online (Sandbox Code Playgroud)

这两者在管道方面应该是等效的。(但是,我认为这两种形式在处理进程组和信号等事务的方式方面存在一些细微差别)。

为了更好地进行命令行编辑,我建议您探索 shell 的工具。例如,bashset -o vi允许您使用类似 vi 的快捷方式或vim直接切换到更有效地编辑命令。默认set -o emacs使用 emacs 快捷方式(搜索man bashreadline 以了解有关它们的更多信息 ( /readline))。