S-JIS[2003-05-19/2022-08-15] 変更履歴

UNIXの基礎知識

UNIXの基礎知識(ほんと?)。 ここに書いてある事は、うる覚え・思い込み・思い違い・勘違いが激しく多いと思いますが。なんと言っても、UNIXとlinuxの違いすら よく分かってないし(爆)


用語(適当)

説明 更新日
linux UNIXの一種、か?  
root 何でも出来る権限を持つユーザー。suコマンドでrootになれる。  
sh
term
シェルと端末(term)の関係は、どうもよく分からない。termがウィンドウみたいなもので、そこで動いているコマンド入力のプログラムがshなのかな?  
SO 共有オブジェクト(share object。動的リンクされるファイル)
MS-Windowsで言うところのDLLのようなもの。例:Tomcatのmod_jk.so
2003-06-18
カーネル UNIXの中核かな?  
環境変数 よく使う値などを保持しておく、シェルの変数。 2006-05-15
シェルスクリプト コマンド群を書いて定型的に実行できるようにしたファイル。  
デーモン いろいろなサービスを行うプログラムのことを、UNIXではデーモン(daemon)と言うらしい。
initdとかxinetdとか、「d」が最後尾に付いていることが多いようだ。
ちなみにrc.dという具合に最後尾に「.d」が付いている場合は、ディレクトリを表しているようだ。
 
デバイス 色々な装置を扱うためのファイル。 2008-11-29
パーミッション ファイルに付与されている権限。 2006-07-06
リダイレクション 標準入出力を使って、データをファイルへ読み書きしたり コマンド間で受け渡したりする手段。 2008-11-29
リンク リンクには何種類かあるらしいが、よく使われるのはシンボリックリンク。MS-Windowsで言うところの「ショートカット」に近い。でも もっと高機能!?  
ワイルドカード ファイル名を指定するときに、ファイル名の同じ部分を指定する記号。  

漢字を表示する方法

xtermは漢字を表示できない。ktermを使用すること。

また、環境変数LANGを指定しておくのがいいみたい。[2005-12-11]

●cshの場合
setenv LANG ja_JP.PCK	…SJIS
setenv LANG ja		…EUC
setenv LANG ja_JP.UTF-8	…UTF8
●bashの場合
export LANG=ja_JP.PCK

コマンドの実行

コマンドは、シェルにコマンドを入力することで実行する。シェルにはshだのcshだのtcshだのkshだのbashだの、色々な種類がある。

;」(セミコロン)で区切ると、複数のコマンドを連続して実行できる。MS-DOSの「&に相当。
(セミコロンで、改行が入力されたのと同じ扱いとなる)

例)rm zzz; rm foo		←rm zzzが成功しても失敗してもrm fooを実行する

||」で区切ると、先のコマンドが失敗した(0以外のコードを返した)場合だけ後続のコマンドを実行する 。MS-DOSの「||に相当。[2006-06-27]

例)rm zzz || echo fail	←rm zzzが失敗するとfailと表示する

&&」で区切ると、先のコマンドが成功した(0のコードを返した)場合だけ後続のコマンドを実行する 。MS-DOSの「&&に相当。[2006-06-27]
(先のコマンドが失敗した場合にそこでコマンド実行を停止する)

例)rm zzz && rm foo	←rm zzzが成功したときだけrm fooを実行する

&&」「||」には、論理演算の論理和・論理積のような優先順位はない。左から順番に処理される。

例)rm zzz || echo zzz-fail && rm foo || echo foo-fail

\」で終わった行は コマンドが次の行に続いていることを表す。MS-DOSの「^に相当。
大量のパラメータを書きたいときなんかに使える。

例)ls Test.\
> java
Test.java

なお、「\」で始まる文字は、その文字そのものを表す。MS-DOSの「^に相当。

例)echo a\nb
anb

カレントディレクトリに在るコマンドの実行

コマンドの実体は色々な場所にあるが、環境変数PATHにそれらのディレクトリ名を入れておくことにより、そのパス(ディレクトリ)の中からコマンドが探される。
指定されたパス内でコマンドが見つかることを「パスが(とお)っている」と言う。

コマンドは、パスが通っているディレクトリに在るコマンドしか使えない。普通はカレントディレクトリにはパスが通っていないので、明示する必要がある。

例)./カレントディレクトリのコマンド名	…「.(ピリオド)」はカレントディレクトリを表しているから

もしくは、環境変数PATHにカレントディレクトリ「.」を加えておくと、カレントディレクトリのコマンド名だけでコマンドを実行できるようになる。

