Script para converter um diretório de scripts ksh em scripts bash?

0

Como ksh e bash são baseados em sh , muitos scripts do Korn Shell (ksh) serão simplesmente executados como scripts shell do Bourne (bash) assim que a shebang e a extensão do arquivo forem alteradas,

e você chama $ bash script.bash em vez de $ ksh script.ksh .

Eu tenho um script básico para substituir qualquer ocorrência de ksh em um diretório chamado "arquivos" e altera as extensões de arquivo para os scripts.

#!/bin/bash/

#replace instances
find ./files -type f - exec sed -i.bak "s/ksh/bash/g" {} \;

#Change extensions
for f in ./files/*.ksh;
  do mv "$f" "./files/""$(basename "$f" .ksh).bash"
done

#Clean up
rm ./files/*.bak

Este script funciona e faz o que está descrito acima, mas é suficiente para converter qualquer script ksh para bash, ou existem condições que eu não considerei?

    
por Somejuan 07.10.2015 / 15:34

4 respostas

5

O script não está realmente fazendo nada útil. A extensão é irrelevante e a linha shebang é ignorada se você executar com bash explicitamente. Você pode obter exatamente a mesma coisa que o seu script, se você acabou de executar:

bash script.ksh

A questão é as diferenças na sintaxe. Isso é o que você precisa corrigir, caso contrário, basta executar os scripts com bash e acabar com isso.

    
por 07.10.2015 / 15:55
3

bash implementa apenas um subconjunto dos recursos de ksh93 . Embora ele implemente a maioria dos recursos de ksh88 , para alguns deles ele é diferente e nem todos os recursos são ativados por padrão.

Por exemplo, os alias em bash não são expandidos quando não interativos, os globs estendidos do ksh não são ativados por padrão, bash não possui print builtin, não é possível definir matrizes com set -A , co -processos são invocados e usados de forma diferente ...

Portanto, a menos que esses scripts ksh sejam muito simples e sejam basicamente compatível com POSIX sh (um subconjunto bem definido do subconjunto de comandos bash e a variante sintaxe de implementação ksh ), é provável que eles não sejam executados adequadamente bash .

Agora, desde 2000, ksh93 é open source e está disponível gratuitamente na maioria dos sistemas operacionais (e na maior parte compatível com ksh88 ). Para ksh88 scripts, pdksh e derivados modernos como mksh também são geralmente suficientes.

Todos eles são geralmente muito mais eficientes do que bash , então não vejo por que você gostaria de ter esses scripts interpretados por bash em vez do interpretador para o qual foram originalmente escritos.

Mesmo zsh seria uma escolha melhor do que bash , pois tem um modo de emulação ksh.

    
por 07.10.2015 / 16:07
0

bash e ksh compartilham uma grande parte da sintaxe, portanto, muitos scripts funcionarão em ambos. No entanto, existem recursos em ksh que bash não suportam (por exemplo, expressões regulares ), e qualquer script usando esses recursos provavelmente se comportará mal. Realmente não importa se seus scripts são simples - uma expressão regular é freqüentemente usada em condições simples de if .

Não há como um script simples consertar essas peculiaridades para você. Reescrever expressões regulares não é uma tarefa fácil de automatizar. O que você pode fazer automaticamente é executar todos os scripts em um ambiente chroot e ver se bash reclama de erros de sintaxe. Ainda assim, você não pode ter 100% de certeza de detectar todos os problemas dessa forma, alguns podem permanecer ocultos (a sintaxe pode ser válida, mas significa coisas diferentes em bash e ksh ).

    
por 07.10.2015 / 16:06
0

Uma abordagem mais rigorosa seria executar checkbashisms em seus scripts para verificar se eles são de fato sh -compliant. Tanto bash como ksh poderão executar esses scripts muito bem. Mas, novamente, em caso de problemas, você terá que corrigir seus scripts manualmente.

    
por 16.10.2015 / 14:44