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