Como receber a entrada do usuário do script bash quando executado como executável sem terminal?

2

Eu estou tentando fazer um script bash que leva algumas entradas e processos do usuário conforme a entrada.

O script é executável e possui um shebang.

O script é mais ou menos assim:

#!/bin/bash
read name -p "Enter your name" 
echo $name >> namelist.txt

Não quero que o usuário abra o script no Terminal. O script é feito executável (chmod + x), e clique duas vezes no script para executá-lo. Mas não faz uma pausa para receber entrada e o arquivo permanece vazio.

Himanshu Shekhar
fonte

Respostas:

2

Você precisa ter uma GUI ou um terminal para entrada do usuário. Se o usuário abrir o script, digamos Nautilus, não há stdin, então a leitura retornará imediatamente. Uma solução possível seria fazer com que o script abrisse um novo terminal e se executasse nele assim:

x-terminal-emulator -e $0

Com o emulador de terminal x, o emulador de terminal padrão é chamado. Isso funciona com o Debian e Ubuntu, não conheço outras distros. Você pode ligar para um terminal específico como xterm, konsole ou qualquer outro terminal, é claro.

$0 é o caminho do arquivo do script, portanto, isso sempre funciona.

Você também precisa garantir que ele não abra recursivamente mais terminais. Uma maneira de isso funcionar é verificar se você pode ler do stdin, como já faz:

O código de retorno do comando read é zero, a menos que seja encontrado um caractere de fim de arquivo, se o tempo limite da leitura for excedido ou se um descritor de arquivo inválido for fornecido como argumento para a opção -u.

Portanto, verifique o valor de retorno, se for! = 0, abra o novo terminal como acima, caso contrário não.

Exemplo:

#!/bin/bash

read -p "Enter first value: " first
# Check return value of last command with $?
if [[ $? != 0 ]]; then
        x-terminal-emulator -e $0
else
        echo $first
        read -p "Enter more: " more
        echo $more
fi

Veja esta pergunta se você precisar manter o terminal aberto após o término do programa.

Lasse Meyer
fonte
0

Acertos e tentativas aleatórias me levaram a uma solução.

Quando você clica duas vezes em um arquivo executável no Nautilus, um pop-up é aberto, solicitando que você "Execute" o script (sem console) ou "Executar no Terminal" ou "Abra" o script no editor de texto padrão.

Escolhendo, "Executar no Terminal serviria ao propósito".

Himanshu Shekhar
fonte
Lembre-se de que, se o usuário estiver configurado para executar arquivos de texto executáveis ​​por padrão, ele não funcionará.
Lasse Meyer
Sim ... peguei você.
Himanshu Shekhar