bash 中减号(-)与 stdin/stdout

问题起源于在一次操作中,我想要搜索某个命令的输出内容,但并不是很确定要搜索
什么,只是有一个模糊的概念,而且命令的输出内容不少,所以要进行多次尝试。

刚开始想到要用 grep来做,但是每次尝试搜索新的字符串,都要重新执行命令。虽
然重新执行命令可以通过命令历史,但还是不太喜欢,更何况grep的输出并不直观,
有时还需要查看上下文,太不灵活。想到自己对vim的操作和正则表达式都更熟悉,
就想把命令的输出导入到vim里,然后再进行操作。可是怎么才能做到呢?

第一次尝试想到用管道把命令输出重定向到vim(这里以ls为例):

1
2
# *Warning* : This is NOT a valid command
ls | vi

但是并不可行,然后又尝试了如下命令:

1
2
# *Warning* : This is NOT a valid command
ls > vi

依然不可行,到网上搜索找到了答案[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)

0%