68user's page 掲示板

Prev< No. 5036〜5130> Next  [最新発言に戻る] [過去ログ一覧]
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");
標準出力と標準エラー出力をログ出力させると、
画面表示で何をすれば良いか分かり、
データ入力時の操作がしやすいです。


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

No. 5112 # よ4あき 2010/10/18 (月) 16:38:28
odの説明で、「x1 と c の順序を逆にしたので、"a" と "61" の行が逆になった
」と書かれていますが・・・イメージが逆になってません♪

No. 5113 # 68user 2010/10/18 (月) 20:04:15
>>5112 よ4あき
ご指摘ありがとうございます。手元のデータは更新しました。
現在修正中の箇所があるのでまだアップできませんが、近日中に
更新いたします。

No. 5116 # 暗号の説明 2010/12/28 (火) 03:37:30
大変わかりやすかったです。
本当に一般の雑誌よりも理解しやすかったです。
感謝

No. 5117 # 68user 2011/08/05 (金) 14:19:25
UNIXの部屋を更新しました。
    http://x68000.q-e-d.net/~68user/unix/

>>5112 よ4あき
od の記述を直しました。更新に10ヶ月もかかりまして、
誠に誠に申し訳ございません。

No. 5118 # 68user 2011/12/16 (金) 17:57:59
さきほど問い合わせフォームにてご指摘いただきました xargs のサンプルの
typo について、修正いたしました。ご指摘いただきありがとうございました。
    http://x68000.q-e-d.net/~68user/unix/pickup?xargs

No. 5120 # ななし 2011/12/24 (土) 22:49:55
公開鍵方式での暗号化の解説、大変わかりやすくて参考になりました。
誤記について報告いたします。
>「a」は ASCII コードでは 0x61、10進数で 141 です。
10進数では97ではないでしょうか?
それと小さいところで、
>e = 5, 7, 13, 17, ...
のところで3が抜けていると思います。
では、後のコンテンツもゆっくり拝見させていただきます。

No. 5121 # 68user 2011/12/27 (火) 14:39:36
>>5120 ななし
ありがとうございます。141 は 8進数でした。97 に直し、
後続の式も修正いたしました。e = 3 も追記しました。

http://x68000.q-e-d.net/~68user/net/crypt-2.html

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