ログイン時にEmacsを起動すると、「emacs:標準入力がttyではありません」というメッセージが表示されます。

ログイン時にEmacsを起動すると、「emacs:標準入力がttyではありません」というメッセージが表示されます。

私はFedora 20とGnome3 classicを持っており、ターミナルウィンドウでCTRL / ALT / Fnを使用しようとしています。 Emacsを使用してファイルを編集する場合は、プロンプトファイルが自動的に表示され、Emacsがバックグラウンドジョブとして実行されるように、次のスクリプトを使用します。これはGnomeデスクトップアプリケーションの非ログイン端末ではうまく機能しますが、ログイン端末では次のエラーメッセージが表示されます。 (CTL / ALT / F2ウィンドウで「&> e」を使用してリダイレクトすると表示されます)

    home/Harry/bin/emx: line 4: t: Permission denied  
    +---------------------------------------------------+  
    | EmacsHints.txt found and displayed                |  
    | Usage: ./emx <filename> ..                        |  
    |   .. Opens EmacsHints.txt and <filename> in emacs |  
    +---------------------------------------------------+
    emacs: standard input is not a tty

誰かがこれを説明し、それを防ぎ、ログイン端末と非ログイン端末の両方でemxスクリプト(間違いなく修正済み)を正常に使用する方法を教えてください。

私のメモやデバッグを含む私のemxスクリプトの修正版:

#!/bin/sh
emxhn="EmacsHints.txt"
emxhf="/home/Harry/emacs/$emxhn"
ps aux | grep $emxhn > t
T=`wc -l t` # no spaces allowed between T and = and value
# echo $T
wc -l t > t1
T=`awk '$1' t1`
# echo $T

echo "+---------------------------------------------------+"

# In the test "" needed round $T else it is split into two commands ..
# .. so are the spaces after [ and before ]
# could be if ( [...] ) then or if [...] ; then 
if [ "$T" = "2 t" ]; then 
#  echo "+----------------------------------------------+"
 echo "| $emxhn already present"\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \  "|"
else
 emacs $emxhf &
 echo "| $emxhn found and displayed"\ \ \ \ \ \ \ \ \ \ \ \ \ \ \  "|"
fi

if [ "$#" = "1" ]; then
 emacs $1 &
else
 echo "| Usage: ./emx <filename> .." \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \  "|"
 echo "|" \   ".. Opens $emxhn and <filename> in emacs" "|"
fi

  echo "+---------------------------------------------------+"

はい、わかりました。 XにいつYに尋ねるべきかを尋ねるXYトラップに陥った。だからここにYがあります。

私はemacsを頻繁に使用しますが、常に使用するわけではありません。そして、私が直面したタスクを完了する方法を記録するヒントファイルもあり、emacsを使用するときにこれらのヒントを提供したいと思います。私はemacsを起動するたびにプロンプ​​トがまだ存在しない場合は、ファイルも開くようにこれを自動化しようとしています。これは私の試みでしたが、Gnome3クラシックスタイルGUIの非ログイン端末でemacsを実行したときにうまくいきました。 CTL/ALT/F2 を使用してログイン端末で試みると、引用したエラー メッセージが表示されます。

私は長年にわたってUnixとFedora Linuxを使ってきましたが、私は好きでしたが、学ぶことは明らかにたくさんあります。

答え1

次にスクリプトを分析します。ところでこうしてやると、その質問に対する答えが出てきたと思います。あなたが尋ねるべき質問例:

  • emacs --daemonこれにより、.NETはEmacsのバックグラウンドインスタンスを作成します.profile
  • 実行してemacsclient FILENAMEEmacsでファイルを開きます。これにより、新しいウィンドウ(X11ウィンドウまたは現在の端末を使用するウィンドウ)が作成されます。
  • EmacsHintsEmacs起動ファイルにファイルをロード(find-file "/home/Harry/emacs/EmacsHints.txt")します.emacs

t: Permission deniedあなたがこのエラーを生成するスクリプトを公開していないため、このメッセージが受信される理由を確認できません(あなたが投稿したスクリプトの4行目に説明があります)。ただし、現在のディレクトリに一時ファイルを作成する場合、これはすべての場合には悪く、現在のディレクトリに書き込む権限がないと機能しない可能性があります。

一時ファイルを生成する必要がある場合は、以下を使用してください。mktemp。しかし、ここで一時ファイルは不要な複雑さです。コマンド置換を使用して、コマンド出力を変数に保存します。

#!/bin/sh
ps_lines=$(ps aux | grep EmacsHints)
line_count=$(echo "$ps_lines" | wc -l)
T=$(echo "$line_count" | awk '$1')
if [ "$T" = "2" ]; then …

これらすべては再び非常に複雑です。grep出力をwcawkステップにパイプするだけでは、役に立つことはありません。

if [ "$(ps aux | grep EmacsHints | wc -l)" = 2 ]; then …

さらに、テストは信頼できません。ファイルがEmacsHints開かれると、時にはps含まれている1行が返され、時には2行が返されます。これはEmacsHintsプロセスタイミングによって異なります。直接ビルドしないでください(機能しない)、この目的のために設計されたツールを使用してください。psgreppidofまたはpgrep

#!/bin/sh
if pgrep -f 'EmacsHints\.txt' >/dev/null; then …

望むより!よりシンプルで実際に動作します。

まあ最大働くEmacsHintsコマンドラインでファイルを指定せずにEmacsでファイルを開くと、ファイルは検出されません。より良いソリューションを提供したいのですが、あなたが達成したい目標を理解していません。常にEmacsHintsEmacsでファイルを開くことを好むなら.emacs

Emacsは起動に少し遅いですが、多くのユーザー(私を含む)がログイン時に実行され、絶対にシャットダウンしないように設定しました。emacs --daemon既存の.profileEmacsインスタンスからファイルを開くにはemacsclient

「標準入力はttyではありません」に関して、GUIウィンドウが開いているときにのみバックグラウンドでEmacsを実行できます。ターミナルでEmacsを実行している場合はフォアグラウンドにある必要があり、そうしないとターミナルにアクセスできません。 XのバックグラウンドでEmacsを実行したい場合:

if [ -n "$DISPLAY" ]; then
  emacs "$1" &
else
  emacs "$1"
fi

ただし、シェルスクリプトでは、常に変数とコマンドの置換(など)の周りに二重引用符を配置"$1"してください。置換が二重引用符内にない場合、値は文字列として解釈されず、グローバルパターンリストとして解釈されます。この問題は通常、スペースを含むファイル名でスクリプトが失敗するようです。これが何を意味するのかわからない場合は、二重引用符を使用してください。"$foo""$(somecommand)"

それとも単に使用しても構いませんemacsclient

答え2

この投稿について:

emx: line 4: t: permission denied

最初のコマンドは、次のコマンドを通知します。

ps aux | grep EmacsHints > t

t実行時のディレクトリにファイルを書き込む権限がありません。フルパスを指定することをお勧めし、/tmp/t次のように使用することをお勧めします。

ps aux | grep EmacsHints > /tmp/t

別のメッセージ:

emacs: standard input is not a tty

スクリプトがEmacsを表示するためにTTYにアクセスできないことを知らせます。emacsまたは、この方法でツールを実行するには、vim通常、STDINおよびSTDOUTにアクセスできるようにTTYデバイスにアクセスする必要があります。

失われた場合やSTDIN / STDOUTが見つからない場合は、次のようにスクリプトから新しい項目を作成できます。

emacs < $(tty) > $(tty)

この問題を解決する別の方法があります。次のQ&Aをご覧ください。シェルスクリプトでエディタを起動するには?

関連情報