--- [管理番号 128] (最終更新 1999/02/17 23:58:45) Q. 質問したら、「chmod(2) を見てください」と言われました。どういうこと ですか? A. この場合は「マニュアルの 2 章の chmod を見てください」という意味です。 たとえば、 # man 2 chmod として見ます。詳しくは、man(1) を見てください。man manです。 --- [管理番号 130] (最終更新 2002/08/24 06:22:40) Q. カレントディレクトリを PATH に含めてはいけないと言われた のですが、どうしてですか? A. セキュリティホールになりうるからです。 もしカレントディレクトリが PATH に含まれている状態で、 % cd /tmp % ls としたとき、/tmp/ls というファイルがあったら、/bin/ls でなく /tmp/ls が実行されてしまいます。 もしかしたら /tmp/ls には #!/bin/sh /bin/rm -rf $HOME & と書いてあるかもしれません。その場合、あなたのホームディレクトリは 全て消えてしまいます。同様に、他人のホームディレクトリを ls で覗いた 場合、そこに置いてある得体の知れない ls を実行してしまうかもしれません。 どうしてもカレントディレクトリを PATH に含めたいならば、せめて PATH の 最後にしましょう (でもやめておいた方がよいと思います)。 「と言っても、カレントディレクトリにあるコマンドを実行するとき タイプ量が増えてしまいのがイヤだから…」 という方は、tcsh・bash・zsh などの高機能なシェルを使って、補完 機能を活用しましょう (FreeBSD 4.1-RELEASE 以降での csh(1) は、 tcsh(1) と全く同じです)。 カレントディレクトリに a.out がある状態で % ./a(TAB を押す) とすると % ./a.out と展開されます。他に a から始まるファイルがある場合は % ./a.(TAB を押す) とします。 --- [管理番号 289] (最終更新 1999/02/17 23:58:45) Q. FreeBSD にログインして、ある一定時間が経過すると自動的に ログアウトしてしまうようです。これを抑止することは可能 でしょうか? A. shell の auto-logout 機能が効いているんじゃないでしょうか。 例えば、tcsh の場合 ~/.cshrc に unset autologout と書けば抑止できます。 --- [管理番号 295] (最終更新 2000/11/08 01:55:32) Q. ログを別のファイルに書き出したくて /etc/syslog.conf を編集したんで すが変化がありません。 A. syslogd(8) に HUP シグナルを送りましたか? # kill -HUP `cat /var/run/syslog.pid` です。 伝統的な Unix では、syslog.conf(5) ファイルの、各行の左端に位置する 種類 (selector) を書く部分と、右側のファイル名 (action) を書く部分 の間の空白は TAB 文字だけしか使えません。スペースを入れると誤動作し ます。もちろん全角スペースは論外です。 cron.* /var/cron/log selector |---- TAB 文字 ----| action なお、最近の FreeBSD ではユーザへの便宜を図って、TAB 文字とスペース のどちらも使用できるよう改良されています。この場合も当然全角スペー スは除きます。 また、syslogd は指定された log file を自動的には作成しませんので、 手作業で作成しておく必要があります。次のように touch コマンドなどを 使用して作成してください。 # touch /var/cron/log 溜ったログファイルの処理については newsyslog(8) を参照すれば良いで しょう。 --- [管理番号 463] (最終更新 1999/02/17 23:58:45) Q. 拡張子 tgz のファイルを展開したいのですが、gtar がみつかりません。 gtar のインストールの仕方を教えてください。 A. gtar とは、GNU の tar ということでしょうか。それならば標準の tar (/usr/bin/tar) が GNU の物です。よってインストールの必要はありません。 中身を見たい時は、 % tar tfz hogehoge.tgz 展開したいときは、 % tar xfz hogehoge.tgz もし仮に GNU の tar がなくても GNU の zcat または、gunzip がインストー ルされていれば、これらのコマンドと tar を組み合わせることで拡張子 tgz のファイルを展開することができます。幸い FreeBSD では、これらのコマン ドも標準で入っています。(GNU の tar は、内部で gunzip を呼び出していま す。) 中身を見たい時は、 % zcat hogehoge.tgz | tar tf - 展開したいときは、 % zcat hogehoge.tgz | tar xf - --- [管理番号 485] (最終更新 1999/07/02 16:24:36) Q. cron でエラーになるんですけど。 A. cron がコマンドを実行するときには、シェル変数や環境変数がほとんど 設定されていません。ですから、手元で確認しているときには存在していた 変数設定がなくてエラーになることがよくあります。たとえば、 xxxx: not found. の場合、PATH の設定が足りないことが多いです。確認してみましょう。 cron で実行されるスクリプトのデバッグを行うには、 % env - sh で、自分の設定をクリアしたシェルを起動して、その上で実行してみると よいでしょう。 --- [管理番号 498] (最終更新 1999/02/17 23:58:45) Q. 生成されて 3日未満のファイルとか、3日を越えてアクセスされてないファ イルの一覧を findコマンドで表示させたいのですが、オプションの指定の 方法がわかりません。 find /path -ctime 3 -print などと実行すると ちょうど 3日のファイルしか表示できません。どうすれば、 3日未満や 3日を越えるファイルを表示できますか。 A. find(1) の -ctime や -atime の n 日の日付指定は、「ちょうど n 日」 であり「n 日を越える」や「n 日未満」ではありません。 「n 日を越える」ならば、+n 「n 日未満」ならば、-n と +- をつけて指定してみましょう。 ちなみに、/path 以下の 3 日を越えてアクセスしていないファイルを表示する には、 find /path -atime +3 -print とします。 -delete オプションを使うと一括削除されます。うっかり必要なファイルを 消去したりしないように十分注意しましょう。 --- [管理番号 526] (最終更新 1999/02/17 23:58:45) Q. login shell を csh から bash に変えたのですが、環境変数や path の設 定がおかしくなってしまいました。なぜですか? A. まず、うかつに shell を変えるべきではありません。 csh と bash は確かに「shell」という大きな仲間に属しますが、shell コマ ンドの構文や初期設定に使われる shell スクリプトのファイル名が全く違い ます。このため、shell を変える場合には初期設定ファイルを全て直す覚悟が 必要です。新旧の shell の manpage をよく読んでから入れ替えましょう。 ちなみに、shell にはおおまかにわけて二つの系統が存在します。 /bin/sh の子孫: sh (bourne shell, bsh), bash(bourne-again shell) /bin/csh の子孫: csh(c shell) tcsh おなじ系統に属する shell にはある程度の互換性があるため、おなじ系統内 での shell の変更は簡単である場合が多いです。もちろん、完全な互換性が あるわけではないので、よく確認しなければなりません。 --- [管理番号 539] (最終更新 1999/02/17 23:58:45) Q. 「パッチ」とはなんですか? A. オリジナルのソースコードとそれを更新したものを diff コマンドで比較 した差分です。 --- [管理番号 540] (最終更新 1999/02/17 23:58:45) Q. パッチの作り方は? A. パッチを作るには diff コマンドを使います。パッチの形式には unified diff 形式と context output format 形式の 2 種類があります。 以下に実行例を示しますので、参考にしてください。 以下、オリジナルを test.org/prog.c、更新後を test/prog.c とします。 unified diff 形式の場合 : % diff -urN test.org/prog.c test/prog.c --- test.org/prog.c Thu Aug 13 03:05:21 1998 +++ test/prog.c Thu Aug 13 03:07:07 1998 @@ -1,6 +1,10 @@ int main() { int num=0; +#if defined(TEST_OPT) num++; +#else + num * 2; +#endif return num; } context output format 形式の場合 : % diff -crN test.org/prog.c test/prog.c *** test.org/prog.c Thu Aug 13 03:05:21 1998 --- test/prog.c Thu Aug 13 03:07:07 1998 *************** *** 1,6 **** --- 1,10 ---- int main() { int num=0; + #if defined(TEST_OPT) num++; + #else + num * 2; + #endif return num; } 詳しくは, diff(1) を参照してください. また、パッチの当て方については [管理番号 541] を参照してください。 --- [管理番号 541] (最終更新 1999/02/17 23:58:45) Q. パッチの当て方は。 A. パッチの最初の 2 行には、相対ディレクトリを含むファイル名が次のよう に 2 行目の '+++' の後ろに書いてあります。 +++ test/prog.c Sat Jan 24 04:13:36 1998 パッチを当てたいファイルがそのファイル名の位置にあるようなディレクトリ にパッチ (ここでは patch.txt) をコピーします。 このディレクトリで以下を実行します。 % patch < patch.txt Hmm... Looks like a unified diff to me... The text leading up to this was: -------------------------- |--- test.org/prog.c Sat Jan 24 04:12:35 1998 |+++ test/prog.c Sat Jan 24 04:13:36 1998 -------------------------- Patching file prog.c using Plan A... Hunk #1 succeeded at 3. done --- [管理番号 567] (最終更新 1999/02/17 23:58:45) Q. ファイルの中身を16進数(8進数、10進数、文字)で見るには。 A. hd(1)、od(1)、hexdump(1)コマンドなどを利用できます。 man -k dump コマンドを実行するとそれらが検索されます。 1バイトずつ 16進数で見るには hd(1)がいいでしょう。 % hd hoge --- [管理番号 568] (最終更新 1999/02/17 23:58:45) Q. 私の使っている shell が何であるかを判定したいのですが。 A. ps $$ してください。 --- [管理番号 592] (最終更新 2003/10/16 23:20:15) Q. パーミッションの実行許可 (rwx の x) がよく理解できません。ファイルの 場合は、そのファイルが実行可能かどうかを表しますが、ディレクトリだと どうなるのでしょうか。 A. ディレクトリの実行許可を より正確に表記すると、 「実行/検索 (execute/search) 許可」 となります。これは、そのディレクトリ名をパス名 (ファイル名) の一部 として使っていいかどうかの判断に使われます。 それではどうしてまた、パス名の一部に使っていいかどうかを示すのに、 「検索」などというのでしょう。だいたい「検索」って何を探しているの でしょう。これは、カーネルの内部動作を示していて、その動作の内容を 知らないと意味不明な言葉なのです。 UNIX では、ファイルを示すのにパス名を使います。一方、カーネル内部で は、ファイルを扱うときに inode を使います。このため、カーネルは、シ ステムコールなどでパス名を指定された場合、そのパス名が示す inode を 知らなければなりません。 カーネルが最初から知っているのはルート("/")とカレント(".")の 2つの ディレクトリの inode だけです。 なので、パス名で指定されたファイルをカーネルが扱うには、この2つのど ちらかの位置から、ひとつひとつディレトリを辿り、目的のパス名の最後 の要素が入っているディレクトリを探し当て、そこに書かれた inode番号 から目的とするファイルの inode を探し求める旅に出ることになります。 この「ディレクトリを辿ってパス名で示されたファイルの inode を探す」 ことをパスの検索(path search)といい、namei という有名なカーネル関数 がその仕事をしています。この inode を探し求める旅で、通過するディレ クトリの中を「検索」していいかを決めるのが、ディレクトリの search permission ということになります。直訳すれば「検索許可」。「検索権」 とも呼ばれます。 たとえば、/etc/hosts を "/etc/hosts" という絶対パス名を使ってアクセ スして読みたい場合には、/etc/hosts そのものの読取り許可だけでなく、 "/" と "/etc" 両方のディレクトリに検索許可が必要です。 カーネルの動作をもう少し細かく書きましょう。 "/etc/hosts" を指定されたカーネルは、これを "/", "etc", "hosts" に 分解してひとつづつ調べていきます。"/" の inode をカーネルは知ってい ますから、"/" の中を検索して "etc" というエントリを見つけます。が、 その前に "/" を検索していいかどうかを確認します。この時使うのがディ レクトリの実行/検索許可です(注)。許可がなければここでエラーになり、 許可があれば中を検索して "etc" を見つけ出します。 見つけたエントリにはファイル名(ディレクトリ名)とその inode番号の組 が書かれていますから、inode番号から inode が手に入ります。次にやる のは "etc" の中を検索して "hosts" を見つけ出すことです。そう、もち ろん検索の前には、"etc" に実行/検索許可があるかどうかを確認します。 許可があって "hosts" が見つかったなら、"/etc/hosts" の inode が手に 入り、検索はここで終ります。 カレントディレクトリ(".")からの相対指定でも、同様の検索をおこなって 目的ファイルの inode を求めます。カレントディレクトリが /usr/X11R6 だとして、grep -i green lib/X11/rgb.txt を実行するには、".", "/usr/X11R6/lib", "/usr/X11R6/lib/X11" の3つのディレクトリに検索許 可が必要になります。 "lib/X11/rgb.txt" を指定されたカーネルは、パス名が "/" で始まってい ないので、カレントディレクトリから検索をおこないます。カレントディ レクトリの inode をカーネルは知ってますから、中を読んで "lib" とい うエントリを検索します。もちろん検索の前にはカレントディレクトリの 実行/検索許可を確認し… あとは同じです。 このように、カーネルにとっては単純に「検索許可」であるものが、カー ネルの外からは「パス名の一部に使っていいかを制限している」と説明す るしかない風変りなものに見えるのです。 関連項目 intro(2) DEFINITIONS節の File Name から File Access Permissions。 UNIXカーネルの設計, 4.4節 パス名のiノードへの変換 Lion's Commentary on UNIX(r) 6th Edition, unix/nami.c /sys/kern/vfs_lookup.c 注 ディレクトリの中を検索するとき、当然これらをカーネルは「読」んで いますが、この時に必要なのは検索許可であり、読取り許可は問われな いことを覚えておきましょう。読み取り許可は、ユーザープロセスが読 む時に使われるものです。 --- [管理番号 609] (最終更新 1999/02/17 23:58:45) Q. コマンドの実行結果をファイルに残したり、結果を別のコマンドに渡したい と思うのですが、どのように操作するのでしょうか。 A. UNIX の Shell(シェル)にはリダイレクトというとても便利で柔軟な機能が あります。コマンドの実行結果を別のコマンドの入力にしたり、ファイルに残 したりできます。この機能の利用方法は使用しているシェルによって若干異 なってきます。 1. 結果をファイルに記録する csh, tcsh など % make > file.log sh, bash など $ make > file.log 2. 標準エラー出力も記録する csh, tcsh など % make >& file.log sh, bash など $ make > file.log 2>&1 3. コマンドの結果を別のコマンドに渡したい csh, tcsh など % ls | more sh, bash など $ ls | more 4. エラー出力も渡したい csh, tcsh など % ls |& more sh, bash など $ ls 2>&1 | more 5. 画面を見ながらその結果を片っ端から記録したい csh, tcsh など % telnet hoge.hiyo.ac.jp |& tee file.log sh, bash など $ telnet hoge.hiyo.ac.jp 2>&1 | tee file.log これでTELNETのログができます。 注) tee とは 標準入力からデータを読み込み、その内容を指定された ファイルと 標準出力に出力するコマンドです。 詳しくは jman tee (日本語版 マニュアルの場合) を参照。 6. 画面を操作しながらその結果を片っ端から記録したい script(1)コマンドは、シェルによらず動作出来るので、とても有用です。 % script file.log これで画面への入力及び出力の全てを file.log に記録する事が出来ます。 ただし、Enter/C-p/C-nなどのシェルに対するキー入力も、コントロール コードとして そのまま記録されてしまいます。 file.logへの記録を終えたいときは exitしてください。 --- [管理番号 630] (最終更新 1999/02/17 23:58:45) Q. cshを使っています。 リダイレクトは % hogehoge >log 標準エラー出力もだと % hogehoge >&log 他のコマンドに渡すときは % hogehoge | hiyohiyo もしくは、 % hogehoge |& hiyohiyo ですが、これを/etc/daily.localに書くと怒られます。 シェルがshですので、同じ事をshの文法で書くとどういう風になるのでしょうか。 A. jman shを">"という文字で検索してみましょう。 パイプライン という部分で パイプラインによる標準入出力の接続はリダイレクトに先立って 行われるため、パイプラインの接続をリダイレクトによって修正 することができます。たとえば、 % command1 2>&1 | command2 という例が載っています。 というわけで、shの場合は、以下のようにします。 リダイレクトは % hogehoge > log 標準エラー出力もだと % hogehoge > log 2>&1 他のコマンドに渡すときは % hogehoge | hiyohiyo もしくは、 % hogehoge 2>&1 | hiyohiyo リダイレクト('<'や'>')やパイプ('|')にはファイルディスクリプタを 指定することが出来ます。 ファイルディスクリプタは番号で表現しますが、約束ごとで、 0 標準入力 1 標準出力 2 標準エラー出力 となっています。">"が"1>"と同じ意味であり、"n>&m"が 「nをmに混ぜてしまう」ということが理解できれば、 % hogehoge > log 2>&1 の代わりに % hogehoge 2> log 1>&2 とするといった応用もできるようになります。 --- [管理番号 639] (最終更新 2001/11/17 19:15:36) Q. コマンドプロンプトを示すのに ``#'' や ``%'' があるようですが、 ``#'' や ``%'' って、どう違うのでしょうか? A. コマンドプロンプトは、あなたが利用している shell によって変ります。 また、自由に変更することもできます。csh(1) 系の shell(csh, tcsh) では、 デフォルトで ``#'' は root、``%'' は一般ユーザを表しています。同様に ``$'' は sh(1) 系のプロンプトを意味します。詳しくは、あなたが利用して いる shell のマニュアルを見てください。 --- [管理番号 679] (最終更新 1999/02/17 23:58:45) Q. FreeBSD-users-jp に質問したところ、「hogehoge は動いていますか? ps -aux | grep hogehoge で確認してください」と言われました。起動してい るはずなのに、どうしても、hogehoge を含む行が表示されません。 A. ps -aux をキャラクタ端末や kterm 上で行なうと、端末に入りきる分しか ps(1) は結果を出力してくれません。具体的には、横 80 桁の kterm で ps -aux を行なった場合、ps の出力のうち、各行の頭 80 桁分しか表示され ません。 /etc/local/sbin/hogehoge をフルパスで /etc/local/etc/rc.d 内のスクリプ トから起動しているような場合、ps -aux の出力結果の内、実行ファイル名の 部分が入り切らないことがあります。もちろん grep(1) で実行ファイル名を 指定しても見つけられないわけです。 プログラムが動いていることが確認できればよい時や、プロセス ID を知りた い時は、ps -ax か ps -acx を使うと確実でしょう。 また、より詳細なデータが知りたい時は、端末幅で出力が途切れず、次の行に 折り返して結果が表示されるように ps -auxwwを使うと確実でしょう。 --- [管理番号 690] (最終更新 2002/08/24 06:22:40) Q. コマンドの実行例を教えてもらったので、さっそく実行しましたが "Command not found." と叱られました。 A. どのように入力しましたか? 1. "# foo" と入力しなさいと言われたので、そのまま "# foo" と入力した場合: コマンドの実行例を示す時に、プロンプトをつけて説明することがあります。 今回の場合、"#" 自体がプロンプトで、入力するのは "foo" だけになります。 プロンプトには、"#" のほかに "%" や "$" があります。これらの違いは、 [管理番号 639] を参照してください。 2. "foo" だけ入力した場合: そのコマンドがインストールされていないか、そのコマンドのあるディレクトリ にパスが通っていません。 まずそのコマンドが存在するか確認してください。次のように find(1) を使う と簡単です。 % find / -name foo -print これで foo が見つからなければ、インストールされていません。 見つかったならば、パスが通っていません。絶対または相対パス付でコマンドを 指定してください。たとえば、find(1) によって /usr/local/sbin/foo と表示 されたら /usr/local/sbin/foo と入力してください。よく使うコマンドならば、そのディレクトリをパスに 追加しましょう。 % setenv PATH ${PATH}:/usr/local/sbin (csh・tcsh 系の場合) % PATH=${PATH}:/usr/local/sbin (sh ・bash 系の場合) これで "foo" と入力しただけで /usr/local/sbin/foo が実行できるようになります。 なお、カレントディレクトリ (.) はパスに加えないようにしましょう。 → [管理番号 130] 3. 絶対パスまたは相対パスを指定してもダメな場合: foo は、スクリプトでありませんか? スクリプトを実行するプログラムが見つから ないときにも、このエラーメッセージが表示されます。foo の 1行目が #!/dokokano/nanntoka のようになっているなら、/dokokano/nanntoka が存在して実行可能であることを 確かめてください。nanntoka が別のところにあれば、正しいディレクトリ指す ようにさすように 1行目を書き換えてください。 それでも Command not found となる場合は、 % head -1 foo | hd として、1行目をダンプしてみてください。もし 00000000 23 21 2f 64 6f 6b 6f 6b 61 6e 6f 2f 6e 61 6e 6e |#!/dokokano/nann| 00000010 74 6f 6b 61 0d 0a |toka..| となっているなら、Windows・DOS の改行コード 0x0D 0x0A になっているため、 #!/dokokano/nanntoka(0x0D) というコマンドを実行しようとして失敗している、ということです。UNIX の 改行コードは 0x0A ですので、 00000000 23 21 2f 64 6f 6b 6f 6b 61 6e 6f 2f 6e 61 6e 6e |#!/dokokano/nann| 00000010 74 6f 6b 61 0a |toka.| となるように修正して下さい。お手軽な改行コード変換の方法としては、 % qkc -u file があります。qkc は japanese/qkc として port/package に含まれています。 --- [管理番号 703] (最終更新 1999/02/17 23:58:45) Q. シェルに csh を使っているのですが、プロンプトの表示をもっと便利にで きませんか? A. csh のデフォルト設定では、一般ユーザの場合は `% ' が、スーパユーザ の場合は `# ' がコマンドプロンプトに表示されますが、シェル変数 `prompt' を設定することでこの表示を変更できます。 以下にいくつかの例をあげておきますので、これらのうちいずれかを ~/.cshrc に記述しておくとよいでしょう。 ・プロンプトに自分のログイン名を表示させる。 set prompt = "${user}% " ・プロンプトにホスト名を表示させる。 set prompt = "`hostname`% " ホスト名がFQDN (ドメイン名を含むホスト名) で設定されている時にドメイ ン名を含まない形にしたいときは次のようにする事もできます。 set prompt = "`hostname -s`% " ・プロンプトに現在のイベント番号を表示させる。 set prompt = "{\!}% " ・プロンプトに現在のワーキングディレクトリを表示させる。 これが csh の難点です。csh では tcsh などと異なり、現在のワーキング ディレクトリを表すシェル変数 `cwd' が変数 `prompt' と呼応しません。 そこで、通常は cd をエイリアスすることで実現します。 alias cd 'cd \!*; set prompt = "`pwd`% "' set prompt = "`pwd`% " 以上の例を組み合わせる事もできます。 ・プロンプトにログイン名とホスト名と現在のイベント番号を表示させる。 set prompt = "${user}@`hostname`{\!}% " ・プロンプトにホスト名と現在のワーキングディレクトリ、イベント番号を表 示させる。 alias cd 'cd \!*; set prompt = "`hostname -s`:`pwd`{!}% "' set prompt = "`hostname -s`:`pwd`{\!}% " これらはあくまで一例であって、他にも方法はいろいろあります。より詳しい 事が知りたいときや応用がしたいときは csh(1) を参照して下さい。 --- [管理番号 709] (最終更新 2004/04/09 05:05:21) Q. コマンドのバージョンを知るには どうしたらいいですか? A. いろいろ考えられますが、以下の方法が比較的簡単です。 1. what(1) や、ident(1) を使う。ただし全てのソースのリビジョン番号が 表示されますので、「このコマンドのバージョンを知りたい」という場合は 不向きです。 % what /bin/ls /bin/ls: Copyright (c) 1989, 1993, 1994 termcap.c 8.1 (Berkeley) 6/4/93 strftime.c 7.38 strftime.c 5.4 (Berkeley) 3/14/89 (略) % ident /bin/ls /bin/ls: $FreeBSD: src/lib/msun/i387/s_ilogb.S,v 1.7.2.1 2000/07/10 09:16:28 obrien Exp $ $FreeBSD: src/lib/libc/i386/string/strrchr.S,v 1.5 1999/08/27 23:59:35 peter Exp $ $FreeBSD: src/lib/libc/i386/string/strncmp.S,v 1.6 1999/08/27 23:59:35 peter Exp $ $FreeBSD: src/lib/libc/i386/string/index.S,v 1.5 1999/08/27 23:59:30 peter Exp $ (略) 2. strings(1) を使う。 % strings hogehoge | grep -i version 3. ports/packages を利用してインストールしたものなら、 % pkg_info -aI | grep hogehoge 4. command 自身の version 表示。 command のなかには、バージョン表示オプションを持っていたり、help 表示すると version を表示してくれるものがあります。 % hogehoge -h や hogehoge -V 最近の GNU 系のコマンドであれば、hogehoge --version なども使えるでしょう。 5. その他 (servername で動いている) bind のバージョン % nslookup -q=txt -class=chaos version.bind servername または % dig @servername txt chaos version.bind sendmail のバージョン - macro 'v' の値を調べる % echo '$v' | sendmail -bt ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter
> 8.9.1 - デバッグ用オプションを使って表示させる。 % sendmail -bt -d0.1 < /dev/null | head -1 Version 8.9.1 - コマンドラインから SMTP 的にお話をする。 % echo HELP | sendmail -bs | head -2 | tail -1 214-This is Sendmail version 8.9.1 - SMTP でお話でする。 % telnet servername smtp Trying 127.0.0.1... Connected to servername. Escape character is '^]'. 220 servername ESMTP Sendmail 8.9.1/8.9.1 ... ただし、その sendmail の設定ファイル /etc/sendmail.cf の SmtpGreetingMessage=$j Sendmail $v/$Z; $b が書きかわっていたなら、正しく表示されません。逆に言うと、 外部に sendmail のバージョンを漏らしたくない場合は、ここを 書きかえておくとよいでしょう。 XFree86 のバージョン % /usr/X11R6/bin/X -version (--version ではありません。-version です) OpenSSL のバージョン % openssl version OpenSSL 0.9.7c 30 Sep 2003 最も確実なのはコマンドのソースを調べる事でしょう :) --- [管理番号 712] (最終更新 1999/11/03 04:54:53) Q. 使っているうちに増えたファイルを一つにまとめたいのですが、 どうすればいいですか? また、それらのファイルを圧縮したり することはできますか? A. これに対する答えは, 非常に多くて困ってしまいます。 :) 以下に、一部ですが挙げますので、参考にして下さい。これ以外にも たくさんありますので、ports/packages の archivers、converters あたりを見てみるといいでしょう。また、これらに関する本も多く 出版されています。 ファイルの圧縮、伸長: bzip [管理番号 725] bzip2 [管理番号 726] compress [管理番号 727] gzip [管理番号 728] pack [管理番号 729] アーカイブ: tar [管理番号 730] アーカイブ+ファイルの圧縮、伸長: lha [管理番号 731] zip [管理番号 732] tar+compress [管理番号 733] tar+gzip [管理番号 734] シェルアーカイブ: shar [管理番号 735] バイナリ <-> テキスト変換: uuencode [管理番号 736] ish [管理番号 737] base64 [管理番号 1012] --- [管理番号 725] (最終更新 1999/02/17 23:58:45) Q. bzip/bunzip ってなんですか? A. ファイルの圧縮, 伸長方法のひとつです. FreeBSD には標準でインストールされていませんので, ports/packages を利用してインストールする必要があります. 圧縮の仕方 : % bzip hogehoge 圧縮したファイルの末尾には, .bz が付けられます. 伸長の仕方 : % bzip -d hogehoge.bz あるいは, % bunzip hogehoge.bz です. 詳しくは, bzip(1) を参照して下さい. --- [管理番号 726] (最終更新 2003/11/17 02:28:48) Q. bzip2/bunzip2 ってなんですか? A. ファイルの圧縮, 伸長方法のひとつです. FreeBSD 4.4-RELEASE 以降では標準で含まれるようになりました。それ以 前のリリースでは、ports/packages を利用してインストールする必要が あります. 圧縮の仕方 : % bzip2 hogehoge 圧縮したファイルの末尾には, .bz2 が付けられます. 伸長の仕方 : % bzip2 -d hogehoge.bz2 あるいは, % bunzip2 hogehoge.bz2 です. 詳しくは, bzip2(1) を参照して下さい. --- [管理番号 727] (最終更新 1999/02/17 23:58:45) Q. compress/uncompress って何ですか? A. ファイルの圧縮, 伸長方法のひとつです. 圧縮の仕方 : % compress hogehoge 圧縮したファイルには末尾に .Z が付けられます. 伸長の仕方 : % uncompress hogehoge.Z あるいは, gzip を用いて, % gzip -d hogehoge.Z とか, % gunzip hogehoge.Z とすることでも伸長することができます. 詳しくは compress(1), gzip(1) を参照して下さい. --- [管理番号 728] (最終更新 1999/02/17 23:58:45) Q. gzip/gunzip ってなんですか? A. ファイルの圧縮, 伸長方法のひとつです. 圧縮の仕方 : % gzip hogehoge 圧縮したファイルの末尾には .gz が付けられます. 伸長の仕方 : % gzip -d hogehoge.gz あるいは, % gunzip hogehoge.gz です. 詳しくは gzip(1) を参照して下さい. --- [管理番号 729] (最終更新 1999/02/17 23:58:45) Q. pack/unpack ってなんですか? A. ファイルの圧縮, 伸長方法のひとつです. 現在のところ FreeBSD では pack を利用できません. しかし, pack で圧縮されたファイルを伸長することは可能です. 伸長の仕方 : % gzip -d hogehoge.z あるいは, % gunzip hogehoge.z です. 詳しくは, gzip(1) を参照して下さい. --- [管理番号 730] (最終更新 1999/02/17 23:58:45) Q. tar ってなんですか? A. 複数のファイルをひとつにまとめるためのプログラムです. この機能をアーカイブといいます. (tar とは Tape ARchiver の略だったりします) まとめ方 : % tar -cf hogehoge.tar file1 file2 ... これで file1, file2, ... を hogehoge.tar にまとめることができます. まとめたファイルには任意の名前を付けることができますが, 一般的にファイルの末尾を .tar にします. ほどき方 : % tar -xf hogehoge.tar 詳しくは, tar(1) を参照して下さい. 使用例が数多く挙げられています. --- [管理番号 731] (最終更新 1999/02/17 23:58:45) Q. lha ってなんですか? A. ファイルの圧縮, 伸長のひとつです. また, アーカイブ機能も備わっています. FreeBSD には標準でインストールされていませんので, ports/packages を利用してインストールする必要があります. 圧縮の仕方 : % lha c hogehoge.lzh hogehoge1 hogehoge2 ... 圧縮したファイルには任意の名前を付けることが可能ですが, ファイルの末尾に .lzh を付けることが多いようです. アーカイブ機能により複数のファイルをひとつにまとめて, 圧縮することが可能です. 伸長の仕方 : % lha x hogehoge.lzh 詳しくは, lha(1) を参照して下さい. 注.) 日本語のマニュアルしかありませんので, 別途 jman をインストールしておく必要があります. --- [管理番号 732] (最終更新 1999/02/17 23:58:45) Q. zip/unzip ってなんですか? A. ファイルの圧縮, 伸長方法のひとつです. また, アーカイブ機能も備わっています. FreeBSD には標準でインストールされていませんので, ports/packages を利用してインストールする必要があります. 圧縮の仕方 : % zip hogehoge.zip hogehoge1 hogehoge2 .... 圧縮したファイルには任意の名前を付けることが可能ですが, ファイルの末尾に, .zip をつけることが多いようです. アーカイブ機能により複数のファイルをひとつにまとめて, 圧縮することが可能です. 伸長の仕方 : % unzip hogehoge.zip 詳しくは, zip(1), unzip(1) を参照して下さい. --- [管理番号 733] (最終更新 2004/04/09 05:05:59) Q. .tar.Z ってなんですか? tar なの? compress なの? A. このファイルは tar(1) でひとまとめにしたあと、compress(1) で 圧縮したファイルです。よく、tar+compress と表記します。ファイルの 末尾が .taz となっていることもあります。 作成方法は、tar(1) については [管理番号 730]、compress(1) に ついては [管理番号 727] を参照して下さい。 ほどき方 : FreeBSD 標準の tar は GNU tar なので、オプション Z をつけることにより、 compress を呼ことができます。 % tar -xZf hogehoge.tar.gz (注: GNU tar 以外では Z に違う機能が割り当てられている場合があります。 よく確認した上で利用して下さい。思わぬ結果を招くかもしれません。) あるいは、 % uncompress hogehoge.tar.Z % tar -xf hogehoge.tar としてもほどくことができます。 詳しくは、compress(1), uncompress(1), tar(1) を参照して下さい。 --- [管理番号 734] (最終更新 2004/04/09 05:05:59) Q. .tar.gz ってなんですか? tar なの? gzip なの? A. このファイルは tar でひとまとめにしたあと、gzip で圧縮した ファイルです。よく、tar+gzip と表記します。ファイルの末尾が .tgz となっていることもあります。 作成方法は、tar については [管理番号 730]、gzip については [管理番号 728] を参照して下さい。 ほどき方 : FreeBSD 標準の tar は GNU tar なので、オプション z をつけることにより、 gzip の機能を呼ことができます。 % tar -xzf hogehoge.tar.gz これ一発でほどけます。 (注: GNU tar 以外では z に違う機能が割り当てられている場合があります。 よく確認した上で利用して下さい。思わぬ結果を招きます。) あるいは、 % gunzip hogehoge.tar.gz % tar -xf hogehoge.tar としてもほどくことができます。 詳しくは、gzip(1), gunzip(1), tar(1) を参照して下さい。 --- [管理番号 735] (最終更新 1999/02/17 23:58:45) Q. shar ってなんですか? A. 複数のファイルをひとつにまとめるためのプログラムで, 指定したファイルを作るためのスクリプトファイルを生成します. できた shar ファイルはテキストファイルです. (実は, shar 自体もシェルスクリプトです.) shar にはアーカイブできないファイルがありますので, ファイルをアーカイブするには tar を用いた方がよいでしょう. [管理番号 730] を参照して下さい. ほどき方 : % sh hogehoge とすれば, ファイルが作成されます. 詳しくは, shar(1) を参照して下さい. --- [管理番号 736] (最終更新 1999/02/17 23:58:45) Q. uuencode/uudecode ってなんですか? A. 任意のファイルを ASCII テキストファイルへ変換するプログラムです. 8bit スルーでない伝送路を使う場合にバイナリファイルを変換しておくのに使います. 作り方 : % uuencode hogehoge foo > hogehoge.uue です. この意味は, hogehoge というファイルを uuencode して hogehoge.uue に保存し, uudecode した時のファイル名は, foo にします. と言う意味です. foo を hogehoge にすれば, 送るファイルと受け取るファイルは同じ名前になります. ファイルモードも保存されます. ただし, setuid ビットと実行ビットは保存されません. 戻し方 : % uudecode hogehoge.uue uuencode されたファイルの前や後ろにいかなる情報があっても, それらを無視しますので, ヘッダの除去などといった余計な操作はしなくても結構です. 詳しくは, uuencode(1), uudecode(1) を参照して下さい. --- [管理番号 737] (最終更新 1999/02/24 03:56:34) Q. ish ってなんですか? A. バイナリ <-> テキスト変換ツールです。 FreeBSD には標準で付いていませんので、あらかじめ ports や packages からインストールしておく必要があります。 バイナリ -> テキスト: % ish hogehoge -s7 この場合、hogehoge は JIS テキストに変換されます。 ファイルの末尾には .ish がつけられます。 テキスト -> バイナリ: % ish hogehoge.ish オンラインマニュアルはありませんので、 % ish で得られる情報を参照するか、書籍・Web 等から情報を得て下さい。 --- [管理番号 794] (最終更新 1999/02/17 23:58:45) Q. ハングアップしてしまいました。助けて下さい。 A. まず、落ち着いて下さい。決して "暴走即電源ブチッ" ということをして はいけません。とりあえず、Ctrl-C や Ctrl-D あるいは Ctrl-\ などのプロ グラム終了にアサインされている機能キーを押してみて下さい。それでもダメ なら仮想コンソールを切替えてログインするかネットワーク経由でログインし てみて下さい。もし、ログインできたら ps コマンドを用いて問題を起こして いるプロセスの PID を調べて、いろいろなシグナルを送ってみてください。 たとえば、 kill -INT kill -HUP kill -QUIT kill -TERM とやってダメなら kill -KILL とやってプロセスを殺して下さい。ただ、ドライバ内部でのフリーズや拡張ボー ドの設定ミスなどでカーネル自体がハングアップしている場合があります。そ れを調べるには、キーボードの CAPS キーを押してみて下さい。もし、カーネ ル自体がお亡くなりになっている時は LED が点滅しません。その時は電源 OFF またはリセットするしかありません。 --- [管理番号 838] (最終更新 2004/04/09 05:05:48) Q. man nice に従って priority (優先度) を下げて実行したら、一般 ユーザーでは反映されず、root では逆に priority が上がって しまいました。 A. shell に csh か tcsh をお使いではないでしょうか。csh・tcsh では nice コマンドは組込みコマンドとなっており、/usr/bin/nice とは 書式が違います。 そのため、nice(1) で表示される /usr/bin/nice 用の記述を信じると 変なことになります。csh(1)・tcsh(1) の nice の項を参照してください。 例えば /usr/bin/nice では、priority を 20 (一番低く) にするには、 $ nice -20 command としますが、csh の場合は、 % nice +20 command としなければなりません。 なおコマンドの起動後に priority を変更するには renice(8) を 使いますが、これは csh の組込みコマンドではありません。 参考までに、プロセスが現在どの priority で動いているのかは、 ps コマンドに -l オプションを指定して実行すれば表示されます。 --- [管理番号 941] (最終更新 2001/03/07 02:08:46) Q. 他の UNIX で使用していた passwd file と passwd を、そのまま FreeBSD で使用できますか? A. SunOS のように、DES という暗号方式で passwd を格納している場合には、 多少の変更で使用できます。(現在の UNIX では、DES 方式がまだまだ多い) まず、FreeBSD (標準では MD5 で暗号化) を DES が使用できるようにする 必要があります。また、SunOS と FreeBSD とで passwd file の field 構成 が少し違いますので調整する必要があります。 1. /stand/sysinstall などを使用して DES をインストールする。 インストール方法については [管理番号 292] を参照してください。 2. SunOS の "/etc/passwd" を "/tmp/passwd" などにコピーしておき GID の後   ろに "::0:0"を追加する。たとえば awkを使用する場合は次のようにする。 cat /etc/passwd | awk 'BEGIN{FS=":" } \ {printf("%s:%s:%s:%s::0:0:%s:%s:%s\n",$1,$2,$3,$4,$5,$6,$7)}'\ > /tmp/passwd 3. "/tmp/passwd" を FreeBSD 側にコピーし、vipw を起動して"/tmp/passwd" を今の FreeBSD の passwd の後ろに追加し、uid の重複や、shell や、 home の path 等を修正/確認した後セーブする。 4. パスワードの記録形式を DES に変更する。 変更方法については [管理番号 345] を参照してください。 以上の操作によって、他の UNIX で使用していた passwd をそのまま FreeBSD で使用できます。 --- [管理番号 1012] (最終更新 2004/04/09 05:05:14) Q. base64 ってなんですか? A. RFC2045 で規定されている、バイナリデータをメールなどで送る ための、バイナリ <-> テキスト変換方式の一つです。base64 化 したデータは以下のようなテキスト形式になります。 f0VMRgEBAQkAAAAAAAAAAAIAAwABAAAAMC4TwDQAAAAkZTwAAAAAADQAIAAFACgA GgAXAAYAAAA0AAAANAAQwDQAEMCgAAAAoAAAAAUAAAAEAAAAAwAAANQAAADUABDA 1AAQwA0AAAANAAAABAAAAAEAAAABAAAAAAAAAAAAEMAAABDAlVk1AJVZNQAFAAAA ABAAAAEAAACgWTUAoGlFwKBpRcBYcgYANM0JAAYAAAAAEAAAAgAAAJDLOwCQ20vA メールやネットニュースなどで、本文が base64 エンコードされて いる場合、 Content-Transfer-Encoding: base64 というヘッダがつけられます。 MIME 対応のメーラー (Mozilla, Sylpheed, Mew, Semi-Gnus など) を使うと、base64 化されたメールを扱うことができます。 コマンドラインから操作したい場合は、FreeBSD 付属の OpenSSL を 使うのがお手軽でしょう。 エンコード % openssl enc -base64 -e < plain.txt > base64.txt デコード % openssl enc -base64 -d < base64.txt > plain.txt また ports/packages にある、base64・mpack・uudeview でも 扱うことができます。 --- [管理番号 1084] (最終更新 2000/05/24 20:46:25) Q. raw デバイスって何ですか? A. デバイスには「ブロック型デバイス」と「キャラクタ型デバイス」があります が、「raw デバイス」とは「キャラクタ型デバイス」のことを指します。 以下、フロッピーディスク (/dev/fd*) を例にあげて説明します。Unix の慣例 でデバイス名に「r」を付けたもの、例えば /dev/fd0 なら、/dev/rfd0* が raw デバイスであり、/dev/fd0* はブロック型デバイスです。これは ls(1) に -l オプションを指定するか、file(1) コマンドなどで確認できます。 % ls -l /dev/rfd0 /dev/fd0 brw-r----- 9 root operator 2, 0 Oct 18 1998 /dev/fd0 crw-r----- 9 root operator 9, 0 Jan 9 16:47 /dev/rfd0 % file /dev/rfd0 /dev/fd0 /dev/rfd0: character special (9/0) /dev/fd0: block special (2/0) raw デバイスに対する入出力 (フロッピーの場合 /dev/rfd*) は、デバイスに 対して直接行われます。カーネルによるバッファリングは行われません。この ため、入出力の際には必ず、デバイスの許容するブロックサイズの倍数単位で 行う必要があります。(*1) また、書き込みのシステムコールが完了した時には、実際にデバイスへの書き 込みも終了しています。 一方、ブロック型デバイスに対する入出力 (フロッピーの場合 /dev/fd*) は、 カーネル中の buffer cache でいったん、バッファリングされます。このため、 デバイスに許可されたブロックサイズの倍数でなくても入出力できます。 ただし、buffer cache で書き込みもキャッシュされているので、コマンドが 終了しても、フロッピーへの書き込みは終了しているとは限りません(というか、 普通は終了していません)。 普通は、適切な (=十分大きな) ブロックサイズを指定すれば、raw デバイス を使った入出力の方が高速です。この事と、書き込みの完了を保障できる ことから、本格的なデータベースでは、raw デバイスを使うのが普通です。(*2) まあ、/dev/fd* に書いても、buffer cache が全て書き終わるのを待てば (sync コマンドを実行して、フロッピーディスクが動き出し、停止するまで 待てば) いいかもしれませんが、普通は raw デバイスを使う方が適切ですね。 とりあえず、ファイルシステムとして使う場合はブロック型デバイスを使い、 特定のファイル等を意識しない装置そのものとして使う場合はキャラクタ型 デバイスを使う、という感じで覚えておけばいいでしょう。 ------ *1 例えば % tar cf /dev/fd0 . (この使い方はよくない) % tar zcf /dev/fd0 . (この使い方はよくない) % tar cf /dev/rfd0 . (rawデバイスを使っているので望ましい) はできますが、 % tar zcf /dev/rfd0 . はエラーになります。これは % tar zcf - . | gzip > /dev/rfd0a と等価であるからです。 tar 自身は書き込む対象が,ファイル/rawデバイス/ブロック型デバイス のいずれの場合でもブロックサイズの倍数単位で書き込みするが、gzip は そうではない、ということです。 (この場合は、tar(1) の --block-compress オプションを使えばうまく いきます) *2 ちなみに Linux には raw デバイスがありません。 Linux の大きな弱点の一つ。 ------ --- [管理番号 1107] (最終更新 1999/03/01 17:10:21) Q. パーミッションを rw-rw-rw- とした hoge というファイルを % tar cvf hoge.tar hoge として hoge.tar を作成したのち % tar xvf hoge.tar で展開すると、ファイル hoge のパーミッションが rw-r--r-- に 変わってしまいます。展開後も rw-rw-rw- となってほしいのですが。 A. 展開時に p オプションを指定して % tar xvfp hoge.tar としてください。詳しくは tar(1) をどうぞ。 rw-rw-rw- ではなく rw-r--r-- となってしまう理由は umask にあります。 % umask 0 % tar xvf hoge.tar とすると、p オプションなしでも、ファイル hoge のパーミッションが rw-rw-rw- となります (意味を理解せずに umask 0 とするのはやめましょう)。 umask はシェルの組み込みコマンドです。詳しい説明は、あなたが 使っているシェル、csh(1),tcsh(1),bash(1) などのマニュアルを ご覧ください。 --- [管理番号 1544] (最終更新 2002/03/07 15:32:11) Q. man の文書をテキスト化するにはどのようにすれば良いのでしょうか。 A. 単純に % man man > man.txt として plain text ファイルを作成すると、cat や more、less などで 見る分にはよいのですが、vi や emacs などのエディタで見ようとすると LS(1) FreeBSD General Commands Manual LS(1) N^HNA^HAM^HME^HE l^Hls^Hs - list directory contents S^HSY^HYN^HNO^HOP^HPS^HSI^HIS^HS のように、太字や下線の部分がおかしくなってしまいます。これは NAME の太字を表現するのに、 N(^Hで一文字戻る)NA(^Hで一文字戻る)AM(^Hで一文字戻る)ME(^Hで一文字戻る)E のように、コントロールコード ^H を使っているからです。同様に 下線付きの `ABC' は A^H_B^H_C^H_ となります。 これを plain text にするには、以下のような方法があります。 (1) colcrt(1) を使用する % man man | colcrt > man.txt これが一番簡単でしょう。 % jman jman | colcrt > jman.txt jman も OK です。 (2) col(1) を使用する。 % man man | col -b > man.txt man ならよいのですが、日本語に対応していないため、jman では うまくいきません。 FreeBSD(98) の col は、3.5.1 以前は日本語が通るようにパッチがあてられて いましたが、4.0 以降は日本語化パッチが配布物の中に含まれています。 (3) colcrt や col の行なっていることを sed や perl で行なうと % jman jman | sed 's/.^H//g; s/.^H//g' > man.txt % jman jman | perl -pe 's/..\x08\x08|.\x08//g' > man.txt のようになります。なお、^H は Ctrl-v BackSpace や Ctrl-v h として 入力します。 (4) emacs (mule) 上で man を見て、ファイルに保存する。 M-x man [ENTER] マニュアル名 [ENTER] とすると、emacs 上にマニュアルが表示されます。それをファイル名を 指定して書き出せばいいでしょう。~/.emacs に (defvar manual-program "jman") としておくと、日本語マニュアルが表示されます。 おまけ。 (5) plain text ではありませんが、 % gzcat /usr/share/man/man1/ls.1.gz | groff -man > ls.ps とすると、マニュアルを Postscript 形式に変換できます。日本語マニュアルは ja-groff (/usr/local/bin/groff にインストールされる) を使って % gzcat /usr/share/man/man1/ls.1.gz | /usr/local/bin/groff -man > ls.ps とします。そのまま Postscript プリンタに出力したり、gs コマンド (ghostscript に含まれています) で見ることができます。 --- [管理番号 1551] (最終更新 2001/10/19 21:29:39) Q. csh スクリプトを書いていて、わからないことがあるのですが。 csh でスクリプトを書くべきではないといわれたのですが、どうしてですか。 A. csh (tcsh) でスクリプトを書く際の問題点は、多数指摘されています。 「なぜ csh でプログラムを書くのが良くないのか」 (原題 `Csh Programing Considered Harmful') これ以外に、関数定義ができないなどの問題があります。中規模・大規模な スクリプトを書く場合は、sh を使うか、perl、ruby、python、scheme の ようなスクリプト言語を使った方がよいでしょう。 ただ、ログインシェルとして csh (tcsh) を使うなら、~/.cshrc などは csh スクリプトとして書く必要がありますので、最低限の知識は知っておいた 方がよいでしょう。 --- [管理番号 1563] (最終更新 2000/03/22 02:27:45) Q. 定期的にある処理を行ないたいのですが、どうすればよいでしょうか。 A. 基本的には cron を利用します。cron(8)、crontab(1)、crontab(5) を御覧下さい。 (system 管理の為等で) root で実行したい場合は、/etc/crontab に記述しますが、 毎日、毎週または毎月実行したいという場合は、 /etc/periodic/daily (毎日) /etc/periodic/weekly (毎週) /etc/periodic/monthly (毎月) いずれかのディレクトリの下に実行可能な shell script をおくことで実行されます。 尚、FreeBSD 2.2.x 以前では /etc/periodic ディレクトリは存在しません。 代わりに、/etc/daily、/etc/weekly、/etc/monthly という shell script が ありますので、それを編集しましょう。 --- [管理番号 1606] (最終更新 2000/06/25 02:30:10) Q. パスワードが入力できません。キーボードでタイプした文字が 全く反映されていないようです。 A. login: のときのみ入力文字が見える場合は、正常です。 UNIX では、 - コンソールからの login - telnet や rlogin 経由の login のときなど、パスワード入力時にキーを打っても、画面上には 何も表示されない (エコーバックされない) ことが多いです。 ですから、パスワードを入力するところで英数字などを入力 しても、画面上では何の変化も起こらないように見えます。 しかしながら、ちゃんと入力はされているはずなので安心しましょう。 --- [管理番号 1671] (最終更新 2000/11/08 01:37:58) Q. ファイル名の途中にスペースが入ったファイルが作成されてしまい、 rm コマンドで消すことができません。どうすればいいですか? A. 様々な方法があります。 - rm 'hoge hoge' とする - rm "hoge hoge" とする。 - スペースの前に \ を付けて、 rm hoge\ hoge とする。 - シェルのメタキャラクタ (? や * など) を使って、 rm hoge?hoge などとする。 以上の方法は、 sh, csh, ksh, tcsh, bash, zsh に共通して使えます。 tcsh や bash や zsh のファイル名補完は、ファイル名に特殊な文字を 含んでいても、うまく補完してくれます。たとえば tcsh で、消したい ファイル以外に hoge で始まるファイルが存在しない状態で、 % rm hoge まで入力してタブを入力すると、 % rm hoge\ hoge のように補完してくれます。 シェルに依存しない方法としては、次のようなものがあります。 - find . -ls で該当ファイルの i-node (1カラム目に表示される数字) を調べて、 find -x . -inum 123456 -exec rm {} \; とする。 - rm -i * として該当ファイル以外は no を、該当ファイルのみ yes を選ぶ。 - FDclone で消す。 - Emacs の dired モードで消す。 emacs を実行し、M-x dired としてディレクトリ名を入力 - Lynx の dired モードで消す。 - perl -e 'unlink "hoge hoge"' する。 - echo 'main(){unlink("hoge hoge");}' > foo.c && cc foo.c && ./a.out する。 - samba で MS-Windows から消す。 - cap で Mac から消す。 - FTP で DELE hoge hoge する。 - rm -rf で、一つ上のディレクトリから消す。 - fdisk / newfs / format しちゃう。 ファイル名の途中にハイフンやアスタリスク、日本語などが入っている ファイルも、同様の方法で消すことができます。 --- [管理番号 2016] (最終更新 2001/10/19 21:29:34) Q. csh スクリプトで書いたプログラムを cron で実行するようにしたところ、 スクリプト中で stty を使っていないのに、 stty: stdin isn't a terminal というメッセージを含んだメールが実行ユーザ宛に送付されるのですが、 どうすれば回避できますか。 A. そもそも、csh スクリプトを書くべきではありません。 たとえ、tcsh(1) がそう主張していようとも、です (cf. [管理番号 1551])。 それはそれとして、もしもあなたが ・csh の builtin コマンドを使用しなければならない等、あえて csh スクリ プトにする理由がある ・356行くらいある csh スクリプトを、あと 7分で修正して動かさなければな らない ・宗教上の理由またはおばあちゃんの遺言で csh でスクリプトを書かなけれ ばならない のであれば、以下を確認してみて下さい。 csh(1) の「スタートアップとシャットダウン」の節に述べられている通り、 スクリプトからは呼んでいないはずの stty が実行されてしまうのは、 /etc/csh.cshrc や実行ユーザーの .cshrc (または .cshrc) で stty が呼ば れている為でしょう。 /etc/csh.cshrc や .cshrc で行なわれる設定を利用する必要がないのであれ ば、そのスクリプトの冒頭は #! /bin/csh -f として、上記設定ファイルを読み込まないようにすべきです。 一方、非対話的なシェルでは端末の操作を行なう必要はありませんので、 そういう操作を行なう stty のようなコマンドは if ($?prompt) then endif で括って、非対話的なシェルでは実行されないようにして、非対話的なシェル から読み込まれた場合も問題が起きないようにしましょう。 --- [管理番号 2111] (最終更新 2002/02/03 13:12:18) Q. grep hoge * とすると、 /usr/bin/grep: Argument list too long. となってしまいます。どうして? A. 引数が長すぎるからです。 ? や * などのワイルドカードの展開は sh や csh などのシェルが行います。その後、 子プロセス (この場合は grep) を生成するのですが、このとき引数に指定できる長さ (バイト数) の上限は /usr/include/sys/syslimits.h で #define ARG_MAX 65536 と設定されています。 % sysctl kern.argmax kern.argmax: 65536 としても参照できますが、動的な変更は不可能です。 例えば、カレントディレクトリに 000000、000001、000002、000003…という ファイルがあった場合、 grep hoge * とすると、シェルによって grep hoge 000000 000001 000002 000003 .... と展開されますが、そのときメモリ中には grep(\0)hoge(\0)000000(\0)000001(\0)000002(\0)000003 .... というデータが作成されます。このデータは execve(2) の第2引数に渡されますが、 この長さが ARG_MAX を越えていた場合、カーネルがエラーを返し、シェルが Argument list too long というエラーを表示しているわけです。ちなみにこの データは、(execve が成功した場合は) 子プロセスの main(int argc, char **argv) の argv が指す領域となります。 というわけで、こういう場合は、 % echo * | xargs grep hoge % find . -type f | xargs grep hoge % find . -type f -print0 | xargs -0 grep hoge (ファイル名に空白などを含む場合) などとして、引数以外 (この場合は標準入出力) の方法でデータを受け渡します。 また、とにかく引数に渡される文字列の長さを短くすればよいのですから、 % grep hoge /usr/ports/*/*/pkg-plist が長すぎるなら % cd /usr/ports % grep */*/pkg-plist とすれば、`/usr/ports' の11バイト×ファイル数の分だけ短くなります。 grep hoge * がダメで echo * が OK である理由は、sh や csh では echo が 組み込みコマンドとなっていて、子プロセスを生成せず内部で処理するからです。 echo が内部コマンドである証拠 % sh $ type echo echo is a shell builtin $ csh % which echo echo is a shell built-in フルパスを指定して /bin/echo * とすれば、grep と同様に ARG_MAX の 制限を受けます。 参考: [FreeBSD-users-jp 53154] 以下のスレッド --- [管理番号 2478] (最終更新 2003/11/17 02:28:48) Q. FreeBSD のマニュアルにはどんなものがありますか? A. マニュアルはセクションごとに分類されています。FreeBSD での セクション一覧を以下に示します。 セクション 1…コマンド セクション 2…システムコール セクション 3…ライブラリルーチン セクション 4…デバイスとデバイスドライバ セクション 5…ファイルフォーマット セクション 6…ゲーム セクション 7…雑多な情報 セクション 8…システムメンテナンスおよび操作コマンド セクション 9…カーネルインタフェース より詳細な情報を見るには各セクションの intro を参照してくだ さい。例えばセクション 4 の intro は % man 4 intro で読めます。 また、セクション全体で共通な情報も intro に記述してあります。 例えばほとんどのシステムコールは - 成功したら 0 を返す - 失敗したら -1 を返す - 失敗したときの理由は識別子 errno に格納される という共通のインタフェースを持っていますが、このような説明が intro(2) に書かれています。また、intro(2) にはエラー番号の 一覧も記載されています。 以下、見付けにくく、なおかつ役立つかもしれないマニュアルを 紹介しておきます。 ファイルフォーマット elf(5) a.out(5) core(5) uuencode(5) など バイナリ・テキストフォーマットの説明 hosts(5) aliases(5) resolv.conf(5) forward(5) など 設定ファイルの説明。/etc/ の下にある OS の設定ファイルと、 ~/.forward などのユーザごとの設定ファイルのマニュアルがある。 デバイス da(4) aic(4) など デバイスドライバの説明 null(4) random(4) など /dev/null や /dev/random など特殊なデバイスの説明 いろいろ hier(7) ディレクトリ階層の説明 tuning(7) 性能チューニング symlink(7) シンボリックリンクの扱い security(7) セキュリティ入門 environ(7) 主要な環境変数 style(9) カーネルソースファイルのスタイルガイド stdio(3) 標準入出力ライブラリの関数一覧 procfs(5) /proc の説明 build(7) システムの構築方法 release(7) リリース版の構築方法 ports(7) portsの説明(make時のターゲットなど) firewall(7) ファイアウォールの構築例 re_format(7) 正規表現 便利なメモ ascii(7) ASCII コード表 (8進数・10進数・16進数) operator(7) C 言語の演算子の優先順位と評価順序 おまけ /usr/share/misc/bsd-family-tree UNIX の系統図 /usr/share/misc/iso3166 国別コード /usr/X11R6/lib/X11/rgb.txt X における色の名前 /usr/local/share/emacs/*/etc/condom.1 関連QandA: [管理番号 141] (~/.netrc -> ftp(1) )