로그인 시 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포함된 한 줄이 반환되고 때로는 두 줄이 반환됩니다. 이는 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를 참조하세요.쉘 스크립트에서 편집기를 시작하는 방법은 무엇입니까?.

관련 정보