Linux リテラシ2006 - 第3回 エディタ、シェル

take

テキスト処理

エディタとは文書を編集するもので、Windowsでいうメモ帳などがこれにあたります。

エディタを起動する

vi ファイル名

sample.txtというファイルを開く

$ vi sample.txt

存在しないファイルを指定した場合、新規ファイルとして生成されます。

モード

viには主に

の二つのモードがあります。
起動時はノーマルモードになっていて、コマンドを入力することで挿入モードへと移行します。
挿入モードではWindows のメモ帳などと同様にvi を使用する事ができます。

挿入モード

挿入モードでは文字を挿入する事ができます。挿入方法はノーマルモードから移行するのに使用したコマンドに依存します。挿入モードになるとエディタの左下に'-- 挿入 --'または'-- INSERT --'と表示されます。

i             ...カーソルの前に挿入するモードになります
                 カーソルより後のテキストは、すべて右に移動します
a             ...現在のカーソルの後ろにテキストを入力します
                 カーソルは右に移動し、テキストはiと同様に挿入されます
A             ...行の後ろにテキストを挿入するモードになります
o             ...カーソルの次の行に空行ができ、そこに挿入するモードになります
[Esc]         ...ノーマルモードに戻る

ノーマルモード

↑ または k   ...カーソルを上に移動します
↓ または j   ...カーソルを下に移動します
← または h   ...カーソルを左に移動します
→ または l   ...カーソルを右に移動します(小文字のLです)

古いシステムでは方向キーが使えないため、h~lのキーで操作します。

x             ...カーソルで強調表示された文字を削除します(挿入モードにはならない)
u             ...1つ前の動作を取り消します(元に戻す)
[行数] yy     ...指定した行数分カーソルのある行から下をコピーします
[行数] dd     ...指定した行数分カーソルのある行から下を削除(切り取り)します
[行数] p      ...コピー、または切り取りした内容を張り付けます

viでは「削除=切り取り」です。直前に削除した文字や行はpで貼り付けることができます。

/検索文字列   ...指定した文字列をカーソルより下の範囲で検索します
?検索文字列   ...指定した文字列をカーソルより上の範囲で検索します
n             ...検索された結果の次の候補に移動します
N             ...検索された結果の前の候補に移動します
:w            ・・・現在の状態をファイルに保存します
:q!           ...変更を保存しないで、viを終了します
:wq           ...ファイルに書き込んで、viを終了します

シェル

ユーザの入力をカーネルと呼ばれるLinuxの核をなす部分に伝え、同時にその逆を行う仲介役のプログラムのことをシェルといいます。これはユーザから見て、カーネルを包み込んでいる「殻(shell)」のように見えることから名付けられました。

bash

ユーザが利用できる対話的シェルの一つで、Linux の標準シェルとして主に使用されているのがbash です。

bash のオートコンプリート機能

bashはコマンドやファイル、ディレクトリ等を入力する際に、入力の途中で[TAB]キーを押すとその続きを補ってくれる機能を持っています。cd でのディレクトリ移動の時など役に立つので使いこなせるようになると便利です。

リダイレクト

リダイレクトとは「標準入出力の入れ換え」を行うことを指します。通常、標準入力とはキーボードからの入力を指し、標準出力とはディスプレイへの表示のことを指します。リダイレクトを行うことによって、標準入力をファイルから読み込むようにしたり、標準出力をファイルに書き出すようにすることが出来ます。

引数を標準出力に出力する

echo 文字列

文字列'Hello,world'を標準出力に出力する

$ echo Hello,world

リダイレクトをする

> ファイル名     ・・・標準出力をを指定したファイルに切替えます
                    ファイルが存在していた場合、古い内容は'''上書き'''されます
>> ファイル名    ・・・標準出力をを指定したファイルに切替えます
                    出力データはファイルの内容に'''追記'''されます
< ファイル名     ・・・標準入力を指定したファイルに切替えます

文字列'Hello,world'の出力先をhello.txt に変更する

$ echo Hello,world > hello.txt

文字列'Hello,world'の出力先をhello.txt に変更し、その内容に追記する

$ echo Hello,world >> hello.txt

hello.txt の内容を標準出力に出力する

$ cat < hello.txt

パイプ

あるコマンドの標準出力をそのまま別のコマンドの標準入力へと送る仕組みのことをパイプといいます。

