2025/6/23 突発的シェル勉強会
シェルとは
https://gyazo.com/c440b70687913cf310892d176ee36fe8
教科書
https://linuc.org/textbooks/linux/
貝殻、(カキの)殻、(カメ・エビ・カニなどの)甲羅、(カブトムシなどの)硬い外皮、(鳥の卵の)殻、(果実・種子などの)殻、(豆類の)さや、(建物・乗り物などの)骨組み、外郭、船体
https://ejje.weblio.jp/content/shell
シェルとはユーザーの入力を受取り、それを元に他のアプリケーションの起動やアプリケーション間の連携などを行うプログラムのこと。貝殻から名前が取られているのは核となるカーネルを包み込むもの、としてのイメージから。
文字を中心としてやり取りするインターフェイスのことをCUI(Character user interface)やCLI(Command Line Interface)と言うがシェルは基本的にはこれらに分類される。対して我々が普段クリックとかドラッグアンドドロップとかしている画面のことをGUIと呼ぶ。
macOSではターミナル.appを起動するとシェルが起動するようになっている。
windowsではコマンドプロンプトやPowerShellが該当する
macOSにおいてユーザーが任意のタイミングでアプリケーションを開くには一般的には2つの方法がある
カーソルを操作して開きたいアプリケーションをダブルクリック
GUI的な起動
シェルから起動
CUI的な起動
普段PCを操作しているときはGUI的な起動が主であるのでなんとなくシェルから起動するのが特別な感じがあるが、PCの成り立ちを考えるともともとはシェルでの操作から始まっていると考えることが出来る。
ちょっと脱線してUNIX入門
UNIXとは昔流行ったOSのこと。移植性や機能が優れていたこともあり現在でもUNIXっぽいOSが大量に存在する。そのこともあってそれらをUNIXと呼ぶことが多い。(要はそういうジャンルになったということ)
最初のUNIXは1970年に PDP-11/20上に構築された。雰囲気はこんな感じ。
https://gyazo.com/3c49d7b2b91b4c614d68eaf1f773859c
https://gyazo.com/4c7b07e70c7e38e2f4e19f7d08413e68
https://gyazo.com/636f985b28ff7a5e0251ddcc21f998ec
UNIXとC言語の創始者であるデニス・リッチーとケン・トンプソンがPDP-11/20を手に持っている。 写真提供: PanelSwitchman
当然ながら当時のPCにはGUIなどというリッチなものは存在しない世界
UNIXはこの当時に最初のバージョンが開発され、これを先祖にもつmacOSも当然この流れを受け継いでいる。
https://ja.wikipedia.org/wiki/Unix系
UNIXはこのような構成になっている
中心として動くのはカーネル
プログラマは直接カーネルの機能を使うことが出来ずシステムコールというAPIを通してアクセスする
API ... Application Program Interfaceのこと
シェルはシェル自体もプログラムであるからいくつかのシステムコールを使用できる
任意のシステムコールにアクセスすることはできないのでそこは注意
https://gyazo.com/20eb6965ca49b8ec4640d846b3aaf8d9
歴史的な理由でmacOSはUNIXだがLinuxはUNIXではないとかのネタがある
UNIXというOS自体は現在ではほぼ動いていなくてUNIXの派生OSがほぼを占める
UNIX認証を得るには高いライセンス料を払わないといけないためLinuxは払ってない
こういうこともあるのでUNIXのような動きをするOSを全体的にUNIX系とかUnix-LikeなOSという言い方をする
UNIXっぽいOSを触る上ではいくつかのキーワードにふれることになるのでおさらいしておこう
Linux
現在最も使われているUNIXっぽいOSの一種
リーナス・トーヴァルズが院生時代に開発した
リーナスの頭文字を取ってLinux
もともとは教育用のOSのMINIXを参考にしたと言われている
厳密にはLinuxはカーネルのことを指すとなっている
https://kernel.org/
https://github.com/torvalds/linux
Linuxカーネル単体ではコンピュータとして利用するのがハードモードすぎるので、OSとして動くように周辺に様々なアプリケーションの追加や設定をしたLinuxディストリビューションと呼ばれるものを使う
ubuntu
Debian
Fedora
CentOS
NixOS
ArchLinux
AndoroidOSもLinux kernelを利用している
GNUソフトウェアを主に使っているのでGNU/Linuxと呼ぶ派閥も存在する
https://gyazo.com/dcd3a636bfcd1ab7826833cc516011ee
https://gyazo.com/78c6ddf398338bce34e0f4e03c8431b0
GNU
GNU is Not UNIXの略
自由ソフトウェアでOSを作るぞ!!! OSに必要なソフトウェアも全部作るぞ!!というノリのプロジェクト
結果的にOSは作られていない...
Gから始まるソフトウエアがあったらだいたいこのGNUプロジェクトの関連
GNOME
GCC
glibc
gdb
GNU 1はリチャード・ストールマン(rms)によって1983年に開始されました。すべてのソフトウェアユーザがコンピューティングを自分自身でコントロールする自由のために、人々が一緒に作業をして組み立てあげるオペレーティングシステムとして。rmsは今もChief GNUisance(最高グニゃっかいもの)にとどまります。
主要なそして今も続くGNUの目標は、100% 自由ソフトウェアのUnix互換のシステムを提供することです。95%が自由、99.5%が自由というのではありません。100%です。GNUというシステムの名前は再帰頭字語で、GNU's Not Unix (GNUはUnixではない)です。つまり、Unixの技術的な考えに謝意を示すとともに、GNUはちょっと違うと言っています。技術的にはGNUはUnixに似ています。しかしUnixと異なり、GNUはユーザに自由を与えます。
BSD
https://gyazo.com/372a3f1b802654b1e5786e30cb512ab2
Berkeley Software Distribution
カルフォルニア大学バークレー校で作られたUNIXの総称
突然ライセンス料を取り始めたことでBSDっぽい雰囲気で無料で動くBSDが作られた
FreeBSD
OpenBSD
macOSのベースとなっているdawrinはMachOSとBSDが元になっている
このためmacOSはBSDベースのコマンドが動く
SwitchのOSらしい
つまるところLinuxとBSDベースのOSは雰囲気はUNIXで共通なのだが、作っている人というか技術が異なるため微妙な差が存在する
特にシェル上で使うコマンドではこれが顕著でよく「GNU版」と「BSD版」で動きが異なることが多い
例えばsedなどの同じ名前のコマンドでもmacOSとLinux上ではオプションや挙動が違う、ということがある
このため移植性の高いシェルスクリプトを書く際はOSごとの差を確認しながら書く必要がある
例えばDockerコンテナ上でしか動作させない、としてLinux(GNU)上でしか動作させないという割り切りもある
よくおじさんがある程度のボリュームがあったらシェルスクリプトじゃなくてPythonやPerlで描いたほうが良いみたいなことを言うのはこのあたりが理由
さてそれを踏まえた上でシェルの話に戻ってくるとする
シェルと言うとwindowsのコマンドプロンプトやPowerShellが含まれるが、windowsはUNIX系のOSではないためだいぶ体系が違っってくる。ここではUNIXのシェルにフォーカスする。
有名どころ
sh
Bourneシェルとも
https://e-words.jp/w/Bourneシェル.html
かなり古いシェルで現在となってはだいたいbashの別名になってることがほとんど
bash
Bourne Again shell
標準的なシェル
以前のmacOSではこれが標準だった
csh
C shell
shとは別の系統で開発された
現在使ってる人ほとんどいない
zsh
Z shell
bashやcshのいいとこどりシェル
macOSの現在の標準
echo $SHELL
これらのシェルは基本的にはshの流れを組んでいるのでだいたい同じような操作感になっている。しかし最近は全く別の操作感を持つシェルも台頭している
fish
Nushell
初心者のうちはsh系統のシェルをとりあえず使えるようになっておくと良いだろう
xxx.sh
シェルスクリプト
シェルスクリプトとはこれらシェルでの命令をスクリプト化したものである
毎回人間が10個とか100個のシェル上での命令を書くのはめんどくさいので、スクリプト化しておくと自動で実行するように設定できたり、手間な処理をワンショットで実行できたりと便利
考え方の重要どころとしてあくまでシェルの命令をまとめただけのものである
Pythonのような高度なプログラミング言語だと思うとややギャップがある
シェルスクリプトで実行されるのはあくまでコマンドである。関数も定義できるが...
このため関数感覚でコマンドを呼び出すとPythonで書くより遅い、とかになりがち
シェルスクリプト自体もむずいがその前に呼び出すコマンドのことを知っておかないとどこがむずいかわからないがち
echo
ls
pwd
ps
grep
sed
man
rm
rmdir
less
ping
ssh
パイプ
wc
xargs
シェルスクリプトを書くには
VSCodeでシェルスクリプトを書く場合はShellCheckをいれておくとよい
https://github.com/koalaman/shellcheck
微妙な書き方を指摘してくれる
参考
https://qiita.com/ko1nksm/items/935be63e940f00e4c228