如何从shell脚本启动编辑器?

时间:2009-11-06 20:42:08

标签: vim shell emacs tcsh

我希望我的tcsh脚本能够启动一个编辑器(例如,vi,emacs):

#!/bin/tcsh
vi my_file

这会使用my_file启动vi,但首先显示警告“Vim:警告:输出不是终端”,并且我的键击不会出现在屏幕上。在我杀了vi之后,我的终端窗口搞砸了(没有换行符),需要“重置”。我尝试了“emacs -nw”,“xemacs -nw”和pico,结果相似。 “xemacs”可以工作,但会启动一个单独的窗口。我想重用相同的终端窗口。

有没有办法从脚本启动编辑器,以便重用相同的终端窗口?

7 个答案:

答案 0 :(得分:17)

我回答了自己的问题!您必须重定向终端输入和输出:

#!/bin/tcsh
vi my_file < `tty` > `tty`

答案 1 :(得分:11)

你得到错误的原因是当你在你的环境中启动一个shell时,它是从一个子shell开始的,STDIN和STDOUT没有连接到TTY - 可能是因为它就像管道一样。重定向时,您将直接打开与设备的新连接。因此,例如,您的命令行将变为

$ vi < `tty` > `tty`

$ vi < /dev/ttys000 > /dev/ttys000

所以你并没有真正使用你的 STDIN / STDOUT,你创建了两个新文件并将它们映射到你的vi进程的STDIN / STDOUT。

现在,请告诉我们您正在做什么,我们会告诉您如何避免这种污染。

答案 2 :(得分:6)

我想做类似的事情。我想要一个能找到我正在处理的最后一个文件的别名,并在vi(1)中打开它进行编辑。无论如何,我无法弄清楚如何将其作为一个可读的别名(在tcsh中),所以我只是创建了一个丑陋的shell脚本(csh,因为我已经老了):

#!/bin/csh

set DIR = "~/www/TooMuchRock/shows/"

set file = $DIR`ls -t $DIR | head -1`
set tty = `tty`

vi $file <$tty >$tty

(1)kraftwerk:bin&gt;哪个vi vi:别名为/ usr / local / bin / vim -u~ / .exrc

答案 3 :(得分:3)

将终端tty设置为变量,然后将编辑器i / o重定向到该变量。

在你的剧本中:

#!/bin/sh

ls | while read a; do vi $a < $MYTTY >$MYTTY; done

然后使用:

执行脚本
$ MYTTY=`tty` ./myscript >/tmp/log

答案 4 :(得分:3)

在shell脚本'while'循环中遇到'pinfo'同样的问题。该行可以在脚本中使用,它使用'ps'来查找当前进程号的tty,“$$”,并将该tty存储在$ KEY_TTY中:

  KEY_TTY=/dev/`ps | grep $$ | tr -s '[:blank:]' | cut -d " " -f 3`

稍后在脚本中,只需调用tty-only proggie,输入为$ KEY_TTY,在我的情况下是:

  pinfo -m $s $page < $KEY_TTY

对于'vi',它应该是:

  vi $a < $KEY_TTY > $KEY_TTY

优点是脚本作为一个整体仍然可以接受STDIN输入,'vi'(或其他)应该可以正常工作 - 无需记住在运行脚本之前设置任何环境变量。

答案 5 :(得分:2)

我能够在bash + Cygwin + Terminator下获得所需的行为:

#!/bin/bash
vim foo

运行脚本,vim加载,没有错误消息,行为正常。毫无疑问,我们的设置之间存在许多差异,因此我无法猜测是什么产生了差异。我很好奇它是什么,但你得到它的工作,这是重要的部分。

答案 6 :(得分:2)

绝对。 : - )

编写脚本并让它调用EDITOR环境变量,您将设置为“emacsclient”。然后启动Emacs,执行M-x server-start,切换到shell缓冲区(M-x shell)并执行脚本。 Emacsclient将弹出要编辑的内容,C-x #将充当“完成”命令,并根据您的选择将您带回编辑完成或中止的脚本。

享受。

编辑:我想补充一点,这些天Emacs是我的终端程序。我有几十个shell缓冲区,从不必担心丢失输出,可以使用Emacs的所有功能来操作和分析终端输出。并让Emacs脚本生成shell的输入。真的很棒。例如,在编辑源代码或处理邮件或执行大多数任何Emacs操作时,在shell缓冲区中观看Tomcat输出滚动非常方便。当出现Tomcat堆栈跟踪时,我可以快速响应它。