Como verificar se o script foi executado via linha de comando ou clicado duas vezes?

6

Como posso determinar se um script foi invocado a partir de uma linha de comando ou através de um clique duplo no gerenciador de arquivos (Nautilis)?

Se o primeiro, eu ainda tenho um prompt de comando quando o script termina, mas se ele foi clicado duas vezes (ou executado através de um arquivo .desktop), o script é executado em uma janela e depois desaparece. Eu quero que a janela permaneça aberta com um prompt de comando.

Eu acho que o script poderia fazer essa verificação e não fazer nada - se invocado a partir de uma linha de comando - ou exec bash no final se invocado via clique duplo ou .desktop.

Não obtive sucesso usando métodos para verificar se é interativa ou não ou tty.

    
por tcashin 05.02.2016 / 07:43

4 respostas

6

Você pode verificar se o processo pai é o shell. Por exemplo:

#! /bin/bash

if [[ $(readlink -f /proc/$(ps -o ppid:1= -p $$)/exe) != $(readlink -f "$SHELL") ]]
then 
    echo "Starting the shell..."
    exec "$SHELL"
else
    echo "Not starting a shell."
fi

ps -o ppid:1= -p $$ imprime o PID do processo pai ( ppid ) do processo atual ( -p $$ ). Um readlink on /proc/<pid>/exe deve imprimir o caminho para o executável, que seria o shell se você o executasse em um shell, ou qualquer outra coisa diferente.

Outra possibilidade é a variável SHLVL , que indica como aninhada a atual instância da shell. Se executado em um shell, o script deve ter SHLVL 2 ou maior. Quando executado clicando duas vezes ou a partir de um iniciador de área de trabalho, deve ser 1:

#! /bin/bash

if (( SHLVL > 1 ))
then 
    echo "Starting the shell..."
    exec "$SHELL"
else
    echo "Not starting a shell."
fi
    
por muru 05.02.2016 / 08:31
1

Você pode verificar se o script de shell foi executado em um terminal analisando a saída do comando tty .

#! /bin/bash

if [[ $(tty) =~ "not a tty" ]]
then
    echo "Not running on terminal"

else
    echo "Running on terminal"
fi
    
por antman 03.04.2018 / 11:17
0

Eu verifiquei as diferenças entre o ambiente ao executar um script do terminal e do ambiente ao executar um script clicando duas vezes nele no Files;

Quando você executa um script clicando duas vezes em Arquivos, a variável $VTE_VERSION não é definida, então você pode conectar-se a ela para decidir se substituirá ou não a instância atual do Bash por uma interativa.

Ou seja, basta colocar isso no final do seu script:

#! /bin/bash
# ...
[ ! -z $VTE_VERSION ] && exec bash

Para que isso funcione também no caso de o script ser executado a partir de um arquivo da área de trabalho, altere a linha Exec = do arquivo da área de trabalho de:

Exec=/path/to/script

Para:

Exec=sh -c '/path/to/script; exec bash'

Dessa forma, /path/to/script será executado e sh será substituído por Bash após a conclusão de /path/to/script .

    
por kos 05.02.2016 / 07:56
0

Ao clicar duas vezes no Nautilus, você não terá a configuração do ambiente inteiro como em uma sessão de terminal normal. Eu uso este código clichê para evitar falhas: insira a descrição do link aqui . Você pode adaptá-lo às suas necessidades:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi
    
por WinEunuuchs2Unix 03.04.2018 / 12:24