Solicitar confirmação do usuário antes de executar um script?

8

Existe uma maneira de obter a caixa de diálogo do tipo Confirmação do Usuário (Como Você Tem Certeza-Sim / Não) quando executo um script (com duplo clique)? Eu não quero dizer no Terminal, mas uma caixa de confirmação gráfica, algo assim:

(Eu sei que a imagem é do Windows, não consegui encontrar uma do Linux)

    
por mayank budhwani 20.02.2016 / 15:24

4 respostas

13

Existe uma maneira de usar zenity

zenity --question --text "Are you sure?"

Você pode testar o status de saída desse comando com a variável $? , algo assim: if [ $? -eq 1 ];then exit 1 ; fi . 0 é OK , 1 é cancelado. Essa construção funcionará bem se você precisar testar o status de saída do pop-up mais tarde, talvez armazene $? logo após o popup sair para uma variável. Como discutido nos comentários, estruturas como o abaixo também funcionarão:

if zenity --question --text "Are you sure" 
then
     runSumeFunction
else
     exit 1
 fi

ou

 zenity --question --text "Are you sure?" || echo "User isn't sure:/"
    
por Sergiy Kolodyazhnyy 20.02.2016 / 15:35
6

Você pode usar xmessage no próprio script. Coloque algo assim após o "shebang":

xmessage "Are you sure?"

Isso exibirá uma mensagem gráfica dizendo "Tem certeza?" com um botão "ok".

Você pode configurar o xmessage para ter mais de um botão e alterar o que está escrito nele. Você também pode configurar as ações feitas por cada botão.

Por exemplo,

xmessage -buttons ok:0,cancel:1 "Are you sure?"  

Veja man xmessage para todas as opções (há muitas delas).

    
por Eduardo Cola 20.02.2016 / 15:30
5

Em vez de dizer-lhe como fazê-lo, direi que você não deveria estar fazendo isso.

TL; DR - Não altere seu script. Em vez disso, configure seu gerenciador de arquivos ou descubra por que seus usuários o executaram acidentalmente.

EDITAR: Você parece tratar seu script de alguma forma especial, como se as configurações gerais não fossem boas o suficiente e seu script precisasse de uma confirmação especial do usuário. Clicando duas vezes sobre ele é a confirmação. Se você descobrir que seus usuários o executam acidentalmente, é necessário descobrir por que eles fazem isso e resolvê-lo. Então o seu problema real é não como exigir confirmação, mas como evitar que seus usuários o executem acidentalmente.

A partir do modo como você expõe seu problema, parece que você espera que seu programa (script) seja executado navegando até o local onde o arquivo se encontra e clicando nele a partir do gerenciador de arquivos. Pense em todos os outros programas no seu sistema. Quantos você começa assim? Você navega para /usr/local/bin ao iniciar o firefox? Claro que você não. Você clica nele no menu de aplicativos. (gnome tweak é um script python talvez seja um exemplo melhor)

Espero que você não considere clicar no menu de aplicativos como um acidente. Então, seu problema se torna como fazer com que o script apareça lá em vez de usar o gerenciador de arquivos. Para fazer isso, você faz o seguinte:

  1. coloque seu script longe dos outros arquivos em que o usuário pode clicar nele acidentalmente (o local típico é /usr/local/bin/ para uma instalação ampla do sistema ou ~/.local/bin/ para uma instalação do usuário)

  2. crie um arquivo de entrada na área de trabalho (leia as especificações padrão ). Aqui está um caso mínimo:

    [Desktop Entry]
    Name=Your script name
    Exec=path/for/your/script
    Icon=path/for/your/icon/can/be/svg
    Terminal=false
    Type=Application
    

    e coloque-o em /usr/local/share/applications/your-script.xml ou ~/.local/share/your-script.xml .

  3. Finalmente, execute update-desktop-database .

Como você clica duas vezes no script, é o trabalho do seu gerenciador de arquivos confirmar isso. Não é tarefa do script confirmar se deve ser executado. Leve isso ao extremo. Você pode imaginar o quão ridículo seria cada vez que você ligasse para algum programa que tivesse que confirmar?

A única ocasião em que um programa deve pedir confirmação é quando está prestes a fazer algo possivelmente perigoso e irreversível. Por exemplo, sobrescrevendo um arquivo ou ignorando a lixeira. E note que mesmo esses exemplos são sobre como fazer um programa fazer algo específico. Eles não são sobre como iniciar tais programas. Se um único propósito do programa é fazer algo tão perigoso, então ele não deveria estar pedindo confirmação também.

De fato, o Nautilus (gerenciador de arquivos Gnome) já pedirá, por padrão, que você confirme se deseja executar um script (ou simplesmente abri-lo em um editor de texto).

E, claro, esse comportamento é configurável, dando ao usuário a possibilidade de desativá-lo (note a entrada em Arquivos de Texto Executáveis ).

Portanto, não adicione um diálogo de confirmação irritante ao seu script. Configure seu gerenciador de arquivos corretamente. E deixe seus usuários fazerem o mesmo.

    
por carandraug 20.02.2016 / 22:16
2

Você pode usar yad, que é como zenity em esteróides, pois é muito mais configurável. Você pode instalá-lo a partir do Centro de Software no Ubuntu. Na sua forma mais básica, você pode digitar

yad --title=Question --image=dialog-question --text="Are you sure?"

e você verá isso:

Se o OK foi pressionado, recebemos um código de retorno 0, se Cancel foi pressionado, recebemos um código de retorno de 1.

Seria melhor colocar a caixa no centro e também ajustar a largura dela, use uma guia principal para posicionar o texto "Tem certeza?" mais para a direita e também sempre no topo. Para isso precisamos:

yad --center --on-top --title=Question --image=dialog-question --text="\tAre you sure?" --width 200

A maioria dos switches são auto-explicativos, exceto o "\ t" antes do "Tem certeza?" que simplesmente adiciona um espaço de tabulação antes de imprimir o texto. Agora devemos ver isso:

A caixa está centrada, sempre no topo e parece melhor. Para definir uma variável para testar qual botão foi pressionado, use:

yad --center --on-top --title=Question --image=dialog-question --text="\tAre you sure?" --width 200;result=$?;echo $result

Neste exemplo, estamos usando a variável $ result, que será definida como 0 se OK foi pressionado ou como 1, se Cancelar foi pressionado.

Para ajuda com yad você pode usar man yad ou yad --help-all mas eu achei exemplos práticos são mais fáceis de adaptar. Existem alguns aqui . yad é muito mais configurável e, portanto, mais utilizável do que zenity na minha opinião.

    
por Scooby-2 08.03.2016 / 01:53

Tags