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

8

Existe uma maneira de obter a caixa de diálogo Tipo de confirmação do usuário (como você tem certeza sim / não) quando executo um script (clicando duas vezes)? Não quero dizer no Terminal, mas uma caixa de confirmação gráfica, algo como isto: insira a descrição da imagem aqui

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

mayank budhwani
fonte

Respostas:

13

Existe uma maneira de usar zenity

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

insira a descrição da imagem aqui

Você pode testar o status de saída do comando com $?variável, algo como isto: 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 posteriormente, talvez armazene $?logo após o pop-up sair de uma variável. Conforme discutido nos comentários, estruturas como a seguir 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:/"
Sergiy Kolodyazhnyy
fonte
2
Você não precisa de colchetes. Apenas faça if zenity...ouzenity... || exit
Kevin
Pode ser feito dessa maneira, mas eu prefiro um estilo mais "tradicional"
Sergiy Kolodyazhnyy
2
Pareceu-me um pouco tolo testar o status de saída de um programa ... alimentando seu status de saída para outro programa (ou shell embutido) e testando o status de saída dele.
Kevin
É um pouco é bobagem, mas tornou-se uma força do hábito
Sergiy Kolodyazhnyy
6

Você pode usar xmessageno próprio script. Coloque algo assim depois do "shebang":

xmessage "Are you sure?"

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

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

Por exemplo,

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

Veja man xmessagetodas as opções (existem muitas).

Eduardo Cola
fonte
Obrigado ... Esta solução também funciona bem .. É que Zenity exibe um diálogo mais bonito .. Em termos de funcionalidade, tanto trabalho ...
mayank budhwani
5

Em vez de lhe dizer 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 executam acidentalmente.

EDIT: Você parece tratar seu script como algo especial, como se as configurações gerais não fossem boas o suficiente e seu script precise de confirmação especial do usuário. Clicar duas vezes nele é a confirmação. Se você achar que seus usuários o executam acidentalmente, precisará descobrir por que eles fazem isso e resolver isso. Seu problema real não é como exigir confirmação, mas como impedir que seus usuários a executem acidentalmente.

Pela maneira como expõe seu problema, parece que você espera que seu programa (script) seja executado navegando até onde está o arquivo e, em seguida, clicando nele no gerenciador de arquivos. Pense em todos os outros programas em seu sistema. Quantos você começa assim? Você navega para /usr/local/binquando inicia o Firefox? Claro que não. Você clica no menu de aplicativos. (o gnome tweak é um script python, talvez seja um exemplo melhor)

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

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

  2. crie um arquivo de entrada da á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 empurrá-lo em /usr/local/share/applications/your-script.xmlou ~/.local/share/your-script.xml.

  3. Finalmente corra update-desktop-database.


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

O único momento em que um programa deve pedir confirmação é quando está prestes a fazer algo possivelmente perigoso e irreversível. Por exemplo, substituindo um arquivo ou ignorando a lixeira. E observe que mesmo esses exemplos são sobre como fazer um programa fazer algo específico. Não se trata de iniciar esses programas. Se um único objetivo do programa é fazer uma coisa tão perigosa, também não deve pedir confirmação.

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

Diálogo de confirmação do Nautilus

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

Menu de preferências do Nautilus - guia comportamento

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

carandraug
fonte
1
Esta não é realmente uma solução, pois não pode ser compartilhada com facilidade e segurança com outras pessoas.
Ismael Miguel
Graças ... Eu sei como fazer isso .. Mas isso acrescenta uma confirmação para todos os scipts ... Eu quero-o para um script em particular ...
mayank budhwani
@IsmaelMiguel, mas esse é o ponto principal da resposta. Não deve ser compartilhado. Há duas coisas diferentes, a ação do programa e o comportamento / experiência do sistema. Você não deve mesclar os dois.
21416 carolineug em:
@IsmaelMiguel, esta resposta aponta o antipadrão do que o usuário deseja fazer. Não dá o peixe ao autor, porque ele é alérgico.
Braiam
@mayankbudhwani você ainda está resolvendo o problema errado. Por que esse script específico é especial? Se seus usuários clicarem acidentalmente, será um problema diferente. Eu editei a resposta com outra abordagem.
21416 carolineug
2

Você pode usar o yad, que é como a zenidade dos 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ê deve ver isso: captura de tela 1

Se OK foi pressionado, obtemos um código de retorno 0, se Cancelar foi pressionado, obtemos um código de retorno 1.

Seria melhor colocar a caixa no centro e também ajustar a largura dela, use uma guia à esquerda para posicionar o texto "Você tem certeza?" mais à direita e também sempre em cima. Para isso, precisamos:

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

A maioria das opções é auto-explicativa, exceto o "\ t" anterior ao "Você tem certeza?" que simplesmente adiciona um espaço de tabulação antes de imprimir o texto. Agora devemos ver isso:insira a descrição da imagem aqui

A caixa está centralizada, sempre na parte superior e fica 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 Cancel foi pressionado.

Para obter ajuda com o yad, você pode usar man yadou, yad --help-allmas achei exemplos práticos mais fáceis de adaptar. Há alguns aqui . O yad é muito mais configurável e, portanto, mais utilizável que o zenity, na minha opinião.

Scooby-2
fonte
Caso isso ajude alguém que eu postei o uso do yad uma vez antes. Você pode vê-lo aqui: askubuntu.com/questions/488350/…
Scooby-2