cd -P .
for dir in ./*/
do cd -P "$dir" ||continue
printf %s\\n "$PWD" >&2
command && cd "$OLDPWD" ||
! break; done || ! cd - >&2
O comando acima não precisa fazer nenhum subshells - apenas rastreia seu progresso no shell atual alternando $OLDPWD
e $PWD
. Quando cd -
o shell troca o valor dessas duas variáveis, basicamente, à medida que altera os diretórios. Ele também imprime o nome de cada diretório, pois trabalha lá para stderr.
Acabei de dar uma segunda olhada e decidi que poderia fazer um trabalho melhor com o tratamento de erros. Irá pular um diretório no qual não pode cd
- e cd
imprimirá uma mensagem sobre o motivo de stderr - e exibirá break
um código de saída diferente de zero se o seu command
não for executado com êxito ou se a execução command
afetar de alguma forma a capacidade de retornar ao diretório original - $OLDPWD
. Nesse caso, ele também faz uma cd -
última - e grava o nome do diretório de trabalho atual resultante no stderr.
youtube-dl
.