68user's page 掲示板

Prev< No. 190〜200> Next  [最新発言に戻る] [過去ログ一覧]
No. 190 # Blue [E-mail] 1999/03/18 (木) 09:29
初めてメールさせていただきます。

UNIX の bc コマンド/ dc コマンドの使い方を伝授していただけないでしょうか。
あるいは、このコマンドの解説本をご存知でしたら教えていただけないでしょうか。

お願いします。

No. 191 # M.Masuda 1999/03/18 (木) 15:25
先日はどうもでした。(^^ゞ >68Userさん
完成を期待しています。

>>ログの件...
また変な事かいちゃった...(>_<)
#RFCのどこに何がかいてあるかは、何で調べてるんですか?

>ところで素朴な疑問ですが、補完って知ってます?
もしこれが無ければ、あまりシェルを触らなかったでしょう。(^^)
DOSの頃はこれが無かったので、長いコマンドでミスタイプすると
大変でした。
ついでにUPキー'↑'でのヒストリー機能もどうでしょう。
#bashだけ?

変な発見。
bashていうのはshの完全上位互換なんでしょうか?
/bin/をみると、うちの環境では sh -> bash とリンクになってま
した。(デフォルトシェルはbash)#OSはTorbo Linux 2.?
#知らなかった。

それと、パーミッションについてちょっと聞きたいのですが。
#Groupはとりあえず無視。
chmod 700 hoge.cgi の場合、Otherに何も無いので、シェル上
からのみ実行可能。
chmod 705 hoge.cgi の場合、Otherに読込・実行共に有るので
シェル上でもwebから(nobody権限)でも実行可能。
となりますよねぇ。

それでは、701の場合はどうなります?
うちの環境では、webからでは動きません。
Other実行権が有れば(1が立っていれば)webからでも実行できる場
合はsuExecをインストールすれば可能なのでしょうか?

それともう一つ。(^^ゞ
.procmailで
:0
* 条件
コマンド
の「* 条件」行を書かなければ全ての場合に適応される。
で合ってますか?


> UNIX の bc コマンド/ dc コマンドの使い方...
bcならここにありますよぅ〜(浦部くみこ調)
http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#bc

No. 192 # 68user 1999/03/18 (木) 17:54
> #RFCのどこに何がかいてあるかは、何で調べてるんですか?
なんとなくです。僕が興味を持つ範囲は限られてるので、
FTPならRFC959、POP3は1939、SMTPは821、HTTPは1945/2068、
くらいを知っておけば、大抵調べることができます。

> もしこれが無ければ、あまりシェルを触らなかったでしょう。(^^)
あ、ご存知でしたか。

> /bin/をみると、うちの環境では sh -> bash とリンクになってま
Linixはsh->bashらしいですね。ただし現状ではshが使われるのは
スクリプトくらいでしょうから、それなりの互換性があれば問題ない
のでしょう。でもたまにshとbashで挙動の違いが原因で動かない、
なんて話は聞きます。

> それでは、701の場合はどうなります?
普通スクリプトはReadできないと実行できません。バイナリならeXecute
だけでもいいですが。
    #!/hoge
で始まる scriptというスクリプトを、
    script
で実行した場合は、カーネル(かな?)が
    /hoge script
を実行します。
    #!/bin/sh
    sleep 10;
を ./script で実行して、C-zでsuspendしてpsを実行すると、
    322 p2 T 0:00.01 /bin/sh ./script
などとなっているはずです。このとき scriptをReadできないと
エラーになるわけですね。

> の「* 条件」行を書かなければ全ての場合に適応される。
たぶん…。試して見てください(^^;

> UNIX の bc コマンド/ dc コマンドの使い方を伝授していただけないでしょうか。
実はbcやdcはかなり高機能なので、あの解説だけでは不十分かも
しれませんが、どの程度の解説をお望みで?(でも僕はあれ以上の
ことは知りません)

dcは逆ポーランドで記述する計算機です。
    % dc
    2 3 + (2+3の結果をスタックにpush)
    p (スタックの先頭を表示)
    5 (結果は5)
    1 2 + 5 3 - * ( (1+2)*(5-3)の結果をスタックをpush)
    p (スタックの先頭を表示)
    6 (結果は6)
計算式を逆ポーランドに変換すると、括弧の優先順位などを
気にせず、先頭から順番に処理していくことができます。
まぁ、コンピュータ向けの書き方で、人間向きではないですね。

No. 193 # mm 1999/03/18 (木) 18:43
>DOSの頃はこれが無かったので、長いコマンドでミスタイプすると
>大変でした。
DOSでも、TSRを使えば、補完可能でした…
というより、これがなければ、DOSのコマンドラインを使う気には
なりませんでした。
私が使っていたのは、history.com というもので、コマンドライン
上での行編集機能、ヒストリー機能、補完機能、別名機能などが
ありました。

ただ、unix上の補完機能の解説って読んだ覚えがないので、
本家のものがどういう仕様になっていたのか、できれば知りたいです。
DOSの場合、カレントに abc.exe というファイルがあって、
コマンドラインの先頭で a を入力して、補完機能を使うと、
abc というようなコマンド名(.exeがない)の補完が行われます。
でも、unixの場合は、補完は引数ファイルだけだという話を聞いた
ような気もしたりしますんで…(違ったかも知れない(^^;)


>dcは逆ポーランドで記述する計算機です。
少し前までなら、まだ逆ポーランド記法の電卓を使ってる人がいる
って話を聞いたことがあるんですが、もう絶滅したかな…(笑い)
確か、FORTHも逆ポーランドだったような…?

No. 194 # Blue [E-mail] 1999/03/18 (木) 20:03
.>実はbcやdcはかなり高機能なので、あの解説だけでは不十分かも
> しれませんが、どの程度の解説をお望みで?(でも僕はあれ以上の
> ことは知りません)

実行させたいのは、プログラムが出力した(文字列)データを表計算のように
単純な合計や平均の演算を行いたいのです。
入力データは、いくつかの固定のデータ数を一つのグループとして(つまり行に相当)
扱いたいのです。
こんな具合です;

" 10 22 110 20 30 200 5 25 300"
この例では;
    10 22 110 が一行目のデータ
    20 30 200 が二行目
    5 25 300 が三行目
として扱い、
一列目の合計を求める bc コマンド記述を実行すると 35 が求まり、
二列目の平均を求める bc コマンド記述を実行すると 25.6 が返ってくると
いった使い方をしたいのですが。

そして、bcコマンドに実行させる処理内容は、C-shell でデータに合わせて
Generate させようと考えています。
bc コマンドにこんなことを望めますか?コンパイルさせずに演算結果を
取り込みたいというのがこの目的です。

No. 195 # 68user 1999/03/18 (木) 21:42
やはりみなさん知ってますか。僕はUNIXを使い初めて数か月
知りませんでした。僕のまわりでは補完を知らない人が かなりいます。

DOS時代は補完がないのが当り前、と思ってたので、別に面倒だとは
思いませんでした。

> unixの場合は、補完は引数ファイルだけ
cshだと確かにそうですね。tcshは(多分bashも)コマンド/引数共に補完できます。
あと、completeという内部コマンドを使うと、どのコマンドが
どういう引数を要求するのか、という情報を与えることができます。

例えば、cat (Ctrl-D)とすると ファイル/ディレクトリ名の一覧出てきますが、
man (Ctrl-D)ならマニュアルの一覧が出てくると便利ですよね。さらに
    man 3 (Ctrl-D) … マニュアルのセクション3
    telnet (Ctrl-D) … ホスト名
    rmdir (Ctrl-D) … ディレクトリ名
    printenv (Ctrl-D) … 環境変数
    gcc -f(Ctrl-D) … -fで始まる長い長いオプション名
と、状況に応じて補完対象を変えてほしいわけで。

というわけで、例えばこんな感じにするわけです。
    http://X68000.startshop.co.jp/~68user/tmp/.completerc

で、bashでは、tcshのcompleteに相当する機能はないのかなと思ってるんですが、
どなたかご存知ですか?


> " 10 22 110 20 30 200 5 25 300"
bcにこだわる理由がなければ、perlやawkを使った方がいいかもしれませんね。

    #!/usr/local/bin/perl
    $raw = 3; # 一行あたりの項目数
    $raw_num = shift || die; # 平均を得たい項目(1列目なら0)
    $sum = 0;
    @nums = split(/ /,<STDIN>);
    $i = 0;
    while ( defined $nums[$i*$raw+$raw_num] ){
        $sum += $nums[$i*$raw+$raw_num];
        $i++;
    }
    print "$raw_num列目の合計は $sumです。\n";

実行例。
    % echo '10 22 110 20 30 200 5 25 300' | ./b 1
    1列目の合計は 77です。

bcでできるかどうかマニュアルを読んでみたのですが、よくわかりませんでした。

ところでbcで割り算の結果を小数点の精度で得る方法をご存知ですか?
3/4 も 3.0/4.0 も 3.1/4.1 も結果が0になるんですが…。

No. 196 # 68user 1999/03/18 (木) 22:03
> ところでbcで割り算の結果を小数点の精度で得る方法をご存知ですか?
man読んでたら書いてありました。scale=3などとして、有効桁数を
指定すればいいんですね。デフォルトはscale=0だから、小数点以下は
表示されない、と。

あと、ご存知かもしれませんが、bc(GNU bc)の日本語マニュアルは
    http://www.jp.freebsd.org/man-jp/search.html
で見られます。

No. 197 # M.Masuda 1999/03/18 (木) 22:27
>> それでは、701の場合はどうなります?
これは、最近小耳に挟んだ事なのですが、一部のサーバー(Apache1.3環境)
での解説で、パーミッションを701でCGIが動くとの表記が有りました。

調べてみるとsuExecを使用していて、そのサーバー上ではファイルのオ
ーナー権限で動くらしいのです、私の環境ではsuExecは使えないので、
状態が解からなく、疑問に思っていたので前回の質問となりました。
#それなら700でもweb経由のCGIが動くはずですよねぇ。
#これ出来ると、webから自分宛のメールを読んだり出来る。

>322 p2 T 0:00.01 /bin/sh ./script
> などとなっているはずです。このとき scriptをReadできないと
> エラーになるわけですね。
言い方を変えると、スクリプトを実行するためのインタープリタが
そのファイルを読めないといけないと言うことですね。
suExecを使わない普通のCGIは、nobody権限で/bin/shとか /bin/perl
が動くわけですね。

>でもたまにshとbashで挙動の違いが原因で動かない、
> なんて話は聞きます。
これは、頭に入れておかないと。φ(._.)
sh と bashの違いを考慮しないとはまりそう...。
#滅多にそんな場面無いだろうけど。

> の「* 条件」行を書かなければ全ての場合に適応される。
「* 条件」の行を空行にすると、無視されました。
「*」のみだと全てのメールにマッチするようですね。
ちなみに、うちの環境だと .forwordに "| exec /path/procmail"
としなくても、~/ に .procmailを置くだけでprocmailが動きました。
#Turbo Linuxだけなのかなぁ。

>FTPならRFC959、POP3は1939、SMTPは821、HTTPは1945/2068、
RFCのブックマークはとってあったのですが、よく見ると一部だけの
ミラーサーバーでした。
自分でも探してみますが、早いサーバー(アクセスの少ない?)を
知っていたら教えて下さい。m(_ _)m

>DOSでも、TSRを使えば、補完可能でした…
私もいくつかの常駐ソフトを知っていましたが、いずれも不安定な
ものが多く、あまり使っていなかったのが現状でした。(^^ゞ
>mmさん

関係無いけど、HSBというソフトリブートを可能にするNEC98シリーズ
用のソフトは便利でした。
メモリチェックをすっ飛ばしてくれるので、環境の切り替え時にバッチ
組んでメニューで再起動なんてよくやっていました。

No. 198 # 68user 1999/03/18 (木) 23:32
> これは、最近小耳に挟んだ事なのですが、一部のサーバー(Apache1.3環境)
> での解説で、パーミッションを701でCGIが動くとの表記が有りました。
700ではなくて701なら動く、ということはあり得ないはずです。

suExecを組み込んだapacheは、はある時点まではnobodyで動いていて
SSI/CGIを動かす際に そのユーザ権限に変更するはずです。
ですので、そのCGIスクリプトを置いてあるディレクトリ(例えばcgi-bin)
にはotherに対してxビットを立てる必要があるかもしれません。
# でも多分ファイルもディレクトリも700でOKだと思いますけど、
# suExecを使ったことがないのでちょっとわかりません。

> ちなみに、うちの環境だと .forwordに "| exec /path/procmail"
> としなくても、~/ に .procmailを置くだけでprocmailが動きました。
え、ほんとですか? それだとsendmail(mail.local?)が、procmailだけを
特別扱いしてることになるんですが…。

No. 199 # mm 1999/03/18 (木) 23:34
> http://X68000.startshop.co.jp/~68user/tmp/.completerc
ガ〜ン!
やはり、ご本家は、スゴーイ!!

DOSの貧弱な環境を何とかunixに近づけたいと思っていたのですが、
やはり所詮、マネはマネに過ぎなかったみたいですね(^^;
(でも、プリミティブなDOSは、やはり問題外…)


M.Masuda さん
>メモリチェックをすっ飛ばしてくれるので、環境の切り替え時にバッチ
>組んでメニューで再起動なんてよくやっていました。
えー、一体どのような環境を切り替えられたのでしょうか?
キャラクタデバイスやTSRなら、リセットしなくても変更可能だし、
それ以上の環境の切り替えはウチでは必要なかったので、
そういうのは使ったことないです(^^;

No. 200 # mm 1999/03/19 (金) 00:04
>えー、一体どのような環境を切り替えられたのでしょうか?
すいません。ついオンラインで読んで疑問に思って書き込んでしまいましたが、
このボードとは無関係の話題でした(^^;
この質問は、なかったことにして下さいませm(_o_)m
(それに、RAMディスクやディスクキャッシュの構成を変える場合にも、
リセットは必要ですね(^^;)

Prev< No. 190〜200> Next  [最新発言に戻る] [過去ログ一覧]