お金をかけずにサーバーの勉強をしよう

黒い画面で動いているシェルというもの

2022年7月31日

メニューへ戻る

Linuxの黒い画面で泳ぎ回るで書いたように、私は普段遣いのPCとして Ubuntu Desktop 22.04の派生版の Lubuntu 22.04 というOSを使っています。

私はUbuntu Desktop の GNOMEがあまり好きではないので、代わりに LXQTを使っている Lubuntuにしています。

細かく Ubuntu Desktop と Lununtu で比較をしている訳ではないので、これから書く部分に Ubuntu Desktop と差異があるかも知れませんが、ほぼ同じだと思いますので、そこはご容赦願います。


黒い画面の話を続けますが、そもそもありゃ一体何だ?ということをば。

Linuxで動いている様々なプログラム群ですが、OS上でプログラムを動かすには決まった手順や作法があって、それなりに面倒なのです。

そこで、シェル(OSカーネルを包む殻のこと)と呼ばれるプログラムにそれを仲介してもうらうことで、ユーザーが簡単にプログラムを実行したり、その結果を文字で確認できるようになります。

ここでも良く出しているこれ、コマンドプロンプトと言いますが、シェルの機能です。

subro@Ubuntu2204:~$

Ubuntu Desktop や Lubuntu のような LinuxのデスクトップOSで黒い画面というと、Lubuntuであれば QTerminalという名前の「ターミナルエミュレーター」というカテゴリのプログラムなんですが、これはシェル実行専用のプログラムと考えて良いかと思います。

シェルと言っても、実体は1つの独立したプログラムでして、LUbuntu 22.04では bashコマンド(GNU Bourne-Again SHell)になっています。

「LUbuntu 22.04では」と如何にも他にありそうな書き方をしていますが、他にもあります。

他のシェルプログラムについて以下のブログに細かく書いてありましたのでそちらをご紹介しておきます。
というか、どうしてもこのブログをご紹介したかったのです。

ちょっと話が戻ってターミナルエミュレーターの話になりますが、ターミナルエミュレーターは名前の通りエミュレーターなのです。
何をエミューレートしているかというと、名前の通りターミナルです。

じゃターミナルって何よ?

というところで、やっとこですが、そのブログをご覧になって下さい。
【10分でわかるかもしれない】シェル(shell)とは?

グリーンの文字だけのテレビの写真があると思います。
あれがターミナル(ダム端末)です。字しか出ないんです。
ウィンドウシステムが無い頃、UNIXの世界ではあれで全部やってました。

更に昔になると、タイプライタだけだったみたいです。
「tty は teletypewriter のこと」が気になる方は、UNIX6とかの歴史を調べてみるとそのオリジンが分かったりするかもです。

Linuxでターミナルと呼ばれているプログラムは、あの黒い画面を提供するだけの機械をソフトでエミュレートしたものなんですね。

大分話が逸れてしまいましたが、シェルに戻りましょう。
上記のブログの下の方に複数のシェルプログラムに関して丁寧に記載して頂いています。
sh・csh・tcsh・zshといったシェルがあることが分かっていただけたかと思います。
他に私が知る所では kshというのもあります。

シェルプログラムは Linuxでは /bin にありますので、Lubuntu 22.04にどんなシェルがインストールされているか見てみます。

