独自シェルを作ってみよう!
あなたは
人目のお客様です.
※ ここで説明していることはすべて無保証です.
サンプルのソースコードやその他プログラム,各種情報などは,
個人の責任の上で利用してください.
NLSH(NuLl SHell / No Library SHell / No Library, no SHell)はシンプルで
極小の自作シェルです.
標準ライブラリ(いわゆるlibc)を一切使わずにビルドすることができます.
(このため極小サイズの実行ファイルを生成可能です)
ご意見,要望などあれば,ぜひ連絡ください!
NLSHはNLUXに統合され,NLUXの付属物となっています.
最新情報&ソースコードは以下を参照してください.
以下は統合前のソースコードです.
- NLSH beta (2021/03/22版)
- nllibcを整備
- fprintf()/fflush()を追加(ただし中身はダミー)
- atoi()を実装
- isalpha()系を実装
- NLSH beta (2021/01/26版)
- NLSH beta (2021/01/25版)
- Ctrl+Zでのサスペンド,fg/bgでのプロセス制御を実装
- プロセス制御を修正
- ルートディレクトリ直下のファイルの補間ができないバグを修正
- フルパスのファイルのワイルドカード展開で,/が重複してしまうバグを修正
- 引数無しの cd でホームディレクトリに移動する
- ビルトインコマンドとシェルコマンドを分割し,ビルトインコマンドを
fork()後に実行するように修正.さらにenvをビルトインコマンドとする
(これによりビルトインコマンドであるenvに対してもパイプが使えるようになる)
- NLSH beta (2021/01/22版)
- 実行ファイルの補完時にコマンドサーチパスを検索する処理を追加
- フォアグラウンドプロセスに入出力を渡していなかった問題を修正
- setpgid()のタイミングを見直すことで,wait4()による待ち合わせ時の
子プロセスのsetpgid()待ちによる無駄なビジーループを無くす
- 環境変数の一覧表示のビルトインを追加
- シェル変数の設定機能を追加
- 存在しないディレクトリがコマンドサーチパスに含まれている場合に
補完されないバグを修正
- nllibcを整備
- brk()/sbrk()を整備
- malloc()を固定領域からsbrk()による拡張を行うように変更
- tcgetpgrp()/tcsetpgrp()を実装
- シグナル,ioctl()の定義を整備
- readdir()によるファイル一覧取得で,ファイル数が多い場合に
中断することがあるバグを修正
- 対応アーキテクチャに以下を追加(ただし未検証で,ひとまず実装しただけ)
SPARC/Alpha/PA-RISC/Blackfin/MN10300/M32R/MicroBlaze
- NLSH beta (2020/12/19版)
- 各種アーキテクチャ対応を整備
- MIPSのシステムコール処理を修正(システムコール番号とエラー処理)
- MIPSのtermios関連の定義をglibcに合わせて修正
- pipe2システムコールが番号が大きいためARM/SHでコンパイルエラーになる場合がある問題の対応
- NLSH beta (2020/11/29版)
- *や?のワイルドカード展開を実装
- tcshライクのCtrl+dによるファイル補完を実装
- 補完処理を改善
- NLSH beta (2020/11/27版)
- TABキーでのファイル名の補完機能を実装
- バックグラウンド動作を整備
- プロセス管理を改善
- Linuxでのビルド時のバグを複数修正
- nllibcに機能追加
- getdents()を追加
- opendir()/readdir()/closedir()関連を追加
- strncpy()/strncmp()を追加
- NLSH beta (2020/11/22版)
- コマンド実行処理の大幅見直し
- PATHによるコマンドサーチを追加
- コマンド実行時の括弧処理を追加
- setpgid()によるプロセスグループの設定を追加
- nllibcに機能追加
- getpid()/getppid()/getsid()/setsid()/getpgid()/setpgid()/getpgrp()を追加
- killpg()を追加
- NLSH beta (2020/11/19版)
- シェル機能を追加
- コマンド実行,パイプ,リダイレクション,バックグラウンド実行,シグナル処理,ディレクトリ移動
- tcshライクのプロンプトを環境変数のユーザ名等から生成
- シェル変数を実装.環境変数からシェル変数を生成する.
- nllibcに機能追加
- errno追加
- open()のフラグ追加
- signal.h, wait.h追加
- システムコール追加(fork()/wait4()/kill()/execve()/dup()/pipe()/dup2()/pipe2()/sigaction()/sigprocmask()/chdir()/ioctl()/sbrk(),brk()/getcwd())
- strchr()/strrchr()/strdup()/memcmp()を追加
- NLSH alpha (2020/10/30版)
- クロスコンパイル対応を整備(newlib対応などを追加)
- nllibcに標準ヘッダファイルを追加し,利用の切替えを可能にする
- nllibcにリンカスクリプトを追加
- nllibcでtermios関連を独立化する
- MIPS対応/SH対応 (ただし未検証)
- PowerPC対応を整備(termios系のioctl()の差異など)
- errnoの扱いをFreeBSD/glibcに合わせて変更
(nltermのみ利用する定義で,Debianでerrno関連のビルドエラーになったことの
対策.具体的には /usr/bin/ld: errno: TLS definition in /lib/x86_64-linux-gnu/libc.so.6 section .tbss mismatches non-TLS reference ... というエラーになる)
- libgccの代替として32/64ビットシフト・32/64ビット除算/剰余算・32/64ビット乗算ライブラリを追加
- NLSH alpha (2020/10/24版)
- PowerPC対応を追加
- クロスコンパイル対応を追加
- NLSH alpha (2020/10/22版)
- nllibcのスタートアップとシステムコール・ラッパーを,
アーキテクチャ依存部/OS依存部を配慮して適切に整理し,
極力C言語で記述する
- NLSH alpha (2020/10/21版)
- nllibcに Linux/ARM, Linux/AArch64 の対応を追加 (ただし未検証)
- Termux/Androidでのビルドに対応
- printf()内部で用いていたバッファを廃止(バッファオーバーフローの可能性があるため)
- nlcrt利用時にerrnoの初期化を追加
- NLSH alpha (2020/10/13版)
- nllineでの1文字入力のミスで,環境によってはエラー終了してしまうバグを修正
- nllineの入力でCtrl+Spaceに対応
- nllibcでprintf()の%xが10進表示になってしまっていた問題を修正
- nllibcでprintf()の%oに対応
- NLSH alpha (2020/10/11版)
- 現時点で,行編集と行入力ができるだけのものです.シェル機能はありません.
- 行入力のライブラリを,以下から選択できます.
- libedit (NetBSD)
- editline (curses不要の省サイズのreadline互換ライブラリ)
- readline (GNU)
- nlline (独自のreadlineライブラリのサブセット)
- getline() による入力
- fgets() による入力
- 標準ライブラリ(いわゆるlibc)無しでビルド可能です.
- nllibc / nlcrt という独自の標準ライブラリとスタートアップを持っています
- 現時点では nlline との併用が必要です
メールは kozos(アットマーク)kozos.jp まで