ターミナルを使って効率的な作業をする


シェル

シェルは、unixの核となる「カーネル」を貝殻のように覆うので、そのような名前になっています。シェルと言ってもいくつか種類があります。
  • sh系
bsh(shとも言われる。Bourne Shellなので区別しやすいようにbshと書くことがある)、bash、zsh等がsh系に属しています。ubuntuのデフォルトはbashになっています。
  • csh系
csh、tcsh等がcsh系に属しています。ただし、sh系と構文が大きく違うことや、unix(linux)の管理レベルではbshが多用されることから、このページではcsh系については触れません。
  • コマンドライン
windowsで使われるシェルです。unixのシェルとは大きくコマンドが異なっています。スタートメニューからの「ファイル名を指定して実行」ウインドウでcmdやcommand(旧式)を入力することにより使うことができます。説明ではcmdを使います。Windows PowerShellというのも存在しています。
※Windows用の説明ページは容量の関係でターミナルを使って効率的な作業をする(windows)に移行しました。
  • GUI(グラフィカルユーザインタフェース)を持つもの
unixやlinuxではnautilusやKonqueror、windowsではWindows Explorerやプログラムマネージャ(windows3.1等の古いバージョンのwindowsに付属)、Mac OSではFinderが属しています。
  • その他
rshやssh等があるが、これはunixやlinuxでリモートホストでコマンドを実行する場合に使います。


とりあえず使ってみましょう(ubuntu向け)

準備をしましょう

この準備をする際は、最後までやり通してください。

強力なシェルに触れる

これから使われるシェルは、sh系の中で非常にたくさんの機能が盛り込まれているzshです。bashやbshでもよいのですが、zshがあることが分かっているのです、使わないわけにはいきません。そのような経緯でzshを選びました。


インストールをする

Ubuntuには、通常、zshがインストールされていませんから、インストールをしなければなりません。その手順を以下に示しましょう。

1.アプリケーション→アクセサリ→端末 から、gnome-terminalを開きます。
2.以下のコマンドを端末にコピー&ペーストしましょう。端末上では右クリックが使えます。
sudo apt-get update && sudo apt-get install zsh
3.Enterキーを押します。パスワードが求められるのでパスワードを入力します。
4.$ のあとに点滅しているのが見えれば、zshのインストールは完了です。

unixやlinuxの端末上では、セキュリティに配慮して、パスワード入力時の*は非表示にすることにしています。*が表示されれば、パスワードの文字数が分かってしまうからです。


ログインシェルにする

あなたが今使っているシェルはbashです。端末を起動するとbashが起動します。この状態のことを「ログインシェルがbashである」と表現します。zshをログインシェルにしたいのであれば、

  1. chshを端末に入力し、Enterキーを押します。
  2. Password: の後に続いてパスワードを入力します。
  3. Login Shell [/bin/bash]: に続いて /bin/zsh と入力します。Enterキーを押します。

これでzshがログインシェルになりました。

(注)ほかのOSやディストリビューション、例えばOpensolarisなど、では passwd -e でログインシェルを変更するものもあります。


最後にzshの設定ファイルを導入

ここからファイルをダウンロードします。ホームディレクトリに置いてください。保存するファイル名はそのままのzshfiles.tar.gzとしてください。


次に以下のコマンドを端末にコピペしましょう。
tar xvf zshfiles.tar.gz
Enterキーを押します。

ここまでくればzshの導入は完了です。端末を閉じるために exit と入力します。

確認のために、もう一度端末を起動します。

andryk ~ 
 $                                                      [1]01/06/11, 21:57:41

大体この様な表示になっていると思います。andrykは人によって異なります(以下同)。

これ以降、<TAB>と表示されていればTABキーを、<CTRL>と表示されて入ればCtrlキーを、<Shift>と表示されていればShiftキーを、<ALT>と表示されていれば<ALT>キーを押してください。また、<ALT>+<CTRL>+c では、AltキーとCtrlキーとc を一緒に押すということを表しています。

こうなれば、zshの導入は成功しています。これでもよいですが、少しだけzshの挙動を高速化しましょう。
以下のように、$ に続いて、zcと入力し、TABキーを押します。それ以外は操作しないでください。

sc1.png

andryk ~ 
 $ zc<TAB>                                                 [1]01/06/11, 21:57:41
