>>4997 べた > 「FILE=/txt.csv」の場合 パス名末尾の / を出力しないようにしていたためですね。 echo ${FILE} | sed -n -e 's#\(.*/\)[^/]*#\1#p' こうすれば出力されると思いますが、 逆に /hoge/fuga.txt のような場合でも /hoge/ となります。 > 「FILE=txt.csv」の場合 パスが指定されていないので、ブランクで正しいと思っていますが。 (そういった条件もありませんでしたし。) >>4998 ふくし nawk は参照渡しできないはずなので、そういう書き方ではできません。 ただ nawk では、ユーザ関数の引数として定義された変数を除き、 すべてグローバル変数だと思うので、やろうとしていることはできます。 |
>>4997 べた ありがとうございました。 出力されました。 |
>>4999 zsh お礼先誤りですみません。 ありがとうございます。 >> 「FILE=txt.csv」の場合 > パスが指定されていないので、ブランクで正しいと思っていますが。 > (そういった条件もありませんでしたし。) No. 4994で、自分でファイル名のみの場合、値なしとしたいと 書いておきながら正しい動きなんですかと質問すみませんで した。 |
>>4998 ふくし えっ、Solairs8 の nawk って return を使えないんでしょうか? |
>>5002 sfish man には return [expr] と記載があったので、リターンコードを返すものだと思っていましたが、 確かに値を返すことも出来ました。こっちの方がいいですね。 |
>>4999 zsh > ただ nawk では、ユーザ関数の引数として定義された変数を除き、 > すべてグローバル変数だと思うので、やろうとしていることはできます。 どういうことでしょか。 nakwで関数を作るのが不慣れなもので、 nawk内で定義した変数はグローバル変数なので、nawk内であれば、 ユーザ定義関数でも参照や書き換えができるということでしょうか。 また、 ユーザ定義関数ないで定義した変数は、関数内でしか有効とならない ということでしょうか。 例などを載せてくれるとありがたいのですが。 |
>>5004 ふくし > nawk内で定義した変数はグローバル変数なので、nawk内であれば、 > ユーザ定義関数でも参照や書き換えができるということでしょうか。 その通りです。 ただ、 >>5002 sfish で return で値が戻せることを教えて頂いたので 関数側は、 --------------------------------- function chk1(arg1) { sub(/^"*/,"",arg1); sub(/"*$/,"",arg1); return arg1; } --------------------------------- のようにして、呼び出し側は --------------------------------- UserID = chk1($1); --------------------------------- とすれば、やろうとしていることができると思います。 |
初歩的な質問ですが 内蔵HDDを増設し「label:Backup」として、クリックしますと「sdb」と表示されています。 プロパティで、場所は/mntとなっています。 このHDDに mv /home/ormaster/123.txt sdb/123.txt とファイルの移動をしたいのですが方法を教えてください。 |
>>5005 zsh ありがとうございます。 |
エラーメッセージ「cannot execute binary 」についての質問。 以前にservice sendmail start 2<&1 | /bin/mail -s "件名" wenbi@akw.com.cn というコマンドを実行して、正常です。 しかし、下記のコマンドを実行して、「cannot execute binary 」というエラーメッセージを出ました。 この後、上記のコマンドを実行しても、エラーを出ます。 service sendmail start infile.txt iconv -f EUC-JP -t Shift_JIS infile.txt < infile2.txt cat infile2.txt | /bin/mail -s "件名" wenbi@akw.com.cn |
>>5006 まえ mount 済みであれば、mv /home/ormaster/123.txt /mnt/123.txt で いけるのではないかと思います。 >>5008 山田洋子 よくわかりませんが、cannot execute binary のエラーメッセージを 出力しているのが service コマンドなのか、iconv コマンドなのか、 cat や mail なのかを調べてみてはどうでしょうか。 |
nawkでsystem関数で、コマンドを実行しています。 今、system関数で実行したコマンドの結果を変数 に格納したいのですが、結果のステータスが格納 されて、コマンドの実行結果が格納できません。 どうしてなのでしょうか。そもそも不可能なのでしょうか。 system関数で、dateコマンドを実行し、結果を変数に 格納して、nawk内で使用したいのです。 nawk '{system("date +%Y%m%d")}' 環境は、 Solaris8 bsh です。 |
>>5010 ふくし system は単なるコマンドの実行であり、コマンドの標準出力を受け取るような 仕組みになっていません。この場合は getline を使うべきかと思います。 |
>>5011 68user ありがとうございます。 上手くいきました。 |
完全ガイドwindowsxp基本+Q&A 2008,3,20 p275,Q057 1・アイコンの数を増やすは、あるが、減らす方法が、無い。 2・初心者に解かるように、教えて。やり方がわからへん。 |
特定のアイコンを消す方法です。 |
はじめまして ネットワークプログラミングのページは とってもためになりました。 ・読みやすい ・わかりやすい ・内容がある すばらしいです。 少なくとも私の嗜好とあうはず。 なので、 おすすめ書籍を紹介してください! ・実践的にアプリケーションを作る ・複数ファイルのビルドを説明 ・winコンポーネント ・プロセス間通信 ・管理人さんのように読みやすく、わかる、内容がある ・ネットワークアプリ(サーバー、メーラーetc) ・c言語、perl、php(windows いま、プロキシサーバと、メールサーバに興味があるので、 それが作れるような本。(あくまでわかりやすく言ってます) ぜひ、よろしくお願いします。 |
>>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 といったアプローチもアリかもしれません。 |
>>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 (私の知りたいことは「プロセス間通信」で、「システムプログラミング」って範疇に入るんだなぁ) これでも読んでみようかと思ってます。 プロセス間通信がわかれば、 数あるソフトウェアを自在に連携して使いこなすことができるる!」 こう思っているが、合ってますでしょうか。(^−^;) |
>>5022 たろう 共有メモリなどのプロセス間通信は、同一サーバ内のプロセスで データをやりとりする仕組みで、他サーバとはやりとりができません (とはいえ MySQL や PostgreSQL なども使っている重要な機能ですが)。 複数クライアントからの情報をサーバ内で効率よく共有するためには 役立つのは確かでしょうが、多くのマシンで連携するクラウドばやりの 昨今では、学習の方向性としてはちょっとずれているかもしれません。 |
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)からどのようにして 乱数の種を取得するのでしょうか? 何卒よろしくお願い致します。 |
>>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) を呼ぶ…と思うのですが、 ソースを見てもそのつながりがよくわかりませんでした。 と思いました。 |
UNIXの初歩的なことですみません。 UNIXで、viを使用するときシェルの環境変数の設定などは 必要なのでしょうか。 cronを編集しようとして、「crontab -e」を実行したの ですが、正しく表示されませんでした。 「crontab -l」では、正しく見れます。 環境変数のEDITORに、”vi”を設定し、「crontab -e」を 行うと、正しく表示されます。 ここでなのですが、unixにログインし、コマンドラインから、 viを起動すると問題なく使用できるのですが、ログインの場合 環境変数のEDITORは関係ないのでしょうか。 それとも、そういうものなのでしょうか。 環境は、 solaris8 bシェル |
>>5027 sep 環境変数 EDITOR は、単に vi(vi コマンド)を使用する場合には 必要ありません。 crontab コマンドのように、エディタを選択できるプログラムが 参照します。 http://x68000.q-e-d.net/~68user/unix/environment.html#EDITOR なお、crontab コマンドでは、EDITOR が設定されていない場合は ed コマンドで編集画面が開きます。 |
はじめまして POP3 クライアントを作ってみよう(3) のページにて > APOP はその原理上、必ずサーバ側に生パスワードを保存しておく必要があります。... > CRAM-MD5 や CRAM-SHA などの認証方法がありますが、サーバ側に生パスワードを保存しておく必要はありません。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ とありますが、CRAM-MD5 (や DIGEST-MD5) は生パスワードを サーバ側が保持していなければならないと理解しておりましたが如何でしょうか? サーバーは,認証の際に 「クライアントから受信した文字列(暗号化済み)」と, 「送信したChallengeコードと(サーバー側の)『ユーザのパスワード』をMD5で暗号化したもの」を 比較する必要がありますので...。 |
ご指摘ありがとうございます。勘違いしていたようです。 以下のように修正いたしました。 http://x68000.q-e-d.net/~68user/net/pop3-3.html - 一方 IMAP というプロトコルには APOP と似た認証の仕組みとして、 - CRAM-MD5 や CRAM-SHA などの認証方法がありますが、サーバ側に - 生パスワードを保存しておく必要はありません。 + SMTP や IMAP には APOP と似た認証の仕組みとして、CRAM-MD5 や、 + それを改善した DIGEST-MD5 などの認証方法がありますが、こちらも + 同様にサーバ側に生パスワードを保存する必要があります。 |
管理人様、失礼いたします。 この度、私の運営する掲示板への度重なるスパム書き込みに対する対策を行っております。 つきましては、せっかくなら私のサイトだけに囚われず 一般の皆様にも使用していただけた方が良いかと思い 絶対に荒らされない掲示板サービスを立ち上げようと考えております。 スパムに悩まされない掲示板に興味が御座いますでしょうか? また、使っていただける皆様と共同して随時機能を追加して参ります。 掲示板サービスに対するご要望があれば、 下記のメールアドレスにご連絡いただければ 追って準備が整い次第、お知らせをさせていただきます。 掲示板サービス以外のメールは、一切送信いたしません。 antispambbs@gmail.com それでは、貴重なスペースをありがとう御座いました。 書き込み内容がサイト内容とそぐわない場合は、 大変お手数ですが削除いただきますようお願いいたします。 失礼いたします。 |
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 |
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] 終了 となります。 期待する結果を得たいのですが、どうすればよいですか。 |
>>5040 あきもと >>4776 zsh を参照してください。 >>5041 おう sed -e '$!N; s/\n \{1,\}//; P; D' file.txt でどうでしょうか? |
管理人さんへ 『User-Agent 統計』のページ (http://x68000.q-e-d.net/~68user/cgi-bin/view-browser.cgi) が『エラー : 内部エラーが起こりました。』となっているので お知らせします。 |
>>5042 zsh ありがとうございます。 教えて頂いたところに書いてある方法で 上手くいきました。 |
>>5042 zsh ありがとうございます。 上手くいきました。 |
はじめまして。ボンジーと申します。ハッキングのやり方を教えてください。しーローとなもので |
いつもUNIXコマンドでお世話になっています。 画像変換のconvertコマンドについてお伺いしたいことがあります。 私は今、趣味でサイトを作っています。 画像アップロードした際にGIFからjpgに変換させる処理にconvertを使っているのですが、 ファイル名の拡張子は.jpgになっているのですが、バイナリエディタで開いて確認するとGIFファイルのままです。 convertはImageMagickダウンロードしてきて新規インストールしたものです。 このページではGIFからJPGへの画像変換を紹介されていたのですが、 私のところと同じような現象がおこっていませんでしょうか。 http://x68000.q-e-d.net/~68user/unix/pickup?keyword=convert&target=command |
>>5056 Misaki そういう事象は聞いたことがないですが、ありうることとしては libjpeg のリンクがうまくいっていない、でしょうか (それにしても エラーが出るのではないかと思うのですが)。 変換前後のファイルを file コマンドで調べても、やはり gif でしょうか? |
>> 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) |
初めまして。かばらと申します。 現在、マシン間のソケット通信に関して勉強中なのですが、connectシステム コールについて質問させていただきいても宜しいでしょうか。 質問1 クライアント側から発行されるconnect()はサーバー側で発行されるaccept()の ように処理をロックすることがあるのでしょうか。もしあるとすればどの タイミングでコールした場合でしょうか。 質問2 サーバー側がlisten()をコールする以前にクライアント側でconnect()をコール するとエラー(返却値-1)が起きますが、クライアントがサーバーの状態を監視し、 connect()をコールするタイミングを得ることは可能でしょうか。 (試しにselect()を使用してみましたが上手くいきませんでした。) 突然の不躾な質問で申し訳ございませんが、何卒ご教授くださいますよう よろしくお願いいたします。 |
>>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()を使用してみましたが上手くいきませんでした。) サーバ側で準備が整ったら通知がくるといった仕組みはないので、リトライ し続けるしかないですね。 |
お礼遅くなりました。 libjpegを入れて再インストールしたらちゃんと変換されました。 私ははgifの取り扱いに失敗しているものだと勘違いしていました。 迅速かつ的確な回答ありがとうございました。 |
ご回答ありがとうございます。 質問1、2共に納得です。 大変お世話になりました! |
はじめまして、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つ推測を立ててみました(どちらも外れているかもしれませんが:笑)。 <推測> 推測① :新たにシェルは起動している、しかし。 スクリプト実行によるサブシェルはあくまでスクリプトを実行するシェルであって対話シェル として起動しているわけではないのでローカル環境設定ファイルを読み込む必要がない。 言い換えると環境設定ファイルはあくまでログインスクリプトだから。 推測② :新たにシェルは起動していない。 あくまでスクリプトを解釈するのはカレントシェルであって解釈後の実際の処理はシェルの 起動を伴わない子プロセスが実行するから。 推測②を書いていてふと思ったのですが、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 |
>>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 などを読むべき条件が 揃っていない、ということですね。 |
>>5072 管理人様 早速のご回答を頂きましてありがとうございます! cronの説明も含め非常にスッキリいたしました。 スクリプト実行によるシェル起動プロセスが~/.bashrcを読み込まない件に関しては最初の 推測が近かったものの「ローカル環境設定ファイルを読み込む必要がない。」のではなく むしろ「読み込んではまずい。」ということだったのですね。 その理由も言われてみれば非常に納得です。 この度は詳細な解説をして頂き、まことにお世話になりました(感謝感激です)。 |
はじめまして 以前『User-Agent 統計』を参考にさせていただいていたのですが 最近トップページから『User-Agent 統計』に進んでもエラーになり うまく動いてないようですが、他の方からは正常に動いているのでしょうか? できれば動作確認していただければと思います。 よろしくお願いします。 |
>>5078 BAVO 以前サーバの負荷が上昇した際、User-Agent 統計が負荷上昇の 一因であるように見えたので、実行不可としておりました。 その後別アプローチから負荷軽減を図ったので、とりあえず さきほど実行可能にしてみました。 http://x68000.q-e-d.net/~68user/cgi-bin/view-browser.cgi >>5045 h.maruwa 同じご指摘をいただいていたにも関わらず、スルーしており 申し訳ありませんでした。 |
>FollowSymLinks >シンボリックリンクを許可するかどうか。 >シンボリックリンクをたどるかどうかを設定します。 >なお、シンボリックリンク自体は OS の機能ですから、いつでも使えます。 >ここでは web 経由でシンボリックリンクを辿るかどうかを決めるわけなので、 >CGI プログラムの中ではいつでもシンボリックリンクを使うことができます。 なんだか日本語が変ですよ。設定がどう働くのかこれじゃわからないです。。。 |
>>5079 68user User-Agent統計のページが閲覧可能となっているのを確認しました。 対応有難うございました。 日本国内でのUser-Agentを多数・長期間分網羅したサイトは稀少なので アクセスが集中しやすいのかもしれませんね。 |
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"); 標準出力と標準エラー出力をログ出力させると、 画面表示で何をすれば良いか分かり、 データ入力時の操作がしやすいです。 以上です。//////// |