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. ..