目次
概要
今日、多数のユーザが、KDEやGNOMEなどのGUI(グラフィカルユーザインターフェース)を介してコンピュータを使用しています。GUIは多くの機能を備えていますが、自動タスクの実行という点では、その用途は限られます。シェルは、GUIに追加すると便利なツールです。この章では、シェル(ここではBash)のいくつかの側面について概説します。
従来、シェルとは、Bash(Bourne again Shell)のことでした。この章では、Bashを「シェル」と呼びます。実際にはシェルはBashの他にもあり(ash、csh、ksh、zsh、…)、異なる機能と特性を持っています。他のシェルの詳細については、YaSTでシェルを検索してください。
シェルは、次のようにして呼び出すことができます。
対話型ログインシェル。コンピュータへのログイン時に、--loginオプションを使用してBashを呼び出す場合か、SSHを使用してリモートコンピュータへログインする場合に使用します。
「通常の」対話型シェル。xtermやkonsole、gnome-terminalなどのツールの起動時には、通常、この形式を使用します。
非対話型シェル。コマンドラインからシェルスクリプトを呼び出す場合に使用します。
使用するシェルのタイプによって、異なる設定ファイルを読み込みます。次のテーブルには、それぞれ、ログインシェル設定ファイルと非ログインシェル設定ファイルが示されています。
表7.1 ログインシェル用Bash設定ファイル¶
|
ファイル |
説明 |
|---|---|
|
|
このファイルは変更しないでください。変更しても、次の更新で変更内容が破棄される可能性があります。 |
|
|
|
|
|
特定プログラムのシステム全体に渡る設定ファイルを含みます。 |
|
|
ログインシェル用のユーザ固有の設定をここに挿入します。 |
表7.2 非ログインシェル用Bash設定ファイル¶
|
|
このファイルは変更しないでください。変更しても、次の更新で変更内容が破棄される可能性があります。 |
|
|
Bashのシステム全体に渡る変更を挿入する場合のみ、このファイルを使用します。 |
|
|
ユーザ固有の設定をここに挿入します。 |
さらに、Bashでは、次のファイルも使用します。
次のテーブルでは、Linuxシステムの最も重要な上位レベルディレクトリについて、短い概要を示します。それらのディレクトリおよび重要なサブディレクトリの詳細については、後続のリストを参照してください。
表7.4 標準的なディレクトリツリーの概要
|
ディレクトリ |
目次 |
|---|---|
|
ルートディレクトリ—ディレクトリツリーの開始点 | |
|
システム管理者および通常ユーザの両者が必要とするコマンドなどの必須バイナリファイル。通常、Bashなどのシェルも含みます。 | |
|
ブートローダの静的ファイル | |
|
ホスト固有のデバイスのアクセスに必要なファイル | |
|
ホスト固有のシステム設定ファイル | |
|
システムにアカウントを持つすべてのユーザのホームディレクトリを格納します。ただし、 | |
|
必須の共有ライブラリおよびカーネルモジュール | |
|
リムーバブルメディアのマウントポイント | |
|
ファイルシステムを一時的にマウントするためのマウントポイント | |
|
アドオンアプリケーションのソフトウェアパッケージ | |
|
スーパーユーザ | |
|
必須のシステムバイナリ | |
|
システムで提供するサービスのデータ | |
|
一時ファイルを格納するディレクトリ | |
|
読み込み専用データを含む第二階層 | |
|
ログファイルなどの可変データ | |
|
システムにMicrosoft Windows*とLinuxの両方がインストールされる場合のみ利用可能。Windowsデータを含みます。 |
次のリストでは、さらに詳しい情報を提供し、ディレクトリに含まれるファイルおよびサブディレクトリの例を示します。
/bin
rootと他のユーザの両者が使用できる基本的なシェルコマンドを含みます。これらのコマンドは、ls、mkdir、cp、mv、rm、rmdirなどです。/binには、SUSE Linux Enterprise DesktopのデフォルトシェルであるBashも含まれます。
/boot
ブートに必要なデータ(ブートローダやカーネルのデータなど)と、その他のデータ(カーネルがユーザモードプログラムの実行を開始する前に使用)が含まれます。
/dev
ハードウェアコンポーネントを記述したデバイスファイルを格納します。
/etc
X Window Systemなどのプログラムの動作を制御するローカル設定ファイルを含みます。/etc/init.dサブディレクトリは、ブートプロセスで実行されるスクリプトを含みます。
/home/username
システムにアカウントを持つすべてのユーザの個人データを格納します。このディレクトリ内のファイルは、その所有者またはシステム管理者しか変更できません。デフォルトでは、電子メールのディレクトリとパーソナルデスクトップの設定が、非表示のファイルおよびディレクトリとして、ここに格納されます。デスクトップ用個人設定データは、KDEユーザの場合は.kde4、GNOMEユーザの場合は.gconfに格納されています。
![]() | ネットワーク環境でのホームディレクトリ |
|---|---|
ネットワーク環境で作業するユーザのホームディレクトリは、 | |
/lib
システムのブートとルートファイルシステムでのコマンドの実行に必要な必須共有ライブラリを含みます。Windowsで共有ライブラリに相当するものは、DLLファイルです。
/media
CD-ROM、USBスティック、デジタルカメラ(USBを使用する場合)など、リムーバブルメディアのマウントポイントを含みます。/mediaでは、一般にシステムのハードディスク以外のあらゆるタイプのドライブが保持されます。リムーバブルメディアをシステムに挿入または接続し、マウントを完了すると、ただちに、そのメディアにこのディレクトリからアクセスできます。
/mnt
このディレクトリは一時的にマウントされるファイルシステムのマウントポイントを提供します。rootがここでファイルシステムをマウントできます。
/opt
サードパーティのソフトウェアのインストール用に予約されています。オプションソフトウェアや大型アドオンプログラムのパッケージをここに格納できます。
/root
rootユーザのホームディレクトリ。rootの個人データがここに保存されます。
/sbin
sで示唆されるように、このディレクトリはスーパーユーザ用のユーティリティを格納します。/sbinには、/bin内のバイナリとともにシステムのブート、復元、および回復に不可欠なバイナリを含みます。
/srv
FTPやHTTPなど、システムによって提供されるサービスのデータを格納します。
/tmp
ファイルの一時的保管を必要とするプログラムによって使用されます。
![]() | ブート時の/tmpのクリーンアップ |
|---|---|
| |
/usr
/usrは、ユーザとは無関係であり、UNIX system resourcesを意味する略語です。/usr内のデータは静的な読み込み専用データです。このデータは、FHS(Filesystem Hierarchy Standard)に準拠するホスト間で共有できます。このディレクトリは、すべてのアプリケーションプログラムを含み、ファイルシステム内の第二階層を形成します。KDE4とGNOMEも、このディレクトリに格納されています。/usrには、/usr/bin、/usr/sbin、/usr/local、/usr/share/docなど、多数のサブディレクトリがあります。
/usr/bin
一般ユーザがアクセスできるプログラムを含みます。
/usr/sbin
修復関数など、システム管理者用に予約されたプログラムを含みます。
/usr/local
このディレクトリには、システム管理者がディストリビューションに依存しないローカルな拡張プログラムをインストールできます。
/usr/share/doc
システムのドキュメントファイルおよびリリースノートを格納します。manualサブディレクトリには、このマニュアルのオンラインバージョンが格納されます。複数の言語をインストールする場合は、このディレクトリに各言語のマニュアルを格納できます。
packagesには、システムにインストールされたソフトウェアパッケージに含まれているドキュメントが格納されます。パッケージごとに、サブディレクトリ/usr/share/doc/packages/が作成されます。このサブディレクトリには、多くの場合、パッケージのREADMEファイルが含まれます。例、設定ファイル、または追加スクリプトが含まれる場合もあります。
packagename
HOWTOをシステムにインストールした場合は、/usr/share/docにhowtoサブディレクトリも含まれます。このサブディレクトリには、Linuxソフトウェアの設定および操作に関する多数のタスクの追加ドキュメントが格納されます。
/var
/usrは静的な読み込み専用データを含みますが、/varは、システム動作時に書き込まれる可変データ(ログファイル、スプールデータなど)のディレクトリです。/var/log/にある重要なログファイルの概要は、表28.1「ログファイル」を参照してください。
/windows
システムにMicrosoft WindowsとLinuxの両方がインストールされている場合のみ使用可能。システムのWindowsパーティションで使用可能なWindowsデータを含みます。このディレクトリのデータを編集できるかどうかは、Windowsパーティションが使用するファイルシステムによって異なります。FAT32の場合、このディレクトリのファイルを開いて編集できます。NTFSの場合、SUSE Linux Enterprise Desktopには書き込み権限サポートもあります。ただし、NTFS-3gファイルシステムのドライバでは機能が制限されています。
シェルスクリプトは、データの収集、テキスト内のワードやフレーズの検索など、あらゆる種類の多数の有用なタスクの実行に便利な方法です。次の例では、小型のシェルスクリプトでテキストをプリントします。
このスクリプトの実行には、次の前提条件が必要です。
各スクリプトは、Shebang行を含む必要があります(この例はすでに示しました)。スクリプトにこの行がない場合は、手動でインタープリタを呼び出します。
スクリプトの保存場所はどこでも構いません。ただし、シェルの検索先ディレクトリを保存場所にすることをお勧めします。シェルのサーチパスは、環境変数PATHで設定されます。一般に、標準ユーザには/usr/binへの書き込みアクセスはありません。このため、スクリプトはユーザのディレクトリ~/bin/に保存することを推奨します。上記の例では、名前はhello.shです。
スクリプトには、実行可能パーミッションが必要です。次のコマンドで、パーミッションを設定してください。
chmod +x ~/bin/hello.sh
これらの前提条件をすべて満たしたら、次の方法でスクリプトを実行できます。
絶対パス. スクリプトは絶対パスで実行できます。この例では、~/bin/hello.shです。
任意の場所.
PATH環境変数にスクリプトが存在するディレクトリが含まれている場合、スクリプトをhello.shだけで実行できます。
各コマンドは、入力または出力用として、3つのチャネルを使用できます。:
標準出力. デフォルトの出力チャネル。コマンドで何かをプリントする際には標準出力チャネルが使用されます。
標準入力. コマンドでユーザまたは他のコマンドからの入力を必要とする場合は、このチャネルが使用されます。
標準エラー. このチャネルは、エラーレポーティングに使用されます。
これらのチャネルをリダイレクトするには、次の方法を使用できます。
Command > File
コマンド出力をファイルに保存します。既存ファイルは削除されます。たとえば、lsコマンドの出力をlisting.txtファイルに書き込みます。
ls > listing.txt
Command >> File
コマンド出力をファイルに追加します。たとえば、lsコマンドの出力をlisting.txtファイルに追加します。
ls >> listing.txt
Command < File
ファイルを読み込み、指定されたコマンドへの入力とします。たとえば、ファイルのコンテンツをreadコマンドで読み込み、変数に入力します。
read a < foo
Command1 | Command2
左側のコマンドの出力を右側のコマンドの入力にします。たとえば、catコマンドは/proc/cpuinfoファイルの内容を出力します。この出力をgrepで使用して、cpuを含む行のみをフィルタします。
cat /proc/cpuinfo | grep cpu
各チャネルには、対応するファイル記述子があります。標準入力には0(ゼロ)、標準出力には1、標準エラーには2が割り当てられています。このファイル記述子を<文字または>文字の前に挿入できます。たとえば、次の行では、fooで始まるファイルを検索しますが、そのファイルを/dev/nullにリダイレクトすることでエラーメッセージを抑制します。
find / -name "foo*" 2>/dev/null
エイリアスは、1つ以上のコマンドのショートカット定義です。エイリアスの構文は、次のとおりです。
aliasNAME=DEFINITION
たとえば、次の行は、エイリアスltを定義しています。このエイリアスは、長いリストを出力し(-lオプション)、そのリストを変更時刻でソートし(-tオプション)、ソート順と逆の順序で出力します(-rオプション)。
alias lt='ls -ltr'
すべてのエイリアス定義を表示するには、aliasを使用します。unaliasで対応するエイリアス名を指定して、エイリアスを削除します。
シェル変数は、グローバル変数またはローカル変数として使用できます。グローバル変数(つまり、環境変数)は、すべてのシェルでアクセスできます。対照的に、ローカル変数は、現在のシェルでのみアクセスできます。
すべての環境変数を表示するには、printenvコマンドを使用します。変数の値を知る必要がある場合は、変数の名前を引数として挿入します。
printenv PATH
変数はグローバルでもローカルでも、echoで表示できます。
echo $PATH
ローカル変数を設定するには、変数名の後に等号を入れ、その後に値を指定します。
PROJECT="SLED"
等号の前後にスペースを挿入しないでください。スペースを挿入すると、エラーになります。環境変数を設定するには、exportを使用します。
export NAME="tux"
変数を削除するには、unsetを使用します。
unset NAME
次のテーブルに、シェルスクリプトで使用できる共通環境変数を示します。
表7.5 便利な環境変数¶
|
|
現在のユーザのホームディレクトリ |
|
|
現在のホスト名 |
|
|
ツールをローカライズする場合、ツールは、この環境変数からの言語を使用します。英語を |
|
|
シェルのサーチパス。コロンで区切ったディレクトリのリスト |
|
|
各コマンドの前にプリントされる通常のプロンプトを指定します。 |
|
|
複数行コマンドの実行時にプリントされるセカンダリプロンプトを指定します。 |
|
|
現在の作業ディレクトリ |
|
|
現在のユーザ |
たとえば、スクリプトfoo.shは、次のように実行できます。
foo.sh "Tux Penguin" 2000
スクリプトに渡される引数すべてにアクセスするには、位置パラメータが必要です。これらのパラメータは、最初の引数には$1、2つ目の引数には$2という順序で割り当てます。パラメータは最大9つまで使用できます。スクリプト名を取得するには、$0を使用します。
次のスクリプトfoo.shは、1から4までのすべての引数をプリントします。
#!/bin/sh echo \"$1\" \"$2\" \"$3\" \"$4\"
このスクリプトを既出例の引数を使用して実行すると、次の結果が出力されます。
"Tux Penguin" "2000" "" ""
変数置換では、変数のコンテンツに、左側または右側からパターンを適用します。次のリストに、可能な構文形式を示します。
${VAR#pattern}
左側から最も短い一致を削除します。
file=/home/tux/book/book.tar.bz2
echo ${file#*/}
home/tux/book/book.tar.bz2${VAR##pattern}
左側から最も長い一致を削除します。
file=/home/tux/book/book.tar.bz2
echo ${file##*/}
book.tar.bz2${VAR%pattern}
右側から最も短い一致を削除します。
file=/home/tux/book/book.tar.bz2
echo ${file%.*}
/home/tux/book/book.tar${VAR%%pattern}
右側から最も長い一致を削除します。
file=/home/tux/book/book.tar.bz2
echo ${file%%.*}
/home/tux/book/book${VAR/pattern_1/pattern_2}
VARのコンテンツをpattern_1からpattern_2に置換します。
file=/home/tux/book/book.tar.bz2
echo ${file/tux/wilber}
/home/wilber/book/book.tar.bz2シェルでは、条件付き実行のため、コマンドを結合し、グループ化することができます。各コマンドが返す終了コードにより、コマンドの成功または失敗が判別されます。終了コードが0(ゼロ)の場合、コマンドは成功しました。それ以外はすべて、コマンド固有のエラーをマークします。
次のリストでは、コマンドをグループ化する方法を一覧します。
Command1 ; Command2
コマンドをシーケンシャルに実行します。終了コードはチェックされません。次の行では、各コマンドの終了コードにかかわらず、catでファイルのコンテンツを表示し、次に、lsでファイルプロパティをプリントします。
cat filelist.txt ; ls -l filelist.txt
Command1 && Command2
左のコマンドが成功した場合、右のコマンドを実行します(論理AND)。次の行では、ファイルのコンテンツを表示し、そのコマンドが成功した場合のみ、ファイルのプロパティをプリントします(このリストの前の項目と比較してください)。
cat filelist.txt && ls -l filelist.txt
Command1 || Command2
左のコマンドが失敗した場合、右のコマンドを実行します(論理OR)次の行では、/home/tux/fooでのディレクトリ作成に失敗した場合のみ、/home/wilber/bar内にディレクトリを作成します。
mkdir /home/tux/foo || mkdir /home/wilber/bar
funcname(){ ... }
シェル関数を作成します。位置パラメータを使用して、関数の引数にアクセスできます。次の行では、短いメッセージをプリントする関数helloを定義します。
hello() { echo "Hello $1"; }この関数は、次のように呼び出せます。
hello Tux
結果は、次のようにプリントされます。
Hello Tux
スクリプトのフローを制御するため、シェルでは、while、if、for、およびcaseの各構文を使用します。
ifコマンドは、式のチェックに使用されます。たとえば、次のコードは、現在のユーザがTuxであるかどうかをテストします。
if test $USER = "tux"; then echo "Hello Tux." else echo "You are not Tux." fi
テスト式は、複雑にすることも、シンプルにすることも可能です。次の式は、ファイルfoo.txtが存在するかどうかをチェックします。
if test -e /tmp/foo.txt ; then echo "Found foo.txt" fi
test式は、角括弧で短縮することもできます。
if [ -e /tmp/foo.txt ] ; then echo "Found foo.txt" fi
その他の役に立つ式については、http://www.cyberciti.biz/nixcraft/linux/docs/uniqlinuxfeatures/lsst/ch03sec02.htmlを参照してください。
forループを使用すると、エントリのリストにコマンドを実行できます。たとえば、次のコードは、現在のディレクトリ内のPNGファイルの情報をプリントします。
for i in *.png; do ls -l $i done
Bashに関する重要な情報は、マニュアルページman shに記載されています。このトピックの詳細については、次のリストを参照してください。
http://tldp.org/LDP/Bash-Beginners-Guide/html/index.html—「Bash Guide for 」
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html—「BASH Programming - Introduction HOW-TO」
http://tldp.org/LDP/abs/html/index.html—「Advanced Bash-Scripting Guide」
http://www.grymoire.com/Unix/Sh.html—「Sh - the Bourne Shell」