0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

kshを試してみた

Posted at

はじめに

仕事の関係で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に慣れていこうと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?