2009-11-06 54 views
17

我想我的tcsh腳本來啓動一個編輯器(例如,六,Emacs的):如何從shell腳本啓動編輯器?

#!/bin/tcsh 
vi my_file 

這將啓動VI與my_file但是首先將會顯示警告「Vim:警告:輸出不是到終端」而我的按鍵不會出現在屏幕上。在我殺死vi之後,我的終端窗口被搞亂了(沒有換行符),需要「重置」。我試過了「emacs -nw」,「xemacs -nw」和pico,結果相似。 「xemacs」的作品,但啓動一個單獨的窗口。我想重複使用相同的終端窗口。

有沒有辦法從腳本啓動編輯器,以便它重用相同的終端窗口?

+0

通常情況下,我會按照您的操作進行操作,而且對我來說工作正常。但我的殼是bash。這種東西在sh下也可以正常工作。 你可以做一個「哪一個vi」來找出是否被稱爲除vi以外的東西? 而且......你在運行什麼樣的操作系統環境? –

+1

使用bash和vim你可以在腳本中執行vi my_file。我不知道你爲什麼要做特別的事情。 –

+0

你想讓vim讀取FILE或VARIABLE的內容嗎? – matpie

回答

16

我回答了我自己的問題!你必須重定向端子的輸入輸出:

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

但是...但...但是...從哪裏重定向?對我來說,這仍然是一個謎,你爲什麼需要這樣做。 –

+0

我想用vim做這件事,但我只得到'\'tty \':模棱兩可的重定向 ' –

+3

事實證明'\'tty \''在我的腳本內擴展爲「不是tty」。我只是使用'/ dev/tty',但我想知道如何便攜式... –

2

我能得到bash下所需的行爲+ Cygwin的+ Terminator

#!/bin/bash 
vim foo 

運行腳本,VIM負載,沒有錯誤消息,表現爲正常。然而,我們的設置之間無疑有幾十種不同之處,所以我不能冒險猜測造成這種差異的原因。我很好奇它是什麼,但你有它的工作,這是重要的一部分。

11

你得到錯誤的原因是,當你在你的環境中啓動一個shell時,它開始於一個子shell,它的STDIN和STDOUT沒有連接到一個TTY--可能是因爲它像一個管道。當你重定向時,你直接打開一個新的連接到設備。因此,舉例來說,您的命令行打開

$ vi < `tty` > `tty` 

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

所以你沒有真正使用標準輸入/輸出,您要創建兩個新的文件,並將它們映射到你的vi進程的STDIN/STDOUT。

現在,告訴我們你在做什麼,我們會告訴你如何避免這種混亂。

+0

我沒有創建新文件。我正在將我的終端設備文件(tty告訴你它是哪個文件)重定向到vi的STDIN/STDOUT,該文件與我的終端窗口相關聯,並且在運行我的腳本之前已存在。 我創建了一個包裝「cvs commit」的腳本,並在提交簽入之前做了很多額外的檢查(例如,運行我們的測試套件)。這有時被稱爲「門控簽入」。由於我不會介入的原因,我不能使用標準的CVS預提交鉤子。我試圖模擬「cvs commit」如何在命令行中未指定提交消息時啓動編輯器。 –

2

絕對如此。 :-)

寫你的腳本,並讓它調用EDITOR環境變量,你將設置爲「emacsclient」。然後啓動Emacs,執行M-x server-start,切換到shell緩衝區(M-x shell)並執行腳本。 Emacsclient會彈出要編輯的東西,並且C-x #將作爲「完成」命令並按照您的選擇將您帶回已完成或中止編輯的腳本。

享受。

編輯:我想補充說的是,這些天Emacs是我的終端程序。我有幾十個shell緩衝區,不用擔心丟失輸出,並可以使用Emacs的所有功能來操作和分析終端輸出。並且讓Emacs腳本生成對shell的輸入。真的很棒。例如,在編輯源代碼或處理郵件或者做大多數Emacs事情時,看Tomcat輸出在shell緩衝區中滾動是非常方便的。當出現Tomcat堆棧跟蹤時,我可以快速響應它。

3

將您的終端tty設置爲變量,然後通過該變量重定向編輯器I/O。

在你的腳本:

$ MYTTY=`tty` ./myscript >/tmp/log 
2

曾與 'PINFO' 在shell腳本同樣的煩惱 '而' 循環:

#!/bin/sh 

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

然後用執行腳本。可以在腳本中使用的線,它使用「PS」查找當前進程號的TTY,「$$」,並存儲在TTY $ KEY_TTY:

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

腳本之後,就調用的唯一的TTY proggie,以$ KEY_TTY作爲輸入,在我的情況下,它是:

pinfo -m $s $page < $KEY_TTY 

爲「VI」這將會是:

vi $a < $KEY_TTY > $KEY_TTY 

的優點是腳本作爲整體仍然可以接受STDIN輸入,'vi'(或其他)應該可以正常工作 - - 在運行腳本之前不必記得設置任何環境變量。

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>其中vi vi:別名爲/ usr/local/bin/vim -u〜/ .exrc