Sua pergunta é um pouco desconexa. Vou responder o que parece ser a parte central, sobre a diferença entre ksh e bash que você observa.
Você encontrou o que é provavelmente a incompatibilidade # 1 entre o ksh e o bash quando se trata de scripts. ATT ksh (ambos ksh88 e ksh93) e zsh executam o último comando (mais à direita) em um pipeline no shell pai, enquanto outros shells (Bourne, ash, bash, pdksh, mksh) executam todos os comandos incluindo o último em um subshell .
Aqui está um programa de teste simples:
msg="a subshell"
true | msg="the parent shell"
echo "This shell runs the last command of a pipeline in $msg"
Em ATT ksh e zsh, a segunda atribuição a msg
é executada no shell pai, portanto, o efeito fica visível após o pipeline. Em outros shells, essa atribuição é executada em uma subcamada, então a primeira atribuição permanece no pai.
Uma solução alternativa é executar o restante do script no pipeline. Este é um idioma comum para ler dados e fazer algum processamento posteriormente:
output_some_stuff | {
var=
while IFS= read -r line; do
var=$(process "$line")
done
use "$var"
}
Você parece ter um bug do ksh . Eu recomendo atualizar para uma versão sem bugs. Se isso não for possível, tente a solução alternativa de Stephane Chazelas . Embora você possa tentar executar seus scripts no bash, não é (e não pretende ser) um substituto para o ksh; Há muitos recursos do ksh que o bash não possui (e vice-versa). Bash e ksh são compatíveis apenas no núcleo POSIX e em alguns outros recursos centrais (em particular, arrays, [[ … ]]
e variáveis locais em funções declaradas por typeset
).
Você também pode tentar o zsh, que quando invocado como ksh
se comporta de uma maneira um pouco mais próxima do ksh do que o bash. Você pode, no entanto, encontrar incompatibilidades.