UNIX入門

提供: MacWiki
移動: 案内検索

UNIXの基礎[編集]

ターミナルエミュレータについて[編集]

UNIX システムの基本的な使い方は,キーボードからコンピュータに対する命令(「コマンド」と呼ばれる)を打ち込むことです.

現在の UNIX,とくに個人が利用しているシステムでは,実際にはターミナルエミュレータ(端末エミュレータ)と呼ばれる種類のアプリケーションを起動し,そこでコマンドを入力することになります.Mac OS X の場合,「ターミナル (Terminal.app)」という名前のターミナルエミュレータが /Applications/Utilities に最初からインストールされています.Mac OS X で UNIX のコマンドを使いたい場合は,この Terminal.app を使うのがよいでしょう.

Terminal.app を使う利点の1つは,ほかのアプリケーションから文字列のコピーやペーストができることです.コマンドに不慣れなうちは,UNIX アプリケーションのインストールなどを行う場合には,解説文書などからコマンドをコピー&ペーストして実行させることをお薦めします.

  • ただし,コピー&ペーストで半角のバックスラッシュが化ける (円記号になってしまう) ことがあります.これは CUI では非常に重要な文字なので,ペースト時に文字化けしていないかどうか注意してください.

Terminal.app で日本語を入力するには、デフォルトから設定を少し変更する必要があります。この設定変更に関しては、 http://homepage3.nifty.com/toshi3/osx2t.html が参考になります。

Cocoa アプリケーションでは,ほかに iTerm というソフトもありますが,やや実行速度が遅いので,お薦めはしません.また,X11 環境をインストールしていれば,xterm や kterm などのターミナルエミュレータを使うことができますが,それは UNIX 的な使い方にある程度習熟してからの方がいいでしょう.

シェルについて[編集]

さて,Terminal.app を起動してコマンドを打ち込んだとき,入力したコマンドを受け取って OS に作業をさせるのは,実は Terminal.app ではなく「シェル (shell)」と呼ばれるプログラムです.

シェルにもいくつか種類がありますが,よく使われるのは bash,tcsh,zsh あたりです(日本ではそれぞれ「バッシュ」,「ティーシーシェル」,「ゼッシュ」と読まれることが多いようです).いずれも Mac OS X には最初からインストールされています.OS X 10.2 では tcsh が,OS X 10.3 および 10.4 では bash がデフォルトのシェルです(ただし OS をアップグレードインストールした場合には,以前のデフォルトのシェルが引き継がれるので,10.3 以降でも tcsh がデフォルトのシェルになることがあります).Terminal.app を起動すると,これらデフォルトのシェルが最初に起動されます.

これらのシェルにはそれぞれ特徴があり,どれかがとくに優れている,ということはありません.あなたが初心者ならば,素直にデフォルトのシェルを使っておけばよいでしょう.ただ,使えるコマンドや各種の設定方法はシェルごとに異なります.解説文書などを読む場合には,どのシェルを前提とした説明なのか注意が必要ですので,自分がどのシェルを使っているのかは把握しておきましょう.

自分が使っているシェルの確認方法ですが,環境変数 (後述) SHELL を参照することで確認できます.コマンドプロンプトから

echo $SHELL

と入力すれば,現在使用しているシェルが,コマンドの絶対パス (後述) として表示されます.

また,GUI を利用するなら,Terminal.app のメニューから,“ファイル>情報を見る”を選択すると(またはキーボードショートカットで Cmd + I を押すと),“ターミナルインスペクタ”というウィンドウが開き,“シェル : tcsh”などという表示が現れます.これがあなたの Terminal.app のデフォルトのシェルであり,現在使用中のシェルです.ただし,あるシェルのコマンドプロンプト(後述)から“bash”,“tcsh”などと打ち込めば,bash や tcsh を起動することができるのですが(そして"exit"を打ち込めばそれを終了できる),こうして起動したシェルの情報まではターミナルインスペクタには表示されないので注意が必要です(と言っても,普通はこうして起動したシェルがなんだったか分からなくなるようなことはないでしょう).