(コマンドには実行権限が付いている必要がある)

シェルスクリプトの場合、シェルコマンドの引数として実行することも出来る。[2022-08-15]
(この場合、実行権限は付いていなくても良い)

chmod +x test.sh
./test.sh
bash test.sh

コマンドのヘルプ

UNIXで使えるコマンドのほとんどは、オプションとして「--help」を付けるとヘルプが表示される。MS-DOSの/?に相当。
また、「man コマンド」を実行すれば、もっと詳しく表示される(こともある)。MS-DOSのhelpに相当。

実行するコマンドがどこに在るかについては、whereiswhichといったコマンドで調べられる。


リダイレクト(リダイレクション)

プログラムの実行結果を端末に表示する代わりに、ファイルに出力したりできる。

文字 説明 更新日
< コマンド < 入力ファイル名 コマンドへの標準入力にファイルを指定する。  
> コマンド > 出力ファイル名 コマンドの標準出力への出力内容を、端末でなくファイルに出力する。
「2>」とすれば、標準エラーへの出力内容が対象となる。
 
>> コマンド >> 出力ファイル名 ファイルへ出力する際、ファイルが既存であれば そのファイルに追加する。  
| コマンドA | コマンドB コマンドAの標準出力への出力内容を、コマンドBの標準入力へ受け渡す。(パイプと呼ぶ)  
<> コマンド <> 入出力ファイル名 ファイルを入出力で使用する。 2008-11-29
<< コマンド << 終了文字列
入力文字列
入力文字列
終了文字列
ヒアドキュメント(here-document)という構文。
入力文字列を、コマンドの標準入力へ渡す。
入力文字列は何行にも亘って書ける。指定した終了文字列と同じ文字列が来たら終わりになる。
2006-05-27
cat << EOF > test.txt
abc
zzz
EOF
標準出力へのリダイレクトも併せて書くことが出来る。 2022-01-26
コマンド <<- 終了文字列
        入力文字列
        入力文字列
