Arquivos shell (* .sh) para o arquivo de lote (* .bat)?

0

É muito tedioso converter scripts de shell em arquivos em lote. Existe uma maneira de executar automaticamente e facilmente a conversão de .sh para .bat ou vice-versa?

    
por stack 28.04.2014 / 10:53

1 resposta

5

Eu duvido seriamente. Precisamente porque é tão tedioso fazer, ou mais precisamente por causa do motivo pelo qual é tedioso: os sistemas, sem falar no software envolvido, são completamente diferente.

Não é apenas uma questão de adicionar ou remover uma linha #! no topo. Pegue esta linha de um script de shell que eu escrevi:

STREAM_FROM=$($ZFS list -t snapshot ${BACKUP_TARGET_FS} -H -o name -r | grep '@backup_' | tail -n 1 | cut -d '@' -f 2)

(Sim, provavelmente há uma maneira mais eficiente de fazer isso do que um punhado de pipes, mas isso não vem ao caso; o script em questão não precisa de desempenho de primeira classe.) Isso é atribuição de variável, expansão da expressão subshell, invocação de comando por expansão de variável de ambiente, expansão de variável de ambiente, tubulação, grep , tail e cut tudo em uma única instrução. Para converter com precisão até mesmo essa declaração, você precisa saiba como tudo isso funciona e a semântica exata das várias opções para os utilitários padrão chamados e como recriar esse comportamento no sistema de destino.

Suponha que você tenha os utilitários do ZFS instalados nos dois sistemas (portanto, não precisamos nos preocupar com essa parte). Como você vai, automaticamente, converter isso em uma instrução de arquivo de lote do Windows ou um conjunto de instruções? Eu diria que, a menos que você possa fazer algo parecido com a solução do problema de parada , não é possível escrever um artigo genérico. conversor como o que você está procurando claramente. Ao contrário da tradução de linguagem natural, com o comportamento de programas de computador "próximo" do original não é nada bom o suficiente: nada menos do que a perfeição é um erro.

Ou pegue um trabalho de digitalização que eu fiz no outro dia (admitidamente não é um script, mas poderia ter sido feito com facilidade; acabei digitando em um terminal porque era uma coisa única); Acabei com algo não muito diferente do seguinte:

for n in $(seq 10 66); do scanimage --button-controlled=yes -x 180 -y 200 --mode Gray --format=tiff > scan${n}.tmp && convert scan${n}.tmp scan${n}.png && \rm scan${n}.tmp; done

Este é um exemplo complicado porque a opção --button-controlled é fornecida pelo backend , não pelo próprio scanimage (SANE). Portanto, uma ferramenta para converter esse one-liner precisaria saber sobre todas as opções fornecidas por cada backend SANE e suas contrapartes no sistema de destino; claramente não é viável, e talvez nem mesmo possível .

Até mesmo um script de shell verdadeiramente simples, que apenas repete um conjunto de arquivos, provavelmente não será possível convertê-lo automaticamente. E esses scripts simples são poucos e distantes entre si.

Além disso, "scripts de shell" não é algo homogêneo: o que é necessário para converter um script de shell bash é diferente do necessário para converter um script de shell zsh diferente do necessário para converter um script de shell escrito em Perl. Em muitos casos, talvez nem existam contrapartes diretas de várias sintaxes, o que complica ainda mais a tradução.

    
por 28.04.2014 / 11:30