Script para abrir o emacs de duas maneiras diferentes

2

Eu tentei escrever um pequeno script que por padrão abriria o emacs com

emacs -nw foo

simplesmente digitando

emacs foo

e quando eu quero uma janela digitando

emacs foo &

O script que eu tentei escrever parece com isso

#!/bin/bash

if [ -z $2 ]; then
    emacs -nw $1
else
    emacs $1 &
fi

O problema que estou correndo é que quando eu tento rodar o script nada acontece, como se eu apertasse enter.

Uma pessoa mais experiente gostaria de saber como fazer esse script adequadamente?

    
por ddavis 27.04.2013 / 05:06

2 respostas

3

O problema com o script é que, se você chamar de qualquer forma (com e sem & , ele verá apenas um parâmetro. bash já usou o & para colocar o processo em segundo plano. Se você tentaria o fg depois de começar com emacs foo & você deve ver o emacs sem janela, como na primeira opção.

A segunda opção nunca é executada e não deve ter um & . O que é necessário é que o script teste se ele é executado em segundo plano e decide sobre isso. Em um programa C ou em Python, eu testaria se o grupo de programas e o grupo de processos de terminal em primeiro plano são os mesmos, mas I não sabe como fazer isso no bash shell (Chris Down answer indica isso pode ser feito).

Sua invocação implica strongmente que você queira chamar este script de emacs . Nesse caso, certifique-se de colocar o caminho completo para os emacs 'reais' lá, para evitar a recursão.

Se você pode viver com um script Python para fazer o trabalho:

import os
import sys
import subprocess

STDOUT_FILENO=1
emacs_cmd = ['/usr/bin/emacs']

if os.getpgrp() == os.tcgetpgrp(STDOUT_FILENO):
    emacs_cmd.append('-nw')
emacs_cmd.extend(sys.argv[1:])
subprocess.call(emacs_cmd)

Ele permite que você especifique vários nomes de arquivos (e opções adicionais do emacs) na linha de comando.

    
por 27.04.2013 / 06:08
2

Como Anthon diz, & não é um argumento para o comando, é parte da sintaxe do seu shell (é o pano de fundo do processo). Aqui está um script que pode testar se o script atual faz parte do grupo de processos de primeiro plano do terminal (que será falso se for baseado em plano de fundo):

#!/bin/bash

# If the STAT column does not end with a plus, this process is not part
# of the terminal's foreground process group (and is backgrounded).

case "$(ps -o stat= -p $$)" in
    *+) exec emacs "$@"  ;;
    *) exec emacs -nw "$@" ;;
esac
    
por 27.04.2013 / 06:33

Tags