问题起源于在一次操作中,我想要搜索某个命令的输出内容,但并不是很确定要搜索
什么,只是有一个模糊的概念,而且命令的输出内容不少,所以要进行多次尝试。
刚开始想到要用 grep
来做,但是每次尝试搜索新的字符串,都要重新执行命令。虽
然重新执行命令可以通过命令历史,但还是不太喜欢,更何况grep
的输出并不直观,
有时还需要查看上下文,太不灵活。想到自己对vim
的操作和正则表达式都更熟悉,
就想把命令的输出导入到vim
里,然后再进行操作。可是怎么才能做到呢?
第一次尝试想到用管道把命令输出重定向到vim
(这里以ls
为例):
1 | *Warning* : This is NOT a valid command |
但是并不可行,然后又尝试了如下命令:
1 | *Warning* : This is NOT a valid command |
依然不可行,到网上搜索找到了答案[1]:
1 | ls | vi - |
只是比我尝试的命令多了一个减号(连字符),就可以了,感觉很神奇,就到网卡搜
索了一下原因[2]。原来减号在一些命令中表示从标准输入(stdin)中获取内容,使用vi -
时vi
就会从标准输入读取内容,如果vi
不想从标准输入获取内容时,你非
要给它一些内容,那当然就会出错啦。
还要强调一点的是,把-
当作参数(文件名)传递给程序时被当作标准输入或标准输
出是程序自己的行为,所以有时会出现产生了一个名为“-”的文件,这时你就知道这个
程序可能不支持了(也知道可能错在哪儿了)。
[1]中还提到了另一种方法,即:
1 | vi <(ls) |
这个叫做 process substitution,注意<
和(ls)
之间没有空格,详细介绍可以参
考Bash中的进程替换(process substitution)或者官方文档。
References
[1]: How do I redirect command output to vim in bash?
[2]: Usage of dash (-) in place of a filename
[3]: Bash中的进程替换(process substitution)