メニュー 閉じる

BashやzshはもちろんWindowsのPowerShellなどシェルとは何?

シェル(Shell)って結局何?

シェルはわたしたちがコンピューターと対話するための道具(インターフェイス)です。
当然、PCと私たちはテレパシーでは対話できないので、言葉を使います。

今はPCとの対話はGUI(グラフィカルユーザーインターフェース)を使うことが一般的です。
WindowsとかMacとかUbuntuとかはGUIでも使えるOSですから、
世の中の殆どはGUIでも対話ができるOSということになります。

ただし、コンピュータ業界でシェルというと「コマンド言語」のことを指しています。
他には、OSシェルとかコマンド言語インタープリター(コマンドラインとも呼ばれます)と言われます。
難しい言葉が出てきましたが同じくOSとユーザーの間のインターフェイスです。

このインターフェースにより、ユーザーはOSに何をすべきかを指示できます。
最も一般的に使用されるシェルはBashやZshだと思います。

 

シェルとは
http://www.cc.kyoto-su.ac.jp/~hirai/text/shell.html

 

余談ですが、上のリンク先にも書かれているようにGUIにしても、その動作をOSの周りにあるカーネルが処理します。
カーネルはシェルを通して会話するということなので、GUIもある意味でシェルということになります。
(これ以上深堀りしても混乱を引き起こすので、やはりシェルは黒い画面に書き込む言語としておきましょう)

さてこのたまに見かける「ターミナル」という黒い画面の存在ですが、タダの画面ではありません。
これらはUNIXというコンピューター黎明期にオープンソースで開発された、
コンピューターの親玉的存在の環境を真似て作られています。

当時はGUIがなかったのでキーボードを介してコンピューターと対話していたのです。
その名残がこのターミナルとかコマンドプロンプトということになります。

ここでは先程取り上げたbashやzshという標準的なコマンド言語を入力することができます。
この呪文みたいな変な英語の名前にあまり意味はなく、
単純に「bashという言語を使っているシェル」ということを指しています。
(歴史的な話はWikipediaで調べてみてください)

 

シェルはプログラミング言語の一種といって良い

プログラマがよく覗いている黒い画面はMacだとターミナルですが、
Windowsだとコマンドプロンプトといいます。
最近はWindowsにPowerShellというより高度な言語が使えるシェルがあります。(使う人少ないけど)

それぞれ、同じコマンドが使えることもありますがだいたい異なります。
つまり、シェルに何を使うかによってコマンドが変わってしまいます。

また、シェルはプログラミング言語っぽいですが基本的にターミナルに入力するコマンドは、
ファイルにして保存することは前提とされていませんよね。
その場でシンプルに命令を出すとき用の画面になります。

使ってみると分かるのですが一文字でも間違えるとエラーになります。
「よし、できた!」と思ってエンターを押した瞬間、「Syntax Error」の表示が出たりします。
これは打ち間違ってるときによく出るエラーメッセージです。

他にもいろいろなエラーメッセージがあります。

こうした対話環境と呼ばれる一問一答形式のコミュニケーションでは、
ワードやメモ帳のようにそこだけ打ち直すことはできません。
コマンドを頭から打ち直す必要があります。

するとさすがに複雑な命令を出すには黒い画面では面倒くさいことがわかります。

そこで、プログラマの多くはメモ帳みたいなエディターと呼ばれるソフトにコードを書きます。
統合開発環境というソフトを使ってすぐに実行したり、文法エラーがないかチェックしたりします。

このシェルという言葉を「.sh」ファイルにすることでファイルとしておくことができます。
ここにコマンドを書いておくと当然ながら内容は保存できますし、
これを使ってターミナル上から再びコマンドを呼び出して、ソフトウェアを動かしたり止めたりできます。

そう考えるとなんとなくシェルの使い方のイメージがわいてくるかもしれません。

 

ハッカーがカラフルなターミナルを使うのはなぜ?

ターミナルとかコマンドプロンプトは最初は黒い画面ですよね。
文字を打ってみても最初はカラフルではありません。
設定で色は変えることができますのでハッカーっぽい感じにしてみましょう。

