2011-09-09 3 views
1

私はbashコマンドを含むファイルを持っていますが、それを1つずつ読み込んでevalを呼び出して実行しています。これは "emacs -nw"を実行しようとするまでうまくいきました。私はこの問題を次のように単純化しました。誰でもemacsコマンドが動作しない理由とそれを修正する方法を説明できますか?私はそれがクォートやハイフンで何かを持っていると思われますが、問題を理解することはできません。ファイルからコマンドを読み込んでemacs -nwを起動するのに問題があります

>> cmd="emacs -nw"; echo $cmd; eval $cmd; 

予想通り、この作品:

は、これらのケースを考えてみましょう。 Emacsは現在のシェル内で開かれます。

>> cmd="ls /tmp"; echo $cmd; eval $cmd; 

期待どおりに動作します。私は/ tmpの内容を見る。

>> echo "emacs -nw" > /tmp/cmds; cat /tmp/cmds | 
    while read cmd; do echo $cmd; eval $cmd; done 

これは機能しません。私はemacs -nwに入力をパイプしてみようとしているかのように、 "emacs:標準入力はttyではありません"というようになります(grepしてパイプを少なくする方法)。

>> echo "ls /tmp" > /tmp/cmds; cat /tmp/cmds | 
    while read cmd; do echo $cmd; eval $cmd; done 

期待どおりに動作するので、引用符/スペースに問題はないと思います。それはハイフンを残しますが、もし私が "ls -alh"と言えば、うまく動作します。

emacsコマンドはどうなっていますか?

ありがとうございました。

答えて

3

コマンドにパイプすると、標準入力が置き換えられます。あなたはwhile ... doneにパイプしており、emacsはそのコマンドの一部であるため、その標準入力はパイプです。

スタンダードを「保存」して元に戻すことができるリダイレクションを賢明に使用すると想像していますが、私はそれを思いつきません。または、eval $cmd </dev/ttyとすることができます。

+0

eval $ cmd Jer

+0

'ls'はstdinを使う必要がないので、問題は表示されません。 –

1

-nwモードで実行するにはEmacsにttyが必要です。 readループはすべての子コマンドの標準入力としてcatの出力を使用していますが、これはttyではありません。行の配列にすべての/ tmp/cmd行をロードし、各コマンドを実行するために配列をループすることが最善の方法です(しかし、これも引用問題を扱うのが難しいかもしれません)。

関連する問題