UNIXコマンドマニュアル

a2p awk スクリプトを perl スクリプトに変換する

% a2p sample.awk > sample.pl
⇒ sample.awk (awkスクリプト) を sample.pl (perlスクリプト) に変換する。
FreeBSD では /usr/bin/a2p が perl4 用、package の perl5 に含まれる /usr/local/bin/a2p が perl5 用。
>> コマンド awk *   perl *

a2ps テキストファイルを Postscript に変換する

Postscript とはプリンタ用の言語である。
% a2ps file.txt | lpr -P printername (BSD 系)
% a2ps file.txt | lp -d printername (SystemV 系)
などと、Postscript データを lpr・lp コマンドで印刷できる。
>> コマンド dvi2ps *   gs *   ghostview *

ac ログイン時間の記録を表示

ユーザ別のログイン時間の記録を表示する。
% ac
total 42.99
これは、ac を実行したユーザは 42.99 時間ログインしていた、ということ。ただし、/var/log/wtmp の内容を元に時間を計算するので、/var/log/wtmp をクリアしてしまうとログイン時間が0に戻ってしまう。-p オプションを使うと、毎日の使用時間を表示できる。
% ac -p
Dec 17 total 2.15
Dec 18 total 6.47
Dec 19 total 2.54
Dec 20 total 3.36
Dec 21 total 10.26
Dec 22 total 4.20

コマンド名が似ているが、accton とは直接は関係ない。
>> コマンド accton *   lastcomm *   sa *

accton アカウント情報ログファイル作成の許可/禁止

普通のUNIXは、デフォルトではアカウント情報ログファイルは記録されないので、ログを取りたい場合は明示的に指定しなければならない。

一般的にログファイルは /var/account/acct である。/var/account/acct が存在しなかったら、まず
# touch /var/account/acct
でファイルを作成し、その後
# accton /var/account/acct
とすると、それ以降に実行されたコマンド名がログに記録される。この記録は sa コマンドや lastcomm コマンドで見ることができる。ログ作成を停止したい場合は、引数を与えず
# accton
とする。FreeBSDでは /etc/rc.conf でログ作成のオン/オフを指定できる。
>> コマンド ac *   lastcomm *   sa *

adduser 新規ユーザを追加する (FreeBSD)

68user というユーザを新しく登録する場合の例を以下に示す。
# adduser
Username: 68user
⇒ ユーザ名は「68user」
Full name: 68user
⇒ Full name も「68user」。会社や学校などなら「Yamada Taro」などとすればよい。
Uid (Leave empty for default): 2000
⇒ UID は 2000。
Login group [68user]: users
⇒ 68user が属するグループは「users」(既に存在している users というグループに属する)
Login group is users. Invite 68user into other groups? []: wheel
⇒ 他のグループにも属するか? と聞かれているので、su で root になるため wheel グループにも属するよう設定する。
Login class [default]: default
⇒ Login class は default のまま。
Shell (sh csh tcsh nologin) [sh]: tcsh
⇒ ログインシェルを指定。この場合は sh・csh・tcsh・nologin から選べ、と言っている。nologin とは /nonexistent のことで、両方とも実質的に telnet などでログインできないことを表す。ログインシェルの選択肢は、/etc/shells の内容によって変わる。ここではログインシェルとして tcsh を選択。
Home directory [/home/68user]: /home/68user
⇒ ホームディレクトリはデフォルトの /home/68user
Use password-based authentication? [yes]: yes
⇒ パスワードによる認証を使用する
Use an empty password? (yes/no) [no]: no
⇒ 空のパスワードは使わない
Use a random password? (yes/no) [no]: no
⇒ ランダムに自動生成したパスワードを使用する場合は yes
Enter password:
⇒ パスワードを入力。エコーバックはされないことに注意。
Enter password again:
⇒ 再度パスワードを入力。エコーバックはされないことに注意。
Lock out the account after creation? [no]: no
⇒ 作成したアカウントを凍結しておくなら yes
Username : 68user
Password : *****
Full Name : 68user
Uid : 2000
Class :
Groups : users wheel
Home : /home/68user
Shell : /bin/tcsh
Locked : no
OK? (yes/no): yes
⇒ 確認のため、入力した情報が表示される。これでよいなら yes とする。
adduser: INFO: Successfully added (68user) to the user database.
⇒ /etc/passwd・/etc/master.passwd・/etc/group に反映された。
Add another user? (yes/no): no
⇒ 引き続き他のユーザを追加するか? ここでは no として終了する。
Goodbye!

adduser を使わず、/etc/master.passwd を直接編集して、pwd_mkdb コマンドを実行する手もある(普通は素直に adduser を使うが)。つまり adduser コマンドは、自動的に /etc/master.passwd を編集し、pwd_mkdb コマンドを実行するプログラムなのである。

FreeBSD でのアカウント追加は adduser だが、Linux・Solaris・NetBSD では useradd コマンドを使う。
>> コマンド rmuser *   chsh *   vipw *   pwd_mkdb *   useradd *
>> 設定ファイル /etc/master.passwd *   /etc/passwd *   /etc/group *

afterstep NEXTSTEP 風のウィンドウマネージャ

かっちょいい外見と柔軟なカスタマイズ機能が人気がある。確かに見栄えはよいが色数をかなり喰うので、X が 8bpp (最大256色) だとかなり苦しい。この場合、減色したアイコン
を使うとよい。

AfterStep はユーザ固有の設定ファイルとして ~/.steprc を読み込む。それが存在しない場合は/usr/X11R6/lib/X11/afterstep/system.steprc がシステムデフォルトの設定ファイルとして利用される。ホームディレクトリに ~/.steprc が存在しない場合は、まず
% cp /usr/X11R6/lib/X11/afterstep/system.steprc ~/.steprc
% chmod +w ~/.steprc
としてシステム付属の設定をコピーし、その後 ~/.steprc を好きなようにいじればよい。

また、ウィンドウマネージャを (twm や fvwm から) afterstep に変えるには、~/.xsession (あるいは ~/.xinitrc) の最後に exec afterstep と書けばよい。afterstep-1.0 の設定方法は fvwm 系とほぼ共通だったが、afterstep-1.4 以降はかなり変わってしまった。

ちなみに、当ページ管理人は、afterstep-1.0 を国際化した afterstep-1.0-i18n を使用している。FreeBSD では
% env LANG=ja_JP.EUC afterstep &
とすると、タイトルバーやメニューに日本語が表示できる。
>> コマンド twm *   fvwm *
>> 設定ファイル ~/.xinitrc *   ~/.xsession *

agrep 曖昧検索を行う grep

grep・egrep・fgrep は指定したパターンに厳密にマッチする行を選び出すが、agrep は曖昧検索を行い、似ている行を選び出すことができる。

「似ているかどうか」は agrep のオプションで、いくつまでのエラーの数を許容するかで指定する。
% cat file.txt
hoga
hoge
moge
fuga
% agrep -1 hoge file.txt
hoga
hoge
⇒ エラーを 1 つまで許容する
% agrep -2 hoge file.txt
hoga
hoge
moge
⇒ エラーを 2 つまで許容する
% agrep hoge file.txt
hoge
⇒ 許容するエラー数を指定しない場合は、通常の grep と同じ動作をする。

-B オプションを指定すると、ひとつずつ許容するエラー数をあげていき、マッチした段階で動作を止める
% agrep -B hogo file.txt
best match has 1 error, there are 2 matches, output them? (y/n) y
hoga
hoge
⇒ 許容エラー数 0 でマッチしなかったため、許容エラー数を 1 にあげて再検索したところ、2 つマッチした

なお、grep・egrep・fgrep は UNIX 伝統のコマンドであるが、agrep は新参者で、メンテナンスされておらず、OS 標準コマンドではない。そういう意味では agrep は grep ファミリーの仲間とは言えない。
>> コマンド grep *   egrep *   fgrep *   zgrep *

alias コマンドの別名 (エイリアス) を設定する。シェルの内部コマンド。

あるコマンドを別のコマンド名で登録することで、長いコマンド名の短縮形を作ることができる。

csh・tcsh の場合は
% alias ls "ls -lFA"
% alias du "du -k"
% alias memo "mule ~/lib/memo"
% alias f "find / -name '\!*' -print"
などとする。一方、sh・bash の場合は
% alias ls="ls -lFA"
と「=」で結ばなくてはならない。