終了文字列
入力文字列の行頭のタブを削除して標準入力へ渡す。(bash)
(スペースは削除されない)
2008-11-29
<<< コマンド <<< 入力文字列 単語1つのみのヒアドキュメント。つまり単語1つを標準入力へ渡す。(bash)
以下のヒアドキュメントと等価。
コマンド << EOF
入力文字列
EOF
2008-11-29
<( ) コマンドB <(コマンドA)
diff <(sort old.txt) <(sort new.txt)
プロセス置換(process substitution)という構文。(bash)
コマンドを実行し、その標準出力をファイル(ファイル名)として他のコマンドの引数に渡す。
(ファイル名は/dev/fd/123のようになる)
2022-01-26
&>
>&
コマンド &> 出力ファイル名 標準出力と標準エラーへの出力内容をファイルに出力する。(bash)
「>&」も使えるが、「&>」の方が良いらしい。「>&」は数値を前後に付ける使い方も出来る為か?
2008-11-29
>& コマンド > 出力ファイル名 >& 標準出力と標準エラーへの出力内容をファイルに出力する。(csh系) 2007-03-23
2>&1 コマンド > 出力ファイル名 2>&1
コマンドA 2>&1 |
コマンドB
標準エラー(2)への出力内容も、標準出力(1)に送る。(sh, ksh, bash系)
(原理:Landscapeさんのシェルのリダイレクトにまつわる失敗
2007-03-23
>&- コマンド 2>&- 標準エラーを閉じる(closeする)。(bash)
「2> /dev/null」は出力された内容を捨てる動作であり、クローズとは異なる。
2008-11-29
>| コマンド >| 出力ファイル名 基本的に「>」と同じ。(bash)
set -C」によってnoclobberがonになっていると、「>」で既存ファイルを指定すると上書きできない。
その場合でも「>|」なら上書きできる。
2008-11-29
>( ) コマンドA >(コマンドB) プロセス置換(process substitution)という構文。(bash)
コマンドAを実行する際に「>()」の部分がファイル名として渡され、そのファイルに出力された内容をコマンドBの標準入力に渡す。
2022-01-26
<&   入力のファイルディスクリプターを複製する。(bash) 2008-11-29

C言語をやってる人なら、標準出力:stdout(printfで出力される先)、標準入力:stdin、標準エラー:stderrと言えば分かるはず。
C++なら、標準出力:cout、標準入力:cin、標準エラー:cerr。
Javaなら、標準出力:out(Sytem.out.println)、標準入力:in、標準エラー:err。

MS-DOSのリダイレクト

標準出力の内容をコンソールとファイルの両方に出したい場合は、teeコマンドへリダイレクトする。[2007-10-07]


ワイルドカード

コマンドのパラメータとして、ファイル名の一部を表す「ワイルドカード」が使える。

* 任意(0文字以上)の文字列。 MS-DOSと同じ。
? 任意の1文字。 MS-DOSと同じ。
[字] 指定した文字。[2007-09-21] [0-9]だと、任意の数字1文字。
[a-zA-Z]だと任意のアルファベット1文字。
ls [0-9]*    	…1文字目が数字のファイルを表示
ls [a-z][0-9]	…1文字目がa〜zで2文字目が数字(で、全体の文字数が2文字)のファイルを表示
ls [a-z]+    	…1文字目がa〜zで2文字目が「+」のファイル。つまり「+」は、普通の正規表現のような「1文字以上」という意味ではない

ワイルドカードの使い方はUNIXとMS-DOSで同じようなものだが、解釈のされ方が異なると聞いたことがあるような気がする

UNIX ワイルドカードはシェルが解釈し、解釈した結果(複数一致した場合はブランクで区切って並べた形に置き換えられる)がコマンドに渡される。
MS-DOS ワイルドカードの解釈は各コマンドに任される。

例えばカレントディレクトリにaaa,bbb,cccという3つのファイルが有るときに「cd *」というコマンドを実行したとする。
UNIXでは「*」はカレントディレクトリのファイル全てに置き換わるので、「cd aaa bbb ccc」が実行されるのと同じことになり、パラメータ数が多すぎるのでエラーとなる。仮にカレントディレクトリにaaaしかなければ「cd aaa」が(正しく)実行される。
MS-DOSではそのままcdコマンドに「*」が渡されて、cdコマンド内で「*」を解釈して実行される。

ワイルドカードを解釈せずにコマンドに渡したい場合(例えばgrepコマンドのパラメータ)の場合は、文字列を「"(ダブルクォーテーション)」で囲む。


ファイルの権限(パーミッション)

ファイルやディレクトリには、アクセス(読み書き実行)の権限(パーミッション)がある。[2006-05-13]

アクセスできる人は、所有者(user、owner)・グループ(group)・他人(other)の3種類。
この3種類毎に、それぞれどのアクセスまで許容するかを設定する。

権限 ファイルの場合 ディレクトリの場合
r 4 読込(read) この権限がないと、ファイルを参照できない。 この権限が無いと、ディレクトリ内を参照できない。
lsで見ることが出来ない(ワイルドカードもマッチしない)し、ファイル名の補完機能もエラーになる。また、rmdirは普通に使えるがrm -rはエラーになる)
ただし直接ファイル名を指定すれば、ファイルにアクセスすることは出来る。[/2006-07-06]
w 2 書込(write) この権限が無いと、ファイルを変更できない。
(そのファイルの上位ディレクトリにも書込権限が無いと、書き込めない)
この権限が無いと、ディレクトリ内にファイルを作ったり削除したりできない。[/2006-07-05]
既存のファイルであれば、(そのファイルに対する書き込み権限さえあれば、)内容の変更は出来る。
(ファイルの作成・削除→ディレクトリの管理領域を変更する必要がある)
x 1 実行(execute) この権限が有ると、ファイルを(直接)実行できる
(読込権限も無いと実行できない)
この権限が無いと、ディレクトリ内にcd等で移動できない。

ファイルやディレクトリを作成すると、その所有者は作成したユーザー、グループはユーザーの属する主グループがデフォルトで設定される。
アクセス権限は、ファイルの場合666(ディレクトリの場合777)からumaskで設定したマスク値を引いたものが初期パーミッションとなる。
(プログラムで権限を指定してファイルを作った場合、その権限からumask値を引いたものとなる)

所有者の変更はchown、グループの変更はchgrpchownも可)で行う。(ただしrootユーザーでしか出来ない環境もある)
アクセス権限の変更はchmodで行う。(変更は所有者かrootユーザーのみ可能)

ちなみに「所有者はアクセス不可/グループはアクセス可能」という設定にしておくと、所有者はそのファイルにアクセスできなくなる。(所有者がそのグループに属していたとしても!)


ファイルの実行権限

ファイルに実行権限を付けると、コマンドラインから直接ファイル名を入力することによって、そのファイルを実行することが出来る。[2007-05-12/2007-05-14]
主としてコンパイルしたバイナリファイルシェルスクリプトに対して使われる。

