저는 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 "+---------------------------------------------------+"
네, 알겠습니다. 언제 Y에게 질문했어야 했는지 X에게 묻는 XY 함정에 빠졌습니다. 따라서 Y는 다음과 같습니다.
나는 emacs를 많이 사용하지만 항상 사용하지는 않습니다. 그리고 나는 또한 내가 직면한 작업을 수행하는 방법을 기록하는 Hints 파일을 가지고 있으며, emacs를 사용하는 동안 이러한 힌트를 사용할 수 있기를 바랍니다. 나는 emacs를 시작할 때마다 힌트가 아직 없으면 파일도 열리도록 이것을 자동화하려고했습니다. 그 스크립트는 그렇게 하려는 나의 시도였고, Gnome3 클래식 스타일 GUI 내의 비로그인 터미널에서 emacs를 실행하는 동안 괜찮았습니다. CTL/ALT/F2를 사용하여 로그인 터미널에서 시도하면 인용된 오류 메시지가 나타납니다.
저는 수년 동안 Unix와 Fedora Linux를 사용하고 사랑해 왔지만, 분명히 아직 배워야 할 것이 엄청나게 많습니다.
답변1
아래에서는 귀하의 스크립트를 분석합니다. 하지만 그렇게 하고 나면 다음 질문에 대한 답이 나올 것 같습니다.당신이 물어봤어야 했던 질문이다:
- .
emacs --daemon
.profile
그러면 Emacs의 배경 인스턴스가 생성됩니다. emacsclient FILENAME
Emacs에서 파일을 열려면 실행하세요 . 그러면 새 창(X11 창 또는 현재 터미널을 사용하는 창)이 생성됩니다.EmacsHints
Emacs 시작 파일에 파일을 로드(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
awk wc
단계는 유용한 작업을 수행하지 않습니다.
if [ "$(ps aux | grep EmacsHints | wc -l)" = 2 ]; then …
또한 테스트는 신뢰할 수 없습니다. EmacsHints
파일이 열려 있으면 때로는 가 ps
포함된 한 줄, 때로는 두 줄이 반환됩니다 . 이는 및 프로세스 EmacsHints
의 타이밍에 따라 다릅니다 . (작동하지 않는) 직접 구축하는 대신 이 목적을 위한 전용 도구를 사용하세요.ps
grep
pidof
또는pgrep
.
#!/bin/sh
if pgrep -f 'EmacsHints\.txt' >/dev/null; then …
짜잔! 더 간단하고 실제로 작동합니다.
글쎄요주로공장. 명령줄에 파일을 지정하지 않고 Emacs에서 파일 을 열면 EmacsHints
감지되지 않습니다. 더 나은 솔루션을 제공하고 싶지만 귀하가 달성하려는 목표를 이해하지 못합니다. 항상 EmacsHints
Emacs에서 파일을 열어 두려면 .emacs
.
Emacs는 시작하는 데 약간 느리지만 많은 사용자(나를 포함)는 로그인할 때 실행되도록 설정한 다음 절대 종료하지 않습니다. .emacs --daemon
.profile
기존 Emacs 인스턴스에서 파일을 열려면 emacsclient
.
"표준 입력은 tty가 아닙니다"와 관련하여 GUI 창을 여는 경우에만 백그라운드에서 Emacs를 실행할 수 있습니다. 터미널에서 Emacs를 실행하는 경우 포그라운드에 있어야 합니다. 그렇지 않으면 터미널에 액세스할 수 없습니다. X에서만 백그라운드로 Emacs를 실행하려면:
if [ -n "$DISPLAY" ]; then
emacs "$1" &
else
emacs "$1"
fi
그런데 쉘 스크립트에서는 변수 및 명령 대체( "$1"
, "$foo"
, "$(somecommand)"
등) 주위에 항상 큰따옴표를 넣으십시오. 대체가 큰따옴표 안에 있지 않으면 값은 문자열이 아니라 glob 패턴 목록으로 해석됩니다. 이 문제는 일반적으로 공백이 포함된 파일 이름에서 실패하는 스크립트로 나타납니다. 이것이 무엇을 의미하는지 이해하지 못한다면 큰따옴표를 사용하십시오.
아니면 그냥 사용할 수도 있습니다 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)
이 문제를 처리하는 다른 방법이 있습니다. 다음 SO Q&A를 참조하세요.쉘 스크립트에서 편집기를 어떻게 시작합니까?.