csh・tcsh・sh・bash とも、コマンドの前に `\' を付けることで、一時的にエイリアスを解除できる。
% alias "ls ls -lFA"
% ls (ls -lFA と同じ)
% \ls (alias が無効。普通の ls と同じ)
% ls (ls -lFA と同じ)

エイリアスを解除するには unalias を使う。alias コマンドを引数なしで実行すると、現在設定されているエイリアスの一覧を表示する。

普通 alias の設定は、~/.cshrc や ~/.profile などに記述しておく。こうすることで、ログインすると自動的に alias が有効になる。
>> コマンド unalias *

amp MPEG AUDIO Layer3 (MP3) プレイヤー

-q メッセージを表示しない
>> コマンド mpg123 *   sox *   splay *   xaudio *

apache 高機能WWWサーバ

シェア、信頼性、知名度など、総合的に見て一番よいと思われる WWW サーバ。CGI、SSI はもちろん、モジュールを組み込むことで色々な機能を使うことができる。
>> コマンド wwwstat *

appres Xのリソースの設定を表示

例えば kterm に関する現在のリソース設定の一覧を表示するには
% appres KTerm
とする。
>> コマンド listres *

apropos キーワードにマッチしたオンラインマニュアルを表示

あるキーワード、例えば「file」について記述してあるマニュアルの一覧が欲しい場合は
% apropos file
とする。これは
% man -k file
と同じ。

apropos・whatis とも、検索対象となるのは各マニュアルの「NAME」の項目だけで、マニュアルを全文検索してくれるわけではない。例えば ls コマンドのマニュアルは
NAME: ls - list directory contents
となっているので、ls コマンドを検索するには「list」「directory」「contents」のいずれかをキーワードに指定しなくてはならない。

apropos は指定の文字列が一部にマッチしていれば表示する。つまり、
% apropos dir
ls(1) - list directory contents
と、「dir」は「directory」にマッチするが、whatis は完全にマッチしないと表示されない。つまり
% whatis dir
では、ls コマンドは表示されない。
>> コマンド man *   whatis *

ar アーカイバ

ファイルをまとめて保管しておくためのユーティリティ。目的としては tar と同じだが、一般ユーザが使うことはあまりない。例えば、/usr/lib/lib*.a などのライブラリは ar でアーカイブされている。

-t オプションを指定すると、アーカイブされているファイルの一覧を表示する。
% ar -t /usr/lib/libc.a
__.SYMDEF
i386_set_ldt.o
i386_get_ldt.o
xdr_stdio.o
xdr_float.o
svc_tcp.o
svc_simple.o
svc_run.o
svc_raw.o
rpc_commondata.o
pmap_rmt.o
(略)
>> コマンド ld *   cc *

archie コマンドラインで FTP サイトから検索する。

archieについての詳しい説明は xarchie へ。
>> コマンド xarchie *

arithmetic 簡単な算数の問題を出題する

-o +-x/ 足し算、引き算、かけ算、割り算を出題する。引き算とかけ算のみをやりたかったら -o -x とする。

as アセンブラ

C をコンパイルする場合は、cc が自動的に as を呼んでくれる。
>> コマンド gas *   gcc *

astrolog 占星術のプログラムらしい

at 実行時間を指定してコマンドを実行

% at 10am -f foo.sh
⇒ 午前10時にシェルスクリプト foo.sh を実行
% echo ls | at 4pm + 2 days
⇒ 2日後の午後4時に ls を実行
>> コマンド crontab *   atq *   sleep *

atq at で指定されたコマンドのリストを表示

>> コマンド at *

awk テキスト整形ツール(パイプ)

一昔前は、perl のようにテキスト処理ツールとして広く使われてきた。

例えば
% ls -l | awk '{print $5,$9}'
とすることで、ファイルサイズとファイル名の一覧が得られる。この例は、入力を空白で区切り、5番目と9番目の列を出力している。空白以外を区切りとしたければ、-F オプションを使えばよい。例えば `.' を区切り (フィールドセパレータという) としたければ
% ls -l | awk -F . '{print $1}'
とする。

{} の前に任意の正規表現を書くと、そこにマッチした行に対して {} 内が実行される。
% ls -l | awk '/abc/ {print $5,$9}'
は、abc を含むファイル名と、そのファイルサイズを表示する。

特殊なパターンとして BEGIN と END がある。BEGIN は最初に実行され、END は最後に実行される。
% ls -l | awk 'BEGIN { print "START!"} {total+=$5; print $9} END {print "size total="total} '
これは、BEGIN {…} で最初に START! と表示し、各行ごとにファイルサイズを変数 total に加算し、END {…} を使って最後にファイルサイズの合計を表示するものである。

スクリプトとして動作させるには、-f オプションを付けて
#!/usr/bin/awk -f
BEGIN { print "START!"}
{total+=$5; print $9}
END {print "size total="total}
などと書く。

awk は一冊の本が書けるほど高機能なので、ここではこれ以上は解説しない。ただし、awk はプログラミング言語というより、行単位の変換ツールと言った方が適切だと思う。大規模なプログラムを作成するのには、絶対に向かない。今から awk を覚えるよりは、perl か ruby の勉強をした方がよいだろう。
>> コマンド gawk *   perl *   sed *   tr *
>> 読み方 awk *

banner 大きい文字を出力

大きい文字を出力する。画面上に出力し、操作者がわかりやすくするために使う。元々はプリンタ出力の表紙作成用に使われていたと聞いた記憶があるような、ないような。

Solaris や HP-UX など SysV 系 UNIX では以下のような出力になる。
% banner hoge
 #    #   ####    ####   ######
 #    #  #    #  #    #  #
 ######  #    #  #       #####
 #    #  #    #  #  ###  #
 #    #  #    #  #    #  #
 #    #   ####    ####   ######

一方、FreeBSD ではこんなことになってしまう (本当はもっと大きいので、少し縮小してある)。
% banner hoge
                     ###                                                        ###
                     ###                                                        ###
                     ##############################################################
                     ##############################################################
                     ##############################################################
                     ##############################################################
                     ##############################################################
                     ###                          ###
                     ###                           ###
                                                    ####
                                                    ####
                                                     ####
                                                     #####
                                                    ######
                     ###                            ######
                     #####################################
                     ####################################
                     ####################################
                     ###################################
                     #################################
                     #############################
                     ###

                                 ############
                              ###################
                            ######################
                          ###########################
                        ##############################
                       #########               #########
                      ######                      ######
                      ####                           ####
                      ###                             ###
                     ###                               ###
                     ###                               ###
                     ###                               ###
                     ###                              ####
                      ###                             ###
                      ####                           ####
                      ######                      ######
                       #########               #########
                        ###############################
                          ###########################
                           #########################
                              ###################
                                 ############
(略)

FreeBSD では -w オプションで文字幅を指定できるので活用しよう。
% banner -w 28 hoge
       #                 #
       ###################
       ###################
                 #
                 #
       ###########
       ##########
           ###
        #########
       ##       ##
       #         #
       #         #
       ###     ###
         #######
   ##        ##
 ##   ###  ######
 #    ### ##    ##
 #   ###  #      #
 #   ###  ##    ##
 ######    #######
                  ##
           ###
        #########
       ##   #   ##
       #    #    #
       #    #    #
        #   #####
            ####

base64 BASE64 エンコーダ・デコーダ

base64 は、エンコード規則のひとつである BASE64 規格にのっとった変換を行うコマンドである。

文字列をエンコード
% echo 'abc' |base64 -e
YWJjCg==
文字列をデコード
% echo 'YWJjCg==' | base64 -d
abc
ファイルをエンコード
% base64 -e sample.txt
ファイルをデコード
% base64 -d sample.txt
>> コマンド uuencode *   uudecode *   nkf *   openssl *

basename パス名+ファイル名からパス名を削除する

与えられた文字列の最後の / 以降を表示するコマンドである。
% basename /usr/local/bin/vi
vi
% basename /hoge/fuga
fuga
ファイルが実際に存在するかどうかは basename はチェックしない。単に文字列を加工し、結果を出力するだけのコマンドである。

また、
% basename foo.dat .dat
とすると、foo.datから.datを削除したものを表示する。これを使って、
% foreach i ( *.c.orig )
foreach? cp $i `basename $i .orig`
foreach? end
とすると、DOS でいう
COPY *.c.orig *.c
が実現できる (foreach は csh・tcsh のみ。sh・bash は for を使うこと)。これと同じことを basename を使わず行うこともできる。foreach・for の説明を参照。
>> コマンド dirname *   realpath *   for *   foreach *

bash 高機能版 sh。バッシュ。

sh のユーザインタフェース機能を強化したもの。

Linux 方面では、デフォルトのログインシェルは bash になっていることが多い。また、Linux では /bin/sh は /bin/bash のハードリンクとなっているので、sh でも bash でも挙動は同じである。Linux 以外の OS では、sh と bash は別物である。

bash という名前は Bourne-Again SHell の頭文字を取ったもの。sh の作者がボーン (Bourne) 氏 であることから、Bourne と Born (生まれる) をかけて、「生まれ変わったシェル」として命名された。
>> コマンド sh *   csh *   tcsh *
>> 設定ファイル ~/.profile *   ~/.bash_profile *
>> 用語集 リダイレクト *   シェルスクリプト *
>> 読み方 bash *

bc 計算機

計算を行う。
% bc
2+4 (入力)
6
a=34/2 (入力)
a-2 (入力)
15
quit (終了)
⇒ quit の代わりに EOF (Ctrl-d) で終了することもできる。

小数点以下の有効桁数は scale という変数で設定できる (デフォルトは0)。
% bc
2/3
0
⇒ デフォルトでは scale=0 なので小数点以下は表示されない
scale=4
⇒ 小数点以下4桁を表示するよう設定変更
2/3
.6666

ファイルに計算式を記述して、ファイル名を指定してもよい。
% cat sample
5*8
quit
% bc sample
40
さらに標準入力から計算式を指定することもできる。
% echo '9*9' | bc
81
% echo 'scale=4; 9/5; 15' | bc
2.2500
15
⇒ セミコロンでつなぐと複数の計算をさせることができる