が、テキストファイルの場合、ファイルの先頭行に「#!」を付けて実行コマンドを指定することにより、そのコマンドを実行することが出来る。
(この「#!」はシバンあるいはシェバンと言うらしい。sharp-bangを縮めてshebangだそうだ。[2012-05-16]
すなわち、あるテキストファイル(例としてファイル名xfile)の先頭行が「#!コマンド」になっている場合 、そのファイル名を直接シェルに入力するのは、コマンドの引数にxfileを指定して実行(「コマンド xfile」を入力)したのと同じことになる。
(指定するコマンドはフルパスでなければならないが、調べるにはwhichを使えばいいので、そんなに手間ではない)

ファイルを実行する際に引数を付けると、その引数もちゃんと渡される。

実行例 同義
% xfile % コマンド xfile
% xfile arg1 arg2 % コマンド xfile arg1 arg2

tailコマンドを実行する例

xfile

#!/bin/tail -2
abc
def
ghi

実行:

% chmod +x xfile
% ./xfile
def
ghi

↑これが実行されたのと同じ

% /bin/tail -2 xfile
def
ghi

実行するプログラムを書いているファイルがそのプログラムの処理対象になってしまう訳で、だからシェルawk等のスクリプトファイルでないとあまり意味が無いんだろうな〜。


一般的な環境

環境変数

「$」で始まる文字列は環境変数として扱われる。「$」の後、波括弧「{」「}」でくくってもよい。(MS-DOSでは、「%」でくくった文字列が環境変数として扱われる)

例)echo $CLASSPATH             MS-DOSなら「echo %CLASSPATH%」
  echo ${CLASSPATH}

また、変数の一部を取り出すような演算を行うことも出来る。

一般的な環境変数
環境変数 説明 備考 MS-DOS相当
PATH コマンドの置き場(ディレクトリー)を並べたもの。コマンド実行時に使用される。   %PATH%
PWD カレントディレクトリー。 bashの~+ %CD%
OLDPWD 1つ以前のカレントディレクトリー。[2008-11-29] bashの~-  
LANG 日本語の種類の指定。[2006-05-15]    
LD_LIBRARY_PATH 共有オブジェクト(動的リンクライブラリー)の置き場を並べたもの。   %PATH%
USER ログインしているユーザー名。[2008-07-31]   %USERNAME%
HOME ユーザーのホームディレクトリー[2008-07-31]   %USERPROFILE%
%HOMEDRIVE%
%HOMEPATH%
TZ タイムゾーン。日本時間は「JST-9」。[2014-01-25]    

環境変数の設定方法

ディレクトリー

一般的なディレクトリー [2006-05-13]
ディレクトリ 説明 備考
/tmp 一時ファイルを置く為のディレクトリー。 どのユーザーでも読み書きできる。
また、OS(UNIX)の種類によっては、マシンを起動したら全部消される。[/2014-01-25]
たまに このディレクトリーがいっぱいになって、アプリケーションが正しい動作をしなくなることがある。
/opt オプションのことかな? アプリケーションのインストール場所によく使われるようだ。
/etc/init.d 起動スクリプト。[2014-01-25]  
/usr/include C言語のヘッダーファイル。  
/usr/src ソースファイル。[2012-03-04]  
/var/log ログファイル。[2014-01-25] /var/log直下はrootユーザーでないと書き込めない。
自分のアプリケーションでログを出力したい場合は、
rootユーザーで/var/logの下にそのアプリケーション用のディレクトリーを作成し、
chownでそのアプリケーションを実行するユーザーに変更しておくのが一番簡単そう。

ファイル

ユーザー関連のファイル [2007-05-16]

デバイス

ファイルのように見えるが、特殊な扱いがされるもの。[2007-01-17]

デバイス 説明 備考 更新日
/dev/null 入出力に使用。
ここに出力したデータは、単純に捨てられる。
入力に使うと、何も入力されない(空っぽのファイルを読もうとするのと同じ)。
MS-DOSのnul 2007-05-25
/dev/pts/〜 コンソール。入出力の双方に使用可能。自分のコンソールはttyコマンドで分かる。 MS-DOSのcon 2007-01-26
/dev/hd〜 ATA(IDE)ハードディスク →HDD    
/dev/sd〜 SCSIハードディスク →USBハードディスク    
/dev/fd〜 ファイルディスクリプター   2008-11-29
/dev/md〜 メタデバイス(仮想的なディスク?)    
/dev/zero 入力に使用。
ここから読み込むと、常に0x00が入ってくる。
  2008-06-21
/dev/stdin
/dev/stdout
/dev/stderr
標準入力・標準出力・標準エラーを表す。
リダイレクションで0,1,2の代わりに使うものらしい。
  2008-11-29

インストール

