\r\n\r\n
シェルとは、LinuxやUnixのオペレーティングシステムで、システムに実行させるコマンドを入力するためのプログラムです。linuxコンピュータでターミナルウィンドウを開くと、コマンドを入力するためのインターフェースであるシェルプログラムが起動します。このインターフェイスをコマンドラインインターフェイスと呼びます。コマンドを入力すると、シェルはそのコマンドを実行し、出力を画面に表示します。
シェルは、対話的にコマンドを受け付け、実行することができるだけでなく、ファイルに格納されたコマンドを実行することもできます。このような実行形態をシェルスクリプトと呼びますが、今回はシェルスクリプトの基本を説明します。
1970年代のUnixを皮切りに、Ken Thomsonはv6shellというシェルプログラムを開発した。対話型のシェルで、スクリプトの機能はない。
1977年にはbourneshellが登場し、現在もrootアカウントのデフォルトシェルとして使用されている。このシェルはスクリプト機能を追加し、長年にわたって非常に有用であることが証明された。
1980年代にShellがさらに発展すると、C-shellやKornシェルといったShellの亜種が数多く生まれた。
Bash ShellはBourne Shellの略で、オリジナルのBourne Shellを大幅に改良したシェルである。
今回は、bashshellのシェルスクリプトを説明します。
シェルスクリプトの実行方法は簡単で、シェルへの引数としてスクリプトのパスを渡すだけです。
シェルスクリプトの例。
echo "hello world"
次のように操作します。
$ bash hello.sh
# prints
ハローワールド
注)シェルでは、行末にLF文字(ラインフィード)が必要です。Windowsで作成したシェルスクリプトをLinuxで直接実行するとエラーが発生することがあります。 Windowsでは改行にCR-LFの組み合わせ(キャリッジリターン・ラインフィード)を使用します。これはLFに変換するだけです。この操作を行う方法については、Windowsのエディタをご確認ください。
シェルスクリプトをコマンドとして直接実行する方法もあります。**以下の行(hashbang文)は、シェルスクリプトの1行目として使用されます。
#!/bin/bash
この変更により、私たちのシンプルなシェルスクリプトは次のようになります。
#!/bin/bash
echo "hello world"
ここで、以下のようにスクリプトファイルを実行可能な状態にする必要があります。
$ chmod +x hello.sh
この場合、シェルを明示的に参照することなく、スクリプトファイルを直接実行することができます。
$ hello.sh
# prints
ハローワールド
では、シェルスクリプトを使うことの利点をいくつか挙げてみましょう。
シェルスクリプトを使うメリットの第一は、頻繁に実行される作業を自動化できることです。例えば、毎日1つずつやらなければならないことがあるとします。毎日、Linuxシステム上で複数のコマンドを実行する必要がある場合、これらのコマンドをファイルに保存して、スクリプトを実行することができます。例としては、以下のようなものがあります。
頻繁に行う作業を自動化するだけでなく、複数のコマンドシーケンスを1つのコマンドにまとめることも有効な手段でしょう。実行する順番はもちろん、複数のコマンドを覚えるより、一つのコマンドを覚える方がずっと簡単です。
その一例が、Linux OS自体のブートシーケンスである。ブートの一部として、オペレーティングシステムはシステムを正しい状態にするために多くのコマンドを実行します。これらのコマンドは、実際には/etcディレクトリにあるシェルスクリプトです。これらのシェルスクリプトの一つを見てみると、シェルスクリプトがない場合に手動で実行しなければならないかもしれないシステムの起動の複雑さに気づくはずです。
以下は、ユーザーがログインするたびに実行されるシェルスクリプト /etc/profile のサンプルです。これらのコマンドを手で入力することを想像してみてください。
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# および Bourne 互換シェル (bash(1), ksh(1), ash(1), ...) を使用します。
if [ "$PS1" ]; then
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
# bash.bashrcというファイルにはすでにデフォルトのPS1が設定されています。
# ♪ PS1='\h:\w$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
フィー
さもなくば
if [ "`id -u`" -eq 0 ]; then
PS1='# '
さもなくば
PS1='$ '
フィー
フィー
フィー
# デフォルトのumaskはpam_umaskで処理されるようになりました。
# pam_umask(8) と /etc/login.defs を参照してください。
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
フィー
ダン
アンセットアイ
フィー
シェルスクリプトと同じ操作を、C/C++で書かれた通常のプログラムで行うことができる。しかし、シェルスクリプトの作成とデバッグは、C/C++プログラムよりはるかに簡単です。特に、外部コマンドの実行、ファイルやディレクトリの作成・削除、出力のリダイレクトなど、システム管理業務において顕著です。
C/C++プログラムは、システムコールの呼び出しやデータ構造の操作など、低レベルの操作に適しています。
シェルスクリプトはテキストファイルであるため、どのような動作をするのかを簡単に確認することができます。これに対して、C++で書かれたプログラム(実行ファイルにコンパイルされたものなど)が、伝えることを選択しているか、ソースコードにアクセスしているかを知ることができる唯一の方法である。例えば、シェルスクリプトでファイルを削除していないかを確認し、必要な場合は別の場所にコピーすることが可能です。
また、シェルスクリプトはソースコードを見ることができるため、通常のプログラムよりも簡単に問題を診断することができます。ディレクトリが存在しないため、スクリプトが失敗しているのでしょうか?スクリプトのコードを見て、ディレクトリを作成することができます(ただし、お行儀の良いシェルスクリプトは、このようなエラーを避けるために、チェックして作成する必要があります)。
シェルスクリプトは、他のUnixおよびUnix系OSに転送して実行することができます(シェル自体が存在する場合)。X86、MIPS、SPARCなど、異なるアーキテクチャのシェルスクリプトを転送する場合でも、シェルスクリプトはC/C++プログラムより移植性が高い。
C/C++のプログラムを他のシステムに転送して使うには、ソースコードをコピーしてプログラムをビルドし、それを実行してみるしかない。その場合でも、アーキテクチャ固有のコードを使用している場合、期待通りに動作しないことがあります。
シェルスクリプトがどのようなもので、どのような利点があるのかがわかったところで、自分のタスクにシェルスクリプトを使ってみたくはないだろうか。使用する際にどのような問題があったのでしょうか?以下のコメント欄でお知らせください。