シェルスクリプト総合 その11at UNIX
シェルスクリプト総合 その11 - 暇つぶし2ch355:名無しさん@お腹いっぱい。
08/06/25 13:31:19
>>350
だったら、4桁数字だったら西暦、
2桁数字だったら日付、
Jan Feb等に一致したら月、
それ以外のフィールドは無視、というように
全フィールドをチェックすればできるな。

356:名無しさん@お腹いっぱい。
08/06/25 14:22:51
338です。
あっという間にたくさんのレスが。ありがとうございます。

>>340
>>343
>>352
ありがとうございます。
#!/bin/sh
の後に書いてやってみていますが、まだうまくいきません。
基本的な書き方がわかっていなさすぎなんでしょうね。

>>350
日付のフォーマットはこれだけ限定です。

過去スレ等、さらに読みに行ってきます。
本当に皆さんありがとう。



357:名無しさん@お腹いっぱい。
08/06/25 14:31:41
>>355
だったら
↓だな。

#!/bin/sh

while read line; do
for f in $line; do
case $f in
[0-3][0-9]) d=$f;;
[1-2][0-9][0-9][0-9]) y=$f;;
Jan) m=1;; Feb) m=2;; Mar) m=3;; Apr) m=4;; May) m=5;; Jun) m=6;;
Jul) m=7;; Aug) m=8;; Sep) m=9;; Oct) m=10;; Nov) m=11;; Dec) m=12;;
esac
done
printf '%d.%d.%d\n' $y $m $d
done


358:名無しさん@お腹いっぱい。
08/06/25 14:43:10
宗教的に問題ないなら GNU date 入れちゃいなよ。
便利だよ。

359:名無しさん@お腹いっぱい。
08/06/25 14:44:15
宗教上の理由でそれは出来ません

360:名無しさん@お腹いっぱい。
08/06/25 14:46:23
ならしょうがない。

361:名無しさん@お腹いっぱい。
08/06/25 19:29:20
輸血と献血とGNU date は家訓で禁じられてます

362:名無しさん@お腹いっぱい。
08/06/25 20:25:21
perlで我慢しる

$ cat <<END | perl -ane 'use Date::Parse; $t = str2time($_); ($s,$m,$h,$d,$M,$y) = localtime($t); print $y+1900 . "." . $M . "." . $d . "\n"'
Fri, 16 May 2008 09:39:25 +0900
Sun, 18 May 2008 09:30:21 +0900
Mon, 02 Jun 2008 08:15:45 +0900
END
2008.4.16
2008.4.18
2008.5.2


363:名無しさん@お腹いっぱい。
08/06/25 20:27:13
use Date::Parse;
($s,$m,$h,$d,$M,$y) = strptime($_);
print $y+1900 . "." . $M+0 . "." . $d+0 . "\n";


364:名無しさん@お腹いっぱい。
08/06/25 21:12:11
>>362
純正シェルでの >>357 の回答の後にperl出しても意味ないなぁ。

365:名無しさん@お腹いっぱい。
08/06/25 22:43:18
perlやGNU dateの方が書式に寛容

366:名無しさん@お腹いっぱい。
08/06/25 22:47:29
perlが入っててもDate::Parseが入ってない環境が多いから動かない環境が多い。

367:名無しさん@お腹いっぱい。
08/06/26 01:57:12
純正シェル(笑)

368:名無しさん@お腹いっぱい。
08/06/26 02:04:04
シェルってゆうな。クズ。

369:名無しさん@お腹いっぱい。
08/06/26 02:05:33
貝殻

370:名無しさん@お腹いっぱい。
08/06/26 02:12:50
ゆうなって言うなこのクズ

371:名無しさん@お腹いっぱい。
08/06/26 03:07:08
稲村

372:265
08/06/26 17:31:41
bashのshはシェルの略なので
これからはbaと呼ぶことにします。

373:名無しさん@お腹いっぱい。
08/06/27 10:24:30
338、356です。
勉強始めたばかりで適切なスレを見つけるのもままならない。
質問した後に、スレ違いだったようだと反省している。
実はbashでやっているんだが・・・ってこれを最初に言うべきだったんだね。
皆さんにいただいたヒントでなんとかしようとさらに勉強するつもりだ。
ほんとに親切な人が多いスレで感激しているよ。
頑張ってみる。ありがとう。

374:名無しさん@お腹いっぱい。
08/06/27 10:27:48
まだ出来てないのかよ。

