20

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

#!/bin/tcsh
vi my_file

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

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

4

7 回答 7

21

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

#!/bin/tcsh
vi my_file < `tty` > `tty`
于 2009-11-06T20:48:19.417 回答
11

您收到错误的原因是,当您在环境中启动 shell 时,它从一个子 shell 开始,该子 shell 的 STDIN 和 STDOUT 未连接到 TTY — 可能是因为这类似于管道。重定向时,您将直接打开与设备的新连接。因此,例如,您的命令行变为

$ vi < `tty` > `tty`

进入

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

因此,您并没有真正使用旧的STDIN/STDOUT,而是创建了两个新文件并将它们映射到 vi 进程的 STDIN/STDOUT。

现在,告诉我们你在做什么,我们会告诉你如何避免这种混乱。

于 2009-11-06T21:47:47.297 回答
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> which vi vi: 别名为/usr/local/bin/vim -u ~/.exrc

于 2012-10-19T16:41:34.073 回答
3

绝对地。:-)

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

享受。

编辑:我想补充的是,这些天 Emacs 是我的终端程序。我有几十个 shell 缓冲区,永远不必担心丢失输出,并且可以使用 Emacs 的所有功能来操作和分析终端输出。并让 Emacs 脚本为 shell 生成输入。其实厉害。例如,在编辑源或处理邮件或做任何 Emacs 事情时,在 shell 缓冲区中观看 Tomcat 输出滚动是非常方便的。当出现 Tomcat 堆栈跟踪时,我可以快速响应它。

于 2009-11-06T22:32:34.893 回答
3

将您的终端设置tty为一个变量,然后通过该变量重定向编辑器 i/o。

在您的脚本中:

#!/bin/sh

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

然后执行脚本:

$ MYTTY=`tty` ./myscript >/tmp/log
于 2009-11-06T22:48:40.710 回答
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”(或其他)应该可以正常工作——无需记住在运行脚本之前设置任何环境变量。

于 2012-05-04T21:51:25.820 回答
2

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

#!/bin/bash
vim foo

运行脚本,vim 加载,没有错误消息,表现正常。然而,毫无疑问,我们的设置之间存在数十种变化,所以我无法猜测是什么造成了不同。我很好奇它是什么,但你让它工作了,这是重要的部分。

于 2009-11-06T21:06:10.317 回答