启动 vim 的 bash 脚本能否中止处于管道中?
Can a bash script that launches vim abort being in a pipeline?
我有一个 bash 脚本,它会在从命令行读取一些输入后为我启动 vim。
我用它来轻松地编辑路径中某处的脚本。它也做一些其他的事情,但最简单的形式如下:
vibin.sh
#!/usr/bin/env bash
PROG=$(which "")
vim "$PROG"
我经常会用它来编辑我最近 运行 的东西,以进行快速调整。
例如,如果我 运行
$ my_script.sh a b c d
我可能会回到历史记录,然后在行首插入 vibin.sh
进行编辑。
$ vibin.sh myscript.sh a b c d
这工作正常,但如果我之前的命令被传送到某些东西,例如
$ vibin.sh myscript.sh a b c d | tee /tmp/out
有没有办法让我的脚本在管道中中止,并让它正常工作?当前 vim 当我这样做时会进入一个奇怪的状态,我可以退出,但我更喜欢更好的解决方案
目前我可以检测到我是否在管道中 运行 并中止,但我实际上想让它做我想做的事 - 编辑脚本!
# ensure we're not in a pipeline
if [ ! -t 1 ] ; then
exit 1;
fi
尝试
vim "$PROG" < /dev/tty > /dev/tty
也就是说,强制重定向标准 input/output from/to 当前控制台。针对 pipe/redirects.
的解决方法
我有一个 bash 脚本,它会在从命令行读取一些输入后为我启动 vim。
我用它来轻松地编辑路径中某处的脚本。它也做一些其他的事情,但最简单的形式如下:
vibin.sh
#!/usr/bin/env bash
PROG=$(which "")
vim "$PROG"
我经常会用它来编辑我最近 运行 的东西,以进行快速调整。 例如,如果我 运行
$ my_script.sh a b c d
我可能会回到历史记录,然后在行首插入 vibin.sh
进行编辑。
$ vibin.sh myscript.sh a b c d
这工作正常,但如果我之前的命令被传送到某些东西,例如
$ vibin.sh myscript.sh a b c d | tee /tmp/out
有没有办法让我的脚本在管道中中止,并让它正常工作?当前 vim 当我这样做时会进入一个奇怪的状态,我可以退出,但我更喜欢更好的解决方案
目前我可以检测到我是否在管道中 运行 并中止,但我实际上想让它做我想做的事 - 编辑脚本!
# ensure we're not in a pipeline
if [ ! -t 1 ] ; then
exit 1;
fi
尝试
vim "$PROG" < /dev/tty > /dev/tty
也就是说,强制重定向标准 input/output from/to 当前控制台。针对 pipe/redirects.
的解决方法