(以下是依据测试给出的猜测)
好像 Vim 要求 stdout 必须是 terminal
~ $ ( vim tmp && cat tmp ) | nl
Vim: Warning: Output is not to a terminal
work-around:把 stdout 改成 terminal
~ $ tty=`tty`
~ $ ( 1>$tty vim tmp && cat tmp ) | nl
Emacs 没这个要求
~ $ ( emacs -Q tmp && cat tmp ) | nl
但它们都要求 stdin 是 terminal
~ $ pwd | ( vim tmp && cat tmp )
Vim: Warning: Input is not from a terminal
~ $ pwd | ( emacs -Q tmp && cat tmp )
emacs: standard input is not a tty
work-around,把 stdin 改成 terminal
~ $ pwd | ( 0<$tty vim tmp && cat tmp )