20

tcsh スクリプトでエディター (vi、emacs など) を起動したい:

#!/bin/tcsh
vi my_file

これにより、vi が my_file で起動されますが、最初に「Vim: 警告: 出力が端末ではありません」という警告が表示され、キーストロークが画面に表示されません。vi を強制終了した後、ターミナル ウィンドウがめちゃくちゃになり (改行がない)、「リセット」が必要になります。「emacs -nw」、「xemacs -nw」、および pico を試してみましたが、同様の結果が得られました。「xemacs」は機能しますが、別のウィンドウが起動します。同じ端末ウィンドウを再利用したい。

スクリプトからエディタを起動して、同じターミナル ウィンドウを再利用する方法はありますか?

4

7 に答える 7

11

エラーが発生する理由は、環境でシェルを起動すると、STDIN と STDOUT が TTY に接続されていないサブシェルで起動されるためです。これはおそらく、パイプラインのようなものにあるためです。リダイレクトすると、デバイスへの新しい接続が直接開かれます。したがって、たとえば、コマンドラインは次のようになります

$ vi < `tty` > `tty`

の中へ

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

したがって、実際には古いSTDIN/STDOUT を使用しているのではなく、2 つの新しいファイルを作成し、それらを vi プロセスの STDIN/STDOUT にマッピングしています。

さて、あなたがこれで何をしているのか教えてください。このクラッジを避ける方法を教えてあげましょう。

于 2009-11-06T21:47:47.297 に答える
6

私は似たようなことをしたかった。私が作業していた最後のファイルを見つけ、それを編集のために vi(1) で開くエイリアスが必要でした。とにかく、(tcshで)読み取り可能なエイリアスとしてそれを行う方法を理解できなかったので、代わりに醜いシェルスクリプト(古いので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し、シェルバッファー()に切り替えて、M-x shellスクリプトを実行します。Emacsclientは編集するものをポップアップしC-x #、「完了」コマンドとして機能し、選択したとおりに編集が完了または中止された状態でスクリプトに戻ります。

楽しみ。

編集:私は最近Emacsが私のターミナルプログラムであることを追加するつもりでした。私は数十のシェルバッファーを持っており、出力が失われることを心配する必要はなく、Emacsのすべての機能を使用してターミナル出力を操作および分析できます。そして、Emacsスクリプトにシェルへの入力を生成させます。実はすごい。たとえば、ソースの編集やメールの処理、またはほとんどすべてのEmacsの処理を行っているときに、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

シェルスクリプトの「while」ループの「pinfo」でも同じ問題が発生しました。この行はスクリプトで使用できます。「ps」を使用して現在のプロセス番号「$$」の tty を検索し、その tty を $KEY_TTY に保存します。

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

スクリプトの後半で、$KEY_TTY を入力として tty のみのプログラムを呼び出すだけです。私の場合は次のようになりました。

  pinfo -m $s $page < $KEY_TTY

「vi」の場合は次のようになります。

  vi $a < $KEY_TTY > $KEY_TTY

利点は、スクリプト全体が引き続き STDIN 入力を受け入れることができ、スクリプトを実行する前に環境変数を設定することを忘れずに、'vi' (または何でも) が正常に動作することです。

于 2012-05-04T21:51:25.820 に答える