UNIXの様々なソフトの一般的なインストール方法は、アーカイブを解凍・展開してソースからコンパイルし直すことによって行うそうだ。

  1. 拡張子tar.gzのファイルを解凍展開する
  2. 解凍したディレクトリで「./configure --help」を実行し、設定方法を確認する
  3. 解凍したディレクトリで「./configure [オプション]」を実行し、makefile(このファイルはmakeコマンドが使用する)を作成する。オプションは「--help」によって確認し、必要なものを指定する。
  4. make」を実行しソースのコンパイルを行う。
  5. make install」を実行し、インストールを行う。

RedHatの場合は、rpmなんてものもある。


ネットワークの設定

設定ファイル 説明 備考
/etc/ftp* ftp関連の色々な設定。  
/etc/ftpd/ftpusers ftpを許可しないユーザーの指定。[2006-08-03]  
/etc/pam.conf telnetを許可するユーザーを指定。[2006-08-03]  
/etc/hosts 自分自身のIPアドレスや、他のIPアドレスに名前を付けたりする。  
/etc/hosts.allow アクセス許可対象となるIPアドレスを指定する。telnet等に影響する。  
/etc/hosts.deny アクセス不許可となるIPアドレスを指定する。  
/etc/sysconfig/network-scripts/ifcfg-eth0 イーサ0のIPアドレス。 DHCP用の例 [2004-05-25]
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
 
固定IP用の例
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.128.xxx
NETMASK=255.255.255.0
NETWORK=192.168.128.0
BROADCAST=192.168.128.255
 
/etc/resolv.conf DNSのIPアドレス。 複数のDNSを指定する例(上がプリマリで下がセカンダリ)
search localdomain
nameserver xxx.xxx.xxx.xx
nameserver yyy.yyy.yyy.yyy
これが存在しないアドレスを指していると、外部からtelnetで接続しようとした時に プロンプトが出てくるまで時間がかかる。[2005-04-07]
/etc/sysconfig/network ゲートウェイのIPアドレス。  
ネットワーク上のマシン名(HOSTNAME=ホスト名)  

ifcfg-eth*を変更した後は、再起動が必要。「/etc/init.d/network restart」でネットワーク関連だけを再起動できる。

イーサ0(eth0)というのは、ネットワークカードの1番目用のデバイス。2つ以上のネットワークカード(NIC)を増設しているマシンでは、eth1,eth2,…となる。

また、仮想IPアドレスを設定することも出来る。仮想IPアドレスとは、1つのサーバーに複数のIPアドレスを割り当てるもの。
「ifcfg-eth0」をコピーして「ifcfg-eth0:1」というファイルを作り、その中身のデバイス名を「eth0」から「eth0:1」に変更し、IPアドレスを新しいアドレスに書き換えるだけでよい。

ifconfigというコマンドで、現在動いているネットワークインターフェースの一覧が表示できる(rootユーザーでないと駄目かも)。


起動デーモンの変更方法

起動デーモンというのは、マシンの起動時に実行されるデーモンのこと、かな?
不必要なデーモンを削ることで起動が速くなるし、セキュリティ的にもいいらしい。

以下の方法は、OCNさんの『Webセキュリティ-起動停止方法-』で勉強させていただきました。

まず、起動スクリプトのラン(実行)レベルを確認する。

$ cat /etc/inittab | grep id
id:5:initdefault:

この「5」がランレベルと呼ばれるものらしい。

次に、「/etc/rc.d/rc5.d」というディレクトリに移動する。この「rc5.d」の「5」の部分には、先に調べたランレベルを指定する。このディレクトリには、以下のような、各デーモンへのシンボリックリンクのファイルがたくさん有る。

リンクファイル名 説明
SnnXXXX 起動用(start)
KnnXXXX 終了用(kill)

nnが2桁の数字で、実行する順序でも表しているのかなぁ? 重複もあるけど…。
XXXXはデーモンの名称。
このリンクファイルを削除するとデーモンは起動しなくなり、作成すると起動するようになる。

それから、デーモンの起動を制御するntsysvというコマンドもあるらしい。


デーモン起動用のシェル

デーモンを実行・終了させる為に、それ専用のシェルを作っておくのが流儀らしい。
そのシェルにオプションを指定して実行する。オプションにはだいたい以下のようなものを用意しておくようだ。

オプション 説明
start 起動する
stop 停止する
restart 再起動する
status 現在の状態を表示する
--help ヘルプを表示する

例:ネットワークの再起動xinetdの再起動サンバの再起動


技術メモへ戻る
メールの送信先:ひしだま