また,デフォルトの状態では,コマンドプロンプトが表示された状態では、Terminal.app のウィンドウに“Terminal - bash -ttyp1”などという表示が出ているはずです.この2番目の文字列は動作中のプロセスを表します.コマンドプロンプトが表示された状態では,ここには実行中のシェルの名称が示されるので,それを見ても現在使っているシェルを確認できます.この表示については,たとえば bash から tcsh を起動した場合などでも,“Terminal - tcsh -ttyp1”と表示されます.

なお一時的に別のシェルを利用したい場合(例えば"zsh")、標準入力を通して渡す方法もあります:

$ echo 'ls -d 00000{098..121}.jpg' |zsh -s

コマンドプロンプト[編集]

「コマンドプロンプト」とは,シェルがコマンドの入力待ち状態であることを示す記号です.bash では“$”,tcsh では“%”がデフォルトのコマンドプロンプトです.この記号が表示されていれば、キーボードからの入力が画面に表示され,リターンキーを押せばその入力(コマンド)がシェルに引き渡されます.

パスについて (1) パスとは?[編集]

「パス(パス名)」とは,階層構造を持ったファイルシステムでファイルやディレクトリの場所を示すための表記です.具体的には,たとえば /Applications/Safari.app などというのがパスです(これは標準のウェブブラウザ,Safari のパスです).

「ファイルシステム」というのは,とりあえずはディスク上でファイルやディレクトリを管理する仕組み,くらいに考えておいてください.あるいは,ディスクユーティリティなどでハードディスク上のボリュームを消去するとき,「フォーマット」を選択する必要がありますね? その「フォーマット(の種類)」のことだと考えておいてもいいでしょう.

「階層構造を持つ」というのは,乱暴に言えば次のようなことです.まず大元になる,マシン上の全てのファイルやディレクトリを含むディレクトリ R があったとします.その中に色々なファイルやディレクトリ A,B,... があり,A,B の中にさらにファイルやディレクトリが……という調子で,R 以外の全てのファイルやディレクトリが必ずどれかのディレクトリの中にある,というファイルシステムの形態です.実際には,普通のユーザが階層構造を持たないファイルシステムに触れることはあまりないでしょうから,よく分からなければ冒頭の説明にある「階層構造」というのは無視してもかまいません.

さて,前の段落のディレクトリ R は,そのマシン上の全てのディレクトリ,ファイルを含むディレクトリでした.このようなディレクトリのことを「ルートディレクトリ」または簡単に「ルート」と呼びます.パス名は「/(半角スラッシュ)」になります.階層構造を持つファイルシステムでは,ファイルやディレクトリ間の関係を木の枝のような図で表現することができます.そのように表現した場合に「根 root」にあたるディレクトリである,ということでこの名前があります.

パスについて (2) 絶対パスと相対パス[編集]

上で例示したパス名は,ルートディレクトリからそのファイルやディレクトリまで,どのような順序でディレクトリを辿っていけばよいかを示す文字列になっています.その際,ディレクトリとディレクトリの間の区切り文字(ディレクトリセパレータ)は「/(半角スラッシュ)」になります.

たとえば,あなた自身の Mail.app の設定ファイルのパス名は /Users/Your_Account/Library/Preferences/com.apple.mail.plist です(「Your_Account」の部分はあなたのユーザ名になります).

パス名の表現には2通りあって,このような「ルートディレクトリから始めるパス名」のことは「絶対パス」と言います.

もう1つのパス名の表現は「相対パス」と呼ばれるものです.これは,該当するファイルやディレクトリまで,ユーザが現在「居る」ディレクトリ(カレントディレクトリ)から,どのようにディレクトリを辿っていけばよいかを示す文字列になります.

