我希望我的tcsh脚本能够启动一个编辑器(例如,vi,emacs):
#!/bin/tcsh
vi my_file
这会使用my_file启动vi,但首先显示警告“Vim:警告:输出不是终端”,并且我的键击不会出现在屏幕上。在我杀了vi之后,我的终端窗口搞砸了(没有换行符),需要“重置”。我尝试了“emacs -nw”,“xemacs -nw”和pico,结果相似。 “xemacs”可以工作,但会启动一个单独的窗口。我想重用相同的终端窗口。
有没有办法从脚本启动编辑器,以便重用相同的终端窗口?
答案 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堆栈跟踪时,我可以快速响应它。