Como um projeto pessoal, estou tentando escrever um script para limpar alguns dos arquivos estranhos que acompanham o Windows 10 que é executado no Cygwin. Eu gostaria que o script pudesse ser copiado e colado, o que exigiria que ele fosse robusto contra diferentes tipos de novas linhas. Existem sh
shells -like que expõem a capacidade de tratar \r
como espaço em branco, possivelmente quando alguma opção é definida?
É uma coisa estranha de se fazer. A resposta pode se resumir a "sim, isso é uma coisa estranha de se fazer e não há como fazê-lo".
Em geral, isso não é possível para um script real.
Um script executável autônomo terá uma linha shebang que identifica o interpretador a ser usado:
O problema é que, independentemente do interpretador, a própria linha shebang conterá um caractere de retorno de carro antes do final, o que significa que o interpretador não será encontrado (exceto o nome executável improvável de literalmente
$'sh\r'
- o que acho ilegal no Windows) .O outro tipo de script executável é um arquivo de texto simples com o conjunto de bits de execução, que o POSIX requer para ser interpretado como um script na linguagem de comando do shell POSIX (quando invocado a partir de um shell compatível). Essa linguagem de shell, no entanto, como você descobriu, trata retornos de carro como bytes de dados, então você tem o problema que identificou.
Você tem algumas opções. Uma é renunciar diretamente a um script executável real e simplesmente invocar primeiro um intérprete para alguma outra linguagem. Você identificou Perl e Python e, de fato, a maioria das linguagens de script está satisfeita com qualquer formato de final de linha contemporâneo. Invocar o script como
perl cleanup.pl
não será um problema.No entanto, muitas tarefas administrativas são muito mais fáceis em uma linguagem shell convencional, e há mais um truque: termine cada linha com um comentário.
O
#
caractere introduz um comentário no final da linha em todos os shells padrão (em contextos não interativos). O comentário incluirá o byte de retorno de carro, que é um elemento fino de um comentário, e terminará imediatamente depois com o byte de alimentação de linha final.É importante que haja esse espaço antes do hash: um
#
dentro de uma palavra não inicia um comentário, mas faz parte da palavra .Você pode executar este script diretamente com um shell:
Mas se você for iniciá-lo digitando um comando de uma sessão de shell existente, esses scripts POSIX mencionados anteriormente também funcionarão: apenas torne o arquivo executável e, em seguida,
irá executá-lo usando o que seu shell considerar a coisa certa a fazer para um script POSIX .
Como isso soa como algo único, provavelmente não vale a pena o esforço de torná-lo executável, então
sh cleanup.sh
parece adequado para mim.Minha sugestão honesta para essa situação é provavelmente o Powershell (ou lote em um push), mas entendo que não é o que você deseja. O WSL é outra opção: ele lida com retornos de carro na linha shebang automaticamente e, em seguida, você pode usar comentários para o resto.