使用可能な演算子は以下のとおり。
a + b
a - b
a * b
a / b 商。小数点以下の表示は scale の設定に従う
a % b 剰余。a を b で割ったときの余り
a ^ b べき乗。a を b 回掛け合わせた数。
>> コマンド calc *   dc *   hexcalc *   xcalc *

bdes ファイルを暗号化・復号化する(パイプ)

ファイルを暗号化する。crypt と同じ機能を持つ。sample.dat というファイルを暗号化したい場合は
% bdes < sample.dat > sample.dat.encryped
Enter key: (暗号化のキーを入力)
とする。復号化は、
% bdes -d < sample.dat.encryped > sample.dat.decryped
Enter key: (暗号化時に入力したキーを入力)
FreeBSD の場合、DES をインストールすると /usr/bin/bdes にバイナリが置かれる。
>> コマンド crypt *   openssl *

bdftopcf 

>> コマンド mkfontdir *

beav バイナリエディタ・ビュアー

emacs ライクな操作方法を持つ (が、結構違うところも多い)。日本語は表示できない (エディットはできる)。

画面イメージ
     0: 02 74 3D 00 0C 00 04 01  2E 00 00 00 00 74 3D 00  .t=..........t=.
    10: 0C 00 04 02 2E 2E 00 00  31 75 3D 00 10 00 08 06  ........1u=.....
    20: 6B 65 72 6E 65 6C 00 D3  32 75 3D 00 18 00 08 0C  kernel..2u=.....
    30: 61 63 63 66 5F 64 61 74  61 2E 6B 6F 00 8F 78 C0  accf_data.ko..x.
    40: 33 75 3D 00 18 00 08 0C  61 63 63 66 5F 68 74 74  3u=.....accf_htt
    50: 70 2E 6B 6F 00 8F 78 C0  34 75 3D 00 10 00 08 06  p.ko..x.4u=.....
    60: 61 68 61 2E 6B 6F 00 D3  35 75 3D 00 10 00 08 06  aha.ko..5u=.....
    70: 61 68 63 2E 6B 6F 00 D3  36 75 3D 00 14 00 08 0B  ahc.ko..6u=.....
    80: 61 68 63 5F 65 69 73 61  2E 6B 6F 00 38 75 3D 00  ahc_eisa.ko.8u=.
    90: 14 00 08 0A 61 68 63 5F  70 63 69 2E 6B 6F 00 D3  ....ahc_pci.ko..
    A0: 39 75 3D 00 10 00 08 06  61 68 64 2E 6B 6F 00 D3  9u=.....ahd.ko..
    B0: 3A 75 3D 00 10 00 08 06  61 69 6F 2E 6B 6F 00 D3  :u=.....aio.ko..
    C0: 3B 75 3D 00 10 00 08 06  61 6D 72 2E 6B 6F 00 D3  ;u=.....amr.ko..
    D0: 3C 75 3D 00 14 00 08 08  69 66 5F 61 6E 2E 6B 6F  xu=.....if_an.ko
    E0: 00 B9 10 D3 3D 75 3D 00  14 00 08 09 69 66 5F 61  ....=u=.....if_a
    F0: 74 68 2E 6B 6F 00 15 D3  3F 75 3D 00 14 00 08 09  th.ko...?u=.....
   100: 69 66 5F 61 75 65 2E 6B  6F 00 24 D3 B3 76 3D 00  if_aue.ko.$..v=.
   110: 14 00 08 09 69 66 5F 61  78 65 2E 6B 6F 00 15 D3  ....if_axe.ko...
   120: B4 76 3D 00 14 00 08 09  69 66 5F 62 66 65 2E 6B  .v=.....if_bfe.k
   130: 6F 00 1A D3 B5 76 3D 00  14 00 08 09 69 66 5F 62  o....v=.....if_b
   140: 67 65 2E 6B 6F 00 16 D3  B6 76 3D 00 14 00 08 09  ge.ko....v=.....
   150: 62 72 69 64 67 65 2E 6B  6F 00 73 CE B7 76 3D 00  bridge.ko.s..v=.
BEAV  I kernel       File: /boot/kernel [RW]    CURSOR=00000000, 1   HEX 8   0H:


主要キーバインド
C-f 1文字進む
C-b 1文字戻る
C-n 1行進む
C-p 1行戻る
C-x C-s セーブ
C-x C-c 終了
ESC s 検索
ESC t 次検索
C-x i 1バイト挿入
ESC d 1バイト削除
C-g 現在入力中のコマンドを抜ける
ESC ? ヘルプを表示
C-x 2 ウィンドウを上下に分割
C-x n 次ウィンドウに移動
ESC a ASCII 表示モードに切り替え
ESC < バッファの先頭に移動
ESC > バッファの終端に移動

オンラインマニュアルが貧弱なのには困るが、(FreeBSD では) 詳しいドキュメントが /usr/local/share/doc/beav/beav.txt に書いてある (英文)。
>> コマンド hexdump *   hd *   od *

bfilter 個人向け HTTP proxy (プロキシ)

個人用途向け HTTP proxy。主に、邪魔なバナー広告・画像・IFRAME などを削除するために使う。

ウリは以下の通り。
  • 正規表現で柔軟な削除設定が可能
  • HTTP/1.1 に対応 (パイプライン・持続的接続にも対応)
  • Javascript エンジンを搭載しているため、質の高い判断が可能
  • 新しいウィンドウを開くための target="_blank" 属性を削除可能

最近の mozilla や FireFox は画像ブロック機能を持っているので、そちらも検討するとよい。

デフォルトのルール設定では、
  • (.*/)?banners?.*
  • (.*/)?ad[sv]?(/|\.).*
  • (.*\.)?ad[0-9]*\..*
などの正規表現にマッチする URL がブロックされるようになっている。試しに朝日新聞と読売新聞のサイトを閲覧してみたところ、一部の広告が表示されないようになっており、効果はあるようだ。ただし毎日新聞のサイトを閲覧してみると記事が何も表示されなかった。デフォルト設定ではルールが厳しすぎるため、よく閲覧するサイトごとに手作業でルールを決めないと使いものにならないかもしれない。

なお、UNIX の GUI 版もあるが、GUI 上からブロックの ON・OFF などを設定できるのが便利な程度である。

bg 指定したジョブをバックグラウンドで実行する。シェルの内部コマンド。

ジョブ番号を指定しないとカレントジョブが操作対象になる。bg を使うということは、command & で起動するのと同じこと。詳しくは jobs を参照。
>> コマンド fg *   jobs *

biff メールの到着を知らせるかどうかを設定する。

biff コマンドは、メールが届いた瞬間に、
New mail for foo@bar.com has arrived:
----
From: foo@bar.com <hogehoge>
Subject: Hello!

Hi. I'm hogehoge....
のような誰からどういう内容のメールが届いたかという情報を表示する。

引数に y か n を指定することで、biff の機能を切り替えることができる。
% biff y
⇒ メールの到着を知らせる
% biff n
⇒ メールの到着を知らせない
% biff b
⇒ BEEP 音でメールの到着を知らせる
引数なしで実行すると、現在の設定を表示する。
% biff
n
⇒ メールの到着を知らせない設定になっているということ

この機能はシェルが出力する
You have new mail.
というメッセージとは全く別のものである。

biff の出力は結構うざったいので biff n か biff b にしておき、シェルのメッセージや xbiff・xpbiff を使った方がよいのではないかと思う。

関連: http://68user.blog27.fc2.com/blog-entry-23.html biff はなぜ動く?
>> コマンド xbiff *   xpbiff *
>> Cシェル変数 mail *
>> 読み方 biff *

bindkey tcsh の機能をキーに割り付ける。tcsh の内部コマンド。

引数なしで実行すると、現在のキーバインドを表示する。例えば、
% bindkey
Standard key bindings
"^@" -> set-mark-command
"^A" -> beginning-of-line
"^B" -> backward-char
...(略)...
だと、^@(Ctrl-@) はマーク、^a (Ctrl-a) は行頭に移動、^b (Ctrl-b) は一文字戻る、という意味。-l オプションを付けると、全ての機能とその解説の一覧が表示される。

例えば ^r にはデフォルトでは redisplay という機能が割り振られている。これを後方インクリメンタルサーチである i-search-back に変えるには
% bindkey ^R i-search-back
とすればよい。例えば、これまで
% script test
% man xscreensaver
% coco -q < sample.dat
というコマンドを実行していたとする。ここで Ctrl-R を押すと、コマンドラインが
% (カーソル位置)
bck:
となる。ここで s をタイプすると、一番近い s を含むヒストリを探す
% coco -q < sample.dat
bck:s
続いて c をタイプすると、sc を検索する。
% man xscreensaver
bck:sc
さらに r を押すと
% script test
bck:scr
となる。script test を実行したい場合はそのままリターンキーを押せばよいし、C-f、C-b などで編集することもできる。ESC キーを押せば検索モードを抜ける。

なお、bash では標準で C-r に後方インクリメンタルサーチが割り振られている。
>> コマンド tcsh *

bison 構文解析パーサ生成プログラム

