在一系列 UNIX 管道命令中间使用 $EDITOR

Wad*_*ndy 3 unix bash editor pipe

我有一个 shell 命令,它提供了我想在将其传输到另一个命令之前对其进行编辑的输出。这不是可以轻松编辑的常规输出sed等。我目前的做法是:

command-one > tmp
vim tmp
command-two < tmp
rm tmp
Run Code Online (Sandbox Code Playgroud)

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

小智 6

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

#!/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
Run Code Online (Sandbox Code Playgroud)

例如,将脚本保存为 edpipe,然后在管道中调用它,如下所示

ls | edpipe | wc -l
Run Code Online (Sandbox Code Playgroud)