UNIXの基礎

更新:2001年10月12日11時5分


  1. 自習のために
  2. UNIXの使い方
  3. 基本的なコマンド
  4. シェル(説明はしません.自由に質問して下さい)

1.自習のために

 UNIXについては操作に必要な部分を講義・演習の中で説明していきます.


2.UNIXの使い方

 UNIXのコマンド(命令)は,Linux(RedHat)+KDEの画面のドッグの下の左から 8番目あたりに,「rxvt」のアイコンがあるので, それをクリックして端末画面を開いて下さい.

 コンピュータ毎に表示は違いますが,
            [a01c001@x951 ~]
のような表示(プロンプトと言います)の後で,3で示すようなコマンドを キー入力する事で実行されます.

 KDEは(他のWindows95/98/Me/2000/XPやMAC OSも同じですが) 3で話すコマンドにGUI(Graphical User Interface)の化粧をして, ユーザに取って使いやすくさせたものです. 基本的なコマンドが実際にKDEでどのようにグラフィカルに表現され, どのように使いやすくなっているか(使いにくいかもしれません)も 考えて見て下さい.

 ちなみに,「rxvt」を開いてコマンドとキー入力するような使い方を, CUI(Character User Interface)等といいます.目が不自由な方には 却ってこの方が言い事があります.


3.基本的なコマンド

 UNIXの基本的なコマンドは英語の省略形が多いので最初は戸惑うと思います.
これは慣れの問題なので適当に英語を推測しながら覚えて下さい

 この部分は徐々に増えていきます.また講義で説明したり,質問を受ければ ここに追加する予定です.

UNIXの基本的なコマンド


4.シェル


 シェル(shell)とはUNIXのOperating System(OS)に対してユーザは命令(コマ
ンド)を与えるときのインターフェイスの機能をもっています。通常、UNIXに
コマンドを与える時は

		% ls -l

のように打ち込みますが、この"ls -l"はそのままOSに行くのではなく、ユーザが
選んだシェルで解釈されてOSに仕事が送られます。いろいろなシェルがありますが
通常はCshellと呼ばれるシェル(またはそれを拡張したシェル)が使われます。

 ここではこのCシェルを説明しながら、最終的にはシェルプログラミングを理解
してもらいます。シェルプログラミングは、通常のC言語で作ったプログラムも
1つの関数のように使えるし、コマンドもその中で使えるので、これを覚えれば
少ない量で大きなプログラムを簡単に書くことができます。

 scriptとは辞書を引くと台本とありますが、C言語がどちらかと言うとミクロな
命令からなるプログラムであると考えれば、スクリプトはマクロなプログラムを
考えれば良いでしょう。

 説明は箇条書きですが、途中にコメントを入れておきます。実際にUNIX端末で
実行させながらやってみてください。


シェルの機能

【シェルの目的】
 ○ コマンド行を読み込み、解釈して実行する。

 ○ UNIX とユーザとのインターフェイス

・コマンド実行の3つの場合分け
   (1). 実行形(オブジェクト・コード)の実行
		// ls -l 等はこれです。
   (2). シェル・スクリプトの実行
		// スクリプトのファイルを作り、これを実行させます。
   (3). シェルのサブ(内部)コマンド
		// 以下に述べるset,echo,setenv等です。


シェル変数と環境変数

【シェル変数】
  現在利用しているシェルの実行環境のみの設定

 % set  変数名=値
		// % set d=date
 % set  変数名

 % set       :シェル変数をリスト
 % echo  $変数名  :値を表示する
		// % echo $d
		// date
 % unset  変数名  :変数を解放する

【環境変数】
 プロセスの実行環境の設定
		// このシェルの上で動くプロセス(コマンド)の環境に
		// 遺伝します。
 % setenv  変数名 値
		// % setenv PAGER /usr/ucb/more
 % printenv      :環境変数をリスト
		// 一度、打ってみてください。たくさん表示されるはずです。
		// この環境変数はCプログラムの中でも利用できます。
 % printenv  変数名  :値を表示する

 % unsetenv  変数名  :変数を解放する