yacc の上位互換プログラム。GNU が作成・配布している。
>> コマンド lex *   flex *   yacc *
>> 読み方 bison *

bonnie ディスクベンチマーク

ディスクのベンチマークプログラム。事前にディレクトリを作成し、そこにファイルを作成することでベンチマークを行う。root 権限は必要なく、一般ユーザで実行可能。

デフォルトでは 100MB のファイルを作成し、シーケンシャル・ランダムアクセスの入出力を行う。
% mkdir /bonnie-dir
% bonnie -d /bonnie-dir
File '/bonnie-dir/Bonnie.1690', size: 104857600
(略)
              -------Sequential Output-------- ---Sequential Input-- --Random--
              -Per Char- --Block--- -Rewrite-- -Per Char- --Block--- --Seeks---
Machine    MB K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU K/sec %CPU  /sec %CPU
          100  4514  8.2  4715  3.2  4606  3.3 41965 99.5 239622 99.9 25600.5 97.3

bonnie の後継である bonnie++ というプログラムもある。bonnie と bonnie++ の比較は bonnie++ の項目を参照。
>> コマンド bonnie++ *

bonnie++ ディスクベンチマーク

bonnie の後継であるディスクベンチマークプログラム。機能的な差異は以下の通り。
  • 2GB をこえるファイルサイズを扱える。
  • bonnie は 1つのファイルしか生成しないが、bonnie++ は複数のファイルを生成するため、ファイル生成・削除のスピードを計測できる。

bonnie++ を実行すると、カレントディレクトリにファイルを生成し始めるので、ディレクトリを掘ってそれを -d オプションで指定して実行するとよいだろう。また、bonnie と同様に一般ユーザ権限で実行が可能である。

bonnie++ はデフォルトでは 300MB のファイルを生成する。また、デフォルトでは 16,000 のファイルを生成する。下記の結果では、files=16 となっているが、実際には 1,000 倍した値が使われる。

% mkdir bonnie++
% bonnie++ -d bonnie++/
(略)
Version 1.93c       ------Sequential Output------ --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP  /sec %CP
myhost         300M   194  99  2110   1  1630   1   364  98  4803   3  79.1   2
Latency             78667us     520ms     817ms   36437us     184ms   32417ms
Version 1.93c       ------Sequential Create------ --------Random Create--------
myhost              -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
              files  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP  /sec %CP
                 16  8038  39 21130  43 11179  33  8727  41 21475  51  9720  36
Latency             25107us    2758us   11912us   27388us   70667us    3901us
1.93c,1.93c,myhost,1,1069276163,300M,,194,99,2110,1,1630,1,364,98,4803,3,79.1,2,16,
,,,,8038,39,21130,43,11179,33,8727,41,21475,51,9720,36,78667us,520ms,817ms,36437us,
184ms,32417ms,25107us,2758us,11912us,27388us,70667us,3901us
>> コマンド bonnie *

bsdiff バイナリパッチ作成 (差分・差異・比較)

bsdiff はバイナリファイルのパッチ (差分ファイル) を生成する。
% bsdiff bin.old bin.new bin.bsdiff
⇒ bin.old と bin.new の差分を抽出し、パッチファイル bin.bsdiff を生成する。
生成したパッチをあてるには bspatch を使う。
% bspatch bin.old bin.new bin.bsdiff
⇒ bin.old にパッチファイル bin.bsdiff をあて、bin.new を生成する。

同種のコマンドとして xdelta があるが、bsdiff・bspatch の作者は「bsdiff が生成するパッチファイルは、xdelta の 50〜80% のサイズである」と主張している。実際にパッチサイズはかなり小さくなるようだ。

ちなみにbsdiff・bspatch の bs は「Binary Software」の略。

テキストファイルのパッチ生成・パッチ適用には diff・patch コマンドを使うこと。
>> コマンド bspatch *   xdelta *   diff *   patch *

bspatch バイナリパッチ適用

詳細は bsdiff を参照。
>> コマンド bsdiff *

builtins tcsh の内部コマンド一覧を表示

>> コマンド tcsh *

bzip2 gzip より圧縮率の高い圧縮・伸長ツール (bunzip2)

gzip は compress より圧縮率が高いが、bzip2 は gzip よりさらに圧縮率が高い。いくつかのファイルを圧縮してみた結果、bzip2 は gzip より 2〜15% 程度圧縮率が高かった。しかし、その分圧縮にかかる時間は4倍くらいになってしまうので、用途を考えて bzip2 を使うべきか gzip を使うべきかを決めるとよいだろう。

bzip というものもあるが、これは bzip version 1 であるので、bzip2 を使った方がよい。bzip2 は Linux 方面で普及しているが、*BSD 方面ではまだ標準の地位を得ていない。圧縮したファイルを配布する際は、bzip2 版と gzip 版を用意しておくとよいだろう。

使い方は、gzip とほとんど同じである。
% bzip2 file
で、圧縮された file.bz2 が生成される。伸長するには
% bunzip2 file.bz2
または
% bzip2 -d file.bz2
とすればよい。

オプション: (これも gzip と似ている)
-c 圧縮・伸長の結果を標準出力に書き出す。ファイルへの書き込みは行なわない
-d 伸長する
-v バーボーズモード
-1 圧縮にかかる時間を短くする
-9 圧縮率の高い圧縮方法を使う

bunzip2 は伸長ツールだが、bzip2 -d としても全く同じである。
>> コマンド gzip *   compress *   tar *

cal カレンダーを表示する

y(数字) y年のカレンダーを表示する
% cal 1998
                             1998

      January               February               March
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
             1  2  3   1  2  3  4  5  6  7   1  2  3  4  5  6  7
 4  5  6  7  8  9 10   8  9 10 11 12 13 14   8  9 10 11 12 13 14
11 12 13 14 15 16 17  15 16 17 18 19 20 21  15 16 17 18 19 20 21
18 19 20 21 22 23 24  22 23 24 25 26 27 28  22 23 24 25 26 27 28
25 26 27 28 29 30 31                        29 30 31

       April                  May                   June
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
          1  2  3  4                  1  2      1  2  3  4  5  6
 5  6  7  8  9 10 11   3  4  5  6  7  8  9   7  8  9 10 11 12 13
12 13 14 15 16 17 18  10 11 12 13 14 15 16  14 15 16 17 18 19 20
19 20 21 22 23 24 25  17 18 19 20 21 22 23  21 22 23 24 25 26 27
26 27 28 29 30        24 25 26 27 28 29 30  28 29 30
                      31
(略)
⇒ 1998年のカレンダーを表示
m y(数字) y年m月のカレンダーを表示する
% cal 6 1999
     June 1998
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
⇒ 1999年6月のカレンダーを表示
% cal sep 1998 September 1998 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
⇒ 月は英語でも指定可能
-y 今年のカレンダー(1〜12月)を表示
-j 1月1日からの日数を表示する

ちなみに 1752年9月に、ユリウス歴からグレゴリオ歴に(イギリスが)移行した。そのため、1752年9月3日〜13日は表示されない。
% cal 9 1752
   September 1752
Su Mo Tu We Th Fr Sa
       1  2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
>> コマンド xcalender *

calc 簡易計算機

>> コマンド bc *   dc *   hexcalc *   xcalc *

cat ファイルの内容を表示する(パイプ)。複数のファイルを連結する

指定したファイルの内容を表示する。ファイルが長くて一画面に収まらない場合は、more や less などのページャと呼ばれるプログラムを使う方がよい。

-n 行番号を表示
-b 行番号を表示。空行をカウントしない
-s 連続する空行を1行の空行として表示
-v コントロールコードを文字列 (^X や M-x など) として表示する
-t -v オプションに加えて、ダブを ^I で表示する
-u 出力をバッファリングしない

cat コマンドは、split コマンドで分割したファイルを結合するときにも使われる。
% split sample
% ls x??
xaa xab xac
% cat xaa xab xac > sample2
>> コマンド more *   less *   split *
>> 読み方 cat *

catman オンラインマニュアルの整形を行う

man で表示されるマニュアルは、nroff というマクロ言語の形式で用意されている。

man コマンドを実行すると、nroff 形式のファイルを nroff や groff コマンドで変換して、catman というプレインテキスト形式に整形する。この変換作業には少し時間がかかるので、一度参照されたマニュアルは catman 形式で保存しておき、二度目からは catman 形式のファイルを表示することで man の実行が速くなる。

catman コマンドは、事前に整形作業を行って、プレインテキストを作成しておくためのコマンドである。一度も見たことがないマニュアルを初めて表示するときに時間がかかるのが嫌なら、事前に catman コマンドを実行しておくとよい。ただし、その分ディスク容量を喰うことになる。

catman を使わなくても、一度表示したマニュアルは man コマンドが自動的に整形済のプレインテキスト版を保存してくれるので、man の速度に不満がないなら catman を使う必要はない。

