目次
コンピューターシステムを学ぶことは新しい外国語を学ぶことに似ていると考えます。チュートリアルブックは有用ですが、実際に自ら使って学ぶことが必要です。円滑なスタートが出きるように、いくつかの基本的なポイントを説明します。
Debian GNU/Linuxの強力なデザインはマルチユーザー、マルチタスクというUnixオペレーティングシステムに由来します。これらUnixとGNU/Linuxの特徴や類似点の強力さを活用することを覚えましょう。
Unix対象の文書を避けたり、GNU/Linuxに関する文書だけに頼ることは、有用な情報を見逃すことになるので止めましょう。
一般的なシステム管理に関する良好なオンラインリソースは、Debianのnon-freeアーカイブにrutebook
パッケージ
(ポプコン: I:0.2)としてある"Ruteユーザーのためのチュートリアルと解説書(Rute User's
Tutorial and Exposition)" が提供しています。
![]() |
注記 |
---|---|
Unix的システムをコマンドラインツールで少々使った経験があれば、私がここで説明することはすべてご存知でしょう。リアリティーチェックと記憶を呼び戻すのにこれを使って下さい。 |
X
Windowシステムをgdm
等のディスプレーマネージャーとともにインストールした場合以外には、システム起動の際に文字のloginスクリーンが現れます。あなたのホスト名がfoo
と仮定すると、loginプロンプトは次に示すような見えます。
foo login:
GNOMEやKDEのようなGUI環境をインストールした場合には、Ctrl-Alt-F1とすることでloginプロンプトが出て、Alt-F7とすることでGUI環境に戻れます(詳細は下記の「仮想コンソール」参照)。
loginプロンプトであなたのユーザー名(例えばpenguin
)を打鍵しEnterキーを押します。さらにあなたのパスワードを打鍵しEnterキーを再び押します。
![]() |
注記 |
---|---|
Unixの伝統に従い、Debianシステムではユーザー名とパスワードに関して大文字小文字の区別をします。ユーザー名は通常小文字のみから選ばれます。最初のユーザーアカウントは通常インストールの際に作られます。追加のユーザーアカウントはrootによって |
"/etc/motd
" (本日のメッセージ:Message Of The
Day)に保存されている歓迎メッセージとコマンドプロンプトを表示しシステムが起動されます。
Debian GNU/Linux lenny/sid foo tty1 foo login: penguin Password: Last login: Sun Apr 22 09:29:34 2007 on tty1 Linux snoopy 2.6.20-1-amd64 #1 SMP Sun Apr 15 20:25:49 UTC 2007 x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. foo:~$
ここで、Debian
GNU/Linuxシステムがフリーソフトで無保証であるという、歓迎メッセージの主要部分は"/etc/motd.tail
"ファイルを編集することでカスタム化できます。最初の行は"uname
-snrvm
"用いたシステム情報から生成されます。
これであなたはシェルの中にいます。シェルはあなたからのコマンドを解釈します。
インストールの際に"Desktop environment"タスクを選定しGNOMEのgdm
とともにX
Windowシステムをインストールした場合には、システムの起動するとグラフィカルなloginプロンプトのスクリーンが表示されます。あなたのユーザー名とパスワードを入力することで非特権ユーザーアカウントにloginできます。タブ(tab)を用いたりマウスの第一クリックを用いるとユーザー名とパスワードの間を行き来できます。
gnome-terminal
(1)やrxvt
(1)やxterm
(1)のようなx-terminal-emulator
プログラムをXの下で起動するとシェルプロンプトが得られます。GNOMEデスクトップ環境下では、"Applications"
→ "Accessories" → "Terminal"とクリックしてもうまくいきます。
次の「仮想コンソール」も参照下さい.
デスクトップ環境(例えばfluxbox
)次第ではメニューの起点がよく分からないことがあります。そんな時はスクリーンの中央を(右)クリックしてメニューが表示されることを期待しましょう。
rootアカウントはスーパーユーザーとか特権ユーザーとも呼ばれます。このアカウントからは次のようなシステム管理活動ができます。
rootアカウントの権限を使うには、この無制限の権限ゆえ配慮と責任ある行動が求められます。
![]() |
警告 |
---|---|
rootのパスワードを他人に決して教えてはいけません。 |
![]() |
注記 |
---|---|
ファイル(Debianシステムにとってはファイルの一種であるCD-ROM等のハードウエアーデバイスも含む)パーミッションは、非rootユーザーによるそのファイルの使用やアクセスをできなくなくすることがあります。この様な状況の下ではrootアカウントを使うことが簡便なテスト法ですが、問題解決はファイルパーミッションとユーザーのグループのメンバーシップを適切に設定する必要があります(「ファイルシステムのパーミッション」参照)。 |
rootのパスワードを使ってrootのシェルプロンプトを使えるようにする基本的な方法を次に記します。
root
と入力します。
どのユーザーシェルプロンプトからでも"su -l
"と入力します。
どのユーザーシェルプロンプトからでも"su
"と入力します。
デスクトップのメニューがGUIのシステム管理ツールを適切な権限とともに自動的に起動しない場合、gnome-terminal
(1)やrxvt
(1)やxterm
(1)のようなXターミナルエミュレーターのrootシェルプロンプトから起動できます。「rootシェルプロンプト」 and 「Xクライアントをrootで実行」を参照下さい。
![]() |
警告 |
---|---|
|
![]() |
警告 |
---|---|
クリチカルな情報が表示されている際には、あなたのXスクリーンを覗き見られるかもしれないのでリモートの信頼できないGUIプログラムを決して実行してはいけません。 |
デフォールトのDebianシステムでは、6つの切り替え可能なVT100様の文字コンソールがあり、Linuxホスト上で直接コマンドシェルを起動できるようになっています。GUI環境下でない場合は、Left-Alt-key
とF1
—
F6
の中の一つのキーを同時に押すことで仮想コンソール間の切り替えができます。仮想ターミナルそれぞれに独立したアカウントでログインすることができ、。マルチユーザー環境を提供します。このマルチユーザー環境はUnixの偉大な機能で、癖になります。
X
Windowシステムの下では、Ctrl-Alt-F1
キーを押す、つまりleft-Ctrl-key
とleft-Alt-key
とF1-key
キーを同時に押すと文字コンソール1にアクセスできます。通常仮想コンソール7で実行されているX
WindowシステムへはAlt-F7
を押すことにより戻れます。
これとは別の方法で、例えば仮想ターミナル1という今とは違う仮想ターミナルへの変更がコマンドラインから出来ます。
# chvt 1
コマンドプロンプトでCtrl-D
、つまりleft-Ctrl-key
とd-key
の同時押しをするとシェルでのアクティビティーを終了できます。文字コンソールの場合は、こうするとloginプロンプト戻ります。これらのコントロール文字は通常"control
D"と大文字を使って表記されますが、Shiftキーを押す必要はありません。またCtrl-D
に関する簡略表記^D
も使われます。この代わりに"exit"とタイプすることができます。
x-terminal-emulator
(1)にあっては、このようにすることでx-terminal-emulator
のウィンドウが閉じることができます。
ファイル操作の際にパーフォーマンス向上のためにメモリーへのデーターのキャッシュがされる他の現代的なOSと同様に、Debianシステムでも電源を安全に切る前に適切なシャットダウン手順を取る必要があります。これはすべてのメモリー上の変更を強制的にディスクに書き出しすことで、ファイルの完全性を維持するためです。ソフトウエアーによる電源コントロールができる場合、シャットダウン手続きはシステムの電源を自動的に落とします。(これがうまくいかない時には、シャットダウン手続きの後で数秒間電源ボタンを押す必要があるかもしれません。)
通常のマルチユーザーモードからのシステムのシャットダウンがコマンドラインから出来ます。
# shutdown -h now
シングルユーザーモードからのシステムのシャットダウンがコマンドラインから出来ます。
# poweroff -i -f
この他に、"/etc/inittab
"に"ca:12345:ctrlaltdel:/sbin/shutdown
-t1 -a -h
now
"と書かれていれば、Ctrl-Alt-Delete
(left-Ctrl-key
とleft-Alt-Key
とDelete
の同時押し)を入力するシャットダウン方法もあります。
「SSH上のリモートシステムをシャットダウンする方法」を参照下さい。
例えば"cat
<some-binary-file>
"のような変な事をした後でスクリーンが無茶苦茶になった場合、コマンドプロンプトに"reset
"と入力して下さい。このときコマンドを入力してもスクリーンには読み取れる表示がされないかもしれません。"clear
"とすればスクリーンが消去できます。
デスクトップ環境タスク抜きの最小限インストレーションDebianシステムですら基本的なUnix機能は提供されますが、コマンドラインやcursesに基づくmc
やvim
等のいくつかの文字ターミナルパッケージをaptitude
(8)を使って次のように追加インストールすることから始めることを初心者にお薦めします。
# aptitude update ... # aptitude install mc vim sudo ...
既にこれらのパッケージがインストールされている場合には、新しいパッケージはインストールされません。
表1.1 興味あるテキストモードのプログラムパッケージのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
mc
*
|
V:12, I:28 | 6452 | テキストモードの全画面ファイルマネージャー |
sudo
*
|
V:43, I:73 | 612 | ユーザーに限定的なroot権限を与えるプログラム |
vim
*
|
V:14, I:31 | 1732 | UnixテキストエディターVi IMproved(改良版Vi)、プログラマーのためのテキストエディター(標準版) |
vim-tiny *
|
V:17, I:91 | 824 | UnixテキストエディターVi IMproved(改良版Vi)、プログラマーのためのテキストエディター(軽量版) |
emacs22 *
|
V:3, I:7 | 11020 | GNUプロジェクトEmacs、Lispに基づく拡張可能なテキストエディター(22版) |
emacs23 *
|
V:1.6, I:2 | 13272 | GNUプロジェクトEmacs、Lispに基づく拡張可能なテキストエディター(23版) |
w3m
*
|
V:22, I:84 | 1964 | テキストモードWWWブラウザー |
gpm
*
|
V:3, I:4 | 564 | テキストコンソール上のUnix式のカットアンドペースト(daemon) |
いくつかの参考資料を読むのも良いことです。
表1.2 有用な文書パッケージのリスト
パッケージ | ポプコン | サイズ | 説明 |
---|---|---|---|
doc-debian *
|
I:83 | 376 | Debianプロジェクトの文書、(Debian FAQ)他 |
debian-policy *
|
I:3 | 2748 | Debianポリシーマニュアルと関連文書 |
developers-reference *
|
I:1.1 | 1352 | Debian開発者のためのガイドラインと情報 |
maint-guide *
|
I:0.8 | 644 | Debian新メンテナ向けガイド |
debian-history *
|
I:0.3 | 2544 | Debianプロジェクトの歴史 |
debian-faq *
|
I:56 | 1190 | Debian FAQ(よくある質問集) |
doc-linux-text *
|
I:82 | 8616 | Linux HOWTOとFAQ(テキスト版) |
doc-linux-html *
|
I:0.9 | 62564 | Linux HOWTOとFAQ(HTML版) |
sysadmin-guide *
|
I:0.3 | 964 | Linuxシステム管理者ガイド |
rutebook *
|
I:0.2 | 8264 | Linux: Ruteユーザーのためのチュートリアルと解説書(non-free) |
これらのパッケージの一部を次のようにしてインストールします。
# aptitude install package_name
次の練習のためにあなたのメインのユーザーアカウントを使いたくない場合には、例えばfish
という追加のユーザーアカウントを作成できます。rootシェルプロンプトで次のように入力します。
# adduser fish
すべての質問に返事をします。
こうすることでfish
という名前の新規アカウントが作られます。練習の後で、このユーザーとそのホームディレクトリーは次のようのすれば削除できます。
# deluser --remove-home fish
ラップトップPC上のデスクトップのDebianシステム等のような典型的単一ユーザーワークステーションでは次のような単純なsudo
(8)の設定をして、非特権ユーザー(例えばpenguin
)に管理者権限を(rootパスワードではなく)ユーザー自身のパスワードで与えることがよくあります。
# echo "penguin ALL=(ALL) ALL" >> /etc/sudoers
このトリックの使用は、単一ユーザーワークステーション上であなた自身が管理者でユーザーである際のみに限るべきです。
![]() |
警告 |
---|---|
システムセキュリティー上非常に悪い事態を招くので、マルチユーザーワークステーション上の通常ユーザーアカウントに対してこの様な設定をしてはいけません。 |
![]() |
注意 |
---|---|
上記例のような |
![]() |
注意 |
---|---|
この文脈上の管理者権限はワークステーションに関するシステム管理業務をする権限を与えられた人に属します。そのような権限と能力を持っていなければ、あなたの会社の管理部門の管理職や上司とはいえこのような権限を与えてはいけません。 |
![]() |
注記 |
---|---|
特定デバイスや特定ファイルへのアクセスの権限を与えるには、 |
![]() |
注記 |
---|---|
|
非特権ユーザーアカウントを使う限り全くリスク無くDebianシステムでお遊びをする準備万端です。
何故なら、たとえデフォールトのインストール後ですらDebianシステムは非特権ユーザーがシステムに損害を与えられないように的確なファイルパーミッションが設定されているからです。もちろん悪用可能な穴が残っているかもしれませんが、こんな問題まで心配する人はこのセクションを読んでいるべきではなく、Securing Debian Manualを読むべきです。
DebianシステムをUnix的システムとして次に学びましょう:
GNU/Linuxや他のUnix的オペレーティングシステムでは、ファイルはディレクトリーに整理されています。すべてのファイルやディレクトリーは、"/
"を根(root)に持つ一本の大きな木(ツリー)のようにアレンジされています。
このようなファイルやディレクトリーはいくつかのデバイスに展開することができます。あるデバイス上にあるファイルシステムを大きなファイルツリーにマウントするのにmount
(8)が使われます。その逆に、それを切り離すのにumount
(8)が使われます。最近のLinuxカーネルでは、mount
(8)をオプションとともに用いると、ファイルツリーの一部を別のところと結びつけたり、共有・非共有・従属・バインド不可としてファイルシステムをマウントもできます。各ファイルシステムごとの使用可能なマウントオプションは"/share/doc/linux-doc-2.6.*/Documentation/filesystems/
"にあります。
Unixシステム上のディレクトリーは、一部の他システム上ではフォルダと呼ばれます。Unixシステム上では"A:
"のようなドライブというコンセプトが無いこと覚えておいて下さい。単一のファイルシステムがあって、そこにすべてが含まれています。これはWindowsと比べた際の大きな利点です。
Unixファイルの基礎は以下です。
MYFILE
"と"MyFile
"は異なるファイルです。
/
"と記載されます。これをrootユーザーのホームディレクトリー"/root
"とは混同しないで下さい。
/
"以外の文字・記号からなる名前がついています。ルートディレクトリーは例外で、その名前は"/
"("スラッシュ"とか"ルートディレクトリー"と読まれます)でその名前を変えることはできません。
/
"ディレクトリーで始まり、ファイル名中の各ディレクトリーやファイル名の間には"/
"がはさまります。最初の"/
"は
ディレクトリー名です。その他の"/
"は、次のサブディレクトリーとの区別をします。そして最後には実際のファイルの名前がきます。ちょっと混乱しそうですので、次の完全に記述したファイル名 の例をご覧下さい:
"/usr/share/keytables/us.map.gz
"。
一方このベース名である、"us.map.gz
"だけをファイル名と呼ぶ人もあります。
/etc/
"や"/usr/
"のような複数の枝を持ちます。これらのサブディレクトリーもまた"/etc/init.d/
"や"/usr/local/
"のように、さらにサブディレクトリーに枝別れします。これらの全体をまとめてディレクトリーツリーと呼びます。絶対ファイル名はツリーの根元("/
")から枝の先
(ファイル) までの経路として考えることもできます。また、あたかもディレクトリーツリーを家系図のように人が話すのを聞いたことがあるでしょう。あたかもそれぞれのサブディレクトリーに親があるとし、パスはファイルの完全な祖先の系図のように表現します。ルートディレクトリーではない他の場所から始まる相対パスもあります。ディレクトリー"../
"は親ディレクトリーを参照していることを覚えておきましょう。このような呼び方はディレクトリーのような構造を持つ他の階層的ツリー状のデーター構造体でもよく使われます。
C:\
"のようなデバイス名が含まれるRT-11やCP/MやOpenVMSやMS-DOSやAmigaOSやMicrosoft
Windowsと違う点です。(但し、通常のファイルシステム中に物理デバイスを示すディレクトリー項目はあります。「ファイルシステムの内側」参照。)
![]() |
注記 |
---|---|
ほとんど全ての文字や記号をファイル名中に使えますが、実際そうすることは賢明ではありません。スペースやタブや改行や他の特殊文字: |
![]() |
注記 |
---|---|
"root"(ルート)と言う言葉は"rootユーザー"と言う意味でも"ルートディレクトリー"と言う意味でも使われます。それがいずれかは使われている文脈から明かです。 |
![]() |
注記 |
---|---|
パスと言う言葉は上述の完全に記述したファイル名に関して使われるばかりではなくコマンドサーチパスにも使われます。どちらの意味かは文脈から明かです。 |
ファイル階層について詳細に学ぶ最も良い方法は、Filesystem Hierarchy
Standard("/usr/share/doc/debian-policy/fhs/fhs-2.3.txt.gz
"やhier
(7))に記述されています。手始めとして次の事実を覚えるべきです。
表1.3 重要ディレクトリーの使い方のリスト
ディレクトリー | ディレクトリーの用途 |
---|---|
/
|
ルートディレクトリー |
/etc/
|
システム全体の設定ファイル |
/var/log/
|
システムのログファイル |
/home/
|
全ての非特権ユーザーのホームディレクトリー |
Unixの伝統に従い、Debian/Linux
システムはハードディスクや他のストレージデバイス上に存在する物理データーを表すファイルシステムを提供し、コンソールスクリーンやリモートのシリアルコンソールなどのハードウェアデバイスとの相互作用が"/dev/
"の下に統一された形式で表されています。
Debian/Linuxシステム上の、各々のファイルやディレクトリーや名前付きパイプ(2つのプログラムがデーターを共有する方法)や物理デバイスは、それぞれの所有者(owner)やデーターが所属するグループ(group)や最終アクセス時間などの付帯属性(attribute)を記述するinodeと呼ばれるデーター構造を持ちます。 Debian GNU/Linux システムでの inode
構造 の正確な定義を知るには、"/usr/include/linux/fs.h
" をご覧下さい。
ほとんど全てをファイルシステム表現しようというアイデアはUnixの発明でしたし、現代的なLinuxカーネルはこのアイデアを一歩進めています。コンピューター上で実行されているプロセス情報さえファイルシステム中に見つけられます。
このような物理的実体と内部プロセスの抽象的かつ統一された表現は非常にパワフルなので、多くの全く異なるデバイスに同じコマンドを使用して同種の操作が行えます。実行中のプロセスに繋がった特殊なファイルにデーターを書き込むことでカーネルが如何に動作するかまで変更できます。
![]() |
ティップ |
---|---|
ファイルツリーや物理的実体の間の関係を確認する必要がある際には、 |
Unix的システムのファイルシステムのパーミッションは次の3つの影響されるユーザーのカテゴリーのために定義されています。
ファイルでは、それぞれに対応するパーミッションは次のようになります。
ディレクトリーでは、対応するパーミッションはそれぞれ次のようになります。
ここで、ディレクトリーに関する実行(execute)パーミッションとはディレクトリー内のファイルへの読出しを許可するのみならず、サイズや変更時間のようなアトリビュート閲覧を許可します。
ファイルやディレクトリーのパーミッション情報他を表示するには、ls
(1)が使われます。"-l
"オプション付きでこれを実行すると、次の情報がこの順序で表示されます。
rootアカウントからchown
(1)を使用することでファイルの所有者を変更します。ファイルの所有者又はrootアカウントからchgrp
(1)を使用することでファイルのグループを変更します。ファイルの所有者又はrootアカウントからchmod
(1)を使用することでファイルやディレクトリーのアクセスパーミッションを変更します。foo
ファイルの操作の基本的文法は次の通り。
# chown <newowner> foo # chgrp <newgroup> foo # chmod [ugoa][+-=][rwxXst][,...] foo
例えば次のようにするとディレクトリーツリーの所有者をユーザーfoo
に変更しグループbar
で共有できます。
# cd /some/location/ # chown -R foo:bar . # chmod -R ug+rwX,o=rX .
更に特殊なパーミッションビットが3つ存在します。
ここで、これらのビットの"ls -l
"のアウトプットはこれらの出力によってかくされた実行ビットが非設定(unset)の場合大文字となります。
セットユーザーIDを実行ファイルにセットすると、ユーザーはファイルの所有者ID(例えば、root) を使って実行ファイルを実行することを許可されます。同様に、セットグループIDを実行ファイルにセットすると、ユーザーはファイルのグループID(例えば、root) を使って実行ファイルを実行することを許可されます。これらの設定はセキュリティーを破壊するリスクを引き起こすので、これらのビットを有効にするには特別な注意が必要です。
セットグループIDsをディレクトリーに対して有効にすると、ディレクトリーに作成した全ファイルがディレクトリーのグループに所属するというBSD的ファイル生成手法が有効になります。
スティッキビットをディレクトリーに対して有効にすると、ディレクトリーにあるファイルがファイルの所有者以外から削除されるのを防ぎます。"/tmp
"のような全員書込み可能ディレクトリーやグループ書込み可能なディレクトリーなどのにあるファイルの内容を安全にするためには、書込みパーミッションを無効にするだけでなく、ディレクトリーにスティッキビットもセットする必要があります。さもなければ、ディレクトリーに書込みアクセスできるユーザーにより、ファイルが削除され、同じ名前で新規ファイルが作成されることを許してしまいます。
ファイルパーミッションの興味ある例を次にいくつか示します。
$ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4 crw------- 1 root root 108, 0 2007-04-29 07:00 /dev/ppp -rw-r--r-- 1 root root 1427 2007-04-16 00:19 /etc/passwd -rw-r----- 1 root shadow 943 2007-04-16 00:19 /etc/shadow -rwsr-xr-x 1 root root 700056 2007-04-22 05:29 /usr/sbin/exim4 $ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src drwxrwxrwt 10 root root 4096 2007-04-29 07:59 /tmp drwxrwsr-x 10 root staff 4096 2007-03-24 18:48 /usr/local drwxrwsr-x 4 root src 4096 2007-04-27 00:31 /usr/src drwxrwsr-x 2 root mail 4096 2007-03-28 23:33 /var/mail drwxrwxrwt 2 root root 4096 2007-04-29 07:11 /var/tmp
chmod
(1)を用いて、ファイルパーミッションを記述するためのもう一つの数字モードが存在します。この数字モードは8進数を使った3桁から4桁の数字を用います。
表1.5 chmod
(1)コマンドで用いられるファイルパーミッションの数字モード
数字 | 意味 |
---|---|
1桁目(任意) | セットユーザーID (=4)とセットグループID (=2)とスティキービット (=1)の和 |
2桁目 | ユーザーに関する、読出し(read) (=4)と書込み(write) (=2)と実行(execute) (=1)のファイルパーミッションの和 |
3桁目 | グループに関して、同上 |
4桁目 | ユーザーに関して、同上 |
これは複雑に聞こえるかもしれませんが、実際は本当にシンプルです。"ls
-l
"コマンドの出力の最初の数列(2〜10列)を見て、それをファイルパーミッションのバイナリー表記(2進数)("-"を"0"、"rwx"を"1""-")として読むと、この数字モードの値はファイルパーミッションの8進数表現として意味を持ちます。
例えば、次を試してみて下さい:
$ touch foo bar $ chmod u=rw,go=r foo $ chmod 644 bar $ ls -l foo bar -rw-r--r-- 1 penguin penguin 17 2007-04-29 08:22 bar -rw-r--r-- 1 penguin penguin 12 2007-04-29 08:22 foo
![]() |
ティップ |
---|---|
シェルスクリプトから" |
新規作成ファイルのやディレクトリーに適用されるパーミッションはumask
シェル組込みコマンドを使うことにより制限できます。dash
(1)かbash
(1)かbuiltins
(7)をご覧下さい。
(ファイルパーミッション) = (要求されたパーミッション) & ~(umask値)
表1.6 umask値の例
umask | 作成されるファイルパーミッション | 作成されるディレクトリーパーミッション | 使い方 |
---|---|---|---|
0022
|
-rw-r--r--
|
-rwxr-xr-x
|
ユーザーのみにより書込み可 |
0002
|
-rw-rw-r--
|
-rwxrwxr-x
|
グループにより書込み可 |
Debianシステムはユーザー専用グループ(UPG)方式がデフォールト方式です。新規ユーザーがシステムに追加される毎にUPGは作成されます。UPGはそのグループを作成したユーザーと同じ名前を持ち、そのユーザーがUPGの唯一のメンバーです。UPG方式では、全ユーザーが各自専用のグループを持つのでumaskを0002
と設定しても安全です。(一部Unix系システムでは全一般ユーザーを1つのusers
グループに所属させることがよく行われます。そのような場合には安全のため0022
とumaskを設定します。)
グループパーミッションを特定ユーザーに適用するには、"sudo
vigr
"を用いてそのユーザーをグループのメンバーにする必要があります。
![]() |
注記 |
---|---|
もし" |
ハードウエアーデバイスはDebianシステム上では一種のファイルでしかありません。CD-ROMやUSBメモリースティックのようなデバイスをユーザーアカウントからアクセスするのに問題があった場合にはそのユーザーを適切なグループのメンバーにします。
いくつかのシステムが供給するグループはそのメンバーにroot
権限無しに特定のファイルやデバイスにアクセスすることを可能にします。
表1.7 ファイルアクセスのためにシステムが供給する特記すべきグループのリスト
グループ | アクセスできるファイルやデバイスの説明 |
---|---|
dialout
|
シリアルポート ("/dev/ttyS[0-3] ")への全面的かつ直接のアクセス
|
dip
|
信頼できるピアーにダイヤルアップIP接続をするためのシリアルポートへの制限付きアクセス |
cdrom
|
CD-ROMやDVD+/-RWのドライバー |
audio
|
音声デバイス |
video
|
映像デバイス |
scanner
|
スキャナー |
adm
|
システムモニターのログ |
staff
|
下級管理業務のためのディレクトリー:
"/usr/local "、"/home "
|
![]() |
ティップ |
---|---|
モデムの設定をしたりどこにでも電話したり等するには |
いくつかのシステムが供給するグループはそのメンバーにroot
権限無しに特定のコマンドを実行することを可能にします。
表1.8 特定コマンド実行のためにシステムが供給する特記すべきグループのリスト
グループ | 実行可能なコマンド |
---|---|
sudo
|
パスワード無しにsudo を実行
|
lpadmin
|
プリンターのデーターベースからプリンターを追加・変更・削除するコマンドを実行 |
plugdev
|
USBメモリーのようなリムーバブルデバイスに関してpmount (1)を実行
|
システムが供給するユーザーやグループの完全なリストは、base-passwd
パッケージが供給する"/usr/share/doc/base-passwd/users-and-groups.html
"の中にある最新バージョンの"Users
and Groups"文書を参照下さい。
ユーザーやグループシステムを管理するコマンドはpasswd
(5)やgroup
(5)やshadow
(5)やnewgrp
(1)やvipw
(8)やvigr
(8)やpam_group
(8)を参照下さい。
GNU/Linuxファイルのタイムスタンプには3種類あります。
表1.9 タイムスタンプのタイプのリスト
タイプ | 意味 |
---|---|
mtime |
ファイル内容変更時間(ls -l )
|
ctime |
ファイル状態変更時間(ls -lc )
|
atime |
ファイル最終アクセス時間 (ls -lu )
|
![]() |
注記 |
---|---|
ctimeはファイル作成日時ではありません。 |
![]() |
注記 |
---|---|
Debianシステム上のファイルを単に読むだけでinode中のatime情報を更新する書込みオペレーションが通常引き起こされることを覚えておいて下さい。ファイルシステムを" |
既存ファイルのタイムスタンプを変更するにはtouch
(1)コマンドを使って下さい。
タイムスタンプに関して、現代の英語ロケール("en_US.UTF-8
")では旧式の英語ロケール("C
")と違った文字列がls
コマンドから出力されます。
$ LANG=en_US.UTF-8 ls -l foo -rw-r--r-- 1 penguin penguin 3 2008-03-05 00:47 foo $ LANG=C ls -l foo -rw-r--r-- 1 penguin penguin 3 Mar 5 00:47 foo
![]() |
ティップ |
---|---|
" |
"foo
"というファイルを異なるファイル名"bar
"に結びつけるのには2つの方法があります。
ln foo bar
"
ln -s foo bar
"
リンク数の変化とrm
コマンドの結果の微妙な違いについての次の例をご覧下さい。
$ echo "Original Content" > foo $ ls -li foo 2398521 -rw-r--r-- 1 penguin penguin 17 2007-04-29 08:15 foo $ ln foo bar # hard link $ ln -s foo baz # symlink $ ls -li foo bar baz 2398521 -rw-r--r-- 2 penguin penguin 17 2007-04-29 08:15 bar 2398538 lrwxrwxrwx 1 penguin penguin 3 2007-04-29 08:16 baz -> foo 2398521 -rw-r--r-- 2 penguin penguin 17 2007-04-29 08:15 foo $ rm foo $ echo "New Content" > foo $ ls -li foo bar baz 2398521 -rw-r--r-- 1 penguin penguin 17 2007-04-29 08:15 bar 2398538 lrwxrwxrwx 1 penguin penguin 3 2007-04-29 08:16 baz -> foo 2398540 -rw-r--r-- 1 penguin penguin 12 2007-04-29 08:17 foo $ cat bar Original Content $ cat baz New Content
ハードリンクは同一ファイルシステム内に作れ、ls
(1)コマンドに"-i
"オプションを使って表示されるinode番号が同じです。
シンボリックリンクは上の例に示したように、常にファイルアクセスパーミッション"rwxrwxrwx
"を持ちますので、シンボリックリンクが指すファイルのアクセスパーミッションが有効ファイルアクセスパーミッションとなります。
![]() |
注意 |
---|---|
もし特段の理由がないなら複雑なシンボリックリンクやハードリンクを作らない方が一般的には良いでしょう。シンボリックリンクの論理的組み合わせがファイルシステム中でループになっているという悪夢を引き起こすかもしれません。 |
![]() |
注記 |
---|---|
もしハードリンクを使う特段の理由がなければ、ハードリンクよりシンボリックリンクを使う方が一般的には良いでしょう。 |
".
"ディレクトリーは、それ自身が中にあるディレクトリーとリンクしていますので、新規ディレクトリーのリンク数は2から始まります。"..
"ディレクトリーは親ディレクトリーとリンクしているので、ディレクトリーのリンク数は新規サブディレクトリーの増加に伴い増加します。
もし最近あなたがWindowsからLinuxに移動してきたなら、Unixのファイル名のリンクはWindows上でもっとも似ている"shortcuts"との比較で如何にうまくできているかにすぐ気づくでしょう。ファイルシステム中に実装されているのでアプリケーションからはリンクされたファイルなのかオリジナルなのかの区別がつきません。ハードリンクの場合は実際全く違いはありません。
名前付きパイプは、パイプのように働くファイルです。何かをファイルに入れると、もう一方の端からそれが出てきます。こうしてこれはFIFOまたはFirst-In-First-Out(先入れ先出し)と呼ばれます。つまり、最初にパイプに入れられたものが最初にもう一方の端から出てきます。
名前付きパイプに書き込んむ場合、パイプに書き込んむプロセスは情報がパイプから読出されるまで終了しません。名前付きパイプから読み出す場合、読出すプロセス何か読出すものが無くなるまで終了するのを待ちます。パイプのサイズは常に
0 です。 -- 名前付きパイプはデーターを保存せず、
シェルの"|
"のように2つのプロセスをリンクするだけです。しかし、このパイプは名前を持つので、2つのプロセスは同じコマンドラインになくても良いし、同じユーザーにより実行される必要さえありません。パイプはUnixの非常に影響力ある発明でした。
例えば、次を試してみて下さい:
$ cd; mkfifo mypipe $ echo "hello" >mypipe & # put into background [1] 8022 $ ls -l mypipe prw-r--r-- 1 penguin penguin 0 2007-04-29 08:25 mypipe $ cat mypipe hello [1]+ Done echo "hello" >mypipe $ ls mypipe mypipe $ rm mypipe
ソケットはインターネットのコミュニケーションやデーターベースやオペレーティングシステム自身によって頻繁に使われます。ソケットは名前つきパイプ(FIFO)に似ており、異なるコンピューター間でさえプロセス間の情報交換を可能にします。ソケットにとって、これらのプロセスは同時に実行する必要も、同じ祖先プロセスの子供である必要もありません。これはプロセス間通信(IPC)の終端点です。ネットワーク越しで異なるホストの間で情報の交換をすることも可能です。2つの典型的なソケットは、インターネットソケットとUnixドメインソケットです。
![]() |
ティップ |
---|---|
" |
デバイスファイルは、システム上のハードディスク、ビデオカード、ディスプレー、キーボードなどの物理デバイス又は仮想デバイス等を意味します。仮想デバイスの例として"/dev/console
"として表されるコンソールがあります。
2タイプのデバイスファイルがあります。
文字デバイス
ブロックデバイス
デバイスファイルの読出し書込みが可能ですが、人間にとっては意味不明のバイナリーデーターがファイル中に多分含まれています。データーを直接デバイスファイルに書き込むことは時々ハードウェアの接続に関するトラブルシュートに役立ちます。例えば、プリンタデバイス"/dev/lp0
"にテキストファイルをダンプしたり、
適切なシリアルポート"/dev/ttyS0
"にモデムコマンドを送ることができます。しかし、注意深くやらないと、大災害をもたらすことがあります。くれぐれも気をつけて下さい。
![]() |
注記 |
---|---|
通常のプリンターへのアクセスは |
次のようにls
(1)を実行するとデバイスノード番号が表示されます。
$ ls -l /dev/hda /dev/ttyS0 /dev/zero brw-rw---- 1 root cdrom 3, 0 2007-04-29 07:00 /dev/hda crw-rw---- 1 root dialout 4, 64 2007-04-29 07:00 /dev/ttyS0 crw-rw-rw- 1 root root 1, 5 2007-04-29 07:00 /dev/zero
/dev/hda
"はメジャーデバイス番号3とマイナーデバイス番号0を持ちます。これはcdrom
グループに所属するユーザーにより、読出し/書込みアクセスが可能です。
/dev/ttyS0
"
はメジャーデバイス番号4とマイナーデバイス番号64を持ちます。これはdialout
グループに所属するユーザーにより、読出し/書込みアクセスが可能です。
/dev/zero
"
はメジャーデバイス番号1とマイナーデバイス番号5を持ちます。これは誰によっても読出し/書込みアクセスが可能です。
Linux
2.6システムでは、"/dev/
"の下のファイルはudev
(7)メカニズムで自動的に充足されます。
いくつかの特別なデバイスファイルがあります。
表1.10 スペシャルなデバイスファイルのリスト
デバイスファイル | アクション | レスポンスの説明 |
---|---|---|
/dev/null
|
読出し | "行末(EOF)文字"を返す |
/dev/null
|
書込み | 何も返さず(底なしのデーターのゴミ捨て場) |
/dev/zero
|
読出し |
"\0 (NUL)文字"を返す(ASCIIの数字のゼロとは違う)
|
/dev/random
|
読出し | 真の乱数発生機から真のエントロピーのあるランダムな文字を返す(遅い) |
/dev/urandom
|
読出し | 暗号学的にセキュアーな擬似乱数発生機からランダムな文字を返す |
/dev/full
|
書込み | ディスクフル(ENOSPC)エラーを返す |
以上はシェルのリディレクションとともによく使われます。(「典型的なコマンドシーケンスとシェルリディレクション」参照)。
procfsとsysfsは"/proc
"や"/sys
"上にマウントされる仮想ファイルシステムであり、カーネルの内部データー構造をユーザー空間にさらけ出します。言い換えると、オペレーティングシステムのオペレーションへの便利なのぞき窓となると言う意味で仮想といえます。
"/proc
"ディレクトリー中には、システム上で実行されている各プロセスに対応したそのプロセスID(PID)の名前がついたサブディレクトリー他があります。プロセス情報をアクセスするps
(1)のようなシステムユーティリティーはこのディレクトリー構造からその情報を得ています。
"/proc/sys/
"の下のディレクトリーには実行時のカーネル変数を変更するインターフェースがあります。(専用のsysctl
(8)コマンドもしくはその起動/設定ファイル"/etc/sysctrl.conf
"によっても同様のことができます。)
![]() |
注記 |
---|---|
Linuxカーネルが"Too many open files"とエラーを出力することがあります。rootのシェルから、例えば" |
特にあるファイル - "/proc/kcore
" -
に気づくと、パニックになる人がよくいます。これは一般に巨大です。これは(おおよそ)コンピューターのメモリーの内容のコピーです。これは kernel
をデバッグするのに用いられます。コンピューターのメモリーを指す仮想ファイルなので、そのサイズに関して心配する必要は全くありません。
"/sys
"の下のディレクトリーはカーネルから引き出されたデーター構造、その属性、それらの関連を含んでいます。一部カーネル変数を実行時に変更する機構もまた含まれたりします。
linux-doc-2.6.*
パッケージで供給されるLinuxカーネル文書("/usr/share/doc/linux-doc-2.6.*/Documentation/filesystems/*
")中の"proc.txt(.gz)
"や"sysfs.txt(.gz)
"や関連する他の文書を参照下さい。
Midnight Commander (MC)はLinux コンソールや他の端末環境のためのGNU製"スイス軍ナイフ"です。標準Unixコマンドを習うよりもより簡単なメニューを使ったコンソール経験が初心者にもできます。
"mc
"と名づけられたMidnight
Commanderパッケージを次のようにしてインストールする必要があります。
$ sudo aptitude install mc
Debian
システムを探検するためにmc
(1)コマンドを使います。これは学習するための最良の方法です。カーソールキーとエンターキーを使うだけで興味深い場所をちょっと探検します。
/etc
"とサブディレクトリー
/var/log
"とサブディレクトリー
/usr/share/doc
"とサブディレクトリー
/sbin
"と"/bin
"。
終了時に作業ディレクトリーをMCに変更させそのディレクトリーへcdさせるためには、mc
パッケージが提供するスクリプトを"~/.bashrc
"が含むように変更します。
. /usr/share/mc/bin/mc.sh
この理由はmc
(1) ("-P
"オプション項目)
を参照下さい(今言っていることがよく分からないなら、これは後日しても大丈夫です。)
MCは次のようにして起動します。
$ mc
MCを使うとメニューを通じた最小限のユーザーの努力で全てのファイル操作の面倒が見られます。ヘルプ表示を出すには、ただF1を押すだけです。カーソールキーとファンクションキーの操作だけでMCを使えます。
![]() |
注記 |
---|---|
|
もし文字化け表示がされる文字符号化(エンコーディング)問題に出会った際には、MCのコマンドラインに"-a
"を加えると解消する事があります。
これでもMCの表示の問題が解消しない際には、「ターミナルの設定」を参照下さい。
2つのディレクトリーパネルがありそれぞれファイルリストを含むのが標準です。他の便利なモードとしては、右側のウィンドウを"information"
とセットしてファイルアクセス権情報などを表示するモードがあります。次にいくつかの不可欠なキーストロークを示します。gpm
(8)デーモンを実行すると、Linuxの文字ターミナルでマウスも使えます。(MC
で通常の挙動のカットアンドペーストをさせるには、shiftキーを押して下さい。)
表1.11 MCのキーバインディング
キー | キーバインディング |
---|---|
F1
|
ヘルプメニュー |
F3
|
内部ファイルビューワー |
F4
|
内部エディター |
F9
|
プルダウンメニュー有効 |
F10
|
MCを終了 |
Tab
|
二つのウィンドウの間を移動 |
Insert もしくはCtrl-T
|
コピーのような複数ファイル操作のためにファイルをマーク |
Del
|
ファイルの削除(気をつけましょう -- MCを安全削除モードに設定) |
カーソールキー | 自明 |
cd
コマンドは選択されたスクリーンに表示されたディレクトリーを変更します。
Ctrl-Enter
とAlt-Enter
はファイル名をコマンドラインにコピーします。コマンドライン編集と一緒にcp
(1)やmv
(1)コマンドで御使用下さい。
Alt-Tab
はシェルファイル名の自動展開の選択肢を表示します。
mc /etc /root
"。
Esc
+ n-key
→ Fn
(つまり、Esc
+ 1
→
F1
、等々、Esc
+ 0
→
F10
)
Esc
をキーの前に押すのはAlt
をキーと同時に押すのと同様の効果があります。つまり、Esc
+ c
はAlt-C
と同じです。Esc
はメタキーとよばれ時々"M-
"と表記されます。
MC
の内部エディターは興味深いカットアンドペースト機構を持ちます。F3
キーを押すと、選択範囲のスタートとマークし、次にF3
を押すと、選択範囲のエンドとマークし、選択範囲を強調します。そしてカーソールを動かすことができます。F6を押すと、選択範囲はカーソールの位置に移動します。F5を押すと、選択範囲はコピーされ、カーソールの位置に挿入されます。F2
を押すとファイルをセーブします。F10
を押すと選択範囲はなくなります。ほとんどのカーソールキーは直感的に働きます。
このエディターは次のコマンドの内のひとつを使いファイルに対し直接起動できます。
$ mc -e filename_to_edit
$ mcedit filename_to_edit
これはマルチモードエディターではありませんが、複数の Linux コンソール上で使用すると同じ効果を発揮させされます。ウィンドウ間のコピーを行うには、 Alt-<n>キーを押して仮想コンソールを切替えて、"File→Insert file"や"File→Copy to file"を用いてファイルの一部を他のファイルに動かします。
この内部エディターはお好きな他の外部エディターと置き換えが可能です。
また、多くのプログラムは使用するエディターを決定するために環境変数"$EDITOR
"や"$VISUAL
"を使用します。最初vim
(1)やnano
(1)が使いにくい場合には"~/.bashrc
"に次に示す行を追加してエディターを"mcedit
"に設定するのも一計です。
export EDITOR=mcedit export VISUAL=mcedit
できればこれは"vim
"に設定することを推奨します。
vim
(1)が使いにくい場合には、mcedit
(1)をほとんどのシステム管理業務のために使い続けられます。
MCは非常に賢明なビューワーです。文書内の単語を検索するための素晴らしいツールです。私は"/usr/share/doc
"ディレクトリー内のファイルに対していつもこれを使います。これは
大量にあるLinux情報を閲覧する最速の方法です。このビューワーは次のコマンドの内のひとつを使い直接起動できます。
$ mc -v path/to/filename_to_view
$ mcview path/to/filename_to_view
ファイルの上でEnterを押すと、適切なプログラムがファイル内容を処理します(「スタートするプログラムのカスタム化」参照)。これは非常に便利な MC の機能です。
表1.12 enterキー入力へのMCの反応
ファイルタイプ | enterキーへの反応 |
---|---|
実行ファイル | コマンド実行 |
manファイル | ビューワーソフトに内容をパイプ |
htmlファイル | ウェッブブラウザーに内容をパイプ |
"*.tar.gz "や"*.deb "ファイル
|
サブディレクトリーであるかのように内容を表示 |
これらのビューワーや仮想ファイルの機能を有効にするためには、閲覧可能なファイルには実行可能と設定されていてはいけません。chmod
(1)コマンドを使うか、MC
のファイルメニュー経由で状態を変更して下さい。
MCはほとんど全てのことを可能にしますが、シェルプロンプトから実行されるコマンドラインツールの使用方法について学び、Unix的な作業環境に親しむのは非常に重要なことです。
ログインシェルはchsh
(1)を使えば選択できます。
表1.13 シェルプログラムのリスト
パッケージ | ポプコン | サイズ | POSIXシェル | 説明 |
---|---|---|---|---|
bash
*
|
V:91, I:99 | 3596 | はい | Bash: GNU Bourne Again SHell(事実上の標準シェル) |
tcsh
*
|
V:6, I:40 | 736 | いいえ | TENEX C Shell: 拡張バージョンのBerkeley csh |
dash
*
|
V:15, I:22 | 236 | はい | DebianのAlmquistシェル、シェルスクリプトに好適 |
zsh
*
|
V:2, I:5 | 12952 | はい | Z shell: 多くの拡張された標準シェル |
pdksh
*
|
V:0.2, I:1.2 | 468 | はい | パブリックドメインバージョンのKornシェル |
csh
*
|
V:0.6, I:2 | 404 | いいえ | OpenBSDのCシェル、Berkeley cshの派生 |
sash
*
|
V:0.2, I:1.0 | 848 | はい | 組み込みコマンド付きの独立シェル(標準の"/bin/sh "には不向き)
|
ksh
*
|
V:0.4, I:1.7 | 2860 | はい | 真のAT&TバージョンのKornシェル |
rc
*
|
V:0.11, I:1.0 | 204 | いいえ | AT&T Plan 9のrcシェルの実装 |
posh
*
|
V:0.01, I:0.13 | 228 | はい |
ポリシー準拠の通常シェル(pdksh の派生)
|
このチュートリアル章内では、インタラクティブなシェルは常にbash
です。
vim
(1)の挙動は"~/.vimrc
"を使ってカスタム化できます。
例えば、次を試してみて下さい。
# CD upon exiting MC . /usr/share/mc/bin/mc.sh # set CDPATH to good one CDPATH=.:/usr/share/doc:~/Desktop/src:~/Desktop:~ export CDPATH PATH="${PATH}":/usr/sbin:/sbin # set PATH so it includes user's private bin if it exists if [ -d ~/bin ] ; then PATH=~/bin:"${PATH}" fi export PATH EDITOR=vim export EDITOR
![]() |
ティップ |
---|---|
|
Unix的環境下では、特別の意味を持ったいくつかのキーストロークがあります。通常のLinuxの文字ターミナルでは左側のCtrl
やAlt
キーのみが期待にそって機能することに配慮下さい。次に特記すべき暗記するべきキーストロークを記します。
表1.14 Bashのキーバインディングのリスト
キー | キーバインディングの説明 |
---|---|
Ctrl-U
|
カーソールの前の1行を消去 |
Ctrl-H
|
カーソールの前の1文字を削除 |
Ctrl-D
|
入力を終了(シェルを使用中の場合、シェルを終了) |
Ctrl-C
|
実行中のプログラムを終了 |
Ctrl-Z
|
プログラムをバックグラウンドジョブに移動し一時停止 |
Ctrl-S
|
スクリーンへの出力を停止 |
Ctrl-Q
|
スクリーンへの出力を再開 |
Ctrl-Alt-Del
|
システムをリブート/停止、inittab (5)参照
|
Left-Altキー (もしくは、Windowsキー )
|
Emacsおよび同様のUIでのメタキー |
Up-arrow
|
bash でコマンド履歴検索をスタート
|
Ctrl-R
|
bash でインクリメンタルなコマンド履歴検索をスタート
|
Tab
|
bash のコマンドラインのファイル名入力を完結
|
Ctrl-V Tab
|
bash のコマンドラインでTab を展開することなく入力
|
![]() |
ティップ |
---|---|
ターミナルの |
Unix流のマウス操作は3ボタンマウスが基本です。
表1.15 Unix流のマウス操作
アクション | 反応 |
---|---|
マウスの左クリックアンドドラッグ | 選択とクリップボードへのコピー |
左クリック | 選択スタート点の選択 |
右クリック | 選択エンド点の選択とクリップボードへのコピー |
中クリック | クリップボードをカーソール位置に挿入(ペースト) |
現代的なホイールマウスの真ん中のホイールは中マウスボタンと見なされ、中クリックに使えます。2ボタンマウス状況では左右のボタンの同時押しが中クリックとして使えます。Linuxの文字コンソールでマウスを使うにはgpm
(8)をデーモンで実行する必要があります。
less
(1)は機能拡張されたページャー(ファイル内容のブラウザー)です。"h
"
と入力するとヘルプが表示されます。これは、more
(1) よりもはるかに機能があり、"eval
$(lesspipe)
"または"eval
$(lessfile)
"とシェルのスタートスクリプト中で実行することで更に機能拡充されます。詳しくは、"/usr/share/doc/lessf/LESSOPEN
"を参照下さい。"-R
"オプションを用いると生の
option allows
raw文字出力が許可され、ANSIカラーエスケープシーケンスが有効になります。less
(1)を参照下さい。
Unix的システムで人気のある、VimかEmacsプログラムのいずれかのバリアントに習熟するべきです。
著者としてはVimコマンドに慣れることは正しいことだと考えています。なぜならViエディターはLinux/Unixの世界では必ず存在するからです。(実際はオリジナルのvi
か、新しいnvi
がどこででも見つけられるプログラムです。これにもかかわらずVimを著者が初心者のために選んだのは、より強力かつ動作が充分似ているのと、F1
キーを通じてヘルプが表示されるからです。)
これとは違い、EmacsかXEmacsをエディターとして選ぶのも、特にプログラムをするには、非常に良い選択です。Emacsには、ニュースリーダ機能、ディレクトリーの編集機能、メール機能他の、過多な機能があります。プログラミングやシェルスクリプトの編集に使うときは、作業中のフォーマットをインテリジェントに認識し助力をしようとします。Linux上で必要なプログラムはEmacsだけと考える人もいます。Emacsを今10分間学ぶことは将来何時間もの節約になります。Emacsを学ぶ際にはGNUのEmacsマニュアルを持っておくことを高く推薦します。
これら全てのプログラムには練習しながら学べるようにチュータリングプログラムが普通付いてきます。Vimを"vim
"とタイプして起動し、F1キーを押します。最初の35行を読みます。カーソールを"|tutor|
"に移動しCtrl-]
を押してオンラインの訓練コースを始めます。
![]() |
注記 |
---|---|
VimやEmacsのような良いエディターは、正しいフォント設定がされたUTF-8ロケールの下の正しいオプションを使ったx-terminal-emulatorを使うと、UTF-8や他のエギゾチックな符号化方式(エンコーディング)のテキストを正しく扱えます。マルチバイトテキストに関するそれぞれの文書を参照下さい。 |
Debianにはいくつかの異なったエディターがあります。上述のようにvim
パッケージをインストールすることを推薦します。
Debianではシステムのデフォールトのエディターへの統一されたアクセスを"/usr/bin/editor
"コマンドを通じて提供しているので、他のプログラム(例えばreportbug
(1)等)が起動できます。設定変更は次で出来ます。
$ sudo update-alternatives --config editor
著者が"/usr/bin/vim.tiny
"より"/usr/bin/vim.basic
"を初心者に推薦するのはシンタクスハイライトをサポートしているからです。
![]() |
ティップ |
---|---|
多くのプログラムは" |
vim
(1)の挙動は"~/.vimrc
"を使ってカスタム化できます。
例えば、次を試してみて下さい:
" ------------------------------- " Local configuration " set nocompatible set nopaste set pastetoggle=<f2> syn on if $USER == "root" set nomodeline set noswapfile else set modeline set swapfile endif " filler to avoid the line above being recognized as a modeline " filler " filler
シェルコマンドの出力はスクリーンから押し出されると永久に無くなってしまうかもしれません。シェルでの活動を後で見直せるようにファイルに記録しておくのは良いことです。この種の記録は何らかのシステム管理作業をする際には非常に重要です。
シェル活動の記録の基本方法はscript
(1)の下で実行することです。
例えば、次を試してみて下さい:
$ script Script started, file is typescript
script
の下で何なりのシェルコマンドを実行します。
Ctrl-D
を押してscript
から脱出します。
$ vim typescript
「シェルの活動を綺麗に記録」を参照下さい。
基本的Unixコマンドを学びます。ここでは一般的意味で"Unix"を使っています。いかなるUnixクローンのOSも等価なコマンドを提供します。Debianシステムも例外ではありません。今一部コマンドが思うように機能しなくても心配しないで下さい。エアリアス
がシェルで使われた場合は、対応するコマンドの出力は変わります。次は順番に実行すると言う意味の例ではありません。
非特権ユーザーのアカウントから次のコマンドを全て実行します。
表1.16 基本のUnixコマンドのリスト
コマンド | 説明 |
---|---|
pwd
|
カレント/ワーキングディレクトリーの名前を表示 |
whoami
|
現在のユーザー名を表示 |
id
|
現在のユーザーのアイデンティティ(名前とuidとgidと関連するgroup)を表示 |
file <foo>
|
"<foo> "ファイルのファイルタイプを表示
|
type -p <commandname>
|
"<commandname> "コマンドのファイルの位置を表示
|
which <commandname>
|
, , |
type <commandname>
|
"<commandname> "コマンドに関する情報を表示
|
apropos <key-word>
|
"<key-word> "に関連したコマンドを発見
|
man -k <key-word>
|
, , |
whatis <commandname>
|
"<commandname> "コマンドに関する1行の説明を表示
|
man -a <commandname>
|
"<commandname> "コマンドに関する説明を表示(Unixスタイル)
|
info <commandname>
|
"<commandname> "コマンドに関する比較的長い説明を表示(GNUスタイル)
|
ls
|
ディレクトリーの内容をリスト(非ドットファイルおよびディレクトリー) |
ls -a
|
ディレクトリーの内容をリスト(全ファイルおよびディレクトリー) |
ls -A
|
ディレクトリーの内容をリスト(ほとんど全ファイルおよびディレクトリー、".. "と". "をスキップ)
|
ls -la
|
ディレクトリーの内容を詳細情報とともにリスト |
ls -lai
|
ディレクトリーの内容をinode番号と詳細情報とともにリスト |
ls -d
|
現ディレクトリーの中の全ディレクトリーをリスト |
tree
|
ファイルツリーの内容を表示 |
lsof <foo>
|
"<foo> "ファイルのオープンの状態をリスト
|
lsof -p <pid>
|
プロセスID: "<pid> "によってオープンされたファイルをリスト
|
mkdir <foo>
|
現ディレクトリー中に"<foo> "という新規ディレクトリー作成
|
rmdir <foo>
|
現ディレクトリー中の"<foo> "というディレクトリーを削除
|
cd <foo>
|
現ディレクトリー中もしくは"$CDPATH "変数中にリストされたディレクトリー中の"<foo> "というディレクトリーにディレクトリーを変更
|
cd /
|
ディレクトリーをルートディレクトリーに変更 |
cd
|
現在のユーザーのホームディレクトリーにディレクトリーを変更 |
cd /<foo>
|
絶対ディレクトリーパス"/<foo> "にディレクトリーを変更
|
cd ..
|
親ディレクトリーにディレクトリーを変更 |
cd ~<foo>
|
ユーザー"<foo> "のホームディレクトリーにディレクトリーを変更
|
cd -
|
一つ前のディレクトリーにディレクトリーを変更 |
</etc/motd pager
|
"/etc/motd "の内容をデフォールトのページャーで表示
|
touch <junkfile>
|
空ファイル"<junkfile> "を作成
|
cp <foo> <bar>
|
既存のファイル"<foo> "を新規ファイル"<bar> "にコピー
|
rm <junkfile>
|
ファイル"<junkfile> "を削除
|
mv <foo> <bar>
|
既存のファイル"<foo> "の名前を新しい名前"<bar> "に変更(ディレクトリー"<bar> "が存在不可)
|
mv <foo> <bar>
|
既存のファイル"<foo> "を新しい場所"<bar>/<foo> "に移動(ディレクトリー"<bar> "が存在しなければいけない)
|
mv <foo> <bar>/<baz>
|
既存のファイル"<foo> "を新しい場所の新しい名前のファイル"<bar>/<baz> "に移動(ディレクトリー"<bar> "が存在しなければいけないが、ディレクトリー"<bar>/<baz> "は存在してはいけない)
|
chmod 600 <foo>
|
既存のファイル"<foo> "を他人から読出し不可かつ書込み不可(全員実行不可)
|
chmod 644 <foo>
|
既存のファイル"<foo> "を他人からは読出し可だが書込み不可(全員実行不可)
|
chmod 755 <foo>
|
既存のファイル"<foo> "を他人からは読出し可だが書込み不可(全員実行可能)
|
find . -name <pattern>
|
シェルで"<pattern> "にマッチするファイル名を探索(比較的遅い)
|
locate -d . <pattern>
|
シェルで"<pattern> "にマッチするファイル名を探索(定期的に生成されるデーターベースを使い比較的早い)
|
grep -e "<pattern>" *.html
|
現ディレクトリーにある".html "で終わる全ファイルから"<pattern>"のパターンを検索し、該当する全ファイルを表示
|
top
|
フルスクリーンを用いてプロセス情報を表示し、"q "と押して終了
|
ps aux | pager
|
起動中の全プロセスの情報をBSDスタイルの出力を用いて表示 |
ps -ef | pager
|
起動中の全プロセスの情報をSystem-Vスタイルの出力を用いて表示 |
ps aux | grep -e "[e]xim4*"
|
"exim "もしくは"exim4 "の起動中の全プロセスを表示
|
ps axf | pager
|
起動中の全プロセスの情報をASCIIアート出力を用いて表示 |
kill <1234>
|
プロセスID"<1234>"により識別されるプロセスを停止 |
gzip <foo>
|
Lempel-Zivコーディング(LZ77)を用いて"<foo> "を圧縮し"<foo>.gz "を作成
|
gunzip <foo>.gz
|
"<foo>.gz "を解凍して"<foo> "を作成
|
bzip2 <foo>
|
Burrows-Wheelerブロックソートテキスト圧縮アルゴリズムとHuffmanコーディングを用いて"<foo> "を圧縮し"<foo>.bz2 "を作成(gzipより高圧縮率)
|
bunzip2 <foo>.bz2
|
"<foo>.bz2 "を解凍して"<foo> "を作成
|
tar -xvf <foo>.tar
|
"<foo>.tar "アーカイブからファイルを展開
|
tar -xvzf <foo>.tar.gz
|
gzip圧縮された"<foo>.tar.gz "アーカイブからファイルを展開
|
tar -xvf -j <foo>.tar.bz2
|
"<foo>.tar.bz2 "アーカイブからファイルを展開
|
tar -cvf <foo>.tar <bar>/
|
フォルダ"<bar>/ "の内容を"<foo>.tar "アーカイブにアーカイブ
|
tar -cvzf <foo>.tar.gz <bar>/
|
フォルダ"<bar>/ "の内容を"<foo>.tar.gz "アーカイブに圧縮アーカイブ
|
tar -cvjf <foo>.tar.bz2 <bar>/
|
フォルダ"<bar>/ "の内容を"<foo>.tar.bz2 "アーカイブに圧縮アーカイブ
|
zcat README.gz | pager
|
標準のページャーを用いて圧縮された"README.gz "の内容を表示
|
zcat README.gz > foo
|
"README.gz "の内容を解凍してファイル"foo "を作成
|
zcat README.gz >> foo
|
圧縮された
"README.gz "の内容をファイル"foo "の末尾に追加(ファイルが存在しない場合は事前に作成)
|
![]() |
注記 |
---|---|
Unixは" |
![]() |
注記 |
---|---|
|
![]() |
注記 |
---|---|
最小限のDebianシステムのデフォールトのページャーは |
![]() |
注記 |
---|---|
上記の" |
上記のコマンドを訓練として用いて、ディレクトリーを渡り歩き、システムの中を覗き込んで下さい。コンソールのコマンドに関して質問がある場合は、必ずマニュアルページを読んでみて下さい。
例えば、次を試してみて下さい:
$ man man $ man bash $ man builtins $ man grep $ man ls
マンページのスタイルは慣れるのに少々大変かもしれません。なぜなら特に比較的旧式の非常に伝統的なマンページは比較的言葉が少ないからです。しかし一旦慣れるとその簡潔さの良さが分かります。
GNUやBSD由来を含む多くのUnix的なコマンドは次のように(場合によっては一切の引数無しで)起動すると簡単なヘルプ情報を表示します。
$ <コマンド名> --help $ <コマンド名> -h
Debianシステムの使い方が少し分かったでしょう。Debianシステム上でのコマンド実行のメカニズムを掘り下げます。初心者のためにちょっと簡略化してみました。正確な説明はbash
(1)を参照下さい。
シンプルなコマンドは、次の要素のシーケンスとなります。
>
と>>
と<
と<<
等。)
&&
と||
と<改行>と;
と&
と(
と)
)
環境変数の値はUnixコマンドの挙動を変えます。
環境変数のデフォールト値はPAMシステムが初期設定されます。その後次のような何らかのアプリケーションプログラムにより再設定されているかもしれません。
gdm
のようなディスプレーマネージャーは環境変数を再設定します。
~/bash_profile
"や"~/.bashrc
"にあるシェル起動コードの中でシェルは環境変数を再設定します。
"$LANG
"変数に与えられる完全なロケール値は3つの部分からなります:"xx_YY.ZZZZ
"。
表1.17 ロケールの値の3つの部分
ロケールの値 | 意味 |
---|---|
xx
|
ISO 639言語コード(小文字)、例えば"en" |
YY
|
ISO 3166国コード(大文字)、例えば"US" |
ZZZZ
|
コードセット、常に"UTF-8"と設定 |
言語コードと国コードは"info gettext
"中の該当記述を参照下さい。
現代的なDebianシステム上では、十分な理由と必要な知見をもって歴史的なコードセットを特段希望しない限り、常にコードセットをUTF-8
と設定すべきです。
ロケールの詳細に関しては、「ロケール」を参照下さい。
![]() |
注記 |
---|---|
" |
表1.18 推奨ロケール
推奨ロケール | 言語(地域) |
---|---|
en_US.UTF-8
|
英語(米国) |
en_GB.UTF-8
|
英語(英国) |
fr_FR.UTF-8
|
フランス語(フランス) |
de_DE.UTF-8
|
ドイツ語(ドイツ) |
it_IT.UTF-8
|
イタリア語(イタリア) |
es_ES.UTF-8
|
スペイン語(スペイン) |
ca_ES.UTF-8
|
カタラン語(スペイン) |
sv_SE.UTF-8
|
スウェーデン語(スウェーデン) |
pt_BR.UTF-8
|
ポルトガル語(ブラジル) |
ru_RU.UTF-8
|
ロシア語(ロシア) |
zh_CN.UTF-8
|
中国語(中華人民共和国) |
zh_TW.UTF-8
|
中国語(台湾_R.O.C.) |
ja_JP.UTF-8
|
日本語(日本) |
ko_KR.UTF-8
|
韓国語(大韓民国) |
vi_VN.UTF-8
|
ベトナム語(ベトナム) |
典型的なコマンドの実行は次のようなシェルの行シーケンスを用います。
$ date Sun Jun 3 10:27:39 JST 2007 $ LANG=fr_FR.UTF-8 date dimanche 3 juin 2007, 10:27:33 (UTC+0900)
以上で、date
(1)プログラムは異なる環境変数"$LANG
"値で実行されます。
ほとんどのコマンド実行は頭に環境変数定義をつけないのが普通です。上記の例の代わりに次のように実行します。
$ LANG=fr_FR.UTF-8 $ date dimanche 3 juin 2007, 10:27:33 (UTC+0900)
ここで確認できるように、コマンドの出力は環境変数に影響されフランス語の出力となっています。もし環境変数を(例えばシェルスクリプトを呼んでいて)サブプロセスに引き継ぎたい際には、次のように環境変数をexport(エクスポート)しなければいけません。
$ export LANG
![]() |
ティップ |
---|---|
バグ報告をする際には、非英語環境を使っているなら、プログラムを" |
"$LANG
"とこれに関連した環境変数に関しては、locale
(5)とlocale
(7)を参照下さい。
![]() |
注記 |
---|---|
特段必要がなければ" |
シェルにコマンドを打ち込んだ際に、シェルは"$PATH
"環境変数にリストされたディレクトリーのリストから検索します。"$PATH
"環境変数の値は、シェルの検索パスとも呼ばれます。
標準のDebianインストールでは、ユーザーアカウントの"$PATH
"環境変数には"/sbin
"や"/usr/sbin
"が含まれないかもしれません。例えば、ifconfig
コマンドは"/sbin/ifconfig
"とフルパスを使って実行する必要があります。(類似のip
コマンドは"/bin
"にあります。)
Bashシェルの"$PATH
"環境変数は、"~/.bash_profile
"か"~/.bashrc
"ファイルで変更できます。
多くのコマンドはユーザー特定の設定をホームディレクトリーに保存し、その内容でコマンドの挙動が変わります。ホームディレクトリーは"$HOME
"環境変数で指定されます。
表1.19 "$HOME
"の値のリスト
"$HOME "の値
|
プログラム実行状況 |
---|---|
/
|
initプロセスが実行するプログラム(デーモン) |
/root
|
通常のrootシェルから実行されるプログラム |
/home/<normal_user>
|
通常のユーザーシェルから実行されるプログラム |
/home/<normal_user>
|
通常のユーザーのGUIデスクトップメニューから実行されるプログラム |
/home/<normal_user>
|
"sudo program "を用いてrootとして実行されるプログラム
|
/root
|
"sudo -H program "を用いてrootとして実行されるプログラム
|
![]() |
ティップ |
---|---|
シェルは、" |
プログラムコマンドによっては引数があります。引数は"-
"か"--
"で始まり、オプションと呼ばれ、コマンドの挙動をコントロールします。
$ date Mon Oct 27 23:02:09 CET 2003 $ date -R Mon, 27 Oct 2003 23:02:40 +0100
上記で、コマンドライン引数"-R
"がdate
(1)の挙動をRFC2822準拠の日付文字列出力と変えています。
ファイル名を全てタイプせずにファイルのグループをコマンド処理したいことがよくあります。シェルのグロブ(ワイルドカードとも時々呼ばれる)を用いたファイル名のパターン展開を用いるとこのニーズに答えられます。
表1.20 シェルグロブパターン
シェルグロブパターン | マッチルールの説明 |
---|---|
*
|
". "で始まらないファイル(部分)名
|
.*
|
". "で始まるファイル(部分)名
|
?
|
1文字 |
[…]
|
括弧中の1文字 |
[a-z]
|
"a "と"z "の範囲間の1文字
|
[^…]
|
括弧内( "^ "以外)に含まれる文字以外の1文字
|
例えば、次を試してみて下さい:
$ mkdir junk; cd junk; touch 1.txt 2.txt 3.c 4.h .5.txt ..6.txt $ echo *.txt 1.txt 2.txt $ echo * 1.txt 2.txt 3.c 4.h $ echo *.[hc] 3.c 4.h $ echo .* . .. .5.txt ..6.txt $ echo .*[^.]* .5.txt ..6.txt $ echo [^1-3]* 4.h $ cd ..; rm -rf junk
glob
(7)を参照下さい。
![]() |
注記 |
---|---|
通常のシェルのファイル名の展開と違い、 |
![]() |
注記 |
---|---|
BASHはshopt組み込みオプションで" |
各コマンドは終了ステータスを戻り値(変数:"$?
")として返します。
例えば、次を試してみて下さい。
$ [ 1 = 1 ] ; echo $? 0 $ [ 1 = 2 ] ; echo $? 1
![]() |
注記 |
---|---|
シェルの論理的な観点では、成功は、0(ゼロ)の値を持つ論理的真として扱われることに注意して下さい。少々これは非直感的なのでここで再確認する必要があります。 |
次に挙げるシェルコマンドの一部として一行でタイプするシェルコマンドの慣用句を覚えましょう。
表1.22 シェルコマンドの慣用句
コマンドの慣用句 | 説明 |
---|---|
command &
|
command をサブシェル中でバックグラウンド実行
|
command1 | command2
|
command1 の標準出力をcommand2 の標準入力にパイプ(同時並行で実行)
|
command1 2>&1 | command2
|
command1 の標準出力と標準エラー出力をcommand2 の標準入力にパイプ(同時進行で実行)
|
command1 ; command2
|
command1 を実行し、後に続いてcommand2 を実行
|
command1 && command2
|
command1 を実行; もし成功したら、後に続いてcommand2 を実行(command1 とcommand2 の両方が成功したら、正常終了を返す)
|
command1 || command2
|
command1 を実行; もし成功しなかったら、後に続いてcommand2 を実行(command1
か
command2 のどちらかが成功したら、正常終了を返す)
|
command > foo
|
command の標準出力をfoo ファイルにリダイレクト (上書き)
|
command 2> foo
|
command の標準エラー出力をfoo ファイルにリダイレクト (上書き)
|
command >> foo
|
command の標準出力をfoo ファイルにリダイレクト (追記)
|
command 2>> foo
|
command の標準エラー出力をfoo ファイルにリダイレクト (追記)
|
command > foo 2>&1
|
command の標準出力と標準エラー出力をfoo ファイルにリダイレクト
|
command < foo
|
command の標準入力をfoo ファイルからリダイレクト
|
command << delimiter
|
command の標準入力を"delimiter "に出会うまでのこれに続く行からリダイレクト(ヒアドキュメント)
|
command <<- delimiter
|
command の標準入力を"delimiter "に出会うまでのこれに続く行からリダイレクト(ヒアドキュメント、行頭のタブ文字は入力から削除)
|
Debianシステムはマルチタスクシステムです。バックグラウンドジョブを使うと単一シェルの下で複数プログラムを実行可能にします。バックグラウンドジョブの管理にはシェル内部組み込みコマンドのjobs
やfg
やbg
やkill
を使います。bash(1)マンページ中の"SIGNALS"と"JOB
CONTROL"セクションやbuiltins
(1)を参照下さい。
例えば、次を試してみて下さい:
$ </etc/motd pager
$ pager </etc/motd
$ pager /etc/motd
$ cat /etc/motd | pager
4つ全ての例が全く同じ表示をしますが、最後の例は余計なcat
コマンドを実行するので理由なくリソースの無駄遣いをします。
シェルではexec
組み込みコマンドを任意のファイルディスクリプタとともに使いファイルをオープンすることができます。
$ echo Hello >foo $ exec 3<foo 4>bar # open files $ cat <&3 >&4 # redirect stdin to 3, stdout to 4 $ exec 3<&- 4>&- # close files $ cat bar Hello
上記で、"n<&-
"と"n>&-
"
はファイルディスクリプタ"n
"をクローズするという意味です。
ファイルデスクリプタの0-2は事前定義されています。
良く使うコマンドにエイリアスを設定できます。
例えば、次を試してみて下さい:
$ alias la='ls -la'
こうすると、"la
"が"ls
-la
"の短縮形として機能し、全てのファイルを長いリスト形式でリストします。
既存のエリアスはalias
でリストできます(bash
(1)の"SHELL
BUILTIN COMMANDS"参照)。
$ alias ... alias la='ls -la'
type
内部コマンドを使うと正確なパスやコマンドの正体を識別できます(bash
(1)の"SHELL
BUILTIN COMMANDS"下参照)。
例えば、次を試してみて下さい:
$ type ls ls is hashed (/bin/ls) $ type la la is aliased to ls -la $ type echo echo is a shell builtin $ type file file is /usr/bin/file
上記で、ls
は最近探索されましたが"file
"
は最近探索されていませので、"ls
"は"ハッシュされた"つまりシェルには"ls
"コマンドの場所を高速アクセスのために内部記録していると表示されます。
![]() |
ティップ |
---|---|
「着色化されたコマンド」を参照下さい。 |
Unix的作業環境では、テキスト処理はテキストを標準テキスト処理ツールの連鎖パイプを通す行います。これは決定的なUnixの発明です。
Unix的システムでしばしば使われる標準テキスト処理ツールがいくつかあります。
正規表現無使用:
cat
(1)はファイルをつなぎ合わせ全てを出力します。
tac
(1)はファイルをつなぎ合わせ逆順で出力します。
cut
(1)は行の一部を選択し出力します。
head
(1)はファイルの最初の部分を選択し出力します。
tail
(1)はファイルの最後の部分を選択し出力します。
sort
(1)は行を順番に並び替えます。
uniq
(1)は順番に並べられたファイルから重複行を削除します。
tr
(1)は文字を変換削除します。
diff
(1)は1行ごとにファイルを比較します。
基本正規表現(BRE)使用:
egrep
(1)はテキストのパターンマッチをします。
ed
(1)は原始的な行エディター。
sed
(1)はストリームエディター。
vim
(1)はスクリーンエディター。
emacs
(1)はスクリーンエディター。(ちょっと拡張されたBRE)
拡張正規表現(ERE)使用:
egrep
(1)はテキストのパターンマッチをします。
awk
(1)は単純なテキスト処理をします。
tcl
(3tcl)は考え得る全てのテキスト処理をします:re_syntax
(3)。時々tk
(3tk)とともに使用されます。
perl
(1)は考え得る全てのテキスト処理をします。perlre
(1).
pcregrep
パッケージのpcregrep
(1)
はテキストのパターンマッチをPerl互換正規表現(PCRE)パターンを使ってします。
re
モジュールとともに使うことでpython
(1)は考え得る全てのテキスト処理をします。"/usr/share/doc/python/html/index.html
"を参照下さい。
もしこれらのコマンドが正確にどう動作するかを確認したいなら、"man
command
"を使って自分で見つけましょう。
![]() |
注記 |
---|---|
ソート順や範囲表現はロケールに依存します。コマンドの伝統的挙動を得たい際には、" |
![]() |
注記 |
---|---|
Perl正規表現( |
正規表現は多くのテキスト処理ツールで使われています。シェルグロブに類似していますがより複雑で強力です。
正規表現はマッチするパターンを表現し、テキスト文字とメタ文字からなっています。
メタ文字は特別な意味を持った文字です。上記のようにテキストツールによって、BREとEREの2つの主要なスタイルがあります。
表1.24 BREとEREのメタ文字
BRE | ERE | 正規表現の説明 |
---|---|---|
\ . [ ] ^ $ *
|
\ . [ ] ^ $ *
|
共通のメタ文字 |
\+ \? \( \) \{ \} \|
|
"\ "でエスケープされた、BREのみで用いるメタ文字
|
|
+ ? ( ) { } |
|
"\ "でエスケープされ無い、EREのみで用いるメタ文字
|
|
c
|
c
|
非メタ文字 "c "にマッチ
|
\c
|
\c
|
c "自身がメタ文字でも"c "というそのままの文字とマッチ
|
.
|
.
|
改行を含めた如何なる文字ともマッチ |
^
|
^
|
文字列の最初とマッチ |
$
|
$
|
文字列の最後とマッチ |
\<
|
\<
|
単語先頭とマッチ |
\>
|
\>
|
単語末尾とマッチ |
\[abc…\]
|
[abc…]
|
"abc… "のいずれかの文字にマッチ
|
\[^abc…\]
|
[^abc…]
|
"abc… "以外の文字にマッチ
|
r*
|
r*
|
"r "という正規表現の0回以上にマッチ
|
r\+
|
r+
|
"r "という正規表現の1回以上にマッチ
|
r\?
|
r?
|
"r "という正規表現の0回か1回にマッチ
|
r1\|r2
|
r1|r2
|
"r1 "か"r2 "という正規表現のいずれかにマッチ
|
\(r1\|r2\)
|
(r1|r2)
|
"r1 "か"r2 "という正規表現のいずれかにマッチし、それを括弧で囲まれた正規表現と見なす
|
emacs
の正規表現は、ERE同様の"+
"と"?
"をメタ文字と扱う拡張をしてはありますが、基本的にBREです。これら文字をemacs
の正規表現で"\
"でエスケープする必要はありません。
grep
(1)をつかうと正規表現を使って文字列探索ができます。
例えば、次を試してみて下さい:
$ egrep 'GNU.*LICENSE|Yoyodyne' /usr/share/common-licenses/GPL GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE Yoyodyne, Inc., hereby disclaims all copyright interest in the program
![]() |
ティップ |
---|---|
「着色化されたコマンド」を参照下さい。 |
置換式の場合、一部の文字に特別な意味があります
Perlの置換式では、"\n
"の代わりに"$n
"をつかい、"&
"には特段の意味はありません。
例えば、次を試してみて下さい:
$ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/=&=/' zzz=1abc2efg3hij4= $ echo zzz1abc2efg3hij4 | \ sed -e 's/\(1[a-z]*\)[0-9]*\(.*\)$/\2===\1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/$2===$1/' zzzefg3hij4===1abc $ echo zzz1abc2efg3hij4 | \ perl -pe 's/(1[a-z]*)[0-9]*(.*)$/=&=/' zzz=&=
ここで、括弧で囲まれた正規表現のスタイルと、マッチした文字列が異なるツール上でテキスト置換処理にどう使われるかとに注目下さい。
これらの正規表現は一部エディター内でカーソールの動きやテキスト置換アクションに対しても使えます。
シェルコマンドラインの行末のバックスラッシュ"\
"は改行をホワイトスペース文字としてエスケープするので、シェルコマンドライン入力を次行に継続させます。
これらのコマンドを習うために、関連するマニュアルページを全て読んで下さい。
ed
(1)コマンドは次のようにすると"file
"中に存在する全ての"FROM_REGEX
"を"TO_TEXT
"で置換できます。
$ ed file <<EOF ,s/FROM_REGEX/TO_TEXT/g w q EOF
sed
(1)コマンドは次のようにすると"file
"中に存在する全ての"FROM_REGEX
"を"TO_TEXT
"で置換できます。
$ sed file 's/FROM_REGEX/TO_TEXT/g' | sponge file
![]() |
ティップ |
---|---|
|
vim
(1)コマンドはex
(1)コマンドを使い次のようにすると"file
"中に存在する全ての"FROM_REGEX
"を"TO_TEXT
"で置換できます。
$ vim '+%s/FROM_REGEX/TO_TEXT/gc' '+w' '+q' file
![]() |
ティップ |
---|---|
上記の" |
複数ファイル("file1
"と"file2
"と"file3
")をvim
(1)やperl
(1)で同様に正規表現を用いて処理できます。
$ vim '+argdo %s/FROM_REGEX/TO_TEXT/ge|update' '+q' file1 file2 file3
![]() |
ティップ |
---|---|
上記の" |
$ perl -i -p -e 's/FROM_REGEX/TO_TEXT/g;' file1 file2 file3
perl(1)の例中で、"-i
"はその場での編集、"-p
"はファイルに関する暗黙的なループを意味します。
![]() |
ティップ |
---|---|
" |
![]() |
注記 |
---|---|
|
2004年以前の元Debianリーダの名前と就任日がスペースで分割されたフォーマットでリストされている"DPL
"と呼ばれるファイルを考えてみましょう。
Ian Murdock August 1993 Bruce Perens April 1996 Ian Jackson January 1998 Wichert Akkerman January 1999 Ben Collins April 2001 Bdale Garbee April 2002 Martin Michlmayr March 2003
![]() |
ティップ |
---|---|
最新のDebianのリーダーの歴史に関しては、"A Brief History of Debian"を参照下さい。 |
Awkはこういったタイプのファイルからデーターを抽出するために良く使われます。
例えば、次を試してみて下さい:
$ awk '{ print $3 }' <DPL # month started August April January January April April March $ awk '($1=="Ian") { print }' <DPL # DPL called Ian Ian Murdock August 1993 Ian Jackson January 1998 $ awk '($2=="Perens") { print $3,$4 }' <DPL # When Perens started April 1996
Bash などのシェルもこれらのファイルを解釈するのに使えます。
例えば、次を試してみて下さい:
$ while read first last month year; do echo $month done <DPL ... 最初のAwk例と同じ出力
ここで、read
組込みコマンドは"$IFS
"(内部フィールドセパレータ)
を用いて行を単語単位で分割します。
"$IFS
"を":
"に変更すると、"/etc/passwd
"をシェルでうまく解読できます。
$ oldIFS="$IFS" # save old value $ IFS=':' $ while read user password uid gid rest_of_line; do if [ "$user" = "bozo" ]; then echo "$user's ID is $uid" fi done < /etc/passwd bozo's ID is 1000 $ IFS="$oldIFS" # restore old value
(同じことを Awk を使って行うには、フィールドセパレータ設定は"FS=':'
"とします。)
IFSはパラメーター展開、コマンド置換、数式展開の結果を分割するためにもシェルにより使われます。これはダブルクォートやシングルクォートされた単語内では発生しません。IFSの標準値は<space>と<tab>と<newline>の組合せです。
シェルのIFSトリックを注意深く使って下さい。シェルがスクリプトの一部を入力として解釈した場合に、奇妙なことが起きるかもしれません。
$ IFS=":," # use ":" and "," as IFS $ echo IFS=$IFS, IFS="$IFS" # echo is a Bash builtin IFS= , IFS=:, $ date -R # just a command output Sat, 23 Aug 2003 08:30:15 +0200 $ echo $(date -R) # sub shell --> input to main shell Sat 23 Aug 2003 08 30 36 +0200 $ unset IFS # reset IFS to the default $ echo $(date -R) Sat, 23 Aug 2003 08:30:50 +0200
次のスクリプトはパイプの一部として素晴らしいことをします。
表1.26 コマンドをパイプするためのスクリプト断片
スクリプト断片(1行入力) | コマンドの効果 |
---|---|
find /usr -print
|
"/usr "の下の全ファイル発見
|
seq 1 100
|
1から100までプリント |
| xargs -n 1 <command>
|
パイプからの各項目を引数としてコマンドを反復実行 |
| xargs -n 1 echo
|
パイプからのホワイトスペースで分離された項目を行に分割 |
| xargs echo
|
パイプからの全ての行を1行にマージ |
| grep -e <regex_pattern>
|
<regex_pattern>を含む行を抽出 |
| grep -v -e <regex_pattern>
|
<regex_pattern>を含まない行を抽出 |
| cut -d: -f3 -
|
": "で区切られた3番目のフィールドを抽出(passwdファイルなど)
|
| awk '{ print $3 }'
|
ホワイトスペースで区切られた3番目のフィールドを抽出 |
| awk -F'\t' '{ print $3 }'
|
タブで区切られた3番目のフィールドを抽出 |
| col -bx
|
バックスペースを削除し、タブをスベースに変換 |
| expand -
|
タブをスベースに変換 |
| sort| uniq
|
入力をソートし重複箇所を削除 |
| tr 'A-Z' 'a-z'
|
大文字を小文字に変換 |
| tr -d '\n'
|
複数行を1行に連結 |
| tr -d '\r'
|
キャリッジリターンを削除 |
| sed 's/^/# /'
|
各行頭に"# "を追加
|
| sed 's/\.ext//g'
|
".ext "を削除
|
| sed -n -e 2p
|
2番目の行を表示 |
| head -n 2 -
|
最初の2行を表示 |
| tail -n 2 -
|
最後の2行を表示 |
1行のシェルスクリプトはfind
(1)やxargs
(1)を使って非常に複雑な操作を多くのファイルに繰り返し実行できます。「ファイル選択の慣用句」と「ファイルに関してループしながらコマンドを反復実行」を参照下さい。
シェルの対話モードを使うのが複雑過ぎるようになったときには、シェルのスクリプトを書くのも一計です(「シェルスクリプト」参照)。