I/O リダイレクション

・入出力の切り替えを行なう

【標準出力をファイルへ切り替える】
 % cat > file		
	// 行の先頭を^Dとするまで入力すれば、その内容がfileに入ります。
 % cat >> file
	// 行の先頭を^Dとするまで入力すれば、その内容がfileに追加されます。

【標準入力をファイルへ切り替える】
 % cat < file
	// これは出力が標準出力なので cat file と動作は同じです。

【標準エラー出力をファイルへ切り替える】
 % mkdir > error
	// mkdir と単にすると
	//	 usage: mkdir directory ...
	// のようなメッセージが端末に通常はでますが、これはmkdirコマンドが
	// 標準エラー出力として端末にだすものです。ですから、これではerror
	// ファイルにエラー出力は出ません。
 % mkdir >& error
	// errorファイルにusage: mkdir directory ...が入っているはずです。
 % mkdir >>& error
	// このようにするとファイルに追加されます。エラー等はこのように
	// 追加してログに取っておくと便利です。


ジョブ管理

ジョブ: コマンドの実行が行なわれるシェルにおける処理単位。

	// NeXTの場合はWorkspaceのツールのプロセスを選ぶと
	// アプリケーション(フォアグラウンド・ジョブ)と
	// バックグラウンド・ジョブが選べて処理が出来る様になっています。

○ ジョブの状態
・フォアグラウンド・ジョブ
・バックグラウンド・ジョブ
・一時停止状態

○ コマンドの停止には、control KEY + Z(これから"^Z"と書きます。)
○ ジョブの状態表示は、jobs
○ ジョブの強制終了は、kill [-9]

	%vi  example
	^Z
	Stopped
	%man man
        ^Z
        Stopped
	%jobs
	[1]  - Suspended              vi  example
	[2]  + Suspended              man  man
	%kill -9 %1 %2
	[1]    Killed             vi  example
	[2]    Killed             man  man

		// NeXTの場合はこの操作がNeXTStepのビジュアルな殻を
		// 被って誰でも分かりやすく出来ると理解してもらうと
		// NeXTとUNIXの関係が分かりやすいと思います。


別名機能: alias とヒストリ機能

○ 別名機能
  引数も含めて自分に都合の良いコマンド名を用意する

  % alias
  % alias  ls  'ls -al \!* | more'
  % alias  a   alias
  % a      C   clear
  % unalias  ls
  % ls
		// 以下は私が普段使っている alias です。
		// % alias   h       'history \!*| more'
		// % alias   l       'ls -agl \!* | more'
		// % alias   lf      'ls -F'
		// % alias   m       'more -c'
		// % alias   dir     'ls -Al \!*|more'
		// % alias   cd      'cd \!*;pwd'
		// % alias   del     'rm -i \!*'

○ ヒストリ機能
  過去にタイプしたコマンド名の履歴をたどる

  % history
  % !!
  % !ls
  % !-5
	// historyは以下のようなシェル変数で設定できます。
	// % set     history  = 100	# 履歴を100前まで覚えておく
	// % set     savehist = 100	# 直前のログインの履歴も覚える


ファイル名の生成

シェルのコマンド行においてファイル名を生成するために、メタ・キャラクタを
用いる

パターンマッチによるファイル名の生成

【ファイル名の生成文字】
	?  			任意の1文字
	*  			任意の文字列
	[] 			[]で囲まれた中にある1文字
	\{str1,str2,...\	文字列の候補を指定する

  % ls -l [a-c]*
  % ls -l z*
  % ls -l *.{c,o}
  % ls -l ???
  % ls -l .[a-zA-Z0-9]*


個人の環境設定

	// 各ユーザが何か処理をするとき(ログイン、シェルの立ち上げ、
	// ログアウト)に事前に環境として設定されます。

【各種設定ファイルの意味】

	.login		端末にログインする時の端末設定
				tty や tset など
	.cshrc		シェルを起動する時シェルの環境設定
				alias や setenv、path の設定など
	.logout		端末をログアウトする時の処理
				clear


/.cshrc の例

# --- .cshrc sample ---
#

# Set fundamental command path
set     HOST = `hostname`
set     cpath=( /usr/local/bin \
                /etc /usr/etc /usr/uci /usr/ucb /bin /usr/bin \
                /usr/pds/bin /usr/new . )

if ( $?prompt ) then    # Not remote shell or remote cp Mode
        biff y
        # Set Environment variable
        setenv  VISUAL          "/usr/ucb/vi"
        setenv  EDITOR          "/usr/ucb/vi"
        setenv  PAGER           "/usr/ucb/more"
        set     history  = 100
        set     savehist = 100
        set     ignoreeof
        #set    noclobber
        # Set filename completion
        if ($SHELL == "/bin/tcsh") then
                set fignore=( .o ~ .aux .log )
                set prompt="%%`hostname`#`whoami`[%h]:"
        else if ($SHELL == "/bin/newcsh") then
                set editmode=emacs
                set prompt="%`hostname`#`whoami`[\!]:"
        else if ($SHELL == "/bin/csh") then
                set filec
                set fignore=( .o ~ .aux .log )
                set prompt="%`hostname`#`whoami`[\!]:"
        endif
endif

# Set Host dependent command path
if ( $HOST == "hostA" ) then
        set rpath=( /usr/hostA/bin )
else
        set rpath=( )
endif
# Set All command path.
set path=( $cpath $rpath )

## set alias command ##
alias  a        alias
a      ls       'ls -al \!* | more'
a      dir      'pwd; ls -l \!* | grep -v "^-" | more'
a      rlogin   'rlogin \!* -8'
...


// 上の例は.cshrcの1つの例ですが、たとえばこの中の
//	set prompt="%`hostname`#`whoami`[\!]:"
// の部分だけを打ち込めば、あなたのプロンプトは変わるはずです。
// ところがこのような変更では、一旦ログアウトすると効力は消えますから
// .cshrc に組み込んでおけばこれからもずっと使えることになります。


C シェルの組み込みコマンド一覧 (パート1)

	alias		別名定義されている別名とその意味を表示する
	alias name	別名 name の定義を表示する

	%job		jobで指定する(省略可)ジョブをバックグラjobで指定する
	cd dir		引数 dir を指定しないとユーザのホームディ
			レクトリに移動する
			それ以外はディレクトリ dir に移動する

	echo wordlist	引数 wordlist を展開して表示する

	exit		現在のシェルを終了する

	fg %job		jobで指定する(省略可)ジョブをフォアグラウンドで
			実行する (job はジョブ番号を指す)

	history		履歴リストを表示する
	jobs		実行中のジョブを表示する

	kill %job	job で指定したジョブを終了させる
	kill PID	pid で識別されるプロセスを終了させる
			-KILL オプションを付けると強制終了させる
				// PID は psコマンドで分かります。
				// プロセスの識別番号です。
	logout		ログインシェルを終了する

	set			現在定義されているCシェル変数の名前と値
				を表示する
	set name=word		変数 name の値を word とする
	setenv name value  	環境変数 name の値を value とする

	source file	Cシェルスクリプト file を現在のシェルで実行する
				// .cshrc等は変更しても、その変更は次の
				// ログインからしか有効になりません。
				// そのため
				//	% source ~/.cshrc
				// 等として今すぐ使えるようにします。

	stop %job	バックグラウンドで実行しているjob で指定された
			ジョブを停止する

	time command		command の実行に使用した時間を表示する
	unalias pattern 	pattern に一致する別名の定義を削除する
	unset pattern		pattern に一致するシェル変数を解放する
	unsetenv pattern 	pattern に一致する環境変数を解放する
	@			全てのシェル変数の値を表示する

	@ name=expr		変数 name に expr の値をセットする
				expr には算術演算子を含めても良い


C シェルプログラミング

シェルプログラミングの手順

step 1 プログラムの入力
		// 適当なEditorでプログラムを作ります。
step 2 実行可能形への変換
	chmod +x プログラム名
		// このように作ったファイルに実行権を与えると
		// シェルプログラムとして動く様になります。
step 3 プログラムの実行
	プログラム名


echo を使ったシェルスクリプト

[echoを用いてメッセージを表示する] // をファイル名とします。

#!/bin/csh -f
#

echo "This is a shell script."
echo ""
echo "The above line is null line."
echo -n "This  "
echo -n "line  "
echo -n "has  "
echo -n "no  "
echo -n "CR."
echo ""
echo ""
------------------

	% chmod +x echo.csh
	% echo.csh
	This is a shell script.

	The above line is null line.
	This  line  has  no  CR.
	

	// #!/bin/csh -f のところは取り敢えずおまじないだと思ってください。


set を使ったシェルスクリプト

[setを用いて変数を定義する]
#!/bin/csh -f
#

set var = "This is a variable."
set array = (a b c d e)
echo "content of var        :$var"
echo "all value of array    :$array"
echo "second value of array :$array[2]"
echo "number of array       :$#array"
echo "3,4,5 value of array  :$array[3-5]"
echo "out of range of array :$array[10]"

------------------

	% chmod +x set.csh
	% set.csh
	content of var        :This is a variable.
	all value of array    :a b c d e
	second value of array :b
	number of array       :5
	3,4,5 value of array  :c d e
	Subscript out of range.


算術演算 @ を使ったシェルスクリプト

[@を行頭に置いて算術演算を行なう]	// をファイル名とします。


#!/bin/csh -f
#

@ x = 10
echo "x=10"
@ y = 3
echo "y=3"
@ z = $x + $y
echo "z=x+y"
@ zzz = $x * $y
echo "zzz=x*y"

echo "z is $z. zzz is $zzz."

------------------

	% chmod +x exp.csh
	% exp.csh
	x=10
	y=3
	z=x+y
	zzz=x*y
	z is 13. zzz is 30.


$を使ったシェルスクリプト

[$を用いて文字列の入力を行なう]		// をファイル名とします。

#!/bin/csh -f
#

echo "Let's input text from keyboard."
echo -n "Please enter something ? :"
set input = $<
echo "Your input text is [ $input ] ."

------------------

	% chmod +x string.csh
	% string.csh
	Let's input text from keyboard.
	Please enter something ? :abcdefg	// abcdefg は入力です
	Your input text is [ abcdefg ] .


コマンド置換を使ったシェルスクリプト

[UNIXコマンドで実行結果を文字列として得る]// をファイル名とします。

#!/bin/csh -f
#

set date = `date`

echo "Day of the week ?     :$date[1]"
echo "Month ?               :$date[2]"
echo "Day of the month?     :$date[3]"
echo "Time ?                :$date[4]"
echo "Year ?                :$date[6]"

------------------

	% chmod +x date.csh
	% date.csh
	Day of the week ?     :Sat	// 当然ですが皆さんの結果は違うはずです
	Month ?               :May
	Day of the month?     :8
	Time ?                :18:50:41
	Year ?                :1993



if を使ったシェルスクリプト

[if文で条件判断を行なう]		// をファイル名とします。

#!/bin/csh -f
#

set file = $1

if (-d $file) then
   echo "This file ($file) is directory."
else
  echo "This file ($file) isn't directory."
endif

------------------

	% chmod +x if.csh
	% if.csh date.csh
	This file (date.csh) isn't directory.
	% if.csh .
	This file (.) is directory.
		// . とか .. はディレクトリです。ls -l すれば分かるでしょう。


foreach を使ったシェルスクリプト

[foreach文で繰り返し制御を行なう]	// をファイル名とします。

#!/bin/csh -f
#

@ users = 0
set date = `date`
set month = $date[2]

foreach wholist (`who`)
     if ( $wholist == $month ) then
            @ users += 1;
     endif
end

echo "the number of login users : $users"