さらに上級者になると「ターミナルエミュレータ」というものを使っています。

ターミナルエミュレーターとは、ターミナルの機能をエミュレート(模倣)するソフトウェアです。
GUIでテキストベースのプログラムを使用できるようにするために使用されます。

いろいろなターミナルエミュレーターが公開されています。
GNOME Terminal、XFCE4 Terminal、XTermなどが代表的です。

これらを使うメリットとしては単に「使いやすい」「見やすい」ということもそうですが、
1つのターミナル上で複数のターミナルを開けるとか、
途中まで入力していたものを保持するセッション機能が備わっていたり、
画面を共有して複数人で作業ができるようになっていたりするなど、
いろいろな場面で便利に使うことができるようになっています。

そうした機能も次第に普通のターミナルに取り込まれるようになってきました。
広い意味では先程も出てきたMacのターミナルもターミナルエミュレーターの一つです。

ただ、今でも昔から使いこなしてきた玄人エンジニアにとっては、
普通の人は使わないようなターミナルエミュレーターを使うことがあります。

 

Djangoではmanage.py shellで対話型シェルが使える

話はだいぶ飛んでしまいますが、今Djangoでの開発をしているときもシェルが使えることに気づきます。

manage.pyを使って対話型シェルが使えたりします。
簡単なテストをしたいときはこれを使ってみることができるかもしれません。

例えばChannelsのチャネルレイヤーがRedisと通信しているかをテストします。
チュートリアルパート2:チャットサーバーの実装 チャネルレイヤーを有効にする

$ python manage.py shell

Python 3.8.5 (default, Sep 4 2020, 02:22:02) 
[Clang 10.0.0 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import channels.layers
>>> channel_layer = channels.layers.get_channel_layer()
>>> from asgiref.sync import async_to_sync
>>> async_to_sync(channel_layer.send)('test_channel', {'type': 'hello'})
>>> async_to_sync(channel_layer.receive)('test_channel')
{'type': 'hello'}

$ Control + D(キーボードで)

このようにシェルを使ってサーバーを起動しなくても動きが確認できます。

通常の開発ではすでに保存したファイルにimportするモジュール等が書かれています。
でも、こうしたシェルでのテストにおいては最初にimportして機能を使える状態にしてから、
自分が試してみたいテストコードを順番に書いていく必要があります。

つまり、少しだけ面倒ではあります。
あくまでこのように対話型の環境を使うのは最小限の動作テスト等に限ります。

このくらいのコードを対話型環境に書いていくのも結構大変ですから、
(別のメモ帳に先にコードを書いておけばいいけれど)

ですから普通はtest.pyファイルなどにテストをまとめて書いておいて、
その都度ファイルを読み出すことでテストすることが多いと思います。

 

シェルって知らないうちに使っていたんだね

改めて考えてみるとシェルという言葉を使う機会はあまりないし意識することもありません。
でも、毎日つかうというものだなと実感します。(YouTubeを見るだけなら使わないけど)

歴史的な経緯があって今でもWindowsとMacでも大きく異なるシェルの言葉遣いですが、
bashとzshのようにさらにその中でも派閥が分かれています。

「コマンド」というのはシェルに対する命令のことなのですが、
それぞれ異なっているために一つに慣れてもまた違ったコマンドが出てきたりします。

エンジニアはそれぞれ最初に触れたシェルを使っていることもありますし、
こっちのほうがより効率的に開発できると思ったらそちらに切り替えたりしています。

仕事ではよく使うLinuxというOSではbashがまだ現役かなと思います。
zshはその後継者的存在なので殆ど変わりません。
普通使うコマンドは一握りなのでまずはよく使うものだけ、使いながら試してみましょう。

怖いことをいいますが壊そうと思えばシェルコマンド一つで壊すこともできます。
それを防ぐために普通パソコンには管理者権限等がかけられています。
ただ、開発者が使う際にいちいち管理者にお伺いを立てるのは面倒なので、
大体は開発者が管理者としていろいろな指示をシェルを通して行うことになります。

シェル、あまり意識していませんが実はそのくらい強力な言語なのですね。
なるほど、なるほど。