Bash 在一系列UNIX管道命令的中间使用$编辑器
我有一个shell命令,它提供了我想在将输出导入另一个命令之前编辑的输出。这不是可以使用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
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
生成一个临时文件,然后对该临时文件进行处理。对,明白了。仅仅把它作为工作流的一个例子,如果不是确切的话。这是我见过的最酷的答案之一,所以,感觉这应该是一个内置的工具。这是我见过的最酷的答案之一,所以,感觉这应该是一个内置的工具。