具体的には
% catman /usr/share/man/man1/
⇒ /usr/share/man/man1/ 以下のマニュアルを整形し、/usr/share/man/cat1/ に書き込む。
% catman /usr/share/man/ja/man8/
⇒ /usr/share/man/ja/man8/ 以下のマニュアルを整形し、/usr/share/man/ja/cat8/ に書き込む。
% catman /usr/X11R6/man/
⇒ /usr/X11R6/man/ 以下のマニュアル (全セクション) を整形し、/usr/X11R6/man/cat?/ に書き込む。
などと指定する。しかし一般的にはオンラインマニュアルは、全ユーザが参照する共用のものなので、root になって man ユーザの権限で
# su man -c "catman /usr/share/man/man1"
⇒ /usr/share/man/man1 以下のマニュアルを整形する。su コマンドを使って、man の権限で catman を実行する。
とするとよいだろう。
>> コマンド man *   jcatman *   su *

cc C コンパイラ

FreeBSD や Linux など、フリーの PC-UNIX では標準の C コンパイラが gcc になっている。

それ以外の UNIX の C コンパイラは、ごく一部の基本的なオプションは gcc と共通であるが、一般的に互換性はないと思った方がよいだろう。
>> コマンド gcc *   lint *   unifdef *
>> 読み方 cc *

cccc C言語・C++・Java ソースコードステップカウンタ (行数カウント・ステップカウント・ステップ数)

C言語・C++・Java のソースコードのステップ数を調べるツール。
% cccc *.c
と直接ファイルを引数で指定するか、あるいは
% find . -name \*.c -print > source.list
% cccc -f source.list
などとソースファイル名一覧のファイルを生成し、-f オプションで指定することでステップカウントを行う。カウント結果は、カレントディレクトリに出力される cccc.htm という HTML ファイルに記述されている。

このファイルに出力される情報の中から、主要なものを以下に解説する。
Number of modules (NOM) 1 モジュール数。モジュールがどういう単位なのかわからない。
Lines of Code (LOC) 887 コード行数。コメント行・空行・空白行は含まない。
McCabe's Cyclomatic Number (MVG) 156 マッケーブの循環的複雑度。要は各関数が単純な親子関係であれば循環度が低く、どれが親かわからないような複雑な呼ばれ方をする関数だと循環度が高いらしい。10 以下だと単純なよい構造、50 を越える場合はテスト不能、その中間は複雑度が高い、らしい。
Lines of Comment (COM) 203 コメントの行数。純粋にコメントのみからなる行数であって、コードの末尾にコメントを記述した場合はカウントされないようだ。
LOC/COM (L_C) 4.369 コード行数 ÷ コメント行数
MVG/COM (M_C) 0.768 マッケーブの循環的複雑度 ÷ コメント行数。
Henry-Kafura/Shepperd measure (visible) (HKSv) 0 意味がわかりません。
Henry-Kafura/Shepperd measure (concrete) (HKSc) 0 意味がわかりません。
Henry-Kafura/Shepperd measure (inclusive) (HKS) 0 意味がわかりません。
Lines of Code rejected by parser (REJ) 227 cccc が解析できなかった行数。特に C言語や C++ の場合、マクロの定義次第でいくらでも意味不明のコードを記述できる。しかし cccc はマクロ展開をしてくれないため (そしてインクルードファイルも読んでくれないため)、ちょっと変わった書き方に出くわすと結構な頻度でエラー扱いとし、その行をスキップして処理を続行してしまう。解析に失敗してもコード行数に加えてくれればよいと思うのだが、なぜかそうはしてくれない。

また、関数ごとに LOC・MVG・COM・L_C・M_C の値を算出する。

なお、実際の行数 (コメント・空行も含む) は出力してくれないので、wc コマンドで自分で数えよう。

ちなみに「いまどき行数なんて数えるのか? 昭和の時代じゃあるまいし」と学生時代に思っていた当ページ管理人。今の仕事ではきっちり数えさせられています。やだやだ。

cd カレントディレクトリを変更する。シェルの内部コマンド。

カレントディレクトリとは、「今 自分がいるディレクトリ」のこと。

移動したいディレクトリを引数で指定すると、そのディレクトリに移動する。
% pwd
/home/hogehoge
⇒ 現在のカレントディレクトリは /home/hogehoge
% cd lib
% pwd
/home/hogehoge/lib
% cd /usr/local
% pwd
/usr/local
引数なしで起動するとホームディレクトリに移動する。
% cd
% pwd
/home/hogehoge
⇒ 引数を省略して cd を実行すると、ホームディレクトリへ移動
% cd ..
% pwd
/home
⇒ 「..」は「一つ上のディレクトリ」を意味する

引数に「-」を指定すると、一つ前のディレクトリに戻る (これが機能するかどうかは OS による)。ただし、2個以上前のディレクトリまでさかのぼって移動することはできない。
% cd /dir1
% cd /dir2
% pwd
/dir2
% cd -
% pwd
/dir1
⇒ ひとつ前のカレントディレクトリに戻った
% cd -
% pwd
/dir2
⇒ 連続して cd - すると、/dir1 と /dir2 を行き来することになる

カレントディレクトリは各プロセス固有の情報である。シェルからあるコマンドを実行し、その中でカレントディレクトリを変更しても、シェル自体のカレントディレクトリは移動しない。つまり、
#!/bin/sh
cd /
というスクリプトをシェル上から実行しても、シェル自体のカレントディレクトリは変わらないということ。どうしてもというなら、
#!/bin/sh
echo cd /
として、
% eval `hoge.sh` (バッククォートで囲む)
とすればよい。

また、カレントディレクトリは各プロセス固有の情報であるということを利用して、
% (cd /foo; tar zcf archive.tgz .)
などとすると、シェルのカレントディレクトリを変えずに /foo 以下のアーカイブを作成することが
できる。カッコで括った部分は別のシェル (子プロセス) として実行されるので、カッコ内でどれだけカレントディレクトリを変更しても、現在のシェルには影響がない。

なお、これは
% pushd /foo; tar zcf archive.tgz . ; popd
% cd /foo; tar zcf archive.tgz . ; cd -
と等価である。
>> コマンド chdir *   pwd *   mv *   cp *
>> 用語集 プロセス *
>> 読み方 cd *

cda CDプレイヤー

>> コマンド cdcontrol *   xmcd *   cdplay *

cdcontrol CDプレイヤー

おそらく FreeBSD にしかないコマンド。CD ドライブを操作できる。

-f dev CD のデバイス名を指定する。
デバイス名は wcd0、cd0、mcd0 など。例えば CD ドライブのデバイスが wcd0 の場合、-f /dev/wcd0 でも -f wcd0 でもよい。
% chmod 666 /dev/wcd0
が必要かも。環境変数 DISC に CD のデバイス名を指定しておくと、-f オプションでいちいちデバイス名を指定する必要がなくなる。
命令
play トラック 指定したトラックから演奏を開始。トラックを省略するとトラック 1 から演奏する
pause 演奏を中断する
stop 演奏を停止する
resume 演奏を再開する
info CDの演奏時間などの情報を表示
volume [0-255] [0-255] 左右のボリュームを設定。ボリュームは0-255で指定
volume mute ボリュームを0にする
volume mono モノラルで出力
volume stereo ステレオで出力
volume left 左チャンネルだけ出力
volume right 右チャンネルだけ出力
eject CD をイジェクトする
引数で命令を書いてもいいし (cdcontrol play 4 など)、引数なしで起動すると対話モードに入るので、そこで命令を書いてもいい。
>> コマンド cda *   cdplayer *   workman *   xmcd *   cdplay *   tosha *

cdplay CDプレイヤー

起動方法は以下の通り。
% cdplay デバイス名
>> コマンド cda *   cdplayer *   workman *   xmcd *   cdcontrol *

cdplayer CDプレイヤー

>> コマンド cda *   cdplay *   cdcontrol *   xmcd *   workman *

cflow Cのソースを解析して、どの関数内からどの関数を読んでいるか表示する。

>> コマンド gcc *

chdir カレントディレクトリを変更する。cd と全く同じ

>> コマンド cd *

chflags ファイルのフラグを変更する

BSD 系 UNIX にはパーミッションとは別にファイルフラグという仕組みがあり、変更禁止、追加禁止などの設定をすることができる。なお、ファイルフラグは chmod のパーミッションとは全く別のものである。
  • arch アーカイブフラグ
  • dump ダンプフラグ
  • sappnd システムの追加専用フラグ
  • schg システムの変更禁止フラグ
  • uappnd ユーザの追加専用フラグ
  • uchg ユーザの変更禁止フラグ
また、これらの先頭に no をつけるとフラグを消す意味がある。

ファイルを変更禁止にするには
% chflags uchg file
元に戻すには
% chflags nouchg file
とする。例えば FreeBSD では /kernel は chflags schg /kernel とされているので、mv や rm する際は
# chflags noschg /kernel
# rm /kernel
などと、一旦フラグを OFF にしなければならない。他にも、init・chsh コマンドなどに schg フラグが立てられている。現在のファイルフラグの値は ls -lo で見ることができる。
% ls -lo /kernel /sbin/init /usr/bin/chsh
-r-xr-xr-x  1 root  wheel  schg 1301840 Jun 20 20:54 /kernel
-r-x------  1 bin   bin    schg  204800 Oct 13 21:56 /sbin/init
-r-sr-xr-x  6 root  bin    schg   36864 Mar  4  1999 /usr/bin/chsh
なお、ファイルフラグは 4.4BSD から追加された。おそらくファイルフラグを実装しているのは FreeBSD・NetBSD・OpenBSD・BSDI のみだろうと思われる。
>> コマンド ls *   rm *   chmod *

