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

Mar*_*ddy 18 vim emacs shell tcsh

我想我的tcsh脚本启动编辑器(例如,vi,emacs):

#!/bin/tcsh
vi my_file
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ddy 17

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

#!/bin/tcsh
vi my_file < `tty` > `tty`
Run Code Online (Sandbox Code Playgroud)

  • 但是......但...... ......从哪里重定向?对我来说,为什么你需要这样做仍然是个谜. (3认同)
  • 事实证明```tty \``在我的剧本中扩展为"不是tty".我只是使用了`/ dev/tty`,但我想知道它是多么便携...... (3认同)

Cha*_*tin 11

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

$ vi < `tty` > `tty`
Run Code Online (Sandbox Code Playgroud)

$ vi < /dev/ttys000 > /dev/ttys000
Run Code Online (Sandbox Code Playgroud)

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

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


小智 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
Run Code Online (Sandbox Code Playgroud)

(1)kraftwerk:bin>其中vi vi:别名为/ usr/local/bin/vim -u~/.exrc