Completing external command
zcat   zcmp 
Completing builtin command
zcompile
Completing shell function
zcompile_all

下にメニューが出てきたかと思います。さあ、zshの機能の1つに直面しました。ですが、これについては追々説明するので、とりあえずこの機能を使っていただきましょう。もう一度TABキーを押します。
するとどうでしょうか?

sc2.png

上の画像ではメニュー中のzcatが選択されました。この状態で再びTABキーを押したり方向キーを押したりしてzcompile_allを選択して、Enterキーを押します。再びEnterキーを押します。
それから、次のコマンドを実行して、先ほど実行したものが成功しているかどうか確認します。

 $ ls .zsh*.zwc | wc -l 

以降、「コマンドを実行する」というのは、$ の後に続いて指定された文を入力し、Enterキーを押すことを意味します。上の例では、端末上にある $ に続いて ls .zsh*.zwc | wc -l を入力すればよいのです。

sc3.png

一行下にある 2 と言う数字が出力されていればよいです。もし、異なった数字が出るのであれば、もう一度この「最後にzshの設定ファイルを導入」のセクションをやり直してください。


コマンドの基礎

ターミナルに表示されている情報を把握する

zsh_terminal_prompt.jpg
zshには左プロンプトと右プロンプトというのがあります。
  • 左プロンプト
左プロンプトは2段表示になっています。
1段目は

ログインしているユーザー名 カレントディレクトリ

と表示されています。

2段目だけは $ だけです。ほとんどのシェルでデフォルトの設定で $ や # や % 等の後に続いてコマンドを書くことになっています。色はターミナルの設定により変わります。

  • 右プロンプト
右プロンプトは、

[現在の履歴の数]月/日/年, 時:分:秒

です。
日時はその行が表示されたときの時間です。履歴については後で述べます。この履歴の数が異なっていたりしても気にしないでください。
この右プロンプトは優秀で、$ の後に続いてコマンドを入力していって右プロンプトに到達したときに自動的に消えてくれます。これは後でコマンドを使うようになったときに試してみましょう。


mkdirコマンド - ディレクトリを作成する

これから作業するにあたってディレクトリを作成します。
カレントディレクトリが ~ になっていますか?そうでなければ $ に続いて ~ だけを入力してEnterキーを押してください。

ディレクトリの作成は簡単です。以下の画像のように $ に続いて入力し、Enterキーを押します。間違えないように落ち着いて作業しましょう。

mkdir_moezlec.png
mkdir_moezlec1.png

これでディレクトリの作成は終了です。
以降、このディレクトリ作成の作業を、「mkdir moezlec を実行する」と書きます。コマンドが変わっても同様の表記をします。


ターミナル上の矢印キー(↑↓→←)の役割

↑を押すと1つ前の履歴を呼び出すことができます。これは一番最初の履歴に戻るまで押せます。
↓を押すと1つ後の履歴を呼び出すことができます。一番最後の履歴でもう一度↓を押すと、現在の状態に戻せます。例えば abc を入力しておいて↑を押し、もう一度↓を押すと abc に戻ります。
←や→は(点滅している)カーソルを1文字分左や右に移動します。


引数

引数(ひきすうと読む)は難しい用語ではありません。先ほどの mkdir moezlec で考えて見ましょう。第0引数はmkdir、第1引数はmoezlecとなるように、スペースで区切って最初から数えればよいだけです。


manコマンド、run-helpコマンド - コマンドの使用方法を確認する

ここではすでにmkdirコマンドが出てきていますが、なれないうちはコマンドの使用法、そのコマンドが何をするのかなどといったことはすぐに思い出せないでしょう。そこで役に立つのがmanまたはrun-helpコマンドです。zshではrun-helpコマンドが多様されますが、その理由は後ほど見ていただくとして、実際にそのコマンドを使ってみましょう。使用方法は簡単です。manまたはrun-helpコマンドに調べたいコマンドを引数に渡して実行するだけです。1つ使用例を書きます。

$ run-help man mkdir

ページの移動にはp、q、f、<Ctrl>+k、<Ctrl>+j、スペース、矢印キーなどを使います。hを押すことによってページ移動や検索などのマニュアルを読むことができます。
一部のマニュアルが英語で書いてあって驚く人もいるかもしれませんが、日本語化ができます。sudo apt-get update && sudo apt-get install manpages-ja を実行すればマニュアルは日本語になります。