chgrp ファイルの属するグループを変更する

% chgrp group file
⇒ ファイル file のグループを groupに変更する
詳しい説明は chown で。
>> コマンド chown *

chmod ファイル・ディレクトリの属性を変更する。

全てのファイル・ディレクトリにはパーミッションという属性があり、どのユーザが読むことができ、どのユーザが書き込めるか、などのアクセス権限を設定できる。現在のパーミッションの値は ls -l で調べることができる。
% ls -l sample.dat
-rwxr-xr-- 1 user group 402 May 26 1997 sample.dat
の「rwxr-xr--」がパーミッションである(その前の「-」はファイルタイプ。とりあえずは無視)。

読み方は、まずパーミッションの表示を3文字ごとに区切って、「rwx」「r-x」「r--」とする。
  • 1番目のセクション (rwx) はファイル所有者 (この場合は user) にとってのパーミッション
  • 2番目のセクション (r-x) はファイル所有グループ (この場合は group) にとってのパーミッション
  • 3番目のセクション (r--) はそれ以外のユーザにとってのパーミッション
となる。「r」は読み込み可能属性、「w」は書き込み可能属性、「x」は実行可能属性を意味する。

つまり
-rwxr-xr-- 1 user group 402 May 26 1997 sample.dat
は、
  • ユーザ user は、sample.dat を読めるし、書き込めるし、実行できる
  • グループ group に属するユーザは、sample.dat を読めるし、実行できるが、書き込みはできない
  • その他のユーザは、sample.dat を読めるが、書き込みと実行はできない
ということを意味する。

chmod はパーミッションを変更するコマンドだが、そのファイル・ディレクトリの所有者しかパーミッションを変更できない。上記の例だと、sample.dat のパーミッションを変更できるのはユーザ user だけである。

パーミッションの指定方法には絶対方式と相対方式がある。絶対方式は8進数の数字によって指定する。
  • 0400 所有者が読み込める
  • 0200 所有者が書き込める
  • 0100 所有者が実行できる
  • 0040 groupに属するユーザが読み込める
  • 0020 groupに属するユーザが書き込める
  • 0010 groupに属するユーザが実行できる
  • 0004 その他のユーザが読み込める
  • 0002 その他のユーザが書き込める
  • 0001 その他のユーザが実行できる
また、この他に suid・sgid・sticky bit があるが、説明は後述。

ファイル sample.dat を所有者だけが読み込み・書き込みできるようにするには 0400+0200+0100=0700 で、
% chmod 0700 sample.dat
とする。ファイルsampleを所有者が読み込み・書き込み・実行できて、groupに属するユーザとその他のユーザは読み込み・実行のみできるようにするには、0400+0200+0100+0040+0010+0004+0001=0755 で
% chmod 0755 sample
とする (最初の 0 を省略して 700・755 でもよい)。

一方、相対方式は、
  • u,g,o,a … 所有者・グループに属するユーザ・その他のユーザ、全員
  • r,w,x … 読み込み属性・書き込み属性・実行属性
  • +/- … 属性を ON にする/OFF にする
を使う。これは現在のパーミッションの一部だけを変更する際に便利。
% chmod +x file
⇒ file の実行属性を ON にする
% chmod go-w file
⇒ file のグループとその他のユーザの書き込み属性を OFF にする
% chmod a-x file
⇒ file の全員の実行属性を OFF にする (chmod ugo-x file と同じ)
ただし、相対方式と言っても、
% chmod u=rwx,go=rx file (chmod 755 と同じ)
のように完全な (相対的でない) パーミッションを設定することはできる。

なお、シンボリックリンクのパーミッションは意味を持たない。
lrwxrwxrwx 1 user group 3 Aug 1 16:14 file-b -> file-a
でも
l--------- 1 user group 3 Aug 1 16:14 file-b -> file-a
でも全く違いはない。有効なのはリンク先の file-a のパーミッションである。chmod に -RH オプションを付けると、シンボリックリンクのリンク先のファイルの属性を変更する。

これまで r(400)・w(200)・x(100) は読み込み・書き込み・実行属性であると説明してきたが、これはファイルに対する権限であって、ディレクトリに対しては意味が少し違い、
  • r … そのディレクトリの下にあるファイルの一覧を取得できるかどうか
  • w … そのディレクトリの下に、ファイルを新規作成できるかどうか。
また、そのディレクトリの下に存在するファイルを、消去できるかどうか。
  • x … そのディレクトリの下にあるファイルにアクセスできるかどうか
という意味を持つ。
  • ディレクトリに「r」が設定されていると、ls コマンドなどで、その下に存在するファイルの一覧を取得できる。
  • ディレクトリに「w」が設定されていると、ディレクトリの下にファイルを新規作成できるし、ディレクトリの下に存在するファイルを rm コマンドで削除できる。
  • ディレクトリに「x」が設定されていると、その下のファイルの情報を見たり、ファイルに対して書き込み・読み込みができる

実験
では実際に例を示そう。
% mkdir dir
% echo hogehoge > dir/file
% chmod 700 dir
ディレクトリ dir を作成し、その下にファイル file を作成する。file の中身は「hogehoge」である。
% ls dir
file
⇒ ディレクトリ dir 下のファイル一覧が取得できる
% ls -l dir
-rw-r--r-- 1 user group 9 Oct 10 14:57 file
⇒ ディレクトリ dir 下のファイルの情報が取得できる
% ls -l dir/file
-rw-r--r-- 1 user group 9 Oct 10 14:57 file
⇒ ファイル名を直接指定しても大丈夫
% cat dir/file
hogehoge
⇒ ディレクトリ dir 下のファイルの内容が取得できる
いずれも普通にアクセスできることがおわかりだろう。

では、ディレクトリ dir のパーミッション「r」だけを立てて、同じことをしてみよう。
% chmod 400 dir
% ls dir
file
⇒ ディレクトリ dir 下のファイル一覧が取得できる
% ls -l dir
ls: dir/file: Permission denied
⇒ ディレクトリ dir 下のファイルの情報は取得できない
% ls -l dir/file
⇒ ファイル名を直接指定してもダメ
% cat dir/file
cat: dir/file: Permission denied
⇒ ディレクトリ dir 下のファイルの内容が取得できない
ls で dir の下のファイル一覧は取得できるが、ls -l で各ファイルの情報を取得することはできない。dir の下のファイルを表示することもできない。

次に、ディレクトリ dir のパーミッション「x」だけを立てて、同じことをしてみよう。
% chmod 100 dir
% ls dir
ls: dir: Permission denied
⇒ ディレクトリ dir 下のファイル一覧は取得できない
% ls -l dir
ls: dir: Permission denied
⇒ ディレクトリ dir 下のファイルの情報も取得できない
% ls -l dir/file
-rw-r--r-- 1 user group 9 Oct 10 14:57 file
⇒ ファイル名を直接指定すれば大丈夫
% cat dir/file
hogehoge
⇒ ディレクトリ dir 下のファイルの内容は取得できる
「r」を落として「x」を立てると、ls で dir の下のファイル一覧が取得できなくなった。しかしファイル名を直接指定すると、ls -l も有効だし、ファイルの内容も表示できる。

普通、ディレクトリは他ユーザに対して「r-x」としておけばよい。もしディレクトリの下にアクセスしてほしくなければ「---」にすればよいだろう。「r」だけにすると、ファイル一覧は取得できるが、そのファイルの情報を見たり、ファイルにアクセスすることはできなくなる。一方「x」だけを立てると、ファイル一覧は取得できないが、ファイルにアクセスすることはできる、というわけだ。

setuid・setgid・sticky bit
さて、先に少し触れたが、
4000 user s-bit を立てる (setuid・suid)
2000 group s-bitを立てる (setgid・sgid)
1000 sticky bit を立てる
というものがある。
% chmod 4755 file
あるいは
% chmod u+sx file
で setuid を立てることができ、
% chmod 2755 file
あるいは
% chmod g+sx file
で setgid を立てられる。setuid・setgid の意味については setuid の項を参照してほしい。
>> 用語集 setuid *

sticky bit というのは、ディレクトリの下にあるファイルの削除に関する設定である。例えば /tmp ディレクトリを考えてみよう。/tmp は一時ファイルを作成するためのディレクトリで、誰でもファイル・ディレクトリを作成できる。しかし /tmp のパーミッションを 777 にすると、あるユーザが作ったファイルを他のユーザが消すことができてしまう。そこで /tmp のパーミッションを 777 にし、さらに sticky bit を立てる。すると、
  • 誰でもそのディレクトリの下にファイル・ディレクトリを新規作成できる
  • しかし、それを消せるのは作成したユーザ (ファイル・ディレクトリのオーナー) のみ
となる。実際、/tmp は sticky bit が立っている。
% ls -ld /tmp
drwxrwxrwt 7 bin bin 1024 Oct 10 10:24 /tmp
最後の「rwt」の「t」が sticky bit を表している。
% chmod 1777 dir
% chmod a+rwxt dir
などで sticky bit を ON にできる。

