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

2

Eu estou tentando fazer um script bash que requer alguma entrada do usuário e processos conforme a entrada.

O script é executável e tem um shebang.

O script é um pouco assim:

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

Eu não quero que o usuário abra o script no Terminal. O script é feito como executável (chmod + x) e clique duas vezes no script para executá-lo. Mas não faz pausa para receber informações e o arquivo permanece vazio.

    
por Himanshu Shekhar 29.07.2016 / 07:35

2 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 read retorna imediatamente. Uma solução possível seria fazer o script abrir um novo terminal e executar-se da seguinte forma:

x-terminal-emulator -e $0

Com o emulador x-terminal, o emulador de terminal padrão é chamado. Isso funciona com o Debian & Ubuntu, eu não sei sobre outras distros. Você pode chamar um terminal específico como o xterm, o konsole ou qualquer outro terminal, é claro.

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

Você também precisa ter certeza de que não abra mais terminais de maneira recursiva. Uma maneira de isso funcionar é verificar se você pode ler stdin, como você já fez de qualquer maneira:

The return code of the read command is zero, unless an end-of-file character is encountered, if read times out or if an invalid file descriptor is supplied as the argument to the -u option.

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 questão se você precisar manter o terminal aberto após o término do programa.

    
por 29.07.2016 / 14:27
0

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

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

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

    
por 29.07.2016 / 14:50