“emacs: entrada padrão não é um tty” ao iniciar o Emacs no login

2

Eu tenho o Fedora 20 e o Gnome3 classic, e estou tentando usar as janelas de terminal CTRL / ALT / Fn. Quando quero editar um arquivo com o emacs, eu uso o seguinte script para que meu arquivo de Dicas seja exibido automaticamente e o emacs seja executado como um trabalho de fundo. Isso funciona bem no terminal de não-login dos aplicativos de desktop do Gnome, mas no terminal de log-in recebo mensagens de erro: (obtido por redirecionamento com '& > e' na janela CTL / ALT / F2)

    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

Por favor, alguém pode explicar isso e me dizer como evitá-los e usar o script emx (sem dúvida modificado) com sucesso nos terminais log-in e non-log-in?

Versão revisada do meu script emx, incluí minhas anotações e depuração de material:

#!/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 "+---------------------------------------------------+"

Sim, eu vejo, eu caí na armadilha X-Y, perguntando ao X quando eu deveria ter perguntado a Y, então aqui está Y

Eu uso muito o emacs, mas não o tempo todo, e também tenho um arquivo Hints, no qual anoto como fazer as tarefas que encontro e gosto de ter essas dicas disponíveis enquanto uso o emacs. Eu tentei automatizar isso para que sempre que eu iniciasse o emacs, se as Dicas não estivessem lá, o arquivo também seria aberto. Esse script foi a minha tentativa de fazê-lo, e tem sido ok enquanto eu tenho executado o emacs a partir de um terminal de não-login dentro da minha GUI de estilo clássico do Gnome3. Tentar isso em um terminal de log-in com CTL / ALT / F2 deu as mensagens de erro citadas.

Eu tenho usado e amado o Unix e o Fedora Linux por muitos anos, mas obviamente ainda há muito mais para aprender.

    
por Harry Weston 09.05.2014 / 18:20

2 respostas

3

Abaixo, analiso seu roteiro. Mas tendo feito isso, acho que a resposta para a pergunta que você deveria ter feito é:

  • Execute emacs --daemon do seu .profile . Isso cria uma instância em segundo plano do Emacs.
  • Execute emacsclient FILENAME para abrir um arquivo no Emacs. Isso cria uma nova janela (uma janela X11 ou uma janela usando o terminal atual).
  • Carregue o arquivo EmacsHints em seu arquivo de inicialização do Emacs: coloque (find-file "/home/Harry/emacs/EmacsHints.txt") no seu .emacs .

Não sabemos ao certo por que você está recebendo t: Permission denied , pois você não postou o script que gerou esse erro (o script que você postou tem um comentário na linha 4). Mas você está criando um arquivo temporário no diretório atual; essa é uma má idéia em todas as circunstâncias, e provavelmente não está funcionando quando você não tem permissão para escrever o diretório atual.

Se você precisar criar um arquivo temporário, use mktemp . No entanto, aqui, os arquivos temporários são uma complicação desnecessária: use a substituição de comando para armazenar a saída dos comandos em uma variável.

#!/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 …

Tudo isso, por sua vez, é terrivelmente complicado - apenas canalize a saída de grep para wc , e o awk step não está fazendo nada útil.

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

Além disso, seu teste não é confiável: quando o arquivo EmacsHints está aberto, às vezes ps retornará uma linha contendo EmacsHints , às vezes duas: depende do tempo dos processos ps e grep . Em vez de construir o seu próprio (que não está funcionando), use ferramentas dedicadas para essa finalidade: pidof ou pgrep .

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

Voilà! Mais simples, e realmente funciona.

Bem, isso principalmente funciona. Se você abrir o arquivo EmacsHints no Emacs sem especificá-lo na linha de comando, isso não será detectado. Eu ofereceria uma solução melhor, mas não entendo o que você está tentando realizar. Se você sempre deseja que o arquivo EmacsHints seja aberto no Emacs, abra-o em .emacs .

O Emacs é um pouco lento para iniciar, mas muitos usuários (inclusive eu) o configuram para ser executado quando você efetua login e nunca o retira. Execute emacs --daemon do seu .profile . Para abrir um arquivo na instância existente do Emacs, chame emacsclient .

Em relação a “entrada padrão não é um tty”, você pode executar o Emacs em segundo plano apenas se estiver abrindo uma janela da GUI. Se você está rodando o Emacs no terminal, ele deve estar em primeiro plano, caso contrário ele não poderá acessar o terminal. Se você quer rodar o Emacs em segundo plano apenas no X:

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

A propósito, em um script de shell, sempre coloque aspas duplas em torno das substituições de comando e variável: "$1" , "$foo" , "$(somecommand)" , etc. Quando a substituição não está entre aspas duplas, o valor é interpretado não como uma string, mas como uma lista de padrões glob. Esse problema geralmente se manifesta com scripts que falham em nomes de arquivos que contêm espaços. Se você não entende o que tudo isso significa, apenas use aspas duplas.

Ou você pode usar apenas emacsclient .

    
por 10.05.2014 / 13:01
0

Em relação a esta mensagem:

emx: line 4: t: permission denied

O primeiro está dizendo a você que seu comando:

ps aux | grep EmacsHints > t

não tem permissões para gravar o arquivo t no diretório em que ele estiver quando for executado. É melhor especificar um caminho completo, sugiro usar /tmp/t da seguinte forma:

ps aux | grep EmacsHints > /tmp/t

A outra mensagem:

emacs: standard input is not a tty

Está lhe dizendo que o script não tem acesso a um TTY para exibir o emacs. Para executar uma ferramenta como emacs ou vim dessa maneira, muitas vezes os laços precisam ter acesso a um dispositivo TTY para que você possa obter acesso a seu STDIN e STDOUT.

Se você está desesperado ou não se preocupa com a falta de STDIN / STDOUT, você pode criar um novo no seu script assim:

emacs < $(tty) > $(tty)

Existem outros métodos para lidar com isso, consulte este SO Q & A intitulado: Como faço para iniciar um editor a partir de um script de shell? .

    
por 09.05.2014 / 21:37

Tags