375:名無しさん@お腹いっぱい。
08/06/27 10:32:36
>>373
>>357 をコピペして、適当なファイルに保存(ファイル名hoge)する。
$ chmod +x hoge
$ ./hoge < hoge1.txt
2008.5.16
2008.5.18
2008.6.2

ここまで書かないとわからなかったのかな?
パーミッションとか、リダイレクトとか、./ を付けることとか、、

376:名無しさん@お腹いっぱい。
08/06/27 10:36:14
パーミッションとかわからければ、テキストファイルとして保存して
$ sh hoge < hoge1.txt
でいいし。

377:名無しさん@お腹いっぱい。
08/06/27 10:47:21
>>375
できましたっ!
みんな、ありがとう!


378:名無しさん@お腹いっぱい。
08/06/28 16:35:09
ホストをIPに変換するシェルを発行する時、
getentを使いたいのですが、getentって純正シェルでも使えましたっけ?
あと、他にgetentが使えないシェルはありますか?

379:名無しさん@お腹いっぱい。
08/06/28 16:58:49
ホストの人かコンピューターをプロトコルに変換するシェルを開発されるスーパーハカーの方ですねわかります

380:名無しさん@お腹いっぱい。
08/06/28 17:48:26
>>378
外部コマンドならシェルの種類は関係ないでしょ。

381:名無しさん@お腹いっぱい。
08/06/28 18:18:22
zshではシェル関数になっていた > getent


382:名無しさん@お腹いっぱい。
08/06/28 18:21:22
それは俺の知らないzshだ

383:名無しさん@お腹いっぱい。
08/06/28 18:25:32
>>381
それは漏れの知らないzshだ

384:名無しさん@お腹いっぱい。
08/06/28 18:27:34
ashでは not foundって言われた > getent

385:名無しさん@お腹いっぱい。
08/06/28 18:31:13
/usr/share/zsh/4.2.6/functions/compaudit の中に

[[ -x /usr/bin/getent ]] || getent() {
if [[ $2 = <-> ]]; then
grep ":$2:[^:]*$" /etc/$1
else
grep "^$2:" /etc/$1
fi
}

と書いてあった。コマンド実体がない場合にちょー簡略版を定義してるのね。


386:名無しさん@お腹いっぱい。
08/06/28 21:36:48
>>385
その定義だと、コロンで区切られてる前提になってるから、
passwdとgroupにしか使えないね。 (hostsには使えない)

387:名無しさん@お腹いっぱい。
08/06/28 21:47:04
getent hostsって微妙だからな。
libresolv直接叩いているアプリも結構あるし。

388:名無しさん@お腹いっぱい。
08/06/29 03:08:38
行中にIPアドレスらしき文字列が含まれていたら、それを出力するって
こんな感じで問題ないですかね? もっと綺麗に書ける気もするが・・・
# 1行に1つしか含まれてないと仮定して問題なしです。

text='0.0 192.168.0.1 0.0'
regex='[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*'

echo "$text" | grep "$regex" | sed -e "s/.*[^0-9]\($regex\).*[^0-9]*/\1/"

389:388
08/06/29 03:13:28
全然ダメだったorz 教えてください。

390:名無しさん@お腹いっぱい。
08/06/29 03:30:41
echo $text | grep -E -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'

-oなんてオプション他のgrepにあるか知らないけど

391:名無しさん@お腹いっぱい。
08/06/29 09:32:03
>>388
grepとsedを一緒に使うのは無駄。sedだけでできる。

sed '/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/'

392:名無しさん@お腹いっぱい。
08/06/29 09:34:43
すまん、-n p 忘れた。訂正。

sed -n '/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p'

393:名無しさん@お腹いっぱい。
08/06/29 09:35:43
sed -n 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p'

の間違いだろ。初心者はもっと謙虚なレスを書きなさい。

394:名無しさん@お腹いっぱい。
08/06/29 09:38:27
>>392
それだと頭の数字が食われることがある。

sed -n '/[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p'

とした方がいい。

395:名無しさん@お腹いっぱい。
08/06/29 09:40:50
だからぁ~、sedはスレ違い。

>>393 は何を言いたいんだ? (392のあとで)

396:名無しさん@お腹いっぱい。
08/06/29 09:43:09
と言うか、>>393 の頭の 's/ の部分ですでにsed文法エラーじゃん。
初心者はちゃんと動作確認してから書きなさい。

