Por que meu shell script é executado apenas no modo de execução “Display output”?

0

Eu escrevi um script bash ( aqui ) para extrair coordenadas EXIF de uma imagem e exibir essas coordenadas como um ponteiro no Google Maps. Funciona perfeitamente quando usado assim no terminal:

GUI=1 ./show_location_in_chrome.sh /path/to/image.jpg

Eu adicionei um comando de clique com o botão direito do mouse ao Nautilus usando o Nautilus-Actions com estas configurações:

           Path: GUI=1 /home/tomas/show_location_in_chrome.sh
     Parameters: %f
Basename filter: *.jpg

Mas quando clico com o botão direito do mouse em um arquivo JPEG e clico no item de menu, nada acontece. A única exceção é quando o "modo de execução" é definido como "Exibir saída", caso em que o script funciona conforme o esperado. Infelizmente, o Nautilus também exibe uma janela grande com saída de script que eu preciso fechar manualmente todas as vezes.

Como descubro por que o script não funciona em nenhum outro modo de execução que "Display output"? Por favor, comente se posso fornecer mais informações específicas.

O "comando Executar" exibido na saída do comando é:

/bin/sh -c 'GUI=1 /home/tomas/show_location_in_chrome.sh '\''/home/tomas/Dropbox/Camera Up
loads/2013-07-21 14.58.33.jpg'\'''

Editar : adicionei #!/usr/bin/env bash ao início do meu script e removi a chamada explícita para bash na configuração "Caminho". Não mudou nada.

Editar : adicionei echo "Works" > ~/test.txt ao topo do script (abaixo do shebang) e, em seguida, cliquei no item de menu. Nenhum arquivo foi adicionado à minha pasta Home, então concluí que o script nem está sendo executado quando o modo de execução é diferente de "Display output".

    
por Hubro 26.07.2013 / 02:47

1 resposta

1

Possivelmente, com "saída de exibição" desativada, ele provavelmente não executará o comando em um shell, portanto, a sintaxe GUI=1 não é analisada como uma atribuição. Se for esse o caso, alterar o comando para isso deve funcionar:

/usr/bin/env GUI=1 /home/tomas/show_location_in_chrome.sh

Como um aparte, você provavelmente não precisa da variável GUI, você pode usar o que já está lá para determinar se usar zenity ou não. Por exemplo. A variável DISPLAY só deve ser definida se você estiver logado graficamente, então mudando [ "$GUI" ] para [ "$DISPLAY" ] (ou melhor , [[ $DISPLAY ]] ) deve funcionar bem.

Se você quiser usar apenas o zenity quando não estiver sendo executado em um terminal, poderá testar um terminal com o teste -t . Por exemplo,

if [[ ! -t 1 && $DISPLAY ]]; then   # if fd 1 (stdout) is not connected to a terminal, and DISPLAY is non-empty
    zenity ...
else
    echo ...
fi

EDIT: Como alternativa, adicione uma opção para especificar "gui ou não".

gui=0
while [[ $1 = -* ]]; do
    case $1 in
        -h|--help) echo "usage..."; exit ;;
        -g|--gui) gui=1 ;;
         *) echo >&2 "invalid option: $1"; exit 1 ;;
    esac
    shift
done

#...

if (( gui )); then
    zenity ...
else
    echo ...
fi
    
por geirha 26.07.2013 / 08:06