2013-09-30 46 views
1

我有一个shell命令,它提供了我想在将其管道输入到另一个命令之前编辑的输出。这不是常规的输出,可以用sed等很容易编辑。我目前的做法是:

command-one > tmp 
vim tmp 
command-two < tmp 
rm tmp 

我想避免临时文件的创建不必要的,而是像做command-one | vim - | command-two但由于VIM的实际屏幕的输出被管道输送到命令,而不是不工作对我来说是可见的编辑。这在类似git commit的命令中起作用,在使用结果之前等待临时文件被写入。

+0

'pipes'创建tmp文件,只需在管道完成时不必删除它们即可。用第一个块中列出的命令制作一个脚本,你就会很好。祝你好运! – shellter

+0

这只是一个例子。我不会每次都做同样的脚本操作。我发现自己经常需要这种模式,所以它不是我可以放在脚本中并且完成的东西。 –

+0

如果您为使用的shell包含标签(bash | ksh | csh | ...),您将获得更多受访者。得到你想要的东西可能有一些窍门,但如果它存在,我会感到惊奇,2它不脆弱。祝你好运!。 – shellter

回答

1

如果你想使用一些随机编辑器(即值为$EDITOR),你需要使用一个临时文件。编辑完成后,大多数编辑无法接受stdin上的整个文件并将其写入stdout

请参阅mktemp(或tempfile在不太可能的情况下,您没有mktemp)安全地创建临时文件。

0

试试这个:

tmpfile=$(mktemp); command-one > $tmpfile && vim $tmpfile && command-two < $tmpfile && rm $tmpfile 
2

这是困难的,因为陈述,因为正如你已经指出,要适应一个管道一样,编辑需要显示一两件事给用户,并输出不同的东西在标准输出。

但是,如果管道不休息太长/太可怕了,这里的东西,你可以使用vim做:

$ vim <(first | part | of | pipeline) 

这通过vim的一个参数,它是一个命名管道输出者的标准输出命令。有效的结果是你得到一个包含那个输出的缓冲区。编辑它,然后,在退出之前:

:w !rest | of | pipeline 
,其运行在一个壳 rest | of | pipeline并供给电流缓冲器到其标准输入

。你会在vim中看到该命令的输出,然后你将能够:q!放弃修改后的缓冲区并返回到你的shell。