cdコマンド - ディレクトリ移動

zshのディレクトリ移動方法には2通りあります。
  1. cdコマンドを使う
  2. ディレクトリ名をあたかもコマンドのように実行する

まずは1番目の方法です。moezlecディレクトリに移動するには cd moezlec を実行するだけです。左プロンプトに表示されているカレントディレクトリが ~/moezlec に置き換わって表示されます。
2番目の方法です。もし、1番目を実行されているのならば cd -0 を実行して、カレントディレクトリを ~ に戻してください。さて、ディレクトリ名だけを実行させてみましょう。moezlec/ または moezlec を実行してみます。これはzshの機能の1つで、第0引数で扱える補完内容が "Completing executable file or directory"(=実行ファイルかディレクトリの補完) または "Completing suffix alias" になっています。

"Completing suffix alias" の説明はここではしません。これは後ほどにします。

注意点をあげておきます。cdコマンドをまったく使わないわけではありません。「ホームディレクトリに移動してmoezlecディレクトリに移動」というのを2,3回繰り返してください。よろしいでしょうか。そこで cd -<Tab> または cd +<Tab> 。そこにはあなたのディレクトリ移動の履歴のようなものが補完内容として出てきます。この履歴はディレクトリスタックと呼ばれます。難しい理論は抜きにして、例を使ってご説明します。

$ cd -0                                               [1300]02/11/11, 15:46:37
Completing directory stack
0 -- /home/andryk/moezlec
1 -- /home/andryk
2 -- /home/andryk/moezlec
3 -- /home/andryk

上で示した状態で、cd -0 を実行すれば /home/andryk/moezlec に移動、cd -1 であれば /home/andryk に、といった具合です。cd +0 などでも意味は一緒ですが、- と + では表示する順番が逆になります。これは、これから出てくる - と + の両方を引数に扱えるコマンドで同じことが言えるので覚えておいてください。

ところで、ディレクトリ移動をした際に、ディレクトリ移動先で ls コマンドが自動的に実行されていることに気づいたでしょうか?これはzshの設定ファイルにcdコマンドの後にlsを実行しなさい、という記述がなされているからです。設定を書き換えればlsコマンド以外も実行できます。この設定も後で扱います。


zshで多用されるショートカットキー

このセクションを説明するにあたって、前準備が必要になるので、以下にかかれたコマンドを正確な順で実行していってください。touchコマンドは後で扱いますので、今のところは何も気にせずにやってください。以下はtouchに与えられた引数と同じ名前で空のファイルを作成しています。カレントディレクトリが ~/moezlec でなければ、~/moezlec ディレクトリに移動してください。

touch aa.txt
touch am.txt
touch ad.txt
touch ga.txt
touch br.txt

history -n -5 を実行して、上と同じになれば間違いがありません。もし間違えたなら、rm -f *.txt を実行したのちに、もう一度最初からやり直してください。これは履歴を実行した順に出力したものなので、のちの作業でこの出力を参照しつつ行うとよいと思います。

  • ちょっと便利に履歴をたどる
さあ、ちょっと前に矢印キーを使った前の履歴、後の履歴の参照についてご説明しました。しかし、この参照方法では、「前に使ったtouchコマンドはどんなものか」、「前に使った、cから始まるコマンドは何だろうか」などといった参照はできません。ここでその履歴の参照を解決するのが<Ctrl>+nと<Ctrl>+pです。
touch br.txt をターミナル上に打ちます。Enterキーは押しません。ここで br.txt のbの上に←→キーでカーソルを合わせ、<Ctrl>+pを押します。すると1つ前の履歴の touch ga.txt になります。touch aa.txt になるまで何度か<Ctrl>+pを押してください。
次に、→キーを一回だけ押して、aa.txt の2文字目のaの上にカーソルを合わせます。そこで<Ctrl>+nを2度押します。今表示されているのは touch ad.txt です。そこでもう一度<Ctrl>+nを押します。
何も変わらないことに驚きましたか?touch ga.txt になってもよさそうですが。
そろそろこの2つのショートカットキーの種明かしをしましょう。「今カーソルがあっている一つ前までの文字と同じものを調べて、前か後ろのコマンド履歴を参照する」。分かりにくいですか?
touch ad.txt のときに、ad.txt のdにカーソルがあるので、<Ctrl>+nで次に参照しようとするコマンドは touch a で始まるコマンドなのですが、あいにく最後の2つはそれで始まっていない。つまり touch a で始まる履歴では touch ad.txt が最後の履歴となるのです。
もし、上の履歴の直後にtouchだけ(スペースを含めない)で実行した場合、touch br.txt のbにカーソルを合わせて<Ctrl>+nを押してもtouchには変わりません。"touch " (touch のあとに1文字のスペースを含んでいる)の最後の履歴が touch br.txt だからです。
pやnはそれぞれpreviousやnextで覚えるといいでしょう。

  • コマンドの履歴を検索
