Como pode um script Bash contar como foi executado?

9

Eu tenho um script Bash que eu estava tentando fazer para me ajudar a executar um comando bastante complexo com pequenas alterações que seriam feitas através de eco e leitura.

Eu encontrei soluções para forçá-lo a executar um terminal para executar o comando, mas não estou interessado nisso. O que eu gostaria de fazer é, se eu espaçar e apertar Enter nele no Nautilus (fazendo com que ele rode com o Run Software), ele irá aparecer com uma notificação dizendo "Por favor, execute isso de um terminal." / p>

Eu posso fazer o pop-up acontecer - como eu conheço o comando - mas não consigo fazer com que o script Bash diga se ele está sendo executado dentro de um terminal ou não, parece sempre pensar assim. É mesmo possível?

    
por Aescula 18.10.2014 / 13:32

3 respostas

9

De man bash em EXPRESSÕES CONDICIONAIS :

-t fd  
    True if file descriptor fd is open and refers to a terminal.

Assumindo que fd 1 é padrão, if [ -t 1 ]; then deve funcionar para você. O Guia de scripts do Shell avançado afirma que -t usado dessa maneira falhará em ssh , e que o teste (usando stdin, não stdout) deveria ser:

if [[ -t 0 || -p /dev/stdin ]]

-p testa se um arquivo existe e é um pipe nomeado. No entanto, , notei experimentalmente que isso não é verdade para mim: -p /dev/stdin falha para ambos os terminais normais e sessões ssh enquanto if [ -t 0 ] (ou -t 1 ) funciona em ambos os casos (ver também Gilles comentários abaixo sobre os problemas nessa seção do Guia de Scripts de Shell Avançado .

Se o problema principal é um contexto especializado do qual você deseja chamar o script para se comportar de maneira apropriada a esse contexto, você pode evitar todos esses aspectos técnicos e poupar-se de alguma confusão usando um wrapper e uma variável personalizada:

!#/bin/bash

export SPECIAL_CONTEXT=1
/path/to/real/script.sh

Chame isso de live_script.sh ou qualquer outra coisa e clique duas vezes em vez disso. É claro que você poderia realizar a mesma coisa com argumentos de linha de comando, mas um wrapper ainda seria necessário para apontar e clicar em um trabalho de navegador de arquivos da GUI.

    
por 18.10.2014 / 14:19
0

Use a variável bash $ SHLVL para detectar o nível de aninhamento de shell. Em um script executado "cru", clicando duas vezes, será 1, em um script em execução dentro de um terminal será de 2.

#!/bin/bash
if (( SHLVL < 2 )) ; then
    echo "Please run this from a terminal."
    read -p "Press <Enter> to close this window"
    exit 1
fi
# rest of script
    
por 09.10.2018 / 18:06
-2

Outra, usando a variável interna set bash options, $- .

De .bashrc ,

# If not running interactively, don't do anything
case $- in
    *i*) ;;
    *) return;;
esac
    
por 18.10.2014 / 15:38