昔の UNIX の sticky bit というのは、実行ファイルに対して設定するものであった。頻繁に使用するプログラムについて このビットを立てておくと、常にメモリ上にバイナリを保存しておく効果があった。しかし今では仮想記憶の発達により、意味をなさなくなったので、ファイルに対してこのビットを立てても無視される。「sticky」は「貼り付けておく」という意味であるが、現在では「sticky」という意味はなく、名前だけが残っているわけである。

なお、BSD 系 UNIX には、chmod のパーミッションとは全く別に、ファイルフラグという概念がある。これは chflags コマンドで設定できる。
>> コマンド ls *   chown *   chgrp *   umask *   ln *   chflags *
>> 読み方 chmod *

chown ファイルの所有者、所有グループを変更する

ファイル・ディレクトリの所有者(オーナー)、所有グループを変更する。所有者を変更できるのは root のみであるが、グループはファイルのオーナーなら変更できる可能性がある(オーナーが複数のグループに属している必要がある)。
# chown user file
ファイル file の所有者をユーザ user に変更する
% chown user:group file
ファイル file の所有者/グループを user/group に変更する
% chown :group dir
ディレクトリ dir のグループを group に変更する

自分がどのグループに属しているかは、id コマンドでわかる。
% id
uid=1001(hoge) gid=1001(hoge) groups=1001(hoge), 0(wheel), 5(operator)
のとき、
% touch sample
としてファイルを新規作成すると、
% ls -l sample
-rw-r--r-- 1 hoge hoge 0 Feb 1 13:47 sample
となる。このとき、
% chown :グループ名 sample
で sample の所有グループを変更できるが、このときグループ名として指定できるのは hoge・wheel・operator である。
>> コマンド chgrp *   chmod *   id *
>> 読み方 chown *

chpass ユーザの個人情報 (ログインシェル・リアルネームなど) を変更する。

ログインシェルなどの個人情報を変更する。

chpass を引数なしで実行すると、環境変数 EDITOR に設定されているエディタが起動されるので、
Shell: ...
という項目を書き換えてエディタを終了すればよい。tcsh にしたいなら
Shell: /usr/local/bin/tcsh
とする。

ログインシェルを変更したいだけなら、コマンドラインから
% chsh -s tcsh
% chsh -s /usr/local/bin/tcsh
としてもよい。

ログインシェルとして指定できるのは /etc/shells の中に書かれているものだけである。
>> コマンド chsh *   passwd *   vipw *
>> 環境変数 EDITOR *
>> 設定ファイル /etc/shells *   /etc/passwd *
>> 用語集 NIS *

chsh ログインシェルを変更する

FreeBSD では chsh は chpass と全く同じである。説明は chpass の項を参照。
>> コマンド chpass *

cjpeg 画像ファイルを JPEG 形式に変換する

>> コマンド xv *   convert *

cksum ファイルのチェックサムを表示する

-o デフォルトのアルゴリズムではなく、古いアルゴリズムを使う
% cksum sample
123456789 10000 sample
⇒ チェックサムは 123456789、ファイルサイズは 10000、ファイル名は sample
cksum は古いコマンドなので、md5 や openssl dgst を使うことをお勧めする。
>> コマンド md5 *   openssl *

clear 画面の消去

clearはシェルスクリプトで、内容は
#!/bin/sh -
exec tput clear
となっている。

cmp 2つのファイルの比較。最初に違いが見つかった行番号と文字数を表示する。

cmp はあまり多機能ではないので、2つのファイルが違うものかどうかを知りたいときだけ使うといいだろう。
>> コマンド comm *   diff *

coco コード変換、コード判定を行う(パイプ)

-l 対応しているコードの一覧を表示
-q 指定ファイルの中で使われているコードの種類を判定する
% cat sample.dat | coco -q
In (*euc-japan*unix): 4923 bytes
⇒ sample.euc は EUC-JP であることがわかる。

昔の FreeBSD では、coco は mule のパッケージに含まれていたが、mule が emacs に統合されてからは mule-common パッケージ内に含まれている。
>> コマンド nkf *   qkc *   iconv *   euctosj *

col エスケープシーケンスを取り除く(フィルタ)

オンラインマニュアルは、下線や太字の表示のためのエスケープシーケンスが含まれているので、
% man ls > ls.txt
などとしても ls.txt はプレインテキストにはならず、読みづらい。col を使うとエスケープシーケンスを取り除き、プレインテキストに整形できる。
% man ls | col -b > ls.txt
とすることで、ls のオンラインマニュアルをプレインテキストに変換して ls.txt に書き込む。

FreeBSD の col は日本語に対応していないので、jman を使う場合は colcrt コマンドを使って
% jman ls | colcrt > ls.txt
とすればよい。

なお、col -b や colcrt は、
% perl -pe 's/(_\x08|\x08\x08..|\x08.)//g'
と等価である。
>> コマンド man *

comm 2つのファイルの違いの表示

ファイル名に - を指定すると標準入力から読み込む。

comm は比較対象ファイルがあらかじめ辞書順にソートされている必要がある。普通はいちいちソートするのは面倒なので、diff を使う方がよいだろう。
>> コマンド cmp *   diff *

complete コマンドの引数の補完の設定をする。tcsh の内部コマンド

tcsh は Ctrl-D と TAB で補完機能が使えるが、デフォルトではコマンドとファイル・ディレクトリのみが補完対象となっている。しかし、
  • telnet・rlogin … ホスト名
  • printenv … 環境変数
  • jlatex … *.tex
  • rmdir … ディレクトリ
というふうに、コマンドごとに補完対象を変えられるとさらに便利になる。complete コマンドを使うと、コマンドごとに補完対象をきめ細かく指定することができる。

以下に簡単な例をあげる。
% complete alias 'p/1/a/'
エイリアスのみを補完候補にする。ただし1番目の引数だけに対して効果がある。
% complete set 'p/1/s/'
シェル変数のみ。
% complete printenv 'p/*/e/'
環境変数のみ。何番目の引数でも効果あり。
% complete man 'p/*/c/'
コマンドのみ。何番目の引数でも効果あり。
% complete xdvi 'p/1/f:*.dvi/'
拡張子が .dvi であるファイルのみを補完候補にする。
% complete cc 'p/1/f:*.{c,cc}/'
拡張子が .c か .cc であるファイルのみを補完候補にする。

complete コマンドは、複雑で奥が深い。書式は
% complete コマンド名 '補完の種類/(マッチパターン or 引数番号)/補完対象/'
である。

まずは、'p/*/.../' という書き方を覚えよう。
`...' の部分に以下の文字を指定することで、補完候補を限定できる。
c コマンド
d ディレクトリ
f ファイル名
a エイリアス (alias コマンドで設定されているもの)
e 環境変数 (setenv コマンドで設定されているもの)
s シェル変数 (set コマンドで設定されているもの)
v 環境変数とシェル変数
u ユーザ名 (/etc/passwd に書かれているユーザ名)
g グループ名 (/etc/group に書かれているグループ名)
j ジョブ (jobs で表示されるジョブ)
l リミット (limit コマンド・ulimit コマンドで表示されるリミット名)
例をあげると、
% complete unalias 'p/*/a/'
補完対象はエイリアス
% complete unsetenv 'p/*/e/'
補完対象は環境変数
% complete foo 'p/*/es/'
補完対象は環境変数とシェル変数
また、その文字の後に : を付けると、シェルのワイルドカードが使える。
% complete foo 'p/*/f:*.txt/'
補完対象は *.txt にマッチするファイル
% complete foo 'p/*/u:a*/'
補完対象は a から始まるユーザ名

次に、'p/*/(... ... ...)/' という書き方。
例えば
% complete foo 'p/*/(abc def hij)/'
とすると、
% foo (TAB)
abc def hij
と、`()' で囲んだ文字列を補完候補にすることができる。

次に、'p/*/$xxx/' という書き方。
$xxx はシェル変数として扱われる。
% set xxx = (abc def hij)
% complete foo 'p/*/$xxx/'
と、
% complete foo 'p/*/(abc def hij)/'
は同じ意味である。ただし $xxx の内容を変更すると、補完対象も動的に変わる。よって、補完動作を行うときには必ず $xxx を設定しておかなくてはならない。

続いて、'p/*/`...`/' という書き方。
バッククォート `` で囲むことで、その中のコマンドを実行し、その結果を補完候補とする。例えば、talk コマンドの補完対象は現在ログイン中のユーザ名になってほしいので
% complete talk 'p/*/`users`/'
とする。これで、
% talk (Ctrl-D)
user1 user2
と、Ctrl-D や TAB を押すたびに users コマンドが実行され、ログイン中のユーザのみが補完対象となる。