subro@Ubuntu2204:~$ ls -la /bin/*sh
-rwxr-xr-x 1 root root   27016  3月 23 18:42 /bin/avahi-publish
-rwxr-xr-x 1 root root 1396520  1月  7  2022 /bin/bash
-rwxr-xr-x 1 root root    6963  7月  4 20:20 /bin/c_rehash
-rwsr-xr-x 1 root root   44808  3月 14 17:59 /bin/chsh
-rwxr-xr-x 1 root root  125688  3月 23 22:49 /bin/dash
-rwxr-xr-x 1 root root    5188  3月 25 19:31 /bin/gettext.sh
-rwxr-xr-x 1 root root    2181  2月  7 03:03 /bin/gvmap.sh
-rwxr-xr-x 1 root root    4373  2月  6 20:02 /bin/instmodsh
-rwxr-xr-x 1 root root   14648  2月 25 06:09 /bin/pax11publish
-rwxr-xr-x 1 root root   14360  2月  8  2021 /bin/ppmflash
lrwxrwxrwx 1 root root       4  1月  7  2022 /bin/rbash -> bash
lrwxrwxrwx 1 root root      21  4月 19 19:05 /bin/rsh -> /etc/alternatives/rsh
lrwxrwxrwx 1 root root       4  4月 19 19:02 /bin/sh -> dash
-rwxr-xr-x 1 root root  846888  2月 26 08:30 /bin/ssh
lrwxrwxrwx 1 root root       7  2月  5 07:10 /bin/static-sh -> busybox
lrwxrwxrwx 1 root root       8  3月 25 18:52 /bin/tclsh -> tclsh8.6
-rwxr-xr-x 1 root root   14728  3月 25 18:53 /bin/xrefresh

ピンクになってるのがシェルですが、シンボリックリンクになっているものは実体が他のシェルになっているものもありますね。

/bin/sh の実体になってる /bin/dash って何だろうと思ったら、bashが大きくなり過ぎたため 原初のシェル sh(Bourne shell)に近づけるよう最近になって開発されたものらしいです。
What is Dash Shell in Linux?

csh・tcsh・zsh・kshがインストールされていませんが、Ubuntuの aptリポジトリにはありますので、インストールすれば全て使えそうです。

subro@Ubuntu2204:~$ apt list csh tcsh zsh ksh
一覧表示... 完了
csh/jammy 20110502-7 amd64
ksh/jammy,jammy 20211217 all
tcsh/jammy 6.21.00-1.1 amd64
zsh/jammy 5.8.1-1 amd64
zsh/jammy 5.8.1-1 i386

Lubuntu 22.04(Ubuntu Desktop 22.04も同じだと思いますが)では bashを使っておけば良く、こだわりがなければあえて他のシェルを使う必要もないと思います。

なお、シェルもプログラムの一つなのでコマンドラインから実行すればすぐに使えますよ。

dashの例です。
設定ファイルに何も書いてないので、コマンドプロンプトがシンプルです。

subro@Ubuntu2204:~$ dash
$


さて、黒い画面ではベースに /bin/bashが動いている事が分かったところで、環境変数についても触れておきましょう。

シェルはOSに対してコマンド実行を仲介してくれるプログラムですが、簡単なプログラミング言語チックな機能がありまして、変数を持つこともできます。

シェルを実行した段階(コマンドが打てる状態)で既にいくつもの環境変数が設定されていますので、まずそれを見てみましょう。

subro@Ubuntu2204:~$ env
SHELL=/bin/bash
WINDOWID=0
QT_ACCESSIBILITY=1
COLORTERM=truecolor
XDG_CONFIG_DIRS=/etc/xdg/xdg-Lubuntu:/etc/xdg:/etc:/usr/share
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session1
XDG_MENU_PREFIX=lxqt-
SAL_VCL_QT5_USE_CAIRO=true
GTK_IM_MODULE=fcitx
LANGUAGE=
LC_ADDRESS=ja_JP.UTF-8
LC_NAME=ja_JP.UTF-8
SSH_AUTH_SOCK=/tmp/ssh-XXXXXXNO5Xh2/agent.1056
XDG_DATA_HOME=/home/subro/.local/share
XDG_CONFIG_HOME=/home/subro/.config
XMODIFIERS=@im=fcitx
DESKTOP_SESSION=Lubuntu
LXQT_SESSION_CONFIG=session
LC_MONETARY=ja_JP.UTF-8
SSH_AGENT_PID=1130
XDG_SEAT=seat0
PWD=/home/subro
XDG_SESSION_DESKTOP=
LOGNAME=subro
QT_QPA_PLATFORMTHEME=lxqt
XDG_SESSION_TYPE=x11
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
XAUTHORITY=/home/subro/.Xauthority
HOME=/home/subro
LC_PAPER=ja_JP.UTF-8
LANG=ja_JP.UTF-8
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
XDG_CURRENT_DESKTOP=LXQt
DENO_INSTALL=/home/subro/.deno
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
GTK_CSD=0
CLUTTER_IM_MODULE=fcitx
XDG_CACHE_HOME=/home/subro/.cache
LESSCLOSE=/usr/bin/lesspipe %s %s
XDG_SESSION_CLASS=user
TERM=xterm-256color
LC_IDENTIFICATION=ja_JP.UTF-8
GTK_OVERLAY_SCROLLING=0
LESSOPEN=| /usr/bin/lesspipe %s
USER=subro
COLORFGBG=15;0
DISPLAY=:0
SHLVL=1
LC_TELEPHONE=ja_JP.UTF-8
QT_IM_MODULE=fcitx
LC_MEASUREMENT=ja_JP.UTF-8
XDG_VTNR=1
XDG_SESSION_ID=3
XDG_RUNTIME_DIR=/run/user/1000
QT_PLATFORM_PLUGIN=lxqt
LC_TIME=ja_JP.UTF-8
XDG_DATA_DIRS=/usr/share/Lubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
BROWSER=firefox
PATH=/home/subro/.deno/bin:/home/subro/.cargo/bin:/home/subro/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/subro/.dotnet/tools
SAL_USE_VCLPLUGIN=qt5
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
LC_NUMERIC=ja_JP.UTF-8
_=/usr/bin/env
OLDPWD=/var/log

GUI環境なので結構あります。


環境変数はそのシェル内で実行したプログラムからも参照できるという特性があり、サーバープログラムでは環境変数を使って接続先のデータベースを本番と開発切り替えたりします。

bashでの環境変数の設定の仕方は以下なんですが、本番サーバーと開発サーバーで同じ環境変数に対してそれぞれ違うデータベース名を設定する、なんてやるわけです。

本番サーバー
subro@honban:~$ export DATABASE=honban

開発サーバー
subro@kaihatsu:~$ export DATABASE=kaihatsu

こうしてやっておいて、サーバープログラムのコードで「環境変数の『DATABASE』を取得して〜」と作るのです。

サーバープログラムのセッティングや、後はそうですね、パブリッククラウドの接続先などを環境変数に設定しておくとコマンド実行時に一々オプションで書かなくて良いとかあると思います。


以上、シェルについて触れてみましたが、いかがだったでしょうか。

黒い画面を使っている時、常に使っているものですので自分に使いやすいシェルに変える人もいますね。

上に挙げたような別のシェルもありますので、興味があれば別なものを使ってみるのも勉強になります。