>>394 が正解。

397:名無しさん@お腹いっぱい。
08/06/29 09:50:09
>>394 でも、
hoge123 192.168.123.45

みたいな入力があると失敗する。続きは sedスレでやってくれ。

398:名無しさん@お腹いっぱい。
08/06/29 09:52:24
sed -n '/.*\(\<[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\>\).*/s//\1/p'

で改善されるか?

399:名無しさん@お腹いっぱい。
08/06/29 09:54:07
模範解答の発行まだー??

400:名無しさん@お腹いっぱい。
08/06/29 10:04:16
398 で桶

401:名無しさん@お腹いっぱい。
08/06/29 21:24:06
sed -n 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/p'

402:名無しさん@お腹いっぱい。
08/06/29 21:44:44
>>401
>>397 の指摘で失格

403:名無しさん@お腹いっぱい。
08/06/30 01:27:41
よほどパフォーマンスに差がありでもしないかぎり、
書き易く読み易いようにすればいい。

404:388
08/06/30 01:39:46
みなさま色々とありがとうございました。

>>398
ちゃんと処理できるみたいですし、このスレでも良い評価なので
これを使ってあげようかと思います。感謝してください。

この処理は、あるとても重要な国家プロジェクトで使用されます。
コメントで Powered by 398 と入れておきますね。

405:名無しさん@お腹いっぱい。
08/06/30 01:59:48
なわけねーだろ

406:名無しさん@お腹いっぱい。
08/07/02 17:31:55
誰かお願いします。
wk=f
配列にa b c d とそれぞれ入ってるとして
ループでぐるぐるっと、wkと一致するものを探したいんですが、
もし一致するものが無かった場合の終了条件って、どうしたらいいですか。

407:名無しさん@お腹いっぱい。
08/07/02 17:41:16
日本語でおk

408:名無しさん@お腹いっぱい。
08/07/02 17:42:11
純正シェルに配列はない。配列に相当する別の処理をしているなら、
その処理方法を明示して質問し直した方がいい。

409:名無しさん@お腹いっぱい。
08/07/02 17:43:56
>>406
多少エスパーして回答。
ループにwhileを使うんじゃなくて、
forで配列の要素分ループすれば、たとえ一致するものが無かった場合でも
ループはちゃんと終了するから問題なし。

410:名無しさん@お腹いっぱい。
08/07/02 17:48:51
ループの返り値ってことなら、breakとかを使わん限り最後のコマンドの実行結果になるから、
ループの最後にfalseを置いとけばいいんじゃないかね。
成功した場合はbreakで抜ける、ということならば、だけど。


411:名無しさん@お腹いっぱい。
08/07/02 17:51:11
>>406 の日本誤訳:

以下のようなシェルを発行しようとしたのですが、
もし一致するものが無かった場合、うまくいきません。
どうすればいいですか?

#!/bin/bash

wk=f
array=(a b c d e)

i=0
while [ ${array[i]} != $wk ]; do
((i++))
done


412:名無しさん@お腹いっぱい。
08/07/02 17:57:26
皆様あざーっす!
とりあえず今、KSHって何だって事から教わりました。怒鳴り含み。
ちょっと参考にして、考えます。皆暖かいアドバイスども!

413:名無しさん@お腹いっぱい。
08/07/02 17:59:21
突然何を言い出すんだ?

414:名無しさん@お腹いっぱい。
08/07/02 18:08:51
キチガイ警報

415:名無しさん@お腹いっぱい。
08/07/02 22:22:49
作成したいファイル名が書かれたtxtのリストから、
ファイルを作成するにはどうすればよいでしょうか?

たとえばテキストの中身に、
hoge
foo
bar

とあったとして、
hogeとfooとbarというファイルを作成したいのです。

416:名無しさん@お腹いっぱい。
08/07/02 22:34:11
>>415
touch $(cat txt)

417:名無しさん@お腹いっぱい。
08/07/02 22:46:52
>>416
なんでこれでできるのかわからないですができました
ありがとうございます



418:名無しさん@お腹いっぱい。
08/07/03 02:22:28
>>416 それだと大量だった場合に引数溢れのエラーにならないかな?

419:名無しさん@お腹いっぱい。
08/07/03 02:25:14
>>418
じゃあ
cat txt | xargs touch

420:名無しさん@お腹いっぱい。
08/07/03 03:05:13
cat txt|while read FNAME
do
touch $FNAME
done
べたですがw