次に、'c/XXX/YYY/' という書き方。
これは、「現在 XXX まで入力していたら、YYY を補完対象にする」という意味である。`YYY' の部分には、p/// の書き方のところで紹介した (... ... ...) ・ $xxx ・ `...` などの形式をそのまま使うことができる。
% complete foo 'c/abc/e/'
とすると、
% foo (Ctrl-D)
% foo a(Ctrl-D)
では、何も起こらない (デフォルト動作である、ファイル・ディレクトリの一覧を表示する)。しかし、abc とタイプした後に Ctrl-D を押すと
% foo abc(Ctrl-D)
CDPLAYER DISPLAY HOST LESS MPEGTABLES PWD USER
CVSEDITOR EDITOR HOSTDISPLAY LESSCHARSET OSTYPE SHELL VENDOR
と、環境変数の一覧を表示する。

% complete foo 'c/abc/(xx yy zz)/'
ならば、
% foo abc(Ctrl-D)
xx yy zz
となる。

特に、これはオプションを補完候補にする場合に有効である。例えば
% complete foo 'c/-/(x y z)/'
% foo -(Ctrl-D)
x y z
と、オプションの一覧を手軽に見ることができる (もちろん TAB で補完もできる)。さらに、`XXX' の部分には、メタキャラクタを使うことができる。
% complete foo 'c/-[abc]/(x y z)/'
% foo -a(Ctrl-D)
x y z
% foo -b(Ctrl-D)
x y z
この例では、-a か -b か -c が入力されると、x y z という補完候補を表示する。
% complete foo 'c/-A*/(x y z)/'
だと、-A から始まる文字列 ( -A や -Ab -Ac -Aabc など) が入力されているときは x y z が補完対象になるし、
% complete foo 'c/-*A/(x y z)/'
は、- から始まり A で終わる文字列 (-*A にマッチする文字列) が入力されているとき、x y z が補完対象になる。

最後に 'n/XXX/YYY/'。
これは 'c/XXX/YYY/' とほぼ同じであるが、違うのは `XXX' の次の引数に対して `YYY' を補完対象にすることである。
% complete foo 'c/XXX/(YYY)/'
だと、`XXX' の直後に TAB を押すと
% foo XXX(TAB)
YYY
となるが、
% complete foo 'n/XXX/(YYY)/'
% foo XXX(TAB)
と、`XXX' の直後に TAB を押しても何も起こらない。しかし
% foo XXX (TAB)
`XXX' の後に空白を入れて TAB を押すと `YYY' が補完対象となる。

再度、'p///' について補足説明。
実は p/// は、何番目の引数かによって、補完対象を限定する命令である。
% complete foo1 'p/1/c/'
補完対象はコマンド名。ただし1番目の引数のみ。
% complete foo2 'p/3/c/'
補完対象はコマンド名。ただし3番目の引数のみ。
% complete foo3 'p/*/c/'
補完対象はコマンド名。何番目の引数でも有効。
上記の例では、
% foo1 (Ctrl-D)
1番目の引数なので、コマンド名の一覧を表示
% foo1 foo (Ctrl-D)
2番目の引数に対しては設定されていないので、ファイル・ディレクトリの一覧を表示 (デフォルト動作)
% foo2 (Ctrl-D)
1番目の引数に対しては設定されていないので、ファイル・ディレクトリの一覧を表示 (デフォルト動作)
% foo2 foo bar (Ctrl-D)
3番目の引数なので、コマンド名の一覧を表示
となる。foo3 は何番目の引数であっても、常にコマンド名を表示する。

最後に、p/// c/// n/// の使い分けについて。
例えば find コマンドは、-type の後に f s b c l などの引数を書く。そういう場合、
% complete find 'n/-type/(f s b c l)/'
とする。一方、find の引数には -type の他にも、-name -size -inum -exec など多くの引数を取ることができる。この場合には
% complete find 'c/-/(type name size inum exec)/'
と、n/// でなく c/// を使うわけだ。一方 p/// は何番目の引数かを指定したいとき、例えば
% complete telnet 'p/1/(localhost host1 host2)/' 'p/2/(http ftp pop3)/'
などいうふうに使う。また、特に何番目の引数かを指定しない場合でも
% complete foo 'p/*/a/'
としてもよい。

さて、一通り説明をしたので実際に設定例をあげよう。まずは先程あげた簡単な例。
% complete alias 'p/1/a/'
% complete printenv 'p/*/e/'
% complete man 'p/*/c/'
% complete xdvi 'p/1/f:*.dvi/'
% complete cc 'p/1/f:*.{c,cc}/'
これらはもう説明はいらないだろう。

次に find コマンド。
find コマンドは -type -name -size などのオプションがあり、
'c/-/(type name size inum exec print)/'
-type の後には f s b c l などの引数を取る。
'n/-type/(f s b c l)/'
-user の後にはユーザ名、-group の後にはグループ名を取る。
'n/-user/u/' 'n/-group/g/'
また、find はディレクトリ名を受け取り、そこを起点にファイルシステムを検索するので、
'p/*/d/'
も指定しよう。これらの設定を反映させるには、全て繋げればよい。つまり
% complete find 'c/-/(type name size inum exec print)/' 'n/-type/(f s b c l)/' 'n/-user/u/' 'n/-group/g/' 'p/*/d/'
とすればよい。ここで大事なのは、'p/*/d/' を最後に持っていくことである。この設定では
% find -(Ctrl-D)
type name size inum exec print
となるが、もし 'p/*/d/' を先頭に持っていき
% complete find 'p/*/d/' 'c/-/(type name size inum exec print)/' ...
% find -(Ctrl-D)
とすると、tcsh は - がディレクトリの一部であると判断し、- から始まるディレクトリの一覧を表示する。もし - から始まるディレクトリが存在しなければ、何も表示しなくなる。狭い範囲の設定を先に (左に) 書き、広い範囲の設定は後に (右に) 書く、ということを覚えておこう。

次に talk コマンド。
talk の引数はユーザ名であるが、現在ログイン中のユーザ名だけを補完対象にしたい。
% finger | awk '{print $1}' | tail +2 | sort -u
で、現在ログインしているユーザ名だけをピックアップできるので、これを complete コマンドの中に組み込めばよい。

まずは先程の例から '' を外し、代わりに \ でエスケープする。
finger | awk \{print\ \$1\} | tail +2 | sort -u
これは、tcsh (sh・csh も同じ) では、'' の中に ' を含めることができないからである。perl と違って、'\'' としても、真ん中の ' はエスケープされない。'' の中では \ は \ そのものとして扱われるので、メタキャラクタをエスケープする能力を失ってしまうのである。今回は、最終的に
complete finger 'p/.../.../'
と、全体を '' で囲みたいので awk の部分で '' を使わないようにするのである。次に全体を `` (バッククォート) で囲む。
`finger | awk \{print\ \$1\} | tail +2 | sort -u`
さらに p/1// の中に入れる (1番目の引数が対象)。
p/1/`finger | awk \{print\ \$1\} | tail +2 | sort -u`/
全体を '' で囲む。
'p/1/`finger | awk \{print\ \$1\} | tail +2 | sort -u`/'
先頭に complete とコマンド名を付けて できあがり。
% complete talk 'p/1/`finger | awk \{print\ \$1\} | tail +2 | sort -u`/'

最後に telnet コマンド。
telnet コマンドは、
% telnet ホスト名
% telnet ホスト名 ポート番号 (あるいはポート名)
という引数を受ける。そこで、ホスト名とポート名を補完するようにしよう。ホスト名は
% set hosts=(foo.bar.com hoge.fuga.ac.jp)
と、シェル変数 $hosts で設定しておく。

また、ポート名は /etc/services から取得する。/etc/services の中身は
ポート名 ポート番号/プロトコル
という形式になっており、# はコメントを表すので、
% cat /etc/services | awk '{print $1}' | sed 's/#.*//' | sort -u
でプロトコルの一覧を得られる。ただしこれでは問題がある。FreeBSD の /etc/services には
sql*net 66/tcp #Oracle SQL*NET
という行が含まれているのだが、このように * や ? が含まれていると、補完動作をしたとき (Ctrl-D や TAB を押したとき) に、tcsh が * や ? をワイルドカードとみなして、パターンマッチを行おうとする。そこで
% cat /etc/services | awk '{print $1}' | sed 's/#.*//' | sort -u | sed 's/\*/\\*/g'
と、`*' を `\*' に置換しなければならない。

あとはこれをひとつにまとめればよいのだが、先に述べたように、まず '' を含まない形に変更すると
% cat /etc/services | awk \{print\ \$1\} | sed s/#.\*// | sort -u | sed s/\\\*/\\\\\*/g
となる。あとは、1番目の引数ならホスト名を、2番目の引数ならポート名を補完させればよい。ただし、sed の引数に `/' を渡しているので、`p///' という形式は使えない。代わりに`p@@@' や `p^^^' という書き方ができる。最終的には
% set hosts=(foo.bar.com hoge.fuga.ac.jp)
% complete telnet 'p/1/$hosts/' 'p@2@`cat /etc/services | awk \{print\ \$1\} | sed s/#.\*// | sort -u | sed s/\\\*/\\\\\*/g`@'
となる。長いね…。

ここでコマンド補完の設定にも触れておこう。tc と入力して補完しようとすると、
% tc (Ctrl-D)
tcsh tconv tclsh tcpdump tcpslice
と、tc から始まるコマンドの一覧が表示される。もしこの中で tcpdump だけを補完対象としたければ、
% complete -tc* 'p/0/(tcpdump)/'
とする。p/0// の 0 は 0 番目の引数、つまりコマンド自身を表している。すると、
% tc (Ctrl-D)
tcpdump
となり、tcpdump 以外のコマンドが補完候補から外される。