<Ctrl>+rを押します。検索して満足した結果が出ればそのままEnterキーで実行されます。検索をキャンセルするには<Ctrl>+cを使います。

  • ←→キーの代替
→キーの代わりは<Ctrl>+fになります。また、←キーの代わりは<Ctrl>+bになります。
fやbはforwardやbackwardで覚えるといいでしょう。

  • カーソルにある1文字を消す
<Ctrl>+dです。

  • 単語ごとの削除
<Ctrl>+wです。

  • カーソルとカーソル以降にある文字を消す
<Ctrl>+kです。

  • カーソルを先頭に戻す
<Ctrl>+aです。

  • カーソルを文末に移動させる
<Ctrl>+eです。

  • run-helpコマンドを実行
$ cd の状態で<Esc>+hを押すと $ run-help cd が実行されます。

  • 今入力している内容を次に実行する
cd moezlec を実行しようとしたがmoezlecを作成し忘れたので今すぐに mkdir moezlec を実行したい、というときに有効です。
<Esc>+qを押すと cd moezlec が消えて新しくコマンドを書くことができます。そしてそのコマンドを実行後に cd moezlec が出てきます。

  • 画面をクリアする
画面をクリアしてターミナルを起動直後のようにするには<Ctrl>+lを押します。clearコマンドを使ってもよいです。

  • プログラムを強制終了する
<Ctrl>+cです。これは通常コピーとして扱われますが、gnome-terminal上では <Ctrl>+<Shift>+C がコピーになっています。これに少しだけ近いもので<Ctrl>+zがありますが、これはもう少し知識が必要なので後ほどにします。

  • 画面の出力を止める、再開する
$ for i in {1..100} ; do ;
for% echo -n `date`\r
for% sleep 1
for% ; done
上は時計のように使える文ですが、上を実行中に出力を停止するには<Ctrl>+sを、再開には<Ctrl>+qを押します。

  • 文字列の削除を取りやめる
<Ctrl>+_です。

