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
.