kshスクリプトディレクトリをbashスクリプトに変換するスクリプト?

kshスクリプトディレクトリをbashスクリプトに変換するスクリプト?

そして両方とも多くのKornシェルスクリプト(ksh)kshに基づいているため、shebangとファイル拡張子が変更されると、Bourne-againシェルスクリプト(bash)として実行されます。bashsh

$ bash script.bash代わりに電話してください$ ksh script.ksh

"files" というディレクトリで ksh を置き換え、スクリプトのファイル拡張子を変更するデフォルトのスクリプトがあります。

#!/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

このスクリプトは動作し、上記のタスクを実行しますが、kshスクリプトをbashに変換するのに十分ですか、それとも考慮していない条件がありますか?

答え1

スクリプトは実際に役に立つことはありません。 bashを明示的に使用して実行すると、拡張子は重要ではなく、shebang行は無視されます。次のコマンドを実行すると、スクリプトとまったく同じ結果が得られます。

bash script.ksh

問題は構文の違いです。これはあなたが解決しなければならないでしょうそれ以外の場合は、bashを使用してスクリプトを実行すると完了します。

答え2

bash機能のサブセットのみが実装されていますksh93。ほとんどの機能は実装されていますが、ksh88一部の機能は異なる方法で実装されており、すべての機能がデフォルトで有効になっているわけではありません。

たとえば、bash非対話型の場合、エイリアスは拡張されず、ksh拡張グローブはデフォルトで有効になってbashいません。printset -A

したがって、これらのkshスクリプトが非常に単純で、基本的にPOSIX shと互換性がない限り(明確に定義されたコマンドのサブセットとbashさまざまなksh実装構文)bash

2000年からksh93オープンソースであり、ほとんどのオペレーティングシステムで無料で利用できます(ほとんどのバージョンと互換性がありますksh88)。通常、ksh88スクリプトpdkshと最新のスピンオフmkshにも十分です。

彼らは通常それよりはるかに効率的であるため、もともと書かれた通訳者の代わりにbashこれらのスクリプトを解釈したい理由を理解することはできません。bash

ksh エミュレーションモードがあるので、zshより良い選択になることもできます。bash

答え3

bashそしてksh構文のかなりの部分を共有するので、両方で多くのスクリプトを使用できます。ただし、一部の機能はサポートされkshていませんbash(例:一般的な表現)、これらの機能を使用するスクリプトにエラーが発生する可能性があります。スクリプトが単純かどうかは問題ではありません。正規表現は、単純なif条件で使用されることがよくあります。

単純なスクリプトでは、実際にこれらの問題を解決することはできません。正規表現を書き換えるのは簡単な自動化ではありません。あなたは何ですかできる自動実行は、環境内のすべてのスクリプトを実行し、chroot構文bashエラーが発生していることを確認することです。しかし、すべての問題がこの方法で検出されたことを100%確信することはできませbashksh

答え4

より厳格なアプローチは、以下を実行することです。checkbashismsスクリプトが実際にsh要件を満たしていることを確認してください。どちらもこれらのスクリプトを非常によく実行bashできますksh。ただし、問題が発生した場合は、スクリプトを手動で修正する必要があります。

関連情報