chiedere sempre all'utente prima di eseguire un comando nella shell


10

Esiste un'utilità che richiede sempre conferma all'utente prima di eseguire un comando simile al modo in cui sudorichiede la password?


1
Lo vuoi davvero per qualsiasi comando? Compreso cde ls?
Carsten Thiel,

Mi piacerebbe averlo nei miei alias in .bashrc.
m33lky,

Risposte:


9

Vuoi che funzioni senza digitare un comando aggiuntivo, ad es

$ rm file

O solo quando l'utente digita qualcosa di simile

$ confirm rm file

O solo quando l'utente tenta di eseguire determinati comandi, ad es

$ rm file

ma non per

$ echo "Hello"

Se l'opzione 1, ciò può essere fatto usando l'hook preexec in zsh o la trap DEBUG in bash.

Se l'opzione 2, inserisci qualcosa del genere in /etc/bash.bashrco un altro file di avvio della shell.

confirm() {
    echo -n "Do you want to run $*? [N/y] "
    read -N 1 REPLY
    echo
    if test "$REPLY" = "y" -o "$REPLY" = "Y"; then
        "$@"
    else
        echo "Cancelled by user"
    fi
}

Se l'opzione 3, è possibile modificare lo confirmscript sopra o, alcuni comandi hanno un'opzione da chiedere prima di fare qualcosa, ad es rm -i. Si potrebbe mettere alias rm='rm -i'in /etc/bash.bashrc.


Vorrei la conferma solo per un singolo comando che mi dà sempre mal di testa. Come sarebbe la sceneggiatura?
Danijel,

10

Ho giocato un po 'con Bash e ho scoperto un hack con cui questo potrebbe essere reso possibile.

#!/bin/bash

debug_trap () {
    echo "executing $BASH_COMMAND"
    echo "Allow?"
    select choice in yes no
    do
        if [ "$choice" = "yes" ]
        then break
        elif [ "$choice" = "no" ]
        then return 1
        fi
    done
}

shopt -s extdebug
trap debug_trap DEBUG

Puoi salvare questo script sotto, diciamo, confirm-any-command.she sourcenel tuo bashrc. Chiederà la conferma di ogni comando che proverai ad eseguire.

Si noti che questo non è altro che un hack di prova di concetto; Dubito che possa davvero essere utile in questa forma. Se dovrai confermare ogni singolo comando che digiti, molto presto acquisirai l'abitudine di premere automaticamente "sì" dopo ogni comando. La mappatura mentale per "fine del comando" cambierà da solo Entera Enter, yes, Enter- sarete digitando nel suo insieme, non hanno nemmeno provare a passare un po 'di tempo sulla verifica che davvero desidera che questo comando da eseguire. Questo è controproducente e non ti aiuterà.


Si ferma sulla Allow? 1) yes 2) no #? yesnolavoro causando ciclo infinito (Debian 8)
vladkras

@vladkras read help select: dovresti inserire 1o 2piuttosto che yeso no. Il tentativo automatico di input non validi è un comportamento previsto (in modo che lo sceneggiatore non debba reinventare whilese stesso, mantenendo concisione e chiarezza) e l'input EOF termina il ciclo. Sapendo ciò, puoi verificare che lo script sopra funzioni. Non lo modificherò, dato che è comunque una rozza prova del concetto.
Ulidtko,

è vero. Sono stato confuso dal tuo y e s Enteresempio
Vladkras,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.