421:名無しさん@お腹いっぱい。
08/07/03 07:17:23
>>419
xargsは使っちゃいけないコマンド。

>>420
それだと catが無駄。touchがむだ。

while read FNAME
do
> "$FNAME"
done < txt


422:名無しさん@お腹いっぱい。
08/07/03 07:19:13
>>416
bash依存、失格。

> `cat txt`

423:名無しさん@お腹いっぱい。
08/07/03 07:23:31
>>421
415とは関係ないんだけど
パイプでxargsに渡すときに空白をエスケープするにはどうすればいいの
例えばfindで見つけたパスに空白が含まれてた場合とか

424:名無しさん@お腹いっぱい。
08/07/03 07:49:19
>>423 テンプレ>>6

425:名無しさん@お腹いっぱい。
08/07/03 07:55:01
>>424
テンプレにあったとは
すいませんでした

426:名無しさん@お腹いっぱい。
08/07/03 08:02:10
テンプレにはないが、find -print0 | xargs -0 するんじゃなくて、
find -exec +
するのが今後のお勧めだな。-exec の後ろ、\; じゃなくて + ね。

これでxargsは完全に不要!

427:名無しさん@お腹いっぱい。
08/07/03 11:31:21
質問です。
case文でwhile文を使用する時
case "$a" in
"a.c")
while[ $flag = false || $i -ne 10 ] ; do
処理1
done
の時、doneの跡に;;でおkですか?

428:名無しさん@お腹いっぱい。
08/07/03 11:56:24
>>421がFAだけど、敢えてxargs -0で。

cat list.txt | perl -ane '{ chop; printf("%s%c", $_, '\0'); }' | xargs -0 touch


429:名無しさん@お腹いっぱい。
08/07/03 11:57:44
>>426
この+でappendって、最近のfindはどれにもあるの?

430:名無しさん@お腹いっぱい。
08/07/03 11:58:53
純正findにないから使っちゃだめ

431:名無しさん@お腹いっぱい。
08/07/03 12:18:04
>>430
純正findにもあるんだなぁ、+ が。よって find -exec + で FA。

432:名無しさん@お腹いっぱい。
08/07/03 12:31:00
xargs を使っちゃいけない理由キボンヌ
便利だし早いからコマンドラインで結構使うんですが・・・

433:名無しさん@お腹いっぱい。
08/07/03 12:31:12
純正find にないのは -print0 の方ですね。

434:名無しさん@お腹いっぱい。
08/07/03 12:40:55
純正なんとかっていう意味の曖昧な言い方は止めろ
今はPOSIX準拠かどうかの話をしてるようだが、
純正シェルは古い/bin/shの話だったりでわからん

435:名無しさん@お腹いっぱい。
08/07/03 12:45:23
>>432
$ printf "This is\na test.\n"
This is
a test.
$ printf "This is\na test.\n" | xargs -n 1 echo
This
is
a
test.
$ printf "This is\na test.\n" | perl -ane 'chop; printf("%s%c", $_, '\0');' | xargs -0 -n 1 echo
This is
a test.
$


436:名無しさん@お腹いっぱい。
08/07/03 12:46:31
& >>6 (>>424は読んだ?)

437:名無しさん@お腹いっぱい。
08/07/03 13:03:20
>>435
なるほど、理解しますた。分かってれば使えないことはないですな。

438:名無しさん@お腹いっぱい。
08/07/03 16:40:13
まぁ実験して動いたらそれでまずOK。
でその後にリファイン(リファクタリング?) 
これが大事。

439:名無しさん@お腹いっぱい。
08/07/03 17:28:35
>>6
> (スペースなどを含むファイル名を正しく処理するため、
> findは -print0、xargsは -0オプションを常に付けることを推奨
> ただし、Solarisでは未対応。どうするんだろ?)

$ cat print0
#! /bin/sh
while read x; do
printf "%s\0" "$x"
done

$ find ~ | print0 | xargs -0 ~

でいいんじゃね?
# printfは許してね。

440:名無しさん@お腹いっぱい。
08/07/03 18:16:12
>>439
いや、だから、Solarisでも find dir -exec hoge + が使えるんだよ。
よってprint0云々は一切不要。

441:名無しさん@お腹いっぱい。
08/07/03 18:21:41
>>439
ファイル名に \ が含まれていた場合、readが誤動作する(違うファイル名とみなされる)
Solarisの xargsには -0 オプションがない。

