はじめに
仕事の関係でkshを使うことになったのですが、今までシェルスクリプトはbashしか使ったことがなく、試しに自宅PCで触ってみることにしました。
初心者のため、間違ったことを書いている場合は、ご指摘いただければと思います。
kshのインストール
自宅PCはWindowsしかないですが、VirtualBoxでUbuntuを動かしているので、そこにkshの環境を整えようと考えました。
デフォルトのシェルはbash(dash)なので、kshをまずはインストールします。
自宅PCのVirtualBoxのUbuntuのバージョンは以下の通り、22.04 LTSをインストールしています。
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.5 LTS (Jammy Jellyfish)"
kshはapt installでインストールできます。
$ sudo apt update
$ sudo apt install ksh
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
ksh93u+m
Suggested packages:
bunfmt-support
The following NEW packages will be installed:
ksh ksh93u+m
0 upgraded, 2 newly installed, 0 to remove and 208 not upgraded.
Need to get 901 kB of archives.
After this operation, 3,185 kB of additional disk space will be used.
Do you want to continue? [Y/n]
上記画面で Y を入力するとkshがインストールされます。
インストールされたkshのバージョンを確認すると以下の通りとなりました。
$ ksh --version
version sh (AT&T Research) 93u+m/1.0.0-beta.2 2021-12-17
使ってみた感想
最近のLinuxではデフォルトでkshがインストールされていないせいか、Web上にもあまりkshの記事って載っていないですね。以下のページなどをみていろいろと勉強させていただきました。
KornShell(ksh)に関する覚え書き
夢のシェルスクリプト言語 KornShell (ksh93) 〜すごいぞ!型とクラスは本当にあったんだ!〜
データ型の定義や構造体なども使うことができるんですね。使いこなすことができれば便利そうな印象を受けました。上記のWebページなどを見ていて以下のコマンドがいまいちよくわかりませんでした。
#!/bin/ksh
{
<#((50))
...
} < data.dat
調べてみたところ、上記のコマンドの意味としては
data.datファイルの先頭から50バイトの位置にオフセットを移動する
みたいですね。
#!/bin/ksh
{
<#((CUR+10))
...
} < data.dat
またこちらは
data.datファイルのカレントオフセットに10バイト足した位置にオフセットを移動する
みたいです。
bashではファイル読み出しでも先頭から順番にしか処理したことがなかったので、kshは奥が深いと感じました。
整数型の扱い
以下のようなコマンドをファイルに記載し(test.sh)、bash/kshでそれぞれ実行してみるとどちらも実行でき135を表示します。
typeset -i temp=135
echo ${temp}
【bashの場合】
$ bash test.sh
135
【kshの場合】
$ ksh test.sh
135
しかし、tepeset -iではなくintegerを使う場合、bashとkshでは結果が異なります。
integer temp=135
echo ${temp}
【bashの場合】
$ bash test.sh
test.sh: line 1: integer: command not found
【kshの場合】
$ ksh test.sh
135
integerというエイリアスはksh93u+mで定義されているようで、bashでは未定義のようです。
組込み関数の扱い
bashのプロンプトで以下のコマンドを入力し実行するとエラーとなります。
$ export EDITOR=$(whence emacs)
whence: command not found
しかしkshのプロンプトだと上記のコマンドは成功します(エラーは表示されない)。
$ export EDITOR=$(whence emacs)
$
試しに環境変数EDITORの内容を確認すると、以下のように設定されています(パスは環境に依存します)。
$ env | grep EDITOR
EDITOR=/usr/bin/emacs
bashプロンプトでhelpコマンドを入力すると組込みコマンドの一覧が表示されますが、whenceは見当たらないので、bashでは定義されていないようです。
コマンドの修正
kshのプロンプトでhistoryと入力し実行するとコマンドの履歴が表示されます。
$ history
...
46 exit
47 emacs .profile
48 history
kshのプロンプトで以下のコマンドを入力し実行すると.logというファイルをemacsで開くことができます。
$ fc emacs
15
q
emacs .profile
$ fc -e - .profile=.log
emacs .log
さいごに
まだ少ししか触っていないですが、bashとkshではいろいろと違いがありそうですね。もっといろんなコマンドを試してみてkshに慣れていこうと思います。