コマンド1の標準出力をコマンド2の標準入力にパイプする

コマンド1 | コマンド2

コマンド2の後にもパイプを繋げてゆくことで何回でもパイプを続けることが出来ます。また、リダイレクトと連携させることも可能です。

echoの標準出力をrev にパイプする

$ echo Hello, World | rev

revは入力された文字列を逆にして表示するコマンドです。

グロブ

シェルが * ? {} [] ~ 等の特殊文字を解釈し、ファイル名として展開することをグロブといいます。
複数のファイルに対して一括処理を行う場合に有効です。

*               ・・・全ての文字列を表します(0文字も含む)
?               ・・・任意の1文字を表します

グロブの例

$ ls samp*

“samp”から始まる名前のファイルを表示します

$ ls hello.tx?

“hello.tx”から始まる9文字の名前のファイルを表示します

エイリアス

エイリアスとはコマンドやコマンド群に略称をつける機能です。
頻繁に行う作業がある時、そのコマンド名が長い場合や入力が長くなりすぎる場合、エイリアスを用いることで作業を楽に進めることができます。

エイリアスを定義する

alias 別名='コマンド列'

コマンド'ls -a'に別名 la を定義する

$ alias la='ls -a'

定義されたエイリアス la を使用する

$ la

また、定義されたエイリアスにはオプションや引数をとることも出来ます。例えばこのlaの場合、

$ la -l

とすることで ls -a -lと同じコマンドを表します。

現在定義しているエイリアスを確認する

$ alias

エイリアスを取り消す

unalias エイリアス名

エイリアス la を取り消す

$ unalias la

シェルスクリプト

シェルスクリプトとは複数のコマンドや組み込みコマンドなどをファイルに記述し、実行できるようにすることで記述したコマンドをまとめて実行できるようにしたものです。複雑な操作を繰り返し行う際などに役立ちます。

シェルスクリプトを作る

シェルスクリプトは通常、拡張子を.sh とすることが多いのでシェルスクリプトを作る際はファイルの判別をしやすくするためにも.sh と末尾につけるようにしましょう。

シェルスクリプト ex.shを作る

$ vi ex.sh
#!/bin/sh
#
echo sample shell script

bashでは# の後ろに書かれたものはコメントという、プログラムの実行自体には関係の無いソースの中の注釈として扱われます。
一行目に書いた#!/bin/sh というのは、このファイルがシェルスクリプトのファイルであることを表す"おまじない"です。

シェルスクリプトを実行する

実行するために、第二回で学んだchmod コマンドを使ってファイルに実行権限を与えます。

chmod +x シェルスクリプト名
./シェルスクリプト名

実行権限を与えていない場合でも、

sh シェルスクリプト名

とすることで実行することも出来ます。

シェルスクリプト ex.shを実行する

$ chmod +x ex.sh 
$ ./ex.sh

bashの設定ファイル

~/.bashrc
~/.bash_profile

にはbashの設定が含まれています。
.bash_profileはログイン時だけによみこまれるファイルで、ここには環境変数の設定などが保管されています。
.bashrcはログイン時にbash_profileからも読み込まれますが、別のシェルが起動したときにも実行されます。

そして.bash_profileの内容は

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
unset USERNAME

以上のようになっています。#が行の最初についている部分はコメントアウトされています。
上のif~fiでくくられた部分が意味しているのは、ホームディレクトリに.bashrcがあれば.bashrcを読み込むという意味です。
PATHは環境変数(シェル変数)のことで、コロン(:)によって分けられたディレクトリのリストで構成されています。コマンドを実行しようとすると、PATH にあるディレクトリ全てを検索対象とし、ファイルが見つかるとそこで実行されます。

PATHは

echo $PATH

とすることで確認する事ができます。

例えばコマンドlsを実行する時に、lsとタイプして実行される物は/bin/lsです
これはPATHの中に/binが含まれているので
その配下に配置されているlsが実行されています。
それは

which ls

を実行する事で確認する事ができます。

デフォルトの.bashrcの内容は

# .bashrc

# User specific aliases and functions

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

以上のようになっています。
.bashrcの内容は/etc/bashrcのファイルがあればそれを読み込む、と書かれています。
余裕がある人は/etc/bashrcの中身を見て理解してみてください。