Eu gostaria de compactar um monte de pastas que estão em um determinado diretório, criando um arquivo zip por pasta. Para isso, utilizo o seguinte comando:
$ find -maxdepth 1 -mindepth 1 -type d | xargs -I@ zip -r @.zip @
Isso funciona como esperado.
No entanto, por acidente, notei um comportamento que não esperava quando usei #
como a string de substituição em vez de @
:
$ find -maxdepth 1 -mindepth 1 -type d | xargs -I# zip -r #.zip #
zip error: Invalid command arguments (cannot write zip file to terminal)
zip error: Invalid command arguments (cannot write zip file to terminal)
... and so on (the same message repeated for every folder)
#
normalmente abre um comentário, então fica claro que as coisas dão errado aqui. Mas eu esperava que a linha de comando realmente se tornasse find -maxdepth 1 -mindepth 1 -type d | xargs -I
, porque tudo (incluindo) o primeiro #
é um comentário e é removido.
No entanto, ele obviamente executa o zip
comando. Por quê?
Um comentário (no
bash
shell) é introduzido pelo#
caractere. Mas isso só acontece se o#
caractere estiver sem aspas, e o primeiro caractere em uma palavra (token).Se
#
for citado ou ocorrer como um caractere diferente do primeiro caractere em uma palavra, isso não introduzirá um comentário.Comparar:
Em shells interativos, os comentários nunca são introduzidos se a
interactive_comments
opção shell estiver desativada (está ativada por padrão).