で、>>440 の方法で解決。

442:名無しさん@お腹いっぱい。
08/07/03 18:58:56
トレースしてみた。

strace -f find /tmp -exec file {} + 2>&1
execve("/usr/bin/file", ["file"..., "/tmp"..., "/tmp/.ICE-unix"..., "/tmp/mysql.sock" ...,
おお、すげぇ。ちゃんと引数まとめて実行してるね。

strace -f find /tmp -exec file {} \; 2>&1
execve("/usr/bin/file", ["file"..., "/tmp"...], [/* 21 vars */]) = 0
execve("/usr/bin/file", ["file"..., "/tmp/.ICE-unix"...], [/* 21 vars */]) = 0
execve("/usr/bin/file", ["file"..., "/tmp/mysql.sock"...], [/* 21 vars */]) = 0
こっちは1個ずつ実行するから大量だとクソ遅い。

勉強になりまつた。

443:名無しさん@お腹いっぱい。
08/07/03 19:55:30
やっぱ速さってみんな気になるん?
しっかりきっちり動けば、速度は問題ないって思ってる俺は未熟?
いかにもベターってのはやらないけどー。

444:名無しさん@お腹いっぱい。
08/07/03 20:03:16
テクいことして読み難くなるなら多少遅くても分かりやすく書く

445:名無しさん@お腹いっぱい。
08/07/03 20:08:46
>>442
straceって、、Linuxかよw

446:名無しさん@お腹いっぱい。
08/07/03 23:57:40
>>443
必要な時に必要なことをやる。当たり前のこと。
後の話はマ板でやって。

447:名無しさん@お腹いっぱい。
08/07/04 01:32:47
cronで毎日回しているプログラムの処理時間が
16時間越えたらちょっと悩む

448:名無しさん@お腹いっぱい。
08/07/04 08:05:24
kshでユーザIDのリストを計表にして印刷したいんだけど
こんなの作った人いますか?
どこかにサンプルありませんかね。OSは、AIX5.3です。


449:名無しさん@お腹いっぱい。
08/07/04 08:27:34
>>448
計表の正確なところがわからんが、

while read user pass uid rest; do echo $uid $user ; done < /etc/passwd

ってことか?
あと、必要なら sort -n をかましてね。
kshじゃなくて純正シェルでできるよ。

450:名無しさん@お腹いっぱい。
08/07/04 08:29:48
>>448
あ、IFS設定抜けてた。

IFS=:; while read user pass uid rest; do echo $uid $user ; done < /etc/passwd

451:名無しさん@お腹いっぱい。
08/07/04 08:42:50
ksh -c lpr < /etc/passwd

452:名無しさん@お腹いっぱい。
08/07/04 11:13:09
FreeBSD 付属の wc は空白文字でパディングして結果を返すようです。

wc -l $file | sed "s/ /_/g"
_____340_/usr/bin/g++

Linux では次のようにして 340 という値を得ていたのですが、
FreeBSD では空白文字が出力されてしまいます。

wc -l $file | cut -f1 -d" "

FreeBSD 版 wc ではどうすればいいでしょう。
ltrim() みたいなものがありますかね。
それともいったん sh の変数に代入する?
それとも wc や cut には未知のオプションがある?
cut なんていう頑ななコマンドは使わないで、 sed 's/^ *\([0-9]*\) .*$/\1/' しろ?
お前 awk '{ print $1 }' も書けないのか?

bash をよく使うので、依存しているところがあったらごめんなさい。
awk はほとんど馴染みがありません。というか、
何かにつけて不遇の cut を使ってあげたい気持ちがあります…。

453:名無しさん@お腹いっぱい。
08/07/04 11:15:19
>>452

echo `wc -l < $file`

454:名無しさん@お腹いっぱい。
08/07/04 11:28:33
>>452
長文で cutを力説してるのに、
>>453 で cutすら必要ないというオチにワロタ

wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので
cutとかで切る必要ないのと、スペースを取り除くにはシェルの ` ` を使うってことね。

455:名無しさん@お腹いっぱい。
08/07/04 11:33:53
> それともいったん sh の変数に代入する?
質問者が用意した選択肢を誇らしげに答える>>453-454が憐れ。

456:名無しさん@お腹いっぱい。
08/07/04 11:38:03
空白文字のパディング方式に、
暗黙の仮定を置いてまでcutにこだわる意味が全くわからん。
仕様の特殊化しても嬉しくない。

457:452
08/07/04 11:38:04
いやいや

> wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので

役に立ちました! 確かに笑った。

458:名無しさん@お腹いっぱい。
08/07/04 11:38:44
>>455
おまえ、シェルスクリプト書いたことないだろ?

>>453 では一切「sh の変数に代入」は行なっていないがww

459:452
08/07/04 11:50:48
>>456
いやいや、そうなんですよ。 cut ってつまり結局
他のコマンドと組み合わせるには中途半端なツールなんですよ。
単純でそれなりに覚えやすく、見込みのあるヤツだと思ってたんですが…
awk や bash は区切り文字を変えるだけでも結構タイプする印象が。

いや、変にこだわってごめんなさい。

460:名無しさん@お腹いっぱい。
08/07/04 12:06:44
つ awk -F:

461:名無しさん@お腹いっぱい。
08/07/04 15:50:34
cut はデリミタの連続を指定できれば使える君に化けるんだがな。

462:名無しさん@お腹いっぱい。
08/07/08 07:58:27
シェルスクリプトがCなどのプログラムより重い理由をうまく説明したいんですが

463:名無しさん@お腹いっぱい。
08/07/08 08:00:46
>>462
インタプリタ型言語だから。
(fork/execが遅いと言うだけが理由ではない。
内部コマンドだけを使ってもCよりも遅いから)

464:名無しさん@お腹いっぱい。
08/07/08 10:52:14
でも一番のボトルネックは fork, exec だと思うぞ

465:名無しさん@お腹いっぱい。
08/07/08 11:29:48
プロファイルしてみると分かるが、文字列処理も結構コストが高い。
stat(2)せずにls -lしてからパターンマッチなど。
shは文字列がグルーになっているから。

466:名無しさん@お腹いっぱい。
08/07/08 14:57:58
パイプとかバッククォートとかガンガン使うから、
それだけでシステムコール連発になっちゃうもんね。
文字列処理なのに write(2) とか使うわけだw

467:名無しさん@お腹いっぱい。
08/07/08 21:54:18
レスありがとう
ちなみにパイプでコマンドつないだ場合って一つ一つ最後まで処理して次のコマンドに移るであってますかね?


468:名無しさん@お腹いっぱい。
08/07/08 21:56:21
>>467
全然合ってない。それは MS-DOSのニセパイプの動作。

469:名無しさん@お腹いっぱい。
08/07/08 22:14:44
>>468
詳しくおしえてください・・・

470:名無しさん@お腹いっぱい。
08/07/08 22:21:27
>>469 シェル pipe dup2 とかで検索してみ。

471:名無しさん@お腹いっぱい。
08/07/08 22:50:12
そんな検索語じゃわかるわけないだろ。
pipe(2)だって無限にバッファがあって、
入口が閉じるまで出口から出て来ない仕様になってる可能性だってあるわけで。

472:名無しさん@お腹いっぱい。
08/07/08 23:22:32
無限の記憶装置は存在しないのでそんな可能性はゼロだな。

473:名無しさん@お腹いっぱい。
08/07/08 23:25:31
MS-DOSのパイプ仕様を実装することも不可能だな。

474:名無しさん@お腹いっぱい。
08/07/08 23:36:10
コマンド1 | コマンド2

本来のパイプだと、
コマンド1 の標準出力 = コマンド2の標準入力
になるような操作(dupとか)が裏で行われる。
コマンド1と2は同時に実行される。一時ファイルを介さない。

嘘パイプの場合は、
コマンド1 > 一時ファイル
コマンド2 < 一時ファイル
削除 一時ファイル
なだけ。


475:名無しさん@お腹いっぱい。
08/07/08 23:57:58
例えば
cat ばかでかいファイル | head -1
だとcatもheadも同時に起動してheadはcat の出力が1行分でたらそれを出力します
そのときcatの処理が途中だったらどうなるんですか?

476:名無しさん@お腹いっぱい。
08/07/09 00:11:11
やってみろよ

477:名無しさん@お腹いっぱい。
08/07/09 00:50:57
>>475
バッファってしってるか?


478:名無しさん@お腹いっぱい。
08/07/09 01:22:00
>>475
catがwrite(2)を呼び出したときにheadが終了している(パイプが閉じている)とSIGPIPEくらって終了。

479:名無しさん@お腹いっぱい。
08/07/09 02:16:51
そのshigpipeを発行するのはパイプさん?


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch