68user's page 掲示板

Prev< No. 5011〜5111> Next  [最新発言に戻る] [過去ログ一覧]
No. 5011 # 68user 2009/05/23 (土) 01:06:30
>>5010 ふくし
system は単なるコマンドの実行であり、コマンドの標準出力を受け取るような
仕組みになっていません。この場合は getline を使うべきかと思います。

No. 5013 # ふくし 2009/05/23 (土) 10:59:31
>>5011 68user

ありがとうございます。
上手くいきました。

No. 5017 # keiji [E-mail] 2009/05/27 (水) 15:07:21
完全ガイドwindowsxp基本+Q&A 2008,3,20
p275,Q057 
1・アイコンの数を増やすは、あるが、減らす方法が、無い。

2・初心者に解かるように、教えて。やり方がわからへん。

No. 5018 # keiji 2009/05/27 (水) 15:14:43
特定のアイコンを消す方法です。

No. 5020 # たろう 2009/06/21 (日) 03:05:55
はじめまして

ネットワークプログラミングのページは
とってもためになりました。

・読みやすい
・わかりやすい
・内容がある

すばらしいです。

少なくとも私の嗜好とあうはず。
なので、
おすすめ書籍を紹介してください!

・実践的にアプリケーションを作る
・複数ファイルのビルドを説明
・winコンポーネント
・プロセス間通信
・管理人さんのように読みやすく、わかる、内容がある
・ネットワークアプリ(サーバー、メーラーetc)
・c言語、perl、php(windows

いま、プロキシサーバと、メールサーバに興味があるので、
それが作れるような本。(あくまでわかりやすく言ってます)
ぜひ、よろしくお願いします。

No. 5021 # 68user 2009/07/04 (土) 15:59:26
>>5020 たろう
すべての要求を満たす本はニッチすぎて存在しないと思います。
特にサーバはニーズがあまりなく、深く掘り下げるほど単なる
RFC の解説になってしまうため、書籍としては成立しづらいのかも
しれません。

とはいえ、いくつか提示してみます。

○UNIXネットワークプログラミング入門
        http://www.amazon.co.jp/-/dp/4774117544

    この本は持っていませんが、前身である
        UNIXネットワーク・ベストプログラミング入門
            http://www.amazon.co.jp/-/dp/4874085032
    は持っています。書評は
        http://x68000.q-e-d.net/~68user/net/link-book.html
    に書いてあります。

○Perlネットワークプログラミング―ソケットの使い方から
    クライアント/サーバーシステムの開発まで
        http://www.amazon.co.jp/-/dp/4894714655

    買っていませんが、目次を見ると結構範囲は広いようです
    (700ページもあるから当然か…)。深く突っ込んでいるかは
    わかりません。

○基礎からわかるTCP/IP ネットワーク実験プログラミング
        http://www.amazon.co.jp/-/dp/4274065847

    アプリレイヤではなく TCP/IP 寄りですが、結構おもしろいことを
    やっていて勉強になります。読みやすいかというと、個人的には
    ちょっとつらいです (一枚の複雑な図があって、それを長い文章で
    解説するのは無理がある。まぁ書籍だから仕方ないかもしれませんが)


あとは、いずれも持っていませんが、
    オンラインゲームプログラミング
        http://www.amazon.co.jp/-/dp/4797328479

    MMORPGゲームサーバープログラミング
        http://www.amazon.co.jp/-/dp/4797328460
といったアプローチもアリかもしれません。

No. 5022 # たろう 2009/07/11 (土) 12:20:20
>>5021 68user

68userさん。
お返事ありがとうございます。


なんだがいろいろ調べていただいたようで、ありがとうございます。
(68userさんは上級者なんでしょうね)

linuxシステムプログラミング
http://www.amazon.co.jp/Linux%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%9E%B0%E4%BA%95-%E6%AD%A3%E9%9B%84/dp/4274079724/ref=sr_1_2?ie=UTF8&s=books&qid=1247282246&sr=1-2

(私の知りたいことは「プロセス間通信」で、「システムプログラミング」って範疇に入るんだなぁ)

これでも読んでみようかと思ってます。

プロセス間通信がわかれば、
数あるソフトウェアを自在に連携して使いこなすことができるる!」

こう思っているが、合ってますでしょうか。(^−^;)

No. 5023 # 68user 2009/07/27 (月) 16:21:59
>>5022 たろう
共有メモリなどのプロセス間通信は、同一サーバ内のプロセスで
データをやりとりする仕組みで、他サーバとはやりとりができません
(とはいえ MySQL や PostgreSQL なども使っている重要な機能ですが)。

複数クライアントからの情報をサーバ内で効率よく共有するためには
役立つのは確かでしょうが、多くのマシンで連携するクラウドばやりの
昨今では、学習の方向性としてはちょっとずれているかもしれません。

No. 5024 # 鈴木 [E-mail] 2009/08/26 (水) 01:28:17
68userさん はじめまして、鈴木と申します。

SSLクライアント接続のプログラムを作成していた友人から
「SSL_connect() を実行すると -1 が返る。」という相談を受けて、調べている中で、
68userさんの下記ページの、RAND_seed() の説明で解決することができました。

http://x68000.q-e-d.net/~68user/net/ssl-1.html

本当にありがとうございました。

今回、書き込みさせていただいたのは、その続きなのですが
もし、ご存知でしたら教えていただけないでしょうか。


【質問の内容】
  (1)XPでは、RAND_seed()を実行しなくても、乱数の種が不足することはないのでしょうか?
  
  (2)ユーザプログラムでRAND_seed()実行しない場合、OpenSSLは、OS(Windows)からどのようにして
        乱数の種を取得するのでしょうか?

  以下に、質問に至った経緯を記します。

【友人との話の経緯】

当初、前述の友人が作成したRAND_seed()していないSSLクライアントプログラムを
私の環境(WindowsXP Pro(SP2))で実行しても、SSL_connect()ではエラー(-1)は
発生しませんでした。

友人の環境を確認するとWindowsNT4.0ワークステーション(SP3)でした。
どうしても、この古い環境でSSLクライアント接続のプログラムを動かしたいとのこと。

結局、友人の環境(WindowsNT4.0ワークステーション(SP3))では発生しますが、
私の環境(WindowsXP Pro(SP2))では100回ほどテストしましたが発生しませんでした。

  
【試した内容】

  前述の内容を下記にまとめます。

    (友人の環境) WindowsNT4.0ワークステーション(SP3):× SSL_connect() ⇒ (-1)が返る
    (私の環境) WindowsXP Professional(SP2) :○ SSL_connect() ⇒ 正常

    どちらも、PCの電源オン後に自動ログインして、SSLクライアントプログラムを
    自動起動するようにしています。
    使っているOpenSSLのバージョンは私も友人も0.9.8Gです。


    という経緯があって、以下の点についてご存じであれば教えていただけないでしょうか。

    ・XPでは、RAND_seed()を実行しなくても、乱数の種が不足することはないのでしょうか?
    ・ユーザプログラムでRAND_seed()実行しない場合、OpenSSLは、OS(Windows)からどのようにして
        乱数の種を取得するのでしょうか?

  何卒よろしくお願い致します。
    

No. 5025 # 68user 2009/08/26 (水) 11:01:56
>>5024 鈴木
Windows に詳しくないので直接の回答はできませんが、
    - 前提として、RAND_poll(3) は呼んでいますか?
    - プログラムの各部分に RAND_status(3) を実行し、
        seed の状況を確認することで、何を行うと十分な
        seed がたまるか確認できるのではないでしょうか。
    - Windows 用の RAND_poll(3) や RAND_add(3) のソースは
            http://cvs.openssl.org/fileview?f=openssl/crypto/rand/rand_win.c&v=1.46
        にありますので、眺めてみてはどうでしょうか。
    - RAND_seed(3) は最終的には RAND_add(3) を呼ぶ…と思うのですが、
        ソースを見てもそのつながりがよくわかりませんでした。
と思いました。

No. 5027 # sep 2009/09/20 (日) 20:34:31
UNIXの初歩的なことですみません。

UNIXで、viを使用するときシェルの環境変数の設定などは
必要なのでしょうか。

cronを編集しようとして、「crontab -e」を実行したの
ですが、正しく表示されませんでした。
「crontab -l」では、正しく見れます。
環境変数のEDITORに、”vi”を設定し、「crontab -e」を
行うと、正しく表示されます。

ここでなのですが、unixにログインし、コマンドラインから、
viを起動すると問題なく使用できるのですが、ログインの場合
環境変数のEDITORは関係ないのでしょうか。
それとも、そういうものなのでしょうか。

環境は、
solaris8
bシェル

No. 5028 # zsh 2009/09/22 (火) 12:08:17
>>5027 sep
環境変数 EDITOR は、単に vi(vi コマンド)を使用する場合には
必要ありません。
crontab コマンドのように、エディタを選択できるプログラムが
参照します。
http://x68000.q-e-d.net/~68user/unix/environment.html#EDITOR

なお、crontab コマンドでは、EDITOR が設定されていない場合は
ed コマンドで編集画面が開きます。

No. 5029 # y-hira 2009/11/03 (火) 01:44:42
はじめまして

POP3 クライアントを作ってみよう(3) のページにて

> APOP はその原理上、必ずサーバ側に生パスワードを保存しておく必要があります。...
> CRAM-MD5 や CRAM-SHA などの認証方法がありますが、サーバ側に生パスワードを保存しておく必要はありません。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

とありますが、CRAM-MD5 (や DIGEST-MD5) は生パスワードを
サーバ側が保持していなければならないと理解しておりましたが如何でしょうか?

サーバーは,認証の際に 「クライアントから受信した文字列(暗号化済み)」と,
「送信したChallengeコードと(サーバー側の)『ユーザのパスワード』をMD5で暗号化したもの」を
比較する必要がありますので...。

No. 5030 # 68user 2009/11/04 (水) 13:56:53
ご指摘ありがとうございます。勘違いしていたようです。
以下のように修正いたしました。

http://x68000.q-e-d.net/~68user/net/pop3-3.html
- 一方 IMAP というプロトコルには APOP と似た認証の仕組みとして、
- CRAM-MD5 や CRAM-SHA などの認証方法がありますが、サーバ側に
- 生パスワードを保存しておく必要はありません。

+ SMTP や IMAP には APOP と似た認証の仕組みとして、CRAM-MD5 や、
+ それを改善した DIGEST-MD5 などの認証方法がありますが、こちらも
+ 同様にサーバ側に生パスワードを保存する必要があります。

No. 5031 # スパムと戦う掲示板 [URL] [E-mail] 2009/11/09 (月) 23:36:27
管理人様、失礼いたします。

この度、私の運営する掲示板への度重なるスパム書き込みに対する対策を行っております。

つきましては、せっかくなら私のサイトだけに囚われず
一般の皆様にも使用していただけた方が良いかと思い
絶対に荒らされない掲示板サービスを立ち上げようと考えております。

スパムに悩まされない掲示板に興味が御座いますでしょうか?
また、使っていただける皆様と共同して随時機能を追加して参ります。

掲示板サービスに対するご要望があれば、
下記のメールアドレスにご連絡いただければ
追って準備が整い次第、お知らせをさせていただきます。
掲示板サービス以外のメールは、一切送信いたしません。

antispambbs@gmail.com

それでは、貴重なスペースをありがとう御座いました。
書き込み内容がサイト内容とそぐわない場合は、
大変お手数ですが削除いただきますようお願いいたします。

失礼いたします。

No. 5040 # あきもと 2010/01/18 (月) 23:55:19
Bシェルで、whileとreadを使ったファイルからの読み込み
について教えてください。

while文の中の変数をwhile文の外で使いたいのですが、
以下の様に、whileとreadを使ってファイルから読み込み
doをdoneの間で処理を行い、ループを抜けた後、doneの
後ろで、結果を表示させたのですが、正しく表示されません。

どうしたら正しく表示されますか。

環境
    Solaris8
    Bシェル

---------------------------------------------------------
#!/bin/sh
#

num=0

while read line ; do
        echo $line
        num=`expr $line + $num`
done < a.txt

echo "-----"
echo $num


cat a.txt
1
2
3
4
5
6
7
8
9
10

No. 5041 # おう 2010/01/19 (火) 01:28:56
Bシェルで、sedを使って、2行を1行にしているのですが上手く行きません。

改行している次の行で、半角スペースから始まっている行を、sedを使って
1行にしたいのです。

sed -e ':loop' -e '$b' -e 'N;/\n /{s/\n *//;b loop' -e '};P;D;b loop' file.txt

としたのですが、最初に引っかかったのは、1行になるのですが、
それ以降のものは、1行になりません。

環境
    Solaris8
    Bシェル

内容
---------
[Fri Jan 1 00:00:00] 開始
[Fri Jan 1 00:00:00] INFO:あいうえお
  abcdefg
[Fri Jan 1 00:00:00] INFO:あいうえお
    1234567890
[Fri Jan 1 00:00:00] INFO:あいうえお
                    aaaaaaa bbbbbb cccccc
[Fri Jan 1 00:00:00] INFO:あいうえお
        ABC 1234
[Fri Jan 1 00:00:00] INFO:12345
[Fri Jan 1 00:00:00] INFO:ABCDE
[Fri Jan 1 00:00:00] INFO:あいうえお
[Fri Jan 1 00:00:00] 終了

期待する結果
----------
[Fri Jan 1 00:00:00] 開始
[Fri Jan 1 00:00:00] INFO:あいうえお abcdefg
[Fri Jan 1 00:00:00] INFO:あいうえお 1234567890
[Fri Jan 1 00:00:00] INFO:あいうえお aaaaaaa bbbbbb cccccc
[Fri Jan 1 00:00:00] INFO:あいうえお ABC 1234
[Fri Jan 1 00:00:00] INFO:12345
[Fri Jan 1 00:00:00] INFO:ABCDE
[Fri Jan 1 00:00:00] INFO:あいうえお
[Fri Jan 1 00:00:00] 終了

実際の結果
---------
[Fri Jan 1 00:00:00] 開始
[Fri Jan 1 00:00:00] INFO:あいうえお abcdefg
[Fri Jan 1 00:00:00] INFO:あいうえお
    1234567890
[Fri Jan 1 00:00:00] INFO:あいうえお
                    aaaaaaa bbbbbb cccccc
[Fri Jan 1 00:00:00] INFO:あいうえお
        ABC 1234
[Fri Jan 1 00:00:00] INFO:12345
[Fri Jan 1 00:00:00] INFO:ABCDE
[Fri Jan 1 00:00:00] INFO:あいうえお
[Fri Jan 1 00:00:00] 終了

となります。
期待する結果を得たいのですが、どうすればよいですか。

No. 5042 # zsh 2010/01/21 (木) 17:14:43
>>5040 あきもと
>>4776 zsh
を参照してください。

>>5041 おう
sed -e '$!N; s/\n \{1,\}//; P; D' file.txt
でどうでしょうか?

No. 5045 # h.maruwa 2010/01/23 (土) 03:47:25
管理人さんへ
『User-Agent 統計』のページ
(http://x68000.q-e-d.net/~68user/cgi-bin/view-browser.cgi)
が『エラー : 内部エラーが起こりました。』となっているので
お知らせします。

No. 5047 # あきもと 2010/01/23 (土) 17:10:34
>>5042 zsh

ありがとうございます。
教えて頂いたところに書いてある方法で
上手くいきました。

No. 5048 # おう 2010/01/23 (土) 20:18:10
>>5042 zsh

ありがとうございます。
上手くいきました。

No. 5049 # ボンジー 2010/01/26 (火) 20:30:18
はじめまして。ボンジーと申します。ハッキングのやり方を教えてください。しーローとなもので

No. 5056 # Misaki [URL] [E-mail] 2010/02/14 (日) 21:05:38
いつもUNIXコマンドでお世話になっています。

画像変換のconvertコマンドについてお伺いしたいことがあります。

私は今、趣味でサイトを作っています。
画像アップロードした際にGIFからjpgに変換させる処理にconvertを使っているのですが、
ファイル名の拡張子は.jpgになっているのですが、バイナリエディタで開いて確認するとGIFファイルのままです。

convertはImageMagickダウンロードしてきて新規インストールしたものです。

このページではGIFからJPGへの画像変換を紹介されていたのですが、
私のところと同じような現象がおこっていませんでしょうか。
http://x68000.q-e-d.net/~68user/unix/pickup?keyword=convert&target=command

No. 5057 # 68user 2010/02/15 (月) 16:38:19
>>5056 Misaki
そういう事象は聞いたことがないですが、ありうることとしては
libjpeg のリンクがうまくいっていない、でしょうか (それにしても
エラーが出るのではないかと思うのですが)。

変換前後のファイルを file コマンドで調べても、やはり gif でしょうか?

No. 5059 # Misaki [E-mail] 2010/02/16 (火) 16:13:19
>> 5057
早速、回答ありがとうございます。
fileコマンドでgifかどうか判別できるんですね!
やってみたところGIFでした。

簡単に調べてみましたがlibjpegが上手く入っていなかったようです。
帰ったらもうちょっと詳しく調べてみます。

ldd結果
$/usr/bin/ldd /usr/local/bin/convert
                linux-gate.so.1 => (0x00110000)
                libMagickCore.so.3 => /usr/local/lib/libMagickCore.so.3 (0x00111000)
                libMagickWand.so.3 => /usr/local/lib/libMagickWand.so.3 (0x00427000)
                libz.so.1 => /usr/lib/libz.so.1 (0x0059a000)
                libpthread.so.0 => /lib/libpthread.so.0 (0x005af000)
                libdl.so.2 => /lib/libdl.so.2 (0x0056b000)
                libgomp.so.1 => /usr/lib/libgomp.so.1 (0x00523000)
                libm.so.6 => /lib/libm.so.6 (0x00571000)
                libc.so.6 => /lib/libc.so.6 (0x005c6000)
                /lib/ld-linux.so.2 (0x0040c000)
                librt.so.1 => /lib/librt.so.1 (0x0081e000)

No. 5060 # かばら 2010/02/16 (火) 22:18:08
初めまして。かばらと申します。
現在、マシン間のソケット通信に関して勉強中なのですが、connectシステム
コールについて質問させていただきいても宜しいでしょうか。

質問1
クライアント側から発行されるconnect()はサーバー側で発行されるaccept()の
ように処理をロックすることがあるのでしょうか。もしあるとすればどの
タイミングでコールした場合でしょうか。

質問2
サーバー側がlisten()をコールする以前にクライアント側でconnect()をコール
するとエラー(返却値-1)が起きますが、クライアントがサーバーの状態を監視し、
connect()をコールするタイミングを得ることは可能でしょうか。
(試しにselect()を使用してみましたが上手くいきませんでした。)

突然の不躾な質問で申し訳ございませんが、何卒ご教授くださいますよう
よろしくお願いいたします。

No. 5061 # 68user 2010/02/17 (水) 19:51:13
>>5059 Misaki
> 簡単に調べてみましたがlibjpegが上手く入っていなかったようです。
これはまたシンプルな convert ですね。ウチでは以下のとおりです。

/usr/local/bin/convert:
                libMagick.so.10 => /usr/local/lib/libMagick.so.10 (0x28073000)
                libWand.so.10 => /usr/local/lib/libWand.so.10 (0x283c7000)
                libjbig.so.1 => /usr/local/lib/libjbig.so.1 (0x28479000)
                liblcms.so.1 => /usr/local/lib/liblcms.so.1 (0x28484000)
                libtiff.so.4 => /usr/local/lib/libtiff.so.4 (0x284b1000)
                libjasper.so.4 => /usr/local/lib/libjasper.so.4 (0x284fe000)
                libjpeg.so.9 => /usr/local/lib/libjpeg.so.9 (0x28548000)
                libpng.so.5 => /usr/local/lib/libpng.so.5 (0x28566000)
                libfpx.so.1 => /usr/local/lib/libfpx.so.1 (0x2858b000)
                libdpstk.so.1 => /usr/X11R6/lib/libdpstk.so.1 (0x2862b000)
                libdps.so.1 => /usr/X11R6/lib/libdps.so.1 (0x28633000)
                libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x2867a000)
                libXt.so.6 => /usr/X11R6/lib/libXt.so.6 (0x28689000)
                libbz2.so.1 => /usr/lib/libbz2.so.1 (0x286da000)
                libxml2.so.5 => /usr/local/lib/libxml2.so.5 (0x286e9000)
                libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x28818000)
                libfreetype.so.9 => /usr/local/lib/libfreetype.so.9 (0x28907000)
                libz.so.2 => /lib/libz.so.2 (0x28971000)
                libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x2897f000)
                libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x28988000)
                libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x2899f000)
                libm.so.2 => /lib/libm.so.2 (0x28a67000)
                libc.so.5 => /lib/libc.so.5 (0x28a80000)
                libstdc++.so.4 => /usr/lib/libstdc++.so.4 (0x28b5a000)

>>5060 かばら
> 質問1
> クライアント側から発行されるconnect()はサーバー側で発行されるaccept()の
> ように処理をロックすることがあるのでしょうか。もしあるとすればどの
> タイミングでコールした場合でしょうか。
「connect はブロックするか」(connect を発行した後、待たされることはあるか)
という趣旨でよいですかね。ざっと考えつくところは、
    1. 3way handshake が完了するまでブロックする
    2. サーバもしくはサーバ側ルータにて一切のレスポンスを返さない
          構成の場合、いつまでたっても返事がないので SYN を送り続け、ブロックする
    3. サーバ側で処理しているソケット数が SOMAXCONN を超えていた場合、
          滞留しているクライアントの処理が終わるか、タイムアウトになるまで
          ブロックする
    4. サーバ側が listen しているが accept していない場合、ブロックする
などなど。3・4 は記憶に頼って書いてますので、本当かどうかは自信がないです。

一方、ノンブロッキングソケットで connet すれば、ブロックしません。

> 質問2
> サーバー側がlisten()をコールする以前にクライアント側でconnect()をコール
> るとエラー(返却値-1)が起きますが、クライアントがサーバーの状態を監視し、
> connect()をコールするタイミングを得ることは可能でしょうか。
> (試しにselect()を使用してみましたが上手くいきませんでした。)
サーバ側で準備が整ったら通知がくるといった仕組みはないので、リトライ
し続けるしかないですね。

No. 5062 # Misaki 2010/02/18 (木) 12:41:07
お礼遅くなりました。

libjpegを入れて再インストールしたらちゃんと変換されました。
私ははgifの取り扱いに失敗しているものだと勘違いしていました。

迅速かつ的確な回答ありがとうございました。

No. 5063 # かばら 2010/02/18 (木) 22:32:12
ご回答ありがとうございます。
質問1、2共に納得です。

大変お世話になりました!

No. 5071 # Mods [E-mail] 2010/05/13 (木) 10:22:57
はじめまして、Mod's(マスター・オブ・ドヘン○イ)と申します。
困った時に参考にさせて頂いております。

Bシェルスクリプトを独学中です。と言いつつBashの環境設定ファイルとサブシェル
(詰まる所はプロセスの理解不足)について質問させてください。

利用環境:MacOSX 10.6
ログインシェル:Bash
    bash-3.2$ bash --version
    GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)


元々はログインシェルがBashの利用環境にてログイン過程のシェル起動や以降のシェル起動による
環境設定ファイルの読み込み順序などを調べる為に/etc/profile、/etc/bashrc、~/.bash_profile、
~/.bashrcの4つにそれぞれechoコマンドを仕込んで実際にそれらログインスクリプトが起動した
時に任意のファイルへ「読み込みました」的な内容の出力をするようにしました。

結果、ログイン時にはそれら全ての環境設定から出力されその後のBashの起動では~/.bashrcから
のみ出力があり、ここまでは予想通りでした。
グローバル環境設定ファイル、およびローカル環境設定ファイルのいずれもprofile側からrc側を
sourceしています。

ここまでは良いのですが、カレントシェルからシェルスクリプトを実行した際、私の予想では
~/.bashrcから出力を得られるつもりでいました。シェルスクリプトを実行する際にサブシェルを
起動すると「されている(←私の中で未確定)」わけですから。

従いまして下記のように2つ推測を立ててみました(どちらも外れているかもしれませんが:笑)。
<推測>
    推測&#9312; :新たにシェルは起動している、しかし。
    スクリプト実行によるサブシェルはあくまでスクリプトを実行するシェルであって対話シェル
    として起動しているわけではないのでローカル環境設定ファイルを読み込む必要がない。
    言い換えると環境設定ファイルはあくまでログインスクリプトだから。

    推測&#9313; :新たにシェルは起動していない。
    あくまでスクリプトを解釈するのはカレントシェルであって解釈後の実際の処理はシェルの
    起動を伴わない子プロセスが実行するから。

推測&#9313;を書いていてふと思ったのですが、1つのプロセスというのは同時に一つの事しか出来ない
「はず」で、カーネル視点から考えるとシェルとしてプロセスを起動した以上は入力されたコマンド
を自身が理解出来る命令へ翻訳して受け取るための1プロセス。
そして翻訳された命令を受け取ったカーネルは実際のデータ処理実行でまた次の1プロセスを育成。
つまり、こちらはカーネル上のデータ処理のプロセスであってシェルの起動ではない。

よってカレントシェルからのスクリプト実行の処理というのはカレントシェルがスクリプト内の
コマンドを翻訳してカーネルが翻訳された命令を受け取って子プロセスが育生されるので~/.bashrcは
読み込まれない。

つまり、「サブシェルが起動する」というのはカレントシェルのプロセス上でデータ処理が行われる
訳ではないということを便宜的に説明するための「考え方」でしかないのか?

と、以上までのような推測を立ててみました。
個人的にはこのように考えるとcronからのスクリプト実行でも環境変数を~/.bashrcから読み込ま
ない事にも合点がいくのですが。。。
もっともcronプロセスはログインプロセスとは全くべつのプロセスなので環境変数で引き継ぐも
なにもないのですがシェルが起動するということを中心に考えると、むぅ〜ん、という感じです。

どちらにせよ、~/.bashrcをシェルスクリプト実行時に起動させたければsourceすれば良いだけの
ことですが、一般的な説明としてスクリプト実行には新たにシェルが起動しているという説明と
~/.bashrcが起動しない結果が自分の中で噛み合ないので質問させて頂きました。

psコマンドを使いこなせていれば良いのだろうなぁと思いつつ。いきなりの長文で失礼しました。

http://x68000.q-e-d.net/~68user/unix/pickup?keyword=%A5%B5%A5%D6%A5%B7%A5%A7%A5%EB&target=command

No. 5072 # 68user 2010/05/14 (金) 13:19:29
>>5071 Mods
bash(1) 曰く、
    ~/.bash_profile
            個人用の初期化ファイル。ログインシェルが実行します。
    ~/.bashrc
            対話シェルごとに実行される、個人用の起動ファイル。
です。

対話的シェルの定義は、同じく bash(1) 曰く
      対話的なシェルとは、オプションでない引数がなく、標準入力と
      標準出力がいずれも端末に接続されていて (これは isatty(3)
      で調べられます)、 -c オプションが指定されていない状態で起動
      されたシェル、または -i オプション付きで起動されたシェル
      のことです。
です。

シェルスクリプトは
    http://x68000.q-e-d.net/~68user/unix/pickup?%A5%B7%A5%A7%A5%D0%A5%F3%A5%B0
にあるように、結果的には
    /bin/bash ./foo.sh
などと起動されるので、
    「オプションでない引数がなく」
に該当しないため、対話的シェルではありません。よって、
    ~/.bashrc
            対話シェルごとに実行される、個人用の起動ファイル。
は読み込まれません。

また、シェルスクリプト起動の場合はログインシェルでもないので、
    ~/.bash_profile
            個人用の初期化ファイル。ログインシェルが実行します。
も読み込まれません。

以上が仕様上の話です。

で、なぜそういう仕様かと言うと、シェルスクリプトが個人用の
設定を参照してしまうと都合が悪いからです。例えばこちらの手元の
CentOS 5.3 において /usr/bin/* のうちシェルスクリプトである
ものは、以下のようにかなりあります。

/usr/bin/apr-config
/usr/bin/apropos
/usr/bin/apu-config
/usr/bin/at
/usr/bin/atq
/usr/bin/atrm
/usr/bin/bashbug-32
/usr/bin/build-classpath
/usr/bin/build-classpath-directory
/usr/bin/build-jar-repository
/usr/bin/bzcmp
/usr/bin/bzdiff
/usr/bin/bzgrep
/usr/bin/bzless
/usr/bin/bzmore
/usr/bin/c89
/usr/bin/c99
(略)

これらが実行されるたびに ~/.bash_profile などを呼んでしまうと、
alias・シェル変数・関数などがプログラム作成者の意図に反したもの
であった場合、おかしな挙動をしてしまうでしょう。それを避けるために
こういう仕様になっているものと思います。

上記のプログラムの挙動をカスタマイズしたい場合は、アプリ個別の
設定ファイル (~/.*rc) や、環境変数で指示すべき、ということですね。

> 個人的にはこのように考えるとcronからのスクリプト実行でも
> 環境変数を~/.bashrcから読み込まない事にも合点がいくのですが。。。
cron 経由だと端末を持たないので対話的シェルではないから、
~/.bashrc を読まない、です。この結果、
      ログインシェル・対話的シェルと、cron 経由のシェルで
      共通の環境変数を設定する方法がない
となってしまい、仕様としてはイマイチだと個人的には思っていますが、
世の人達は cron で
      HOGE=fuga
      * * * * * $HOME/bin/foo.sh
としたり、
      * * * * * . $HOME/.bash_profile && $HOME/bin/foo.sh
としたり、
      $HOME/bin/foo.sh 内で必要な環境変数を設定する
などの方法で乗り切っています。

環境変数であれば FreeBSD だと /etc/login.conf で設定する方法
もありますが、Mac OS X だとどうなのかはわかりません。

> 一般的な説明としてスクリプト実行には新たにシェルが起動しているという説明と
> ~/.bashrcが起動しない結果が自分の中で噛み合ないので質問させて頂きました。
シェルは起動していますが、~/.bashrc などを読むべき条件が
揃っていない、ということですね。

No. 5073 # Mods [E-mail] 2010/05/14 (金) 17:19:22
>>5072 管理人様

早速のご回答を頂きましてありがとうございます!
cronの説明も含め非常にスッキリいたしました。

スクリプト実行によるシェル起動プロセスが~/.bashrcを読み込まない件に関しては最初の
推測が近かったものの「ローカル環境設定ファイルを読み込む必要がない。」のではなく
むしろ「読み込んではまずい。」ということだったのですね。
その理由も言われてみれば非常に納得です。

この度は詳細な解説をして頂き、まことにお世話になりました(感謝感激です)。

No. 5078 # BAVO 2010/05/26 (水) 21:59:38
はじめまして
以前『User-Agent 統計』を参考にさせていただいていたのですが
最近トップページから『User-Agent 統計』に進んでもエラーになり
うまく動いてないようですが、他の方からは正常に動いているのでしょうか?
できれば動作確認していただければと思います。
よろしくお願いします。

No. 5079 # 68user 2010/05/26 (水) 23:00:37
>>5078 BAVO
以前サーバの負荷が上昇した際、User-Agent 統計が負荷上昇の
一因であるように見えたので、実行不可としておりました。
その後別アプローチから負荷軽減を図ったので、とりあえず
さきほど実行可能にしてみました。
    http://x68000.q-e-d.net/~68user/cgi-bin/view-browser.cgi

>>5045 h.maruwa
同じご指摘をいただいていたにも関わらず、スルーしており
申し訳ありませんでした。

No. 5080 # abb 2010/06/03 (木) 18:58:08
>FollowSymLinks
>シンボリックリンクを許可するかどうか。
>シンボリックリンクをたどるかどうかを設定します。
>なお、シンボリックリンク自体は OS の機能ですから、いつでも使えます。
>ここでは web 経由でシンボリックリンクを辿るかどうかを決めるわけなので、
>CGI プログラムの中ではいつでもシンボリックリンクを使うことができます。

なんだか日本語が変ですよ。設定がどう働くのかこれじゃわからないです。。。

No. 5084 # h.maruwa 2010/08/13 (金) 07:56:50
>>5079 68user
User-Agent統計のページが閲覧可能となっているのを確認しました。
対応有難うございました。

日本国内でのUser-Agentを多数・長期間分網羅したサイトは稀少なので
アクセスが集中しやすいのかもしれませんね。

No. 5091 # jagio 2010/09/26 (日) 11:03:36
UNIX情報Web公開、ありがとうございました。
下記の部分がとても、役に立ちました。

http://x68000.q-e-d.net/~68user/unix/pickup?tee
UNIXの部屋 コマンド検索:tee (*BSD/Linux)
...(snip)...
make >make-log 2>&1 (sh・bash の場合)
...(snip)...


C言語バッチ処理のlog出力先を下記のように(×)から(○)へ変えたら、
標準入力を要求する、フィルタ系pgmテストがやりやすくなりました。
(×)./"$PGM1" >>"$LOG1" 2>&1
(○)./"$PGM1" 2>&1 | tee -a "$LOG1"

pgmには、
標準エラー出力に下記のようなメッセージを表示させ、
    fprintf(stderr, "*** %s needs stdin ! ***\n", pgm_id);
    fprintf(stderr, "*** if end of input ,then press ctrl+d. ***\n");
標準出力と標準エラー出力をログ出力させると、
画面表示で何をすれば良いか分かり、
データ入力時の操作がしやすいです。


以上です。////////

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