Bash 在一系列UNIX管道命令的中间使用$编辑器

Bash 在一系列UNIX管道命令的中间使用$编辑器,bash,unix,editor,pipe,Bash,Unix,Editor,Pipe,我有一个shell命令,它提供了我想在将输出导入另一个命令之前编辑的输出。这不是可以使用sed等工具轻松编辑的常规输出。我目前的做法是: command-one > tmp vim tmp command-two < tmp rm tmp command one>tmp 维姆tmp 命令二$tmpfile&&vim$tmpfile&&命令二>$tmpfile&&rm$tmpfile 试试这个: tmpfile=$(mktemp); command-one > $tmpfile

我有一个shell命令,它提供了我想在将输出导入另一个命令之前编辑的输出。这不是可以使用
sed
等工具轻松编辑的常规输出。我目前的做法是:

command-one > tmp
vim tmp
command-two < tmp
rm tmp
command one>tmp
维姆tmp
命令二

我希望避免不必要地创建临时文件,而是执行类似于
command one | vim-| command two
的操作,但这不起作用,因为vim的实际屏幕输出通过管道传输到命令中,而不是供我编辑。这在诸如
git commit
之类的命令中起作用,这些命令在使用结果之前等待写入临时文件。

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


有关创建临时文件的安全方法,请参见
mktemp
(或
tempfile
,如果您没有
mktemp
),则需要使用临时文件。大多数编辑器无法在
stdin
上接受整个文件,并在编辑完成后将其写入
stdout

有关创建临时文件的安全方法,请参见
mktemp
(或
tempfile
,如果您没有
mktemp
),请尝试以下方法:

tmpfile=$(mktemp); command-one > $tmpfile && vim $tmpfile && command-two < $tmpfile && rm $tmpfile
tmpfile=$(mktemp);命令一>$tmpfile&&vim$tmpfile&&命令二>$tmpfile&&rm$tmpfile
试试这个:

tmpfile=$(mktemp); command-one > $tmpfile && vim $tmpfile && command-two < $tmpfile && rm $tmpfile
tmpfile=$(mktemp);命令一>$tmpfile&&vim$tmpfile&&命令二>$tmpfile&&rm$tmpfile

正如前面所述,这很困难,因为正如您所指出的,为了适应这样的管道,编辑器需要向用户显示一个内容,并在标准输出上输出另一个内容

但是,如果管道的其余部分不是太长/太可怕,那么可以使用vim执行以下操作:

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

它在shell中运行管道的剩余部分,并将当前缓冲区送入其stdin。您将在vim中看到命令的输出,然后您将能够
:q放弃修改后的缓冲区并返回shell。

正如前面所述,这很困难,因为正如您所指出的,为了适应这样的管道,编辑器需要向用户显示一个内容,并在stdout上输出另一个内容

但是,如果管道的其余部分不是太长/太可怕,那么可以使用vim执行以下操作:

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

它在shell中运行管道的剩余部分,并将当前缓冲区送入其stdin。您将在vim中看到命令的输出,然后您将能够
:q
放弃修改后的缓冲区并返回shell。

您可以使用以下代码编写脚本:

#!/bin/sh 
: ${EDITOR:=/usr/bin/vi} 
: ${TMPDIR:=/tmp} 

TMPFILE=${TMPDIR}/.edpipe$$ 

trap "trap '' 0 1 2 3 15; rm -f $TMPFILE; exit 0" 0 1 2 3 15 

cat >$TMPFILE 
$EDITOR ${1:+"$@"} $TMPFILE </dev/tty >/dev/tty 
cat $TMPFILE 
exit 0

您可以使用以下代码编写脚本:

#!/bin/sh 
: ${EDITOR:=/usr/bin/vi} 
: ${TMPDIR:=/tmp} 

TMPFILE=${TMPDIR}/.edpipe$$ 

trap "trap '' 0 1 2 3 15; rm -f $TMPFILE; exit 0" 0 1 2 3 15 

cat >$TMPFILE 
$EDITOR ${1:+"$@"} $TMPFILE </dev/tty >/dev/tty 
cat $TMPFILE 
exit 0

有一个名为vipe()的工具正是为此目的而设计的:

command | vipe | another-command

有一个名为vipe()的工具正是为此目的而设计的:

command | vipe | another-command

管道
创建tmp文件,只是管道完成后不必删除它们。用第一块中列出的命令编写一个脚本,就可以开始了。祝你好运这只是一个例子。我并不是每次都做同样的脚本操作。我只是发现自己经常需要这种模式,所以这不是我可以在脚本中完成的事情。如果您为正在使用的shell添加一个标记(bash | ksh | csh |……),您将获得更多的响应者。也许有一些技巧可以得到你想要的东西,但如果1。它是存在的,2它并不脆弱。祝你好运<代码> Git提交< /代码>不在管道中间。相反,它需要输入,运行
$EDITOR
生成一个临时文件,然后对该临时文件进行处理。对,明白了。仅将其作为工作流的一个示例,如果不是确切的例子。
pipes
create tmp文件,只是在管道完成时不必删除它们。用第一块中列出的命令编写一个脚本,就可以开始了。祝你好运这只是一个例子。我并不是每次都做同样的脚本操作。我只是发现自己经常需要这种模式,所以这不是我可以在脚本中完成的事情。如果您为正在使用的shell添加一个标记(bash | ksh | csh |……),您将获得更多的响应者。也许有一些技巧可以得到你想要的东西,但如果1。它是存在的,2它并不脆弱。祝你好运<代码> Git提交< /代码>不在管道中间。相反,它需要输入,运行
$EDITOR
生成一个临时文件,然后对该临时文件进行处理。对,明白了。仅仅把它作为工作流的一个例子,如果不是确切的话。这是我见过的最酷的答案之一,所以,感觉这应该是一个内置的工具。这是我见过的最酷的答案之一,所以,感觉这应该是一个内置的工具。