他にもたくさんありますが、ここには書ききれません。そこで bindkey -L を実行します。ショートカットキーの一覧が表示されます。^aとあれば<Ctrl>+a、^[aとあれば<Esc>+aです。

Emacsユーザはもうお気づきかもしれません。これらはzshがemacsのキーバインドで実行されているからです。vi風にもできます。その設定方法は後ほどご説明いたします。

このようなページを参照してもよいでしょう。


lsコマンド - ディレクトリやファイルの一覧を表示する

さきほど、touchコマンドを数回実行していただいてファイルを作成しました。これらのファイルが今のディレクトリにあるかどうかを確認したければ ls コマンドを使います。ls を実行してみてください。
ディレクトリには最後に/がついて表示されています。 ./ や ../ となっているのは . がカレントディレクトリ、.. が1つ上のディレクトリを示しているからです。~/moezlec/ の1つ上のディレクトリは ~ になります。逆に言うと、~/moezlec/ は ~ の1つ下のディレクトリです。
ところで、この ls コマンドは引数をとることができます。以下にどんな引数をとることが出きるのか示します。

  • ディレクトリ名
ls ~ とすれば、ホームディレクトリのファイルやディレクトリの一覧が表示されます。

  • ファイル名
~/moezlec/がカレントディレクトリの状態で ls aa.txt を実行すれば aa.txt という出力が得られますが、これだけではあまり実行する意味が無いように見えます。代わりに ls -l aa.txt を実行してみてください。
-rw-r--r-- 1 andryk andryk 0 2011-02-11 16:17 aa.txt
前々から書いているようにandrykの部分は人によって変わります。
さあ、新しく -l が加わって実行されたことによって出力結果が変わりました。-l はオプションと呼ばれます。これはコマンドの便利屋で、ハイフンに続けて文字を書くだけで実行内容が大なり小なり変わります。
上の結果を左から順に説明していきましょう。
まずは-rw-r--r--です。最初の-は、ディレクトリであったり、シンボリックリンクであったりするとそれぞれd、lと表示されるようになります。残りの9文字はパーミッションを示すのですが、パーミッションについての説明は少し長いので以下のページに委ねることにします。
次の1はハードリンクの数なのですが、これはlnコマンドを紹介する時に出てくる話なので今は気を留める必要はありません。
次の2つのandrykはそれぞれ所有者、グループとなっています。
次の0はファイルサイズです。touchコマンドで空のファイルを作ったので、今回は0になっています。
2011-02-11 16:17は最後に編集した時刻です。-cや-uオプションでこの時刻を別の時刻の表示にすることができます。
最後はファイル名です。
ls -<Tab>でどんなオプションがあるのか参照できます。もちろん、lsをrun-helpコマンドで調べてもよいでしょう。"ls is an alias for ls -Fha"と出ますが、これの説明は後回しにして、指示されているように適当なキーをおしてmanページを参照してください。lsの引数の話に戻りますよ。

  • ファイルグロブ
ファイルグロブは、正規表現と似て非なるもので、ワイルドカードなどを使います。
ファイルグロブとはこのようなものです。

 $ ls *.txt
aa.txt    ad.txt    am.txt    br.txt    ga.txt
 $ ls a*.txt
aa.txt    ad.txt    am.txt
 $ ls [a-z]a.txt
aa.txt    ga.txt
 $ ls ?d.txt
ad.txt
 $ ls a{a,m}.txt
aa.txt    am.txt

これはファイルを削除する際やファイルを編集する際によく使われます。頭の中に思いついたファイルグロブをlsで確認して...はzshではしません。Tabキーを押すことによってファイルグロブを展開できるからです。

  • グロブパターン
これはファイルグロブの後ろに()を付けて、その()内に書きます。以下のようなグロブパターンがあります。
パターン 意味
. 通常ファイル
/ ディレクトリ
@ シンボリックリンク
* 実行ファイル
a-X アクセス日時が今日とX日の間にある
a+X アクセス日時がX日以前
L-X Xバイト未満
L+X Xバイト以上
これだけではありませんが、これもTabによる補完ですべてのパターンを確認できます。
実行例を書いてみましょう。

 $ mkdir test
 $ ls -lad *
-rw-r--r-- 1 andryk andryk    0 2011-02-11 16:17 aa.txt
-rw-r--r-- 1 andryk andryk    0 2011-02-11 16:17 ad.txt
-rw-r--r-- 1 andryk andryk    0 2011-02-11 16:17 am.txt
-rw-r--r-- 1 andryk andryk    0 2011-02-11 16:17 br.txt
-rw-r--r-- 1 andryk andryk    0 2011-02-11 16:17 ga.txt
drwxr-xr-x 2 andryk andryk 4.0K 2011-02-11 22:14 test/
 $ mkdir test2
 $ ls -lad *(/am-4)                                    [1423]02/11/11, 22:18:31
drwxr-xr-x 2 andryk andryk 4.0K 2011-02-11 22:14 test/
drwxr-xr-x 2 andryk andryk 4.0K 2011-02-11 22:18 test2/
 $ ls -lad *(/am+2)                                    [1424]02/11/11, 22:18:36
drwxr-xr-x 2 andryk andryk 4.0K 2011-02-11 22:14 test/
 $ ls -lad *(/,am+6)                                   [1426]02/11/11, 22:20:42
-rw-r--r-- 1 andryk andryk    0 2011-02-11 16:17 aa.txt
-rw-r--r-- 1 andryk andryk    0 2011-02-11 16:17 ad.txt
-rw-r--r-- 1 andryk andryk    0 2011-02-11 16:17 am.txt
-rw-r--r-- 1 andryk andryk    0 2011-02-11 16:17 br.txt
-rw-r--r-- 1 andryk andryk    0 2011-02-11 16:17 ga.txt
drwxr-xr-x 2 andryk andryk 4.0K 2011-02-11 22:14 test/
drwxr-xr-x 2 andryk andryk 4.0K 2011-02-11 22:18 test2/

上記のように、パターンを複数書くこともできます。/am+2 では「アクセス日時が2分より前のディレクトリ」、/,am+6 では「ディレクトリまたはアクセス日時が6分より前のファイル・ディレクトリ」という意味になります。

  • オプション
上記にあった -l や -la などです。zshでオプションは覚える必要はありません。補完でオプションとその意味が示されるからです。ls -<Tab> で、上記の -a や -d が何を示しているのか確かめてみましょう。
Tabキーを押すと、"zsh: do you wish to see all 129 possibilities (48 lines)? "と尋ねられるかもしれません。これは、zshが「129の候補が48行に渡って表示されますがすべて見ますか?」と確認をとっているので、よければそのままもう一度Tabキーを押します。
候補の見方です。一部を抜粋します。

--all                 -a  -- list entries starting with .
--directory           -d  -- list directory entries instead of contents
--classify            -F  -- append file type indicators 
--human-readable      -h  -- print sizes in human readable form

上記の例では3列に渡って2行表示されています。
1列目と2列目はオプションで、3列目はそのオプションが何を意味するのかを示しています。列の数が異なっているかもしれません。
1列目では ls --all と ls -a は同等の意味で、それは .filename のような隠しファイルもすべて表示しますよという意味です。 -a などの1文字のオプションを使う場合、- に続けてたくさんのオプションを連ねることができます。一方で、--allなどの省略しないオプションを書く場合はオプションを使うごとに -- を記述してそれに続けてオプションを1つだけ書きます。ですが --{ に続けて書けば、 , で区切って ls --{all,classify} のように複数書くこともできます。それは、 ls -aF と同等です。

もしかしたら補完の内容に --all -a が表示されないかもしれません。それは、ls を実行するだけで ls -Fha が実行されるように設定されているからです。


rmコマンド、rmdirコマンド - ファイルやディレクトリの削除

このセクションを始める前に、moezlecディレクトリ内で touch ./test2/testfile を実行してください。
andryk ~/moezlec
 $ ls -R
.:
./  ../  aa.txt  ad.txt  am.txt  br.txt  ga.txt  test/    test2/

./test:
./  ../

./test2:
./  ../  testfile

さて、いろいろなファイルやディレクトリができてしまったのでmoezlecディレクトリ内のファイルやディレクトリをすべて削除してみましょう。
まずはいくつかカレントディレクトリに .txt ファイルができているので、これらを rm コマンドで削除します。 rmコマンドもファイルグロブを扱えるので、ファイルグロブを使って削除しましょう。rm *.txt<Tab> を実行しましょう。rm aa.txt ad.txt am.txt br.txt ga.txt と表示が変わったらEnterキーを押します。すると、
rm: 通常の空ファイル `aa.txt'を削除しますか? 
と表示されますので、メッセージ内容を確認したら y か yes で答えます。削除したくなければ n か no で答えます。nautilus のようにゴミ箱に移動するのではありません。ですから慎重にこの作業を行ってください。
空のディレクトリの削除にはrmdirコマンドを使います。 「空のディレクトリ」とは何もファイルを保持しないディレクトリのことです。rmdir test で何も確認なしに削除されます。誤って削除してももう一度mkdirコマンドで作成すればよいからです。もう一度になりますが削除対象は*空の*ディレクトリです。mkdirコマンドは最初の方で扱いました。私の説明する順番が悪いのがいけないのですが、もし忘れてしまっておられるのならば、run-helpやこのページの最初の方で確認してください。
このセクションで最初にファイルを作成したので、test2ディレクトリは空ではありません。ですから rmdir コマンドの削除対象ではない。"rmdir: `test2/' を削除できませんでした: ディレクトリは空ではありません"というメッセージが出てしまう。そこでもう一度rmコマンドの登場です。rmのオプションを調べてやるとどうやら
--recursive         -R  -r  -- remove directories and their contents recursive
というのがある。普通の人であればrecursiveは頻繁に使う単語ではないのですが、「帰納的な、再帰的な」といったところです。再帰というのは f(0) = 3, f(1) = 6 としたときに、f(n) = f(n - 1) * f(n - 2) というイメージです。f(2) = 18, f(3) = 108 ですね。わかりにくい?ではファイルとディレクトリでやってみましょう。
--verbose           -v      -- explain what is being done
というオプションが存在しているので、それを伴って以下のディレクトリ構造をもつディレクトリを削除してみます。-fオプションはなれないうちは決して使わないでください。

 $ ls -R .
.:
./  ../  dir3/

./dir3:
./  ../  dir2/    file3-1

./dir3/dir2:
./  ../  dir1/    file2-1  file2-2  file2-3

./dir3/dir2/dir1:
./  ../  dir0/    file1-1  file1-2

./dir3/dir2/dir1/dir0:
./  ../  file0-1

 $ rm -rvf dir3
`dir3/dir2/file2-3' を削除しました。
`dir3/dir2/file2-2' を削除しました。
`dir3/dir2/dir1/file1-1' を削除しました。
`dir3/dir2/dir1/file1-2' を削除しました。
`dir3/dir2/dir1/dir0/file0-1' を削除しました。
ディレクトリ`dir3/dir2/dir1/dir0'を削除した
ディレクトリ`dir3/dir2/dir1'を削除した
`dir3/dir2/file2-1' を削除しました。
ディレクトリ`dir3/dir2'を削除した
`dir3/file3-1' を削除しました。
ディレクトリ`dir3'を削除した

先ほどの f(3) = f(2) * f(1) = (f(1) * f(0)) * f(1) と比べれば、rm -rvf dir3 がそれとにたような動作をしていることがおわかりいただけるかと思います。余談が過ぎました。話を元に戻しましょう。
ですから、test2ディレクトリは rm -r test2/ によって削除できます。rm -r もゴミ箱に移動するのではありませんので、これもファイルを削除するのと同様に慎重におこなってください。


exitコマンド - サブシェルを終了する、ログアウトする

大切なコマンドを忘れていました。
サブシェルとは sh を実行するとbshが起動しますが、その時のbshのことを指します。親シェルであるzshに戻るにはexitを実行してbshを終了させます。
もう一度 exit を実行すればログアウトします。gnome-terminalでは、gnome-terminalが終了します。
もし、"zsh: you have running jobs."と出るのならば、次のセクションを参照してログアウトしてください。


bgコマンド、fgコマンド、jobコマンド - ジョブやプロセスの管理

ブラウジングにfirefoxを使う、ファイラとしてnautilusを使う、暇つぶしなどにxeyesや~games/gnome-sudokuを使う...その他あります。これらは少し特殊で、今までのようにコマンド名だけで実行すると少し不便になるコマンドです。
試しに xclock を実行してみましょう。これは時計を表示するだけです。
時計がでてからターミナルは一向に $ から始まる行を表示してくれません。そこで、xclockを終了してみましょう。$ から始まる行が出てきました。これではxclockが起動している間は何もターミナル上で見えないように感じてしまう。
今度はxeyesを実行してください。xeyesはマウスカーソルを目が追うだけのものです。そこでxeyesがどんなものか理解できたなら、ターミナルにフォーカスをあてて<Ctrl>+zを押してください。

 $ xeyes
^Z  
zsh: suspended  xeyes
 $

zshがxeyesを一時停止した、と告げています。確かにxeyesは表示されているものの動かなくなっています。これは少し不気味か?ここで fg %xeyes を実行してみましょう。

 $ fg %xeyes
[1]  + continued  xeyes

ターミナルが一時停止する前の状態に戻りました。もう一度<Ctrl>+zで一時停止して、今度は bg %xeyes を実行してみてください。xeyesが動いているのにもかかわらずターミナルもコマンドの入力を受け付けているではありませんか!

 $ bg %xeyes
[1]  + continued  xeyes

これは新しい知識です。
ウインドウを使って作業をする場合に、フォアグラウンドとバックグラウンドという考えが必要になります。
xeyesだけで起動する場合、fgコマンドを使った場合はプロセスがフォアグラウンドになります。
xeyes & で起動する場合、bgコマンドを使った場合はプロセスがバックグラウンドになります。
xeyes & はまだ試していません。どうぞやってみてください。bg %xeyesをしなくてもよいことに気づくでしょう。
&をつけ忘れたら<Ctrl>+zで一時停止して bg を実行するとバックグラウンドにできます。
ここで1つ付け加えておくべきこととして、fg や bg は直前に一時停止したジョブを勝手にバックグラウンドやフォアグラウンドにするので、上記の例では fg や bg のみでよいのです; 複数起動していて自分で指定したい場合は上のように%を使って指定します。
zshの、ジョブを管理しておくジョブテーブルは少し特殊です。
xeyes & を実行したあとに jobs コマンドを実行してみてください。

andryk ~/moezlec 
 $ xeyes &                                             [1510]02/12/11, 11:12:57
[1] 2329
andryk ~/moezlec 
 $ jobs                                                [1511]02/12/11, 11:13:58
[1]  + running    xeyes

起動したプロセスが表示されています。これはどのシェルにもある機能です。
そこで、次に xclock &| を実行してみてください。 & ではなく &| です。( | はパイプと呼ばれる)。
予想では jobs コマンドでは xeyes と xclock の両方が表示される?

andryk ~/moezlec 
 $ xclock &|                                           [1513]02/12/11, 11:15:00
andryk ~/moezlec 
 $ jobs                                                [1514]02/12/11, 11:17:31
[1]  + running    xeyes

確かにxclockは起動している。なのにjobsコマンドでは表示されない。
これは &| で起動すると zsh のジョブテーブルに追加せずに起動するという意味になるのでjobsコマンドには表示されません。
これが役立つのは次のような時でしょう。

andryk ~/moezlec 
 $ zsh                                                 [1521]02/12/11, 11:23:18
andryk ~/moezlec 
 $ xeyes &                                             [1522]02/12/11, 11:23:20
[1] 2374
andryk ~/moezlec 
 $ xclock &|                                           [1523]02/12/11, 11:23:23
andryk ~/moezlec 
 $ exit                                                [1524]02/12/11, 11:23:29
zsh: you have running jobs.
andryk ~/moezlec 
 $                                                     [1525]02/12/11, 11:23:31
[1]  + done       xeyes
andryk ~/moezlec 
 $ exit                                                [1525]02/12/11, 11:23:34
andryk ~/moezlec 
 $                                                     [1522]02/12/11, 11:23:36

すべて&のみで起動されていればxeyesもxclockもサブシェルを終了する前にはすべて終了されるべきなのですが、xclockがサブシェルのジョブテーブルに入っていないので、xclockはサブシェルの終了の有無にかかわらず起動し続けることができます。


aliasコマンド、unaliasコマンド - エイリアスの設定

zshのエイリアスには3つあります。

  • コマンドの別名
lsコマンドのセクションで、ls を実行しただけで自動的に ls -Fha が実行されていると書きましたが、これはエイリアスによるものです。
やり方はこうです。
$ alias ls='ls -Fha'
とターミナル上で書くだけです。ですがこれだけではログアウトすればこのエイリアスの設定は失われます。そこで最初の方に導入として設定ファイルを導入したわけですが、その設定には上記のようなエイリアス設定が書かれています。そのほかにどんなエイリアスが設定されているのかを確認するにはaliasコマンドを引数なしで実行します。設定ファイルについては後述します。
逆にエイリアスの設定を解除するには unalias ls のように実行します。

  • 拡張子によるエイリアス
例えばubuntuに標準で付属する画像ビューア eye of gnome はターミナル上で eog & で起動します。画像の一般的な拡張子は .jpg、.png、.bmp、.gifなどが挙げられます。これらは eog filename.jpg & で通常実行されるが、zsh のエイリアス機能はこれを簡略化してあたかもファイル名をコマンドのように扱えます。補完するときに、"Completing suffix alias" が出てくるのはそれが理由です。今回の例では filename.jpg & のみで自動的にeogでfilename.jpgが開きます。
やり方は alias -s jpg=eog のようにします。

  • グローバルエイリアス
例えば頻繁に ../../ を引数にしてコマンドを実行するのであれば、../../ をもう少し簡略化できます。
alias -g ...=../../ と書くだけで、 ls ... などが ls ../../ と解釈されて実行されます。
便利な使い方があるのですが、その使い方は後回しにします。


(ubuntu用のこの先はまだ書かれていません。もうしばらくお待ちください。)


  • 最終更新:2011-02-15 19:02:02

このWIKIを編集するにはパスワード入力が必要です

認証パスワード