たとえば,今あなたが /Users/Your_Account/(あなたのホームディレクトリ)に「居る」(ホームディレクトリがカレントディレクトリである)としましょう.この場合,Mail.app の設定ファイルの相対パスは ./Library/Preferences/com.apple.mail.plist になります.最初の「.」はカレントディレクトリを示す記号ですが,これを省略して, Library/Preferences/com.apple.mail.plist と書くこともできます.

カレントディレクトリよりも上位のディレクトリや,別のディレクトリの枝にあるファイルやディレクトリへの相対パスでは,「..(1つ上のディレクトリ」という記号を組み合わせて使うことになります.

たとえば,カレントディレクトリが /Users/Your_Account/Library/Preferences/ だったとすると,自分のホームディレクトリへの相対パスは ../.. になります.また,/Users/Your_Account/Documents ディレクトリにある text.txt への相対パスは ../../Documents/text.txt になります.

カレントディレクトリ内のファイルやすぐ上のディレクトリ内のファイルなどを示すのには相対パスの方が便利ですが,全然違うディレクトリの枝への相対パスは即座には分からないこともあるでしょう.絶対パスと相対パスは臨機応変に使い分けましょう.

パス名では,ホームディレクトリを示すのに半角のチルダを使うことができます.~ と書けば,それが自分のホームディレクトリのパスを表します.

パスについて (3) コマンドサーチパス[編集]

コマンドサーチパスとは,bash や tcsh などのシェルが入力されたコマンドを検索するディレクトリ群のことです(参照→パスを通す).したがって,これは上述した「パス」とは少々意味が異なります.

以下,もう少し詳しく説明します.

bash や tcsh などのシェルは,コマンドプロンプトからなにかが入力されたとき,以下のいずれかの動作をします.

(3-1) ファイルのパス(/Developer/Tools/CpMac や ./configure といった形式)が入力されたとき

この場合,シェルはこのファイルをプログラムと見なして実行しようとします.もしそのファイルがプログラムでなければ,“Command not found.”などのエラーメッセージが出ます.もしそのファイルの実行権限がなければ,“Permission denied.” などのエラーメッセージが出ます.

(3-2) パスでない文字列が入力されたとき

この場合,シェルはこれをコマンドと見なして実行しようとします.この場合,2つの状況があり得ます.

  • 入力がシェルに組み込まれたコマンド(ビルトインコマンドと呼ばれます)である場合,それがそのまま実行されます.
  • 入力がビルトインコマンドでない場合,シェルはあらかじめ設定されたディレクトリ群(これがコマンドサーチパスです)を検索し,そこに入力したものと同名のプログラムファイルがあれば,そのプログラムが実行されます.もし入力と一致するファイルがなければ,“Command not found”などのエラーメッセージが出ます.

以上のことから分かるように,自分でインストールしたプログラムをコマンドとしてシェルに実行させるためには,

  • コマンドサーチパスにあるディレクトリにそのプログラムをインストールする

か,

  • プログラムをインストールしたディレクトリをコマンドサーチパスに含める

かのいずれかを行わなければなりません.とくに,後者のように設定することを「パスを通す」と表現します,UNIX 系の掲示板では,ときおり

「インストールしたはずのプログラムが実行できません」

「パスは通っていますか?」「パスを通しましょう」

という問答が見られます.知らなければなんのことか分かりませんが,これは「プログラムをインストールしたディレクトリはコマンドサーチパスに含まれていますか?」「コマンドサーチパスを適切に設定しましょう」と答えているのです.

コマンドサーチパスの設定法はシェルによって異なります.設定法はそれぞれのシェルの解説のところを見てください.

環境変数の設定 - tcsh の場合[編集]

setenv コマンド[編集]

UNIX プログラムが参照する外部変数のことを環境変数といいます。tcsh (または csh 系のシェル) の場合,環境変数の設定には setenv コマンドを使用します.書式は setenv ENVIRONMENT_VARIABLE VALUE' となります.たとえば環境変数 LANG を ja_JP.UTF-8 に設定する場合,コマンドプロンプトから

setenv LANG ja_JP.UTF-8

と入力します.

環境変数を一時的に設定したい場合 (たとえばプログラムをコンパイルするときに,そのプログラムに応じた (自分の通常の設定とは異なる) CFLAGS を設定したいなど) は,その都度 setenv コマンドを使えばよいでしょう.また、ターミナルで env コマンドを実行すると、現在設定されている環境変数の一覧を表示することができます。

env


設定ファイル[編集]

tcsh では,自分専用の設定ファイルは ~/.login または ~/.tcshrc という不可視ファイルになります.~/.login はログインシェルが起動した時点で、わかりやすく言うと、Terminal.appを起動した時点で、読み込まれる設定ファイルで、~/.tcshrcはshellが起動するごとに読まれる設定ファイルです。Terminal.appでktermを入力すると、kterm上のシェルではさらに ~/.tcshrc が読み込まれることになります。このファイルにシェルスクリプトを書き込んでおくことで,シェルや様々なプログラムの動作を設定することが出来ます.「シェルスクリプト」の意味が分からない方は,要するに ~/.tcshrc に必要なコマンドを書き込んでおくのだと考えておいてください.

PATH[編集]

この環境変数はコマンドサーチパスを保持しています。

たとえば、/usr/local/bin と /Developer/Tools にパスを通したい (コマンドサーチパスに /usr/local/bin と /Developer/Tools を含めたい) 場合には,~/.tcshrc に

setenv PATH /usr/local/bin:/Developer/Tools:$PATH

という一行を書き加えます.複数のパスを設定する場合には,上記のようにパス名を「:」(半角コロン) で区切ります.

末尾に :$PATH と付けてあるのは,この行が読み込まれる前に設定されている,デフォルトのコマンドサーチパスにパスを追加する形にするためです.tcsh が起動されたときには,まずシステムの標準の設定ファイルが読み込まれ,その後 ~/.tcshrc が読み込まれるので,PATH についてはこのように書いておく必要があります.末尾の :$PATH を付け忘れると「プリインストールされているはずのコマンドが見つからない!」と慌てることになりかねませんので,注意してください.

また,パス名の並びには意味があり,最初のパスから順にコマンドが検索されていきます.バージョンの異なる同一コマンドが複数のパスにインストールされている場合などは注意してください.たとえば、プリインストールされているものより新しいバージョンのコマンドをインストールしたい場合には,普通は /usr/local/bin にインストールするでしょう.その場合に

setenv PATH $PATH:/usr/local/bin:/Developer/Tools

などとすると,/usr/local/bin より先に /bin や /usr/bin などが検索されてしまい,結局プリインストールされている方のコマンドが起動してしまいます.ほとんどの場合は,$PATH は末尾に付けるのがよいでしょう.

PATH の設定には別の方法もあります。環境変数 PATH には、これに対応するシェル変数 path があります(全ての環境変数に、それに対応するシェル変数があるわけではありません)。このような対応する環境変数とシェル変数には、一方に設定された値が他方にも(即座に)反映されるという性質があります。

そこで、シェル変数の設定コマンドである set を用いて環境変数を設定することもできます。たとえば上記の PATH の設定を、

set path = ( /usr/local/bin /Developer/Tools $path )

と書いても同じ効果が得られます。

MANPATH[編集]

この環境変数は man コマンドが検索するマニュアルファイル (man ファイル) のパスを保持しています.設定方法は PATH の場合と同様です.

なお、実際には MANPATH が設定されていなくても man コマンドは機能します。man コマンドは、man ファイルを検索するディレクトリがオプションで指定されておらず、かつ MANPATH も設定されていない場合には、man.conf を読み込んでデフォルトのパスを検索します (Mac OS X の場合、 man.conf は /usr/share/misc/man.conf で、/usr/share/man、/usr/local/share/man、/usr/X11R6/man を検索するように設定されています)。

ただし、自分でインストールしたプログラムの man ファイルが上記以外の場所にインストールされる場合には、.tcshrc で MANPATH を設定しておく必要があります。

この場合、tcsh の起動時には MANPATH は設定されていませんから、PATH の設定とは違って、

setenv MANPATH YOUR_MAN_DIRECTORY:/usr/share/man:/usr/local/share/man:/usr/X11R6/man

のように書く必要があります (YOUR_MAN_DIRECTORY の部分には自分がインストールしたプログラムの man ファイルの場所を書いてください)。

Fink をインストールしている場合には、Fink が MANPATH を設定しているはずなので、

setenv MANPATH YOUR_MAN_DIRECTORY:$MANPATH

と書けばよいはずです。


補足[編集]

Fink を利用している場合は以下の点に注意してください.Fink をインストールすると,~/.tcshrc の先頭に

test -r /sw/bin/init.csh && source /sw/bin/init.csh

という行が書き込まれます.これは Fink の設定ファイルを読み込むためのものです.うっかり消してしまわないでください.また,自分なりの設定を ~/.tcshrc に書き込む場合には,この行の後に書き込んだ方がよいでしょう.

環境変数の設定 - bash の場合[編集]

export コマンド[編集]

bash (または sh 系のシェル) の場合,環境変数の設定には export コマンドを使用します.書式は export ENVIRONMENT_VARIABLE=VALUE' となります.たとえば環境変数 LANG を ja_JP.UTF-8 に設定する場合,コマンドプロンプトから

export LANG=ja_JP.UTF-8

と入力します.もう一つ書式があり、変数の値を設定してから環境変数にします。この書式は VARIABLE=VALUEexport VARIABLEです。

設定ファイル[編集]

bash では,自分専用の設定ファイルは ~/.bash_profile と ~/.bashrc という不可視ファイルになります.~/.bash_profile はログインシェルの起動時に言い換えれば、Terminal.app を起動した時点で読み込まれる設定ファイルで、~/.bashrc はシェルの起動ごとに読まれる設定ファイルです。tcsh の設定ファイルと比べてください。このファイルにシェルスクリプトを書き込んでおくことで,シェルや様々なプログラムの動作を設定することが出来ます.

PATHの設定[編集]

繰り返しになりますので、

setenv PATH /usr/local/bin:/Developer/Tools:$PATH

と同様の効果をbashで得る例をあげておきます.

export PATH="/usr/local/bin:/Developer/Tools:${PATH}"
PATH="/usr/local/bin:/Developer/Tools:${PATH}"
export PATH

空白文字などがPATH中にある場合は必ず、"で囲む必要があります。

尚、この様に設定ファイル~/.bashrcに書いて複数回読み込んだ場合、/usr/local/binと/Developer/Toolsが複数回繰り返して含まれることになります。PATH変数の長さの制限を越えた場合、切り落とされてしまいます。切り落とされなければ問題はありません。

この問題を回避するには、ディレクトリがPATH変数に含まれていなければ含めるように書きます。以下の例では/usr/X11R6/binが含まれていなければ含めます。

if ! echo $PATH | /usr/bin/grep -q "/usr/X11R6/bin" ; then
       PATH="/usr/X11R6/bin:${PATH}"
fi
export PATH

参考ページ[編集]

環境変数の設定 - Mac OS X 固有の事情[編集]

プログラムによっては、ターミナルの起動時に環境変数が設定されていないと、期待通りの動作をしてくれない場合があります。この場合、~/.bash_profile や ~/.tcshrc で環境変数を設定しているだけではうまくいきません。また、~/.xinitrc (X11 環境用の設定ファイル) での設定が X11 環境に反映されないといった問題もあるようです。

こうした場合、自分のホームディレクトリに .MacOSX という不可視のディレクトリを作成し、そこに environment.plist というファイルを作成して環境変数を設定しておく必要があります。このファイルで指定した環境変数は、ターミナル起動時ではなくユーザのログイン時に設定されます。したがって、このファイルで設定した環境変数を反映させるには、一旦ログアウトする必要があります。また、このファイルでの設定は UNIX のコマンドだけでなくあらゆるプログラムに反映されますので、注意が必要です。

具体的には、たとえば環境変数 LANG を ja_JP.UTF-8 に設定したければ,

    • GUIで設定

SSHKeychain.appというssh-key管理のフリーソフトがあり、その環境設定から~/.MacOSX/environment.plistが作成編集が可能です。

-[1] sshkeycahin開発 -[2] スクリーンショット

    • CUIで設定
% mkdir ~/.MacOSX
% touch ~/.MacOSX/environment.plist
% pico ~/.MacOSX/environment.plist

として、~/.MacOSX/environment.plist に

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LANG</key>
<string>ja_JP.UTF-8</string>
</dict>
</plist>

と書き込みます。一度なにかの値を設定した後は、

% open ~/.MacOSX/environment.plist

として、プロパティリストエディタで environment.plist を適宜編集するのもよいでしょう。

PATH変数[編集]

コマンドサーチパスを指定するPATH変数の設定について。

  • ユーザ・ログイン直後時に、~/.MacOSX/environment.plist がPATHに関する設定を持っている場合は(下記例)、PATH 変数が設定される。
    • ただし、MacOSXにリモートログイン(SSH 等)した場合はこれは働かないので設定されない。
<dict>
  <key>PATH</key>
  <string>/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin</string>
</dict>
  • UNIXシェルのセッションをTerminal 等で開始すると、
    1. シェルスクリプト /etc/profile が走り、その中では /usr/libexec/path_helper -s が呼ばれ、/etc/paths, /etc/paths.d/* の設定情報が使われる。もし上記のようなPATH 変数が存在していた場合は path_helper は前置的に追加する。
    2. さらにホームディレクトリ内のシェルスクリプト ~/.bash_profile が走り、下記のような記述があれば、PATH 変数への追加が行われる。
PATH=/usr/local/teTeX/bin:$PATH;export PATH

参考ページ[編集]

  • Setting environment variables for user processes (Technical Q&A QA1076, Apple Developer Connection)

http://developer.apple.com/qa/qa2001/qa1067.html

  • 覚え書き X11 for Mac OS X Part 2 - 日本語環境の構築例

http://homepage3.nifty.com/toshi3/x11_2.html#japanese


シェル zsh[編集]

zshの詳しい説明は、Z shell

カスタマイズ[編集]

  • 「Macで濁点半濁点もきちんと補完できるzshを使う」(homebrew 利用)

http://attonblog.blogspot.jp/2012/11/maczsh.html

$ brew install apple-gcc42
$ brew tap waltarix/customs
$ brew install --use-gcc --disable-etcdir waltarix/customs/zsh
$ sudo vi /etc/shells 
  /usr/local/bin/zsh(この行を追加する)
$ chsh -s /usr/local/bin/zsh(ログインシェルの設定変更)
$ vi ~/.zshrc
  export PATH=$HOME/bin:/usr/local/bin:$PATH:/opt/X11/bin:/usr/texbin(PATH変数設定はこんな感じ)


コメント[編集]

  • 2006-03-03 (Fri) 17:30:15 fu7mu4 : .bash_profileはログイン時に、.bashrcはログイン時+shellの起動時に読み込む設定です。.bashrcに記述しておけば確実に読まれるので、.bashrcと書きましたが、まずかったですか?ではもう少し詳しく書いておきます。
  • 2006-03-03 (Fri) 16:58:42  : 僕はよくわかっていないのですが、「.設定ファイルは ~/.bashrc」という既述はこれで良いのでしょうか? .bash_profile との違いは何ですか?
  • 2006-03-03 (Fri) 04:15:52 fu7mu4 : bashについて追記
  • 2006-02-11 (Sat) 17:56:30  : 修正しました。ありがとうございます。
  • 2006-02-11 (Sat) 17:08:03 ブレインズ : LANGに設定する値は"ja_JP.UTF8"ではなく"ja_JP.UTF-8"ではないでしょうか。

Wiki内の関連ページ[編集]