私は長い間 Bash を使ってきました。今は少なくとももう 1 つのシェルを習得したいので、Korn Shell を学んでいます。しかし、Ksh は 20 年近くメジャー アップデートされていないようですし、Zsh にはその機能が組み込まれていると読んだことがあります。StackExchange ネットワークでシェルの比較に関する多くの質問を読んできましたが、次の質問に対する答えは見つかりませんでした。Zsh に組み込まれていない Korn Shell の機能はありますか?もしそうなら、それは何ですか?
答え1
これがコマンドシェルの比較に関するWikipediaの記事。
それによると、kshにあってzshにはない唯一の機能は名前付きパラメータユーザー定義の「タイプ」この記事は、特に目立たない機能については網羅的なリストではないため、他にも機能がある可能性があります。
逆に言えば、あなたの質問に対する答えは一冊の本にまとめられるほどです(おそらくこれです)。
Zshにはkshにはない多くの機能があります。いくつか有名なものを挙げると、コマンドスタック、ディレクトリスタック、履歴の共有そしてプロンプト。
- コマンドスタックコマンドを入力しているときに、まず別のコマンドを実行する必要があることに気付いた場合です。現在の行をコマンド スタックに送信し、別のコマンドを実行してから、コマンドをスタックからポップします。これを複数回実行できます。(zsh は、これを提供する唯一のシェルです)。
- ディレクトリスタック(別名
pushd
/popd
) は、連続してディレクトリを変更し、逆の順序で cd で戻る場合に使用します。(bash を含む多くのシェルがこれを提供します)。 - 歴史の共有開いているすべてのシェルが 1 つの共通履歴を共有する場所です。 1 つのウィンドウでコマンドを実行し、別のウィンドウに切り替えると、履歴で使用できるようになります。
- プロンプトはプロンプトと同じですが、右揃えになっています。 または
cwd
をdate
に入れる人が多いですrprompt
。
Stack Exchange サイトにおける zsh に関する議論をいくつか紹介します。
答え2
ksh88 は SVR4 に含まれていた最も有名なバリアントで、この言語bash
は主にこれをベースにしており、pdksh はこれを部分的にクローンし、そのサブセットが POSIX 仕様の基礎となっsh
ていますが、1993 年 5 月の最後のリリース (ksh88i) 以来、あまり進化していません (一部のバグ修正と一部のベンダーによる POSIX の調整を除く)。
しかし、1993年12月に最初にリリースされたDavid Kornによる書き直しであるksh93は、2014年頃まで活発に開発され、そのソースコードは解放された2000 年に。最後の公式リリースである ksh93u+ は、2012 年 8 月 (この質問をしてからわずか数週間後) に作成され、AT&T によって解雇された後、元の作者によって多くの新機能を備えた「ベータ」リリース (ksh93v-) が 2014 年に作成されました。
コミュニティはksh93vをベースに開発を続け、コードを近代化する努力を続けてきましたが、その結果ksh2020が生まれました。その努力は今や放棄された.あksh93u+を維持するための別の取り組みその後は同じような展開になりそうだ。新しいもの(ksh93u+m)現時点では少し有望に見えます。
ksh93 は単なるシェルではありません。同じコードの一部を再利用する一連のユーティリティとともに開発され、busybox のように ksh93 に組み込むことができます。
それはむしろ研究この取り組みは、実験的なものとみなされることが多く、文書化がほとんど行われていません。
ksh93 は何よりもまず強力な対話型シェルとして開発されましたが、プログラミング言語として重点が置かれていました。またはzsh
と同様のカテゴリになることを目標に、言語と最適化に多大な努力が払われてきました。perl
python
ksh93 には zsh にはない機能が数多くあり、同様に、ksh93 にはない zsh の機能も数多くあり、両者は互いの機能を借用しています。共通する機能も多数あり、両者で実行できることはありますが、その方法は非常に異なります。
ksh93 にはあって zsh にはないものには次のようなものがあります:
- ast-open のすべての組み込み機能: ast-open の一部としてビルドすると、、、、、、...などの
ksh93
標準ユーティリティの改良版を含む、zsh にはない多くの組み込み機能があります(ただし、zsh には独自の組み込み機能や言語機能でそれらの機能の一部があります)。これがdate
join
head
tr
uniq
wc
最適化perl
物事の側面。何かをするためにプロセスをフォークする必要がある場合は、-like にすることはできません。 - 非フォークコマンド置換 (
$(...)
)、およびサブシェル環境を作成しないコマンド置換${ ...; }
。 - 多次元配列:
a=((a b) (c d))
- オブジェクト指向プログラミング機能 (型、構造、規律、メソッドなど)。
- 変数とオプションの静的スコープ (変数には
zsh
がありますprivate
が、オプションには静的スコープがありません)。 - 名前参照 (静的スコープとオブジェクト プログラミング構造を持つシェルには必須ですが、zsh や bash のような動的スコープを持つシェルにはそれほど必要ありません)
- 自然言語、crontab、ISO 形式を含む組み込みの日付/時刻操作(はそれに比べて非常に制限されています)
printf
。date
zsh
strftime
- いくつかの便利なリダイレクト演算子 (
<#((...))
シーク、<>;
上書き、切り捨てなど)。 - 名前空間
- ジョブプールとコシェル。
- CSV/URI/HTML エンティティ/base64 エンコード/デコード。
- ksh93v での json エンコード/デコード - 高度なデータ構造を他のツールが理解できる形式で (デ) シリアル化します (バグが多いため、ksh2020 で削除されました)。
$"..."
メッセージのローカライズ/dev/tcp
、/dev/udp
(UNIXドメインソケット用の、zsh
がありますが、UDPはありません)ztcp
zsocket
dtksh
90 年代には、CDE に含まれていた ksh93 に X ツールキット機能を追加するシェルもありました。shcomp
がありますコンパイルkshコード。