9-4. UNIXの使い方 '96〜 (1) UNIXマシンの環境 * 環境の確認 **** 以下は INDY IRIX 5.3 の場合 **** % login jiro ユ−ザ jiro でロッグインしたとする。 % setenv HOME=/usr/people/jiro PATH=:/usr/sbin:/usr/bsd:/sbin:/usr/bin:/bin:/usr/bin/X11 LOGNAME=jiro HZ=100 TZ=JST-9 日本時間 JST は国際標準時間から9時間差があると見る。 TERM=iris-ansi % echo $TERM とやっても iris-ansi であると分かる。 USER=jiro LANG=ja_JP.EUC .lang を見る。 SHELL=/bin/csh Cシェルを使っている。 REMOTEUSER=UNKNOWN MAIL=/usr/mail/jiro PWD=/usr/people/jiro MSGVERB=text:action NOMSGLABEL=1 NOMSGSEVERITY=1 MANPATH=/usr/share/catman:/usr/share/man:/usr/catman:/usr/man DISPLAY=:0 % cat .lang ja_JP.EUC % cd /usr/people/jiro; ls -a .desktop-indy .sgisession これらは INDY 特有の設定ファイルで、ユ−ザ作 .ebtpriv .capturesettings 成ツ−ルでユ−ザを作ると勝手にできるものであ .sgihelprc .Sgiresources る。dumpster/ はファイルのゴミ箱である。 .chestrc dumpster/ .login .lang .cshrc .profile 通常のUNIX環境設定ファイル。 .Xdefaults Xウィンドウベ−スのソフトの独自設定。 .netscape Netscape を使うとできる。Ver.2.x 以降分。 .zmailrc .zmlayout Zmail の個人環境。 Mail/ dead.letter 電子メ−ルの保存ディレクトリと失敗分。 * ユ−ザ起動環境 以下はCシェルを使う場合である。ロッグインすると ~/.login、~/.cshrc の順で実行さ れる。Bシェル(ボ−ンシェル)というのもあるが、これは ~/.profile だけが実行され る。たいがいはCシェルを使うようである。 ~/.login ロッグインした時に実行される。 ~/.cshrc Cシェルが起動される時に実行される。 ~/.logout ロッグアウトした時に実行される。 /usr/people/jiro/.cshrc echo や tset は .cshrc では使わないようにする。 --------------------------------------- |alias ls 'ls -C' | % set とやると history 10 と表示される。%history |set history = 10 と打つとこれまで入力したコマンド、10個が表示さ | れる。 |# ここから下追加。 |alias cls clear ; pwd 別名の登録です。 |alias dir 'ls \!*' dir に引き数をとれるようにする。 |alias d 'pwd;ls -F' |alias crd mkdir crd、cpt は Apollo のコマンドに似せた。 |alias cpt 'cp -r' | |setenv PATH .:/usr/local/bin:$PATH コマンドを探すパス。カレントディレクトリ | を先ず探すように .: を指定してある。 |setenv MANPATH /usr/local/man:$MANPATH | |limit coredumpsize 0 core ファイルのサイズを0に制限する。 |set filec ファイル名の補間をする。 |set no clobber 既存ファイルへのリダイレクションを禁止する。 |umask 002 自分が作るファイルに 664, rw- rw- r-- のパ−ミシ | ョンを与える。 .login、.cshrc ファイルの記述の仕方は同じである。 これらのファイルの中身を変更し た場合は、ロッグインし直すと有効になる。もしすぐ有効にしたければ % source .cshrc とやるとよい。 * コマンドの別名のつけ方 % alias dir 'ls -F' 別名の登録。永久登録される訳ではない。 % dir dir1/ dir2/ f1* f2* % unalias dir 別名の取り消し。 * ファイル名の補間 % set filec ESC と Ctrl+D キ−を使う。 % cat jir で ESC キ−を押すと % cat jiro.doc というように補間してくれる。 * setenv コマンド % setenv PATH /com:$PATH 現在のパスの前に /com を含める。 % setenv PATH "$PATH":/com 現在のパスの後に /com を含める。 $PATH:/com だと エラ−になる。 % setenv PRINTER canon 環境変数を追加する。 % setenv 現在の環境を表示する。printenv でもよい。 | PRINTER=canon % unsetenv PRINTER 環境変数を削除する。 * 端末の設定 % setenv TERM vt100 % set term=vt100 でもいい。直に有効になる。 めっ たに端末設定をいじることはないが、時に必要である。 % tset - 現在の端末は?。% set、% setenv でも分かる。ただ vt100 し C-shell の環境でだが。 % tty どのデバイスに接続しているか見る。最初のウィンド /dev/ttyq2 ウは INDY では /dev/ttyq0 である。 % stty 端末画面の状態を表示する。% stty -a で全てのパラ speed 9600 baud; -parity hupcl clocal メ−タを表示する。 Apollo か line = 1; intr = ^C; old-swtch = ^@; dsusp = ^@; ら telnet で INDY に入ってい brkint -inpck icrnl onlcr tab3 るため、speed が 9600 になっ echo echoe echok echoke ている。 * ~/.login ファイル INDY の通常の TERM 変数は "iris-ansi" である。他 .../jiro/.login のEWS、例えば Apollo から telnet して jiro で ---------------------------- ロッグインする。TERM は "apollo" であり、INDY に |#eval `tset -s -Q` はそんな端末情報は無い。そこで .login で TERM が | "iris-ansi" でなければ、他のEWSからのアクセス |if ($TERM != "iris-ansi") then とみなし、ポピュラ−な端末だったDEC社の vt100 | echo "jiro kun" モ−ドにする。vt100 端末ディスプレイは確かに14 | set term=vt100 年前にはあった。学生の時に使ったことがある。当時 |endif はNECの PC98 が研究室に入ってきた時期だった。 Apollo $ telnet INDY どの端末用デバイスに接続しているか見る。全くこの INDY % tty 時代になっても、まだキャラクタ端末を使っているの /dev/ttyq2 だ。ビットマップ・ディスプレイが泣くよ。 INDY % echo $REMOTEHOST printenv REMOTEHOST も同じ。telnet で入っている。 hostA * マニュアルを見る 1.ユ−ザコマンド 2.システムコ−ル $ man 1 intro 3.ライブラリル−チン 4.デバイスファイル $ man 2 intro 5.管理者用システムファイル 6.ゲ−ムとデモ 7.パブリックファイル * man をみる $ nroff -man xxx.man オンラインマニュアルと同じ表示をする。 $ /usr/bin/nroff -ms xxx.man 表などが入っていなければ、これで十分。 [ Linux のマニュアル ] http://www.linux.or.jp/JM。JM Project の [man on WWW] でUNIXのコマンド名を入 れると、日本語訳のマニュアルが出て来る。十分参考にできる。`24/04 追加。 * X関係のマニュアルを追加する $ ld /usr/X11/man Apollo ではここにマニュアルが入っている。 cat1 cat3 cat4 cat7 cat8 $ setenv MANPATH /usr/X11/man $ man XtAddCallback Xの関数のマニュアルを見ている。 * シェルについてもう少し UNIXのコマンド操作はシェルがになっている。 ls とか cp とかいったコマンドはそ う変わるものではないが、環境設定やシェル・スクリプトでは記述が異なってくる。おお まかにシェルはBシェル系とCシェル系がある。Bシェル系の sh がシェルの大元であり、 使いやすくとか拡張したりしてバリエ−ションが増えている。ちなみに Apollo のデフォ ルトは /bin/sh、INDY では /bin/csh になっていた。 自分のマシンがどのシェルになっ ているか調べるには、setenv, printenv, set, echo $SHELL のどれかで表示されるはず である。.login など環境設定ファイルをすぐに有効にしたい時は % source .login など とやってみる。駄目ならロッグインし直すのが手っ取り早い。 [ Bシェル系 ] sh, bash, ksh, zsh /etc/profile、~/.profile を参照。 % export PATH=.:$PATH << .profile の中に普通書いておく。 % cc test.c > log 2>&1 << 2は標準エラ−出力、1は標準出力。 bash は Bourne-Again Shell の略、~/.bashrc をみる。 ksh は普通あまり使われな い。Apollo で一部使用はあるが。 zsh は色々なシェルのいいとこを寄せ集めたもの。 [ Cシェル系 ] csh, tcsh ~/.login、~/.cshrc、~/.tcshrc を参照。tcsh は .tcshrc を優先してみる。 % setenv PATH .:$PATH % set path=(. $path) << 大文字でも可。ただの set で設定環境を表示する。 % cc test.c >& log << 上と同じ意味になる。ともかく全部のログをとる。 * シェルのパラメ−タ登録 `2h/11/E 追記 $ /bin/start_csh % set home=/nix/cad/ % cd home << 注目、設定した home のディレクトリに移動する。 % pwd //node_abcd/nix/cad % set argv () cwd / << カレントディレクトリ。 home /nix/cad/ path (/com /bin /usr/bin /usr/ucb /usr/apollo/bin) prompt % shell /bin/csh status 0 term apollo user katou % unset home << 解除する。 * こんなのも試していた `2h/11/E 追記 test1 ------------ |#!/bin/csh |/com/ld $* << $* が引き数を全部とる。 % test1 -ll -lt << ファイルの数を数える。 Directory "/nix/cad/doc": 92 entries (none listed). (2) ネットワ−クコマンド * telnet : リモ−トロッグイン・サ−ビス % telnet hostB Ctrl+] で telnet> プロンプトになる。 quit を入れ Trying 192.9.200.2 ... ると終了する。ただし多段の telnet をかけている場 Connected to hostB. 合、自分のマシンまで戻ってしまう。つまり自マシン Escape character is '^]'. が AAA としよう。hostB に telnetをかけ、そこから hostC に telnet をかけている場合、Ctrl+] の quit IRIX System V.4 (hostB) だとマシン AAA まで戻ってしまう。 一つ前の hostB に戻るには exit と入れればよい。 login: jiro hostB % ls 自分と相手のマシンの内臓時計がちゃんとなってない telnet> quit と、すぐにコネクションが切れる。自分が Apollo で Connection closed. 1年位時計が進んでいる、内臓電池消耗で狂っている。 % 何かコマンドを入れてないと1分位で切れてしまう。 * ftp : ファイル転送の基本コマンド % ftp hostB ftp では相手ホストでパスワ−ドがちゃんと設定され Trying 192.9.200.1... ているユ−ザにアクセスできる。 Name (hostB:katou): root 331 Password required for root. Password: ftp> binary ファイル転送をバイナリ・モ−ドにする。ASCII 形式 200 Type set to I. での転送は ascii と入れる。通常は binary でいい。 ftp> ? ftp> !/bin/ls 自分側ディレクトリをみる。 readme.doc ftp> put readme.doc ファイルを相手 hostB に送る。 ftp> get temp.doc 相手からファイルをとってくる。 ftp> bye $ 他相手ファイルを消去する delete などもある。 ftp> cd /usr/katou 相手のディレクトリを変更する。 ftp> lcd /usr/satou 自分のディレクトリを変更する。 ftp> prompt mput でいちいち聞いてこないようにする。 ftp> mput * 全てのファイルを一挙に相手に送る。 ftp> dir *.txt 相手側で ls -l *.txt とやる。ftp は引き数はダメ。 ftp> ascii DOSとUNIXで改行コ−ドを自動変換する。 ftp> mdelete * 全てのファイルを消去する。delete は*を認識しない。 通常の ftp コマンドはいささか機能不足である。 相手ホストのディレクトリを ftp> ls で単純にダ−っと見るしかできない。仕方ないので telnet でも入って、ディレクトリを 見ながら ftp を使うといったこともよくある。フリ−ソフトの ncftp なら、相手ホスト で cat や more、UNIXのパイプ機能などを使うことができるらしい。ここから追加し た `2h/04/04、ディレクトリを作るのは mkdir、消すのは rmdir です。 * rlogin : ロッグイン手続き不要の telnet jiro% rlogin hostB ユ−ザ jiro が hostB にアクセスする。 hostB % pwd hostB でも jiro でロッグインしたことになる。 /usr/people/jiro hostB % Connection closed. ~. または Ctrl+D で終了。 jiro% * lpr : プリント出力コマンド % lpr file -Plp が想定されている。プリンタ名 lp である。 % lpr -s file 大きなファイルをプリントする時にやってみよう。 % lpr -Psparc file.ps プリンタ名 sparc は /etc/printcap にあること。 PostScript ファイルの file.ps をプリントする。 lpq でキュ−に溜まっているファイルを見る。% lprm - でキュ−のファイル全てをキャ ンセルする。lpc を使うとこまかな操作ができる。 * お知らせコマンド hostB に hostA のユ−ザが telnet をかけて jiro でロッグインしている状況。 hostB % w どなたがロッグインしてマシンを使っているか。 User tty from login@ idle JCPU PCPU what katou q0 :0.0 10:28am 5:29 -csh jiro q2 hostA 3:56pm w % who katou ttyq0 Dec 6 16:07 上の w と似たコマンドだが情報が少ない。 jiro ttyq2 Dec 6 15:56 rusers というコマンドもある。 hostB % write jiro ユ−ザ jiro にメッセ−ジを送る。telnet している tomete kudsai 画面にでる。write jiro ttyq2 という指定もできる。 hostB % wall tomete tomete はファイルでメッセ−ジを書いておく。hostB にロッグインしているユ−ザ全てにメッセ−ジを送る。 hostA % indy Fri Dec 6 16:03:05 1996 上の katou (ttyq0) からのブロードキャスト・メッセージです % talk jiro@machine 相手と筆談する。phone というのもある。 % finger jiro@machine 相手がコンピュ−タを使っているか調べる。 * ネットワ−クコマンドのまとめ コマンド | サ−バ | 起動方法 | 備 考 -------------|----------|------------|-------------------------------- finger,whois | fingered | inetd | telnet | telnetd | 〃 | tftp | tftpd | 〃 | talk | ntalkd | 〃 | ftp | ftpd | 〃 | ~/.netrc, /etc/ftpusers -------------|----------| 〃 |-------------------------------- rlogin | rlogind | 〃 | /etc/hosts.equiv, ~./rhosts rsh | rshd | 〃 | 〃 内部で rlogin 使用 rcp | rshd | 〃 | 〃 内部で rsh 使用 rmt | ------ | 〃 | 〃 内部で rcmd, rexec 使用 lpr,lpq, etc | lpd | daemon | 〃 & hosts.lpd -------------|----------|------------|-------------------------------- rwho,ruptime | rwhod | daemon | broadcast 使用 rusers | rusersd | portmapper | broadcast 使用 -------------|----------|------------|-------------------------------- rcmd | rshd | | rcmd, rexec はシステムコ−ル rexec | rexecd | -------- | ~/.netrc rdist | | | 内部で rsh、rcmd と rdistd 使用 -------------|----------|------------|-------------------------------- wall, write | ______ | ________ | 端末デバイスにメッセ−ジを送る w, who | | | ようになっているらしい [ Rコマンドの特徴 ] rlogin, rsh, rcp, rmt, lpr などは BSD 4.3 系のRコマンドと呼ばれる。これらはロッ グイン手続きを省く /etc/hosts.equiv と ~/.rhosts が制御ファイルとして設定できる。 ロッグインしたいホストにこれらのファイルを記述して使う。基本的には先ず相手ホスト の /etc/hosts.equiv が参照され、そこでエントリがなければ ~/.rhosts が参照される。 エントリの記述はロッグインを許すホストとユ−ザ名を列挙するか、+ですべてOKとす るかによる。~/.rhosts の記述はIPアドレスではダメである。設定はホスト名を書くと すぐ有効になる。 ------------ rlogin hostB ---------- /etc/hosts.equiv 空 | hostA | -------> | hostB | ↓ | USER taro| | | ~/.rhosts -> /usr/people/taro/.rhosts ------------ ---------- ------------------------ |+ << 何でもOKの印し。 [ telnet, ftp の端末制御 ] BSD 4.3 系の telnet や ftp は端末制御ファイルの設定で、root ロッグインの可否を制 御できる。Apollo では /etc/ttys ファイル、 SunOS 4.1.x では /etc/ttytab ファイル である。rlogin は端末制御でないためこれらのファイルは見ない。 一応 ttys ファイル でもセキュリティ対策の一つにできるが、感じとしてはあまり使わないようである。以前 UUCP の設定の際、RS-232C 接続のところで、このファイルにお世話になった。/etc/ttys など端末制御ファイルの内容を変更した場合は、 root でロッグインして % kill -HUP 1 とやって端末の初期化をする。これでいちいちマシンをリブ−トしなくても済む。 * Solaris 9 での ftp デフォルトではこのマシンには他のコンピュ−タから root で、FTP ロッグインできない。 /etc/ftpd/ftpusers ftpusers ファイルに root daemon bin sys adm など記載され ------------------- ている。root を #root にコメントにする。この変更はすぐに |root 有効になった。このファイルに記載されていないユ−ザのアカ |daemon ウントからは FTP ロッグインできる。/etc/ftpd/ には他にも |bind ファイルイがある。ftpgroups, ftphosts, ftpservers はコメ | | ントだけで中味はない。ftpaccess, ftpconversions にはいろ いろ書いてあった。 # ls /etc/ftpd ftpaccess ftpconversions ftpgroups ftphosts ftpservers ftpusers $ ftp 192.168.1.1 ftp アクセスされると inetd の中から in.ftpd が起動される。 inetd.conf 見ると IPv6 にも対応している模様。 # ps -ef | grep inetd root 149 1 0 ... 0:00 /usr/sbin/inetd -s root 18909 149 0 ... 0:00 in.ftpd -a /etc/inet/inetd.conf /etc/inetd.conf からリンクされている。 ----------------------------------------------------------------- |#ftp stream tcp6 nowait root /usr/sbin/in.ftpd in.ftpd -a # kill -HUP 149 inetd.confの ftp のとこをコメントにして、inetd $ ftp 192.168.1.1 を再起動した。これで他のコンピュ−タから FTPア ftp: connect: Connection refused クセスできなくなる。拒否されているのが分かる。 (3) UNIX基本コマンド * プロセスを見る % ps -ef UID PID PPID C STIME TTY TIME COMD root 331 1 0 09:47:31 ? 0:00 /usr/local/bin/httpd root 294 1 0 09:47:27 ? 0:00 /usr/etc/lpd | % ps -ef | grep httpd root 329 1 0 09:44:15 ? 0:00 /usr/local/bin/httpd root 1951 633 2 17:32:48 pts/2 0:00 grep httpd * ディスクの使用状態を知る % du /usr/people ディレクトリだけの集計。使用ブロック数を表示する。 % du -s /usr/people 上記と同じ。INDY, Solaris の1ブロックは 512 byte。 % du -a カレントディレクトリ下のファイルとディレクトリの集計。 % du -ak Kbyte で表示する。 % df ディスク全体の使用状態。ブロック数表示。 % df -k ディスク全体の使用状態。Kbyte 表示。 INDY に入れていた /usr/local/source/postgresql-6.5.3/ のソ−スプログラムを例にデ ィスクの使用容量を見てみる。このディレクトリに入って % du とやったのが 79796。こ のディレクトリを全部消す前と後で % df -k をやった有効容量の変化が 39899。 これは 39899/1024=38.9639 Mbyte といううこと。79796 は単位はブロックで、 UNIXの1ブ ロックは 512byte。2で割るとキロバイトで 39898 Kbyteとなる。デイスクのファイルの 計算、しばしば分からなくなってしまう。Sun の Solaris 9 では # df -h とか # ls -h とか -h というオプションが追加されている。各自、表示の単位は確認されたい。 やっぱり時たま分からなくなる。今度は V210 Solaris 9 でのこと。メ−ルストアにして いるマシンである。ある日、マシンの様子を見たらル−トにコア・ファイルができていた。 # ls -l で 36808380 ... core。ファイル core を消去したら、使用済みが 503699 から 467770 になった。# df -k でみた値である。503699 - 467770 = 35929 KB x 1024 Byte= 36791296 Byte。1MB = 1024KB = 1024KB x 1024 Byte = 1048576 Byte、 確かこれがディ スクの容量を計算する際の換算。NECの MS-DOS パソコンの時代には、プロッピ−ディ スクの容量がこれだった。それで 35929 KB は 35929/1024 = 35.0869 MB。 * ディスクの使用状態についてもう少し説明 Kbyte 表示 | ディスク全体 | 最初のディレクトリ | ディレクトリ全体 -------------|--------------|--------------------|------------------ Solaris 2.6 | df -k | du -sk * | du -sk SunOS 4.1.4 | df | du -s * | du -s # df ここからは SunOS 4.1.4 での出力 Filesystem kbytes used avail capacity Mounted on /dev/sd1a 15487 5041 8898 36% / /dev/sd1g 148887 122802 11197 92% /usr /dev/sd1h 193591 97988 76244 56% /home # cd /home; du -s * 8 lost+found 51240 swapfile 46739 katou << この中に一杯ディレクトリやファイルがあるが、大元のディレ クトリでの総ファイル容量が出ている。 # du -s 97988 . << # df の /home の used の値と一致している。 * コマンドの有りかを調べる % whereis vi 同じコマンドを全て調べる。 vi: /bin/vi /usr/bin/vi /usr/share/catman/u_man/cat1/vi.z % which vi 環境変数の PATH にもとづき調べる。whereis も同様。 /usr/bin/vi この vi が使われる。 * 一時的にユ−ザIDを変更する % su passwd: xxxxx root のパスワ−ドを入れたら root になれる。 % su jiro jiro になる。% Ctrl+D で元のユ−ザに戻る。 * 計算器 % bc ちょっと計算するのに便利なコマンドです。 X Window の 123456789*2 xcalc 電卓でも計算できるが、左の計算結果はイクスポ− 246913578 ネンシャル表示 2.469135e+08 になってしまう。割り算は quit で抜ける 注意した方がいい。64/10 は 6 となってしまう。 * シェルスクリプト ppp 何か状態を監視する際に使えるスクリプトである。1秒ご ------------------ とに "hellow" と表示する。echo のところを lsとか適当 |#!/bin/sh なコマンドを入れておけばよい。 |while true | do 最初の #!/bin/sh は、Bourne-shell で記述しましたと明 | sleep 1 示するものである。 | echo "hellow" | done % sh ppp 実行する。 または実行権を付けて実行する。UNIXのファイルはこ % chmod +x ppp の実行権を付けていないと、スクリプトやプログラムを実 % ppp 行できない。% chmod 777 xxx とすると何でもOKになる。 qqq qqq ファイルがあるディレクトリに moon.txt ファイルも ----------------------- もあるとする。これは Apollo コンピュ−タで記述して動 |#!/bin/sh 作を確認した。if [ "$sss" = "$kkk" ]; のところの記述 |sss="node_7850b" を if ["$sss"="$kkk"]; こんなようにしたら、エラ−は |if [ -f moon.txt ]; then 出ずに違った結果が出てしまった。こういうのは困る。 | kkk=`/bin/hostname` | if [ "$sss" = "$kkk" ]; then | echo "OK" | else | echo "NG" | fi |fi * Solaris 9 でのメ−ルコマンド # which mail /usr/bin/mail # cd /usr/ucb/ # ls -l mail lrwxrwxrwx 1 root root 12 1月 30日 23:43 mail -> ../bin/mailx # ls -l /bin/mailx -r-x--s--x 1 root mail 126700 4月 7日 2002年 /bin/mailx # /usr/ucb/mail -s "henomohe" katou < "/tmp/File" 本文は /tmp/File。 # /usr/ucb/mail -s "henomohe" katou < /dev/null 本文はなし。 # echo "かとう" | /usr/ucb/mail -s "henomohe" katou 本文は "かとう"。 # df -k | /usr/ucb/mail -s "henomohe" katou > /dev/null 2>&1 ディスクの使用状 況を知らせてみる。 * Solaris 9 でのファイルのサイズについて `2a/05 # df -k ファイルシステム kbytes 使用済み 使用可能 容量 マウント先 /dev/md/dsk/d0 5170926 1285771 3833446 26% / | /dev/md/dsk/d7 41311843 1105497 39793228 3% /usr1 # df -h ファイルシステム サイズ 使用済み 使用可能 容量 マウント先 /dev/md/dsk/d0 4.9G 1.3G 3.6G 26% / | /dev/md/dsk/d7 39G 1.1G 38G 3% /usr1 # cd /usr1; ls -F named/ file1 lost+found/ test1/ NewLibrary/ katou/ haruo/ NewLibrary2/ test2/ test3/ # du -s 2129042 . # du -s * 6360 named 6360+819872+ ... 全部足すと 2129040。 819872 NewLibrary 819872 NewLibrary2 2 file1 226 katou 144 test2 72464 haruo 144 test3 409940 test1 16 lost+found # du -a 16 ./lost+found 2 ./named/nodename | 819872 ./NewLibrary 2129042 . UNIXの1ブロックは 512 Byte 2129042/2 = 1064521 KB # du -k /usr1 8 /usr1/lost+found 328 /usr1/named/temp | 409936 /usr1/NewLibrary 1064521 /usr1 1064521 KB = 1064521/1024 = 1039.57 MB * Solaris 9 でのハ−ドディスクのチェック disk_check ------------------------ Solaris 9 のミラ−リングのディスクのチェックをするコ |#/bin/csh マンドで使用する例。metastat はディスクが正常なら"0" |chk="/usr/sbin/metastat" を引き数として返す。if [ chk ] はchkが真なら実行する。 |if [ chk ]; then | echo "OK" | /usr/ucb/mail -s "DISK OK" katou < /dev/null |else | echo "NG" |fi Solaris 9 の metastat コマンドで、ハ−ドディスクに異常がないか簡単に見分けられる。 Solaris 9 ではハ−ドディスクは Solaris Volume Manager というソフトが管理している。 旧 DiskSuite といった。 # /bin/csh で > setenv LANG C と設定。 # metastat | grep State | grep -v Device | sed 's/ //g' State: Okay State: Okay # metastat | grep State | grep -v Device State: Okay State: Okay # metastat | grep State | grep Device Device Start Block Dbase State Reloc Hot Spare Device Start Block Dbase State Reloc Hot Spare (4) ファイル操作の基本 * 消去、変更、コピ− % rm -r dir 指定ディレクトリを中身もいっしょに消去する。 % rm * カレントディレのファイルのみ全て消去する。 .xxx などは消えない。消すには % rm .* とする。 % mv f1 f2 ファイルの名前を f1 から f2 に変更する。 % mv dir1 dir2 ディレクトリの名前を変更する。 % cp f1 f2 ファイルのコピ−。f1 をもとに f2にコピ−する。コピ− 先のファイルのオ−ナは、作業しているユ−ザのが付く。 % cp -r dir1 dir2 ディレクトリのコピ−。再帰的にコピ−する。ディレクト リの中にディレクトリがあればそれもコピ−する。 % cp -pr dir1 dir2 ディレクトリのコピ−。パ−ミション、オ−ナ、グル−プ、 日付もコピ−する。Sun の Solaris 9 でのこと。 * chown と chgrp % chown jiro * 全てのファイルの所有者を katou に変更する。 % chgrp user * 全てのファイルのグル−プを user に変更する。 % chown -R jiro Dir1 Dir1 というディレクトリ、 その中の全てのディレクトリ % chgrp -R user Dir1 とファイルに対し所有者を jiro、 グル−プを user にす る。-R は再帰的のリカ−シブを意味する。 * ls コマンド % ls -lu 最後に参照された日付けを出す。 % ls -l 最後に編集された日付けを出す。 % cd /var/tmp % ls -l TEST 指定ディレクトリの中のファイル属性を出す。 総ブロック数 0 -rw-r--r-- 1 root sys 0 6月 10日 14時43分 p1 -rw-r--r-- 1 root sys 0 6月 10日 14時43分 p2 % ls -ld TEST ディレクトリ自体の属性を表示したい場合。 drwxr-xr-x 2 root sys 512 6月 10日 14時43分 TEST % ls -l | wc -l ディレクトリ内のファイル数を知る。縦にリストして、そ の行数をカウントする。こんなんしかないのか!。 * ファイル、ディレクトリを見つける *** IRIX 5.3 で確認 *** % find / -name "core" -print core ファイルをル−トから見つけていく。 % find / -user root -perm -4000 -print root に SetUID したファイルを見つける。 % find / -atime -1 -print 最後に参照されてから1日以内のもの。 % find / -type f -atime -1 -print 上記でファイルだけ見つける。 % find / -atime 0 -print たった今、先程アクセスしたもの。 % find / -mtime 2 -print 最後に編集されてから2日以上経つもの。 / はル−トデイレクトリから再帰的に全部のディレクトリを調べる。~ ならホ−ムディレ クトリ以下。. ならカレントディレクトリ以下を調べる。-atime,-mtime に続く数字に + を付ける、- を付ける、何も付けないのは意味がある。分かりにくいので注意されたい。 * ワイルドカ−ドによるファイル検索 % find . -name '*.doc' -print * は任意の文字列、? は任意の1文字を表わす。 % find . -name "*.doc" -print 'xxx' or "xxx" とするか * や ? の前に \ を % find . -name \*.doc -print を付けるかする。 % find . -name "kato.???" -print % find . -name \*.\?\?\? -print * ファイルの中身の検索 % grep jiro * カレントディレクトリの中の全てのファイルから jiro と いう文字列が含まれるファイルを見つける。 % egrep -i jiro * grep の他に egrep というのもある。こっちの方が機能が 高いらしい。-i は大文字、 小文字の区別なく検索するオ プションで grep でも使える。 % grep -ns jiro * */* ファイル名、行番号、記述を表示する。*/* はすぐ下のデ dead.letter:1:From jiro ィレクトリにあるファイルも調べる。またその下のディレ file0:1:jiro kun desu クトリも調べるなら */*/* とする。 再帰的に調べること ./dir1/file1:59: jiro kun はできない。 % grep -ns 04 *.htm* -ns はマッチしたファイル名だけ表示するように付けてあ www.htm:108: KATOU-04 る。それが *.htm* を *.htm にすると、 そのファイル名 www.html:108: KATOU-04 が出なくなってしまう。どうなっているのかよく分からん。 grep 類コマンドでの正規表現はおかしい。ls などの正規表現と意味が違うのがある。ど うもUNIXの悪い癖で一貫性がない。ls などでは任意の一文字は '?' である。それが grep では '.' となる。KATOU-04 にマッチするということで、U?04 という指定はダメで ある。U.04 にしなければならない。U*04 はどうか。これもダメみたいである。 * ファイルの中身の検索の応用 カレントディレクトリの中のファイルに、jiro という文字列が何行あるか調べる。 $ /bin/csh Apollo にてテスト TEST $ /bin/ls -F # /bin/grep jiro * | /usr/ucb/wc -l ------------- TEST readme usr/ 2 |jiro fiile1 file2 file3 | jiro jiro * 空ファイルを作る % touch ddd 空のファイルを作る。問題がなければ何もでない。 % touch 3750 ファイル名の最初が数字だとエラ−になる。気付かなかっ 日付の指定が間違っています た。Apollo では crf コマンドで作る。`27/08 * ハ−ドリンク % touch ddd 空のファイルを作る。 % ln ddd eee 実体は1つ。どちらか修正すればもう一方に反映する。 % ls -l ただしどちらか消しても、もう一方は消えない。 -rwxrwxrwx+ 2 jiro 1342 Oct 3 10:24 ddd -rwxrwxrwx+ 2 jiro 1342 Oct 3 10:24 eee * シンボリックリンク % ln -s ddd fff ddd というファイルが先にある。間違えないように。 % ls -l -rwxrwxrwx+ 2 jiro 1342 Oct 3 10:24 ddd lrwxrwxrwx 1 jiro 3 Oct 3 10:25 fff -> ddd % rm fff % ln -s ppp fff リンクの付け替え。一度リンクを消して再度つけ直す。 % ls -l -rwxrwxrwx+ 1 jiro 0 Oct 3 10:35 ppp lrwxrwxrwx 1 jiro 3 Oct 3 10:37 fff -> ppp * こんなのあり? test test というファイルがあって 123 と書かれてい ----- るとする。それをこんなようにすると、ファイル % cat >> test |123 に追加して記述できてしまう。文字入力 abcの後 abc |abc は Ctrl+C とか D とか Q で抜ける。 * 漢字変換と表示 % jless 漢字ファイル more の高機能版。漢字変換して表示してくれる。 英語版 はただの less。普通は jless を less としておけばいい。 % nkf -e file1 > file2 漢字変換フィルタ−、network kanji filter。この例では file1 を強制的に EUC 変換して file2 に吐き出す。 -j で JIS、-s でシフト JIS にする。 * いろいろ % sh < doc.shar シェルア−カイブファイルの操作。sharで作られたファイ % unshar doc.shar ルは ASCII 形式。unshar で解凍する。 % expand -4 file1 > file2 タブをブランクにする。1個のタブを4つのブランクに。 % od -x file バイナリ・ファイルの中身を見てみる。16進で表示する。 od -c だとキャラクタを表示する。 * ファイルの末尾、先頭を見る % tail /var/mail/katou ファイルの末尾10行を表示する。10行がデフォルト。 % tail -20l /var/mail/katou 指定してファイルの末尾20行を表示する。 % head /var/mail/katou ファイルの先頭を10行を表示する。 * ファイルの終わりから見ていく % tail -f KKK.txt | grep katou << katou という文字だけ検索。 % tail -1f KKK.txt | egrep 'katou|satou' << katou かつ satou という文字を検索。 これはメ−ルの送受信の記録のログなんかを、リアルタイムでチェックする場合などに使 うと便利なやり方である。ここではファイルを更新するためテスト的に、 vi で KKK.txt ファイルを開いて、最後のところに文字列入れて :w! とやりセ−ブする。 該当文字があ れば表示して来る。-f は最後の方から何行かデフォルト分を表示する。 -1f は最後の方 から1行表示する。grep ではアンド指定はできないみたいである。 * tar コマンドの基本 % ls あるディレクトリに2つのファイルがある。 tea5.txt tea6.txt % tar cvf file1 *.txt これらのファイルを file1 という名前で、1つのファイルに a tea5.txt 7 blocks する。ファイル名は xxx.tar でなくても、どんなんでもいい。 a tea6.txt 9 blocks % tar tvf file1 file1 の中身をリストする。 rw-r--r-- 101/12 3373 Apr 12 12:43 2005 tea5.txt rw-r--r-- 101/12 4140 Apr 12 12:43 2005 tea6.txt % cd TEMP このディレクトリの下に TEMP というディレクトリがあり、そ % tar xvf ../file1 こに移って、file1 から2つのファイルを取り出す。 x tea5.txt, 3373 bytes, 7 blocks x tea6.txt, 4140 bytes, 9 blocks * ファイルの圧縮と解凍 % compress file file は無くなり file.Z という圧縮ファイルになる。 % uncompress file.Z file.Z は無くなり file という復元ファイルになる。 % uncompress file または、これでもよい。xxx.Z の Z は大文字のこと。 % uncompress file.tar.Z file.tar.Z を解凍する。file.tar となる。 % tar xf file.tar % zcat file.tar.gz | tar xvf - GNU の gzip で圧縮されているファイルの解凍。 % gtar xvfz file.tar.gz gtar は GNU の tar コマンドの名前をかえたつもり。 サフィックス xxx.gz とついているファイルは、GNU の gzip で圧縮したファイルである。 % gzip file で file.gz とできる。これを解凍するには % gzip -d file.gz とやる。ま たは % gunzip file.gz とするか % zcat file.gz > file とする。 zcat は GNU の圧縮 されたファイルを表示するコマンドである。 この他、サフィックス xxx.taz は tar+compress で圧縮したファイルで、 xxx.tar.Z と 解釈する。一応 % zcat < file.taz | tar xvf - このように使う。xxx.tgz は tar+gzip で圧縮したファイルで、xxx.tar.gz と解釈する。 しかしこれらのコマンドにはだいぶ混 乱が見られる。zcat はUNIXのコマンドとして最初から入っている。それで GNU のコ マンドであることを明示するため、GNU zcat を gzcat にして使うとか。 * tar コマンドの使い方 [ INDY の場合 ] DDS 4mm カ−トリッジテ−プ、通称 DAT。 DDS( Digital Data Storage ) はデ−タフォ−マットを表わす。8mm ビデオのテ−プでも 推奨はされていないが、問題なく使える。 それに DAT ドライブはサ−ドパ−ティ製のも のでも十分使える、問題ない。tar コマンドの他に cpio というコマンドもあるが、ほと んど使われることはない。これら tar などのコマンドは、 変なコマンドでフロッピ−デ ィスクをアクセスするにも tar を使う。テ−プだけのコマンドではないのである。 % tar cvf /dev/tape . カレント・ディレクトリ以下をテ−プに書き込む。 % tar cvf /dev/tape dir1 dir2 指定ディレクトリ全部をテ−プに書き込む。 % tar tvf /dev/tape dir1 dir1 ディレクトリの内容を見る。 % tar xvf /dev/tape dir1 dir1 ディレクトリの内容をディスクに入れる。 % mt -f /dev/tape retension テ−プのたるみを取る。 % mt -f /dev/tape rew テ−プを巻き戻す。 % mt -f /dev/tape erase テ−プ内のデータを消去する。 (5) ちょとだけプログラム * ファイルの比較 diff コマンドを使う。ただファイルの内容が違っているか調べるだけなら cmp コマンド がある。diff のオプションは、 diff -i file1 file2 で大文字と小文字を区別しなくな る。-w はブランクとタブを無視し、例えば次の文字列 if ( a == b ) と if(a==b) は同 じとなる。以下の例は CF-3.7W の Standards/sendmail-v8.def から、何も手をつけずに make sendmail-v8.cf コマンドで作った sendmail-v8.cf と、Standards/sendmail-v8.cf を sendmail.cf としたファイルの比較である。 $ /bin/diff sendmail-v8.cf sendmail.cf 54,57c54,57 < ##### built by motonori on falcon.econ.kyoto-u.ac.jp < ##### in /home/motonori/net/cf/CF-3.7W < ##### with Standards/sendmail-v8.def < ##### at Tue Aug 4 16:44:41 JST 1998 --- > ##### built by root on ic_sg2 > ##### in /usr/local/source/CF-3.7W > ##### with sendmail.def > ##### at Mon Sep 7 14:24:22 JST 1998 $ /bin/cmp sendmail-v8.cf sendmail.cf << 違いの情報はこれでは不十分。 sendmail-v8.cf sendmail.cf differ: char 2708, line 54 $ /com/cmf sendmail-v8.cf sendmail.cf << これは Apollo のコマンドです。 A54 ##### built by motonori on falcon.econ.kyoto-u.ac.jp A55 ##### in /home/motonori/net/cf/CF-3.7W A56 ##### with Standards/sendmail-v8.def A57 ##### at Tue Aug 4 16:44:41 JST 1998 changed to B54 ##### built by root on ic_sg2 B55 ##### in /usr/local/source/CF-3.7W B56 ##### with sendmail.def B57 ##### at Mon Sep 7 14:24:22 JST 1998 1 discrepancy found. * パッチをあてる % patch < patch_file ソ−スのあるディレクトリで実行すること。普通パッチは これであたる。元のファイル名も聞いてこない。 Apollo で試してみた。diff コマンドでファイルの差分をとりパッチファイルとする。そ して変更前のファイルにパッチをあて、変更後のファイルになるかやってみた。 diff は オプションなしだと、通常のパッチファイルを作成する。この場合、元ファイルを少しで も後でいじったら、patch コマンドで変更ファイルにすることはできない。そこで元ファ イルのブランク程度をいじってもだいじょうぶなように、diff -c、patch -c というオプ ションがある。これはコンテキスト形式のパッチファイルという。 -c は Apollo にもあ るが、-u ユニファイド形式というのが GNU の diff, patch コマンドにはある。 パッチ ファイルの形式は都合3種類あり、パッチがうまくあたらない場合は、形式に注意しよう。 元ファイル 変更ファイル パッチファイル $ /bin/diff sendmail-v8.cf sendmail.cf > tmp.patch $ /usr/local/bin/patch < tmp.patch Hmm... Looks like a normal diff to me... File to patch: sendmail-v8.cf << パッチをあてる元ファイルを指定する。 Patching file sendmail-v8.cf using Plan A... Hunk #1 succeeded at 54. done $ cmf sendmail-v8.cf sendmail.cf << 元ファイルが変更ファイルと同じになった。 Files are identical. こんなパッチのあて方もあるよということで。ソ−スがカレントディレクトリに展開され ていて、その上のディレクトリに圧縮ファイルのパッチがある。パッチを展開しながらソ −スにパッチをあてるやり方である。一応パッチコマンドは GNU のもの。 -p1 の意味は よく分からないが、ないとパッチをあてるソ−スのファイル名をいちいち聞いてくる。 % zcat ../kanji.patch.gz | patch -p1 * オブジェクト・ファイル中の文字列を抜き出す % strings -15 -o smapd.o 5018 $Header: smapd.c,v 1.8 94/11/01 11:57:58 mjr rel $ 5097 Rfwtkcfgerr: config line %d - incorrect number of parameters 5162 /usr/lib/sendmail プログラムの解析に使うことができる。 上記は fwtk の smapd.o にやってみた例である。 sendmail が /usr/lib/sendmail に定義されていることが分かる。-15 は文字列の長さで、 15文字以上の文字列を表示せよという意味である。 -o はオブジェクト・ファイル中の 文字列の位置を示すようにするオプションである。 ただ % strings smapd.o このように やると、表示可能な文字列をダ−と表示してくる。 * Makefile の超基本 -------------------- このファイルを Makefile と言う名前で作る。 |all: main clean |OBJS = main.o sub.o main.c sub.c という適当なファイル。Makefile はプログ |main: ${OBJS} ラム開発に便利なコマンドである make とともに使われる。 | @echo ${OBJS} | cc -o $@ ${OBJS} コンパイルをかける。 | |clean: | @echo SOUJI ↑ ここはタブでないとだめ。ブランクだと *** missing separator. Stop. エラ−になる。 % make これは % make -f Makefile ということ。デフォルトでは cc -c main.c -o main.o Makefile を引数にとることになっている。 cc -c sub.c -o sub.o main.o sub.o @echo ${OBJS} が効いている。 cc -o main main.o sub.o SOUJI @echo SOUJI が効いている。 % rm sub.o main.o いったん sub.o main.o を消す。 % make -n は Makefile % make -n の実行スクリプトを表示するだけになる。 Makefile はや cc -c main.c -o main.o やこしいものになると何が記述されているか分からなくな cc -c sub.c -o sub.o るので、内容を見るのに -n オプションは有効である。 echo main.o sub.o cc -o main main.o sub.o echo SOUJI % make clean 部分的に実行する例です。 SOUJI % make clean -n echo SOUJI ------------------------------------------------------------------------------------ [ 付録 ] プログラミングのための便利ツ−ル /nix/com/exhead ------------------------------------------------------------- |#!/bin/csh |#********************************************************** |# C++の xxx.C ファイルからヘッダ−部だけ抜き出して、 |# xxx.h ファイルを自動的に作成するスクリプト。 |# |# ------------------ |# |#if 1 smap.C とする |# | AAAAA |# |#endif |# | |# |BBBBB |# |# $ exhead smap.C |# $ catf smap.h |# ------------------ |# |#ifndef smap_h 自動的に入る |# |#define smap_h 自動的に入る |# | |# |#if 1 #if 1 から #endif で囲んだ部分 |# | AAAAA が smap.h として作られる。 |# |#endif |# | |# |#endif 自動的に入る |# |#********************************************************** | |set k = $1:r | |if ! -f $1 then | echo "ソ−スファイルが見つかりません" | exit |endif | |# ソ−スの拡張子が .C かチェックする |if $1:e != "C" exit | |echo "#ifndef $k""_h" > $k.h |echo "#define $k""_h" >> $k.h |echo "" >> $k.h | |awk /"if 1"/,/endif/ $1 >> $k.h | |echo "" >> $k.h |echo "#endif" >> $k.h | |echo "ヘッダ−ファイルを作成しました" /nix/com/cpc Apollo コンピュ−タのシェルで記述。 ------------------------------------------------------------- |if eqs ^1 '' then | args "[ *** C++コンパイル用スクリプト << cpc >> *** ]" | args "" | args " オブジェクトファイルを xxx.o で、カレント・ディレ" | args " クトリに作成する。拡張子は xxx.C のこと。 " | args "" | args " $ cpc test ただコンパイルするだけ。 " | args " $ cpc test -o 最適化してコンパイルする。 " | args " $ cpc test -h if 0 .. endif で指示されたファイ" | args " ルの部分をヘッダ−部を test.h で" | args " 作成する。 " | args "--------------------------------------------------" | exit |endif |if eqs ^2 '' then | CC ^1.C -A inlib,/lib/xmlib1.2 -c -b ^1.o -v | exit |endif | |select ^2 oneof |case '-o' | CC ^1.C -A cpu,mathlib -A inlib,/lib/xmlib1.2 -c -b ^1.o -O | exit |case '-h' | /nix/com/exhead ^1.C | exit |endselect | |# または、この組合せでコンパイル、リンクすること |# CC -c ppp.C /usr/lib/X11/libXm.a /usr/lib/X11/libXt.a -O -v |# CC -c mmm.C /usr/lib/X11/libXm.a /usr/lib/X11/libXt.a -O -v |# CC -o ppp ppp.bin mmm.bin /usr/lib/X11/libXm.a /usr/lib/X11/libXt.a -O -v |# CC -c ^1.C /usr/lib/X11/libXm.a /usr/lib/X11/libXt.a -O -v |# CC ^1.C -A cpu,mathlib /usr/lib/X11/libXm.a /usr/lib/X11/libXt.a -c -b ^1.o -O /nix/com/cpc Apollo コンピュ−タのシェルで記述。 ------------------------------------------------------------- |# [一挙にファイルの中の文字列を変更する] |# |# $ chstr ?*.C "name" "NAME" name から NAME に変更する例 |# | |chpat ^1 -out =.temp -p ^2 ^3 |dlf ^1 -nq |chn {^1}{.temp} @1 | |# 元 |# chpat ?*.C -out =.temp -p "Object" "OBJECT" |# dlf ?*.C -nq |# chn {?*.C}{.temp} @1 一挙にファイルの名前を変更する /nix/com/dump.c バイナリデ−タのファイルのダンププログラム ------------------------------------------------------------- |#include |#include | |main( argc,argv ) |int argc ; |char *argv[] ; |{ | int fdi,i,n,adr ; | unsigned char buf[16] ; | int j ; | | if ( (fdi=open(argv[1],O_RDONLY)) == -1 ) { | printf( " %s can not file open \n",argv[1] ) ; | exit(); | } | | adr = 0 ; | while (( n = read(fdi,buf,16)) !=0 ) { | printf( "%04x: ",16*adr++ ) ; | for ( i=0; i