そして両方とも多くのKornシェルスクリプト(ksh)ksh
に基づいているため、shebangとファイル拡張子が変更されると、Bourne-againシェルスクリプト(bash)として実行されます。bash
sh
$ 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
いません。print
set -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%確信することはできませbash
んksh
。
答え4
より厳格なアプローチは、以下を実行することです。checkbashisms
スクリプトが実際にsh
要件を満たしていることを確認してください。どちらもこれらのスクリプトを非常によく実行bash
できますksh
。ただし、問題が発生した場合は、スクリプトを手動で修正する必要があります。