Solicitar confirmação para cada comando

4

Estou escrevendo um belo script de instalação ad-hoc para alguma coisa. Não há muito controle constrói, basicamente, apenas uma lista de comandos. Eu gostaria que o usuário confirmasse cada comando antes de ser executado. Existe uma maneira de deixar o bash fazer isso, sem prefixar cada comando com um nome de função do shell?

    
por MvG 12.04.2013 / 15:36

1 resposta

6

Você pode usar extdebug :

shopt -s extdebug
trap '
  read -n1 -p "run \"$BASH_COMMAND\"? " answer <> /dev/tty 1>&0
  echo > /dev/tty
  [[ $answer = [yY] ]]' DEBUG

cmd1
cmd2
...

Para referência, o zsh equivalente seria:

TRAPDEBUG() {
  read -q "?run \"$ZSH_DEBUG_CMD\"? " || setopt errexit
  echo > /dev/tty
}
cmd1
cmd2
...

Mais portably:

run() {
  printf %s "run $*? " > /dev/tty
  read answer < /dev/tty
  case $answer in
    [yY]*) "$@";;
  esac
}
run cmd1
run cmd2
run cmd3 > file

Tenha em atenção que, em cmd3 > file , o file será truncado, mesmo que diga n . Então você pode escrever:

run eval 'cmd3 > file'

Ou mova o eval para a função run como em:

run() {
  printf %s "run $*? " > /dev/tty
  read answer < /dev/tty
  case $answer in
    [yY]*) eval "$@";;
  esac
}
run cmd1
run 'cmd2 "$var"'
run 'cmd3 > file'

Outra portável, mas com ainda mais limitações:

xargs -pL1 env << 'EOF'
cmd1 "some arg"
cmd2 'other arg' arg\ 2
ENV_VAR=value cmd3
EOF

Funciona apenas para comandos (aqueles encontrados em $PATH ), e argumentos podem ser apenas strings (nenhuma variável ou estrutura de shell, embora os xargs entendam algumas formas de citar), e você não pode ter redirecionamentos, pipes. ..

    
por 12.04.2013 / 17:28