トップページunix
987コメント345KB

シェルスクリプト総合 その13

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2008/10/16(木) 00:48:38
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ
シェルスクリプト総合 その12
http://pc11.2ch.net/test/read.cgi/unix/1218277263/
0772名無しさん@お腹いっぱい。2009/01/18(日) 12:06:06
>>768 すげー、無様。

>>763-764が正答なのに。
07737712009/01/18(日) 12:27:13
>>772

実験したら、>>771では駄目だと判明。
もちろん>>763-764も駄目。
>>765-767あたりも参考にすべき。
どうもtestは数値を1バイトの符号なし整数とみなすようだ。
これはunixコマンドの終了ステータスが0-255の範囲であると
定められていることと関係するのだろう。

smpl.c
#include<stdlib.h>

int
main(int argc, char *argv[])
{
int i = atoi( argv[1]);
return (i);
}

jikken.sh
#!/bin/sh
set -x
i=1
while true; do
./a.out $i
if [ $? -ne 255 ]; then
echo "OK"
else
echo "error" && break
fi
i=`expr $i - 1`
done
07747712009/01/18(日) 12:32:57
すまん、testの仕様じゃなくて、
終了ステータスを出す側が符号なし整数でだしてた、
いずれにしても。

実行結果
+ i=1
+ true
+ ./a.out 1
+ [ 1 -ne 255 ]
+ echo OK
OK
+ expr 1 - 1
+ i=0
+ true
+ ./a.out 0
+ [ 0 -ne 255 ]
+ echo OK
OK
+ expr 0 - 1
+ i=-1
+ true
+ ./a.out -1
+ [ 255 -ne 255 ]
+ echo error
error
+ break
0775名無しさん@お腹いっぱい。2009/01/18(日) 13:23:58
最凶の釣り師だな。
「gccのプログラム」、「リターン値が-1のときにエラー」、「シェルを書きたい」
0776名無しさん@お腹いっぱい。2009/01/18(日) 13:54:20
>>775
揚げ足取ってないで早く教えろよ
0777名無しさん@お腹いっぱい。2009/01/18(日) 14:06:42
>>776
だから、>>767 が正解。

255とかにこだわらず、0か0以外で判断すれば良い。
0778名無しさん@お腹いっぱい。2009/01/18(日) 14:19:59
>>777

終了ステータスが0-255まで有ると言うことは、
非ゼロで有っても何らかの理由でその数値を利用するため。

ゼロ以外は何らかのエラーで有るという考え方はOKだが、
何でもかんでも処理を中断して良い訳じゃない。
そこは、プログラムの仕様で判断するべきだし、
今回の仕様は>>761
0779名無しさん@お腹いっぱい。2009/01/18(日) 14:56:19
>>788
だったら、以下のとおり。
これくらい応用して考えろよw


while gccのプログラム; [ $? != 255 ]
do
...
done
0780名無しさん@お腹いっぱい。2009/01/18(日) 15:02:04
>>779

終了ステータス判定に文字列比較演算子を使うな。

要するに、>>761への回答は、
「gccプログラムの終了ステータスは-1には出来ません」

gdb で return(-1); なプログラムを動かしたら、
Program exited with code 0377.
だと。
0781名無しさん@お腹いっぱい。2009/01/18(日) 15:02:45
>>778

いや、今回の質問は、そもそもエラーコードの受け取り方を
>>761 が勘違いしていたのが原因なのだから、
その原因に対する的確な答えは、
>>767 が正解。

>>761 で、「リターン値が-1のときにエラー」とは言っているが、
これはその「gccのプログラム」が 「return -1;」と記述されていることを
言っているに過ぎず、質問のポイントとなっているのはエラーコードの値ではない。
実際、-1 とか 255とか、数値の問題でうまく動かなかったのじゃなく、
while [ gccのプログラム = 0 ] みたいな間違った書き方をして動かなかったのだから、
それに対する指摘が正しい回答と言えよう。
その意味でも >>767 が正解。

エラーコード=255を杓子定規に解釈すれば >>779 だが、
これが本当に意図していた回答かどうかは疑問。
0782名無しさん@お腹いっぱい。2009/01/18(日) 15:18:18
>>781

そこまで深読みして考えるなら、
もう少し突っ込んで>>775にたどり着くべきだな。
0783名無しさん@お腹いっぱい。2009/01/18(日) 15:23:28
>>782
深読みじゃないよ。質問で [ gccのプログラム = 0 ] って書いてるんだから、
エラーコードが 0 かどうかチェックしたいと言う意図だろ。
それが質問の「仕様」。
0784名無しさん@お腹いっぱい。2009/01/18(日) 15:32:41
どうでもいい。
黙れ。
0785名無しさん@お腹いっぱい。2009/01/18(日) 15:37:06
>>784
顔真っ赤にして大変ですねw
0786名無しさん@お腹いっぱい。2009/01/18(日) 15:56:51
仮に、正常終了時に標準出力に0を出すのだとしても、書くなら
while [ `gccのプログラム` = 0 ] だよな。
0787名無しさん@お腹いっぱい。2009/01/18(日) 15:59:18
どうでもいい。
黙れ。
0788名無しさん@お腹いっぱい。2009/01/18(日) 16:02:41
>>780
$?を参照する方法なら文字列比較で構わないよ。
変数の値は文字列だから
0789名無しさん@お腹いっぱい。2009/01/18(日) 16:37:43
>>788
だな。

>>780
-eq -ne 等を使う必要があるのは、たとえば、

3 03 003 0003 ... などを同一の値とみなす必要がある時。

[ 003 -eq 3 ] && echo 同じ
とか。

$? の場合は、0〜255の普通の値しか入らない(00とか000とかにはならない)から、

[ $? != 0 ] で判定して良い。
0790名無しさん@お腹いっぱい。2009/01/18(日) 16:43:52
>>788

無様なコードでも動けばそれでいいというわけだ。
0791名無しさん@お腹いっぱい。2009/01/18(日) 16:44:41
>>781
プログラム終了コードを -1 にしたことが
問題だったのなら、的確な答えは、
>>766 + >>764 が正解

>>767 ではプログラムの終了コードが0か否かしか
判定できない手法なので、残念ながら完全に間違い。
>>761 の要求は満たしてない。
0792名無しさん@お腹いっぱい。2009/01/18(日) 16:47:05
終了コードが3種類以上ある場合、

case $? in
0) hoge;;
1) hoge;;
255) hoge;;
*) hoge;;
esac

みたいに書くこともある。
case文は文字列としての比較しかできない。

「$?を文字列として扱ってはいけない」というルールなら、
caseで効率良く書くことも否定することになる。

それは明らかにおかしい。
0793名無しさん@お腹いっぱい。2009/01/18(日) 16:48:03
というか、ちょっと前から沸いてる >>781 って
多分 >>767 と同一人物だと思うんだけど
なんか自分の答えが正解と言い張って、他人の答えを間違いと
断言する性癖があるね

もう少し余裕もった方がいいと思うよ
0794名無しさん@お腹いっぱい。2009/01/18(日) 16:52:19
>>791
違う。

質問者が本当に「エラーコードが-1かどうか」を判断したかったのなら、

質問でも、(間違った文法だけど)
while [ gccのプログラム != -1 ]
と書いていたはず。

実際には
while [ gccのプログラム = 0 ]
と書いて質問したのだから、
質問の「仕様」は、エラーコード0かどうかで判断するということで正解。
0795名無しさん@お腹いっぱい。2009/01/18(日) 17:06:08
>>794

そもそも、(もし釣り質問で無いなら)
質問者が、どうしていいか訳が分からなくなってる質問内容の
一分だけが、正確に質問者の意図を反映しているというのは強弁。
0796名無しさん@お腹いっぱい。2009/01/18(日) 17:27:44
>>791

もう少し前後のレスをよく読むこと。
>>764だと無限ループになる。
0797名無しさん@お腹いっぱい。2009/01/18(日) 18:32:56
揚げ足取りするつもり無いけど自分が正しいと主張する人は

>>764
× ture: 綴りも違うし、区切りがコロンになってる
○ true;

>>779
× while gccのプログラム; [ $? != 255 ] 条件部分は1つのコマンド/パイプライン(相当)しか書けない
○ while ( gccのプログラム; [ $? != 255 ] )

雑はやめてくれ
07987972009/01/18(日) 18:35:48
変な形で繋がったけど
× 条件部分は〜
○ while の条件部分は〜
0799名無しさん@お腹いっぱい。2009/01/18(日) 18:40:13
雑はやめてくれ
0800名無しさん@お腹いっぱい。2009/01/18(日) 19:01:16
>>797
嘘を書いてるのはお前。

whileの条件部分に書けるのは「パイプライン」じゃなくて「リスト」
リストというのは複数のパイプライン。

while gccのプログラム; [ $? != 255 ]
↑は正しい。


× while ( gccのプログラム; [ $? != 255 ] )

サブシェルが無駄。
0801名無しさん@お腹いっぱい。2009/01/18(日) 19:08:06
おれも >>800 が正しい、に1俵。
whileの条件部分には、( ) なしで2個以上のコマンドが書ける。

>>797
試しに、↓みたいなの実行してみろ。

i=1; while echo $i; i=`expr $i + 1`; [ $i -le 10 ]; do :; done
0802名無しさん@お腹いっぱい。2009/01/18(日) 19:09:52
>>799
失礼雑だった

>>800
リストまではOK

> while gccのプログラム; [ $? != 255 ]
>↑は正しい。

は?
0803名無しさん@お腹いっぱい。2009/01/18(日) 19:14:32
>>802
おまえ、「リスト」知らんのか。

コマンド; コマンド;
みたいにセミコロンで区切ったのがリスト。(改行でもいいが)

リストが桶ということは、2個以上のコマンドが桶。

while gccのプログラム; [ $? != 255 ]
の代わりに、

while echo hoge; [ $? != 255 ]

とでもやってテストしてみろ。ちゃんと動くから。

あと、>>801 が書いてくれたテストプログラムも、
while の条件文に複数のコマンドを書いた例だな。
0804名無しさん@お腹いっぱい。2009/01/18(日) 19:16:46
たぶん、あれだろ。
>>802 は。「リスト」が、&& や || を使ったのしか駄目だと
勘違いしてるんじゃないかww

セミコロンでも改行でもOK。
0805名無しさん@お腹いっぱい。2009/01/18(日) 19:19:18
自演しておきながら、
よくまあ他人同士のふりができるな。

タイミングと言い、やりとりといい、
よくまあ毎回毎回同じパターンで
飽きないか?
0806名無しさん@お腹いっぱい。2009/01/18(日) 19:22:45
とりあえず、
>>797 の後半と、
>>802 の後半は大間違いなので、

>>797 = >>802 に釈明カキコを要求しとく。
0807名無しさん@お腹いっぱい。2009/01/18(日) 19:27:59
>>802
> リストまではOK

リストまではOKってことは、
>>797 の主張が間違ってたってことだよ。

hoge && hage && boke
hoge || hage || boke
hoge; hage; boke

上の3つは全部「リスト」。

ちなみに、
hoge
hage
boke

みたいに3行に書いても全体で1個の「リスト」。

while
hoge
hage
boke
[ $x -ne 0 ]
do
.....
done


みたいな変わった書き方もある。
0808名無しさん@お腹いっぱい。2009/01/18(日) 19:36:33
オナニーは人から見えないところでやれ。

ああ、見られないと出来ないのか。
0809名無しさん@お腹いっぱい。2009/01/18(日) 21:35:35
>>806

普通、人の間違いは指摘する事は有っても、
わざわざ、釈明せよ等とは言わないものだ。

お前、もう良いから、このスレから出て行ってくれ。
邪魔だ。
0810名無しさん@お腹いっぱい。2009/01/18(日) 21:48:36
shのオプションで何が一般的ですか
-fはよく見るけど何もないのもよくみるけど
0811名無しさん@お腹いっぱい。2009/01/18(日) 21:58:29
-f は csh じゃないの?
0812名無しさん@お腹いっぱい。2009/01/18(日) 22:43:58
>>797
恥晒しとくね

>whileの条件部分は1つのコマンド/パイプライン(相当)しか書けない
>whileの条件部分は1つのコマンド/パイプライン(相当)しか書けない
>whileの条件部分は1つのコマンド/パイプライン(相当)しか書けない
>whileの条件部分は1つのコマンド/パイプライン(相当)しか書けない
0813名無しさん@お腹いっぱい。2009/01/18(日) 22:49:02
>>809
「人の間違いを指摘した」のではなく、
「もともと正しかった人を『間違ってる』と指摘した」(>>797)のだから、
話が違うだろ。
0814名無しさん@お腹いっぱい。2009/01/18(日) 23:03:03
>>813

お前がいつもやってることだろ。
誰か他の人間は釈明要求とかしたか?

早く消えろ。
お前がいるとシェルスクリプトその物の評価が下がる。
結果、クソOSが跋扈する。

あ・・さてはお前、windozeの回し者か?
このスレが荒れて流れりゃボーナス倍増か?
・・・ってそんな感じ。
0815名無しさん@お腹いっぱい。2009/01/19(月) 00:54:06
いやはやしかし、whileにあんな書き方があるとは。
while
hoge
hage
kasu
[ $x -ne 0 ]
do

頭固いからよくわからん、なにがどうなってるのやら。

ところで、logのこのメッセージって何。
loggerでログ取ったら紛れ込んでくるんだが。
daemon.infoカテゴリー

last message repeated 2 times
08167612009/01/19(月) 01:03:47
こんなに色々やり方があるとは思わず、大変勉強になりました。
皆さん色々なアドバイス、ありがとうございました。
0817名無しさん@お腹いっぱい。2009/01/19(月) 01:14:31
htmlを拾ってきて、リンクのところだけ抽出したいと思ってるのですが、
とりあえず下のようにa hrefタグだけ抜こうとしてもうまくゆかないです。
なんででしょう?

echo ' fadadf <a href="2xxxxxx"> fdskaf' | sed 's/\(<a href[^>]*>\)/\1/'
0818名無しさん@お腹いっぱい。2009/01/19(月) 01:26:44
>>817
htmlの内容にもよるけど、
< a href="hoge">hoge<\a>< a href="hoge2">hoge2<\a>< a href="hoge3">hoge3<\a><br>
っていう感じだからそれじゃ全然だめ。

例題はこれでいけたけど?
echo ' fadadf <a href="2xxxxxx"> fdskaf' | sed -E 's/.*(<a href[^>]*>).*/\1/'
0819名無しさん@お腹いっぱい。2009/01/19(月) 01:36:53
大雑把でいいんならこんな感じ。
strings hoge.html | fold -s -w 60 | grep "href"
よくfetchでエロを(ry
0820名無しさん@お腹いっぱい。2009/01/19(月) 01:59:23
>>818
ありがとうございます
そういえばマッチするとこの前後を考えてませんでした。
一応対象のファイルは1行につき<a href>タグ一個なのでうまくいきそうです
>>819
これは初めて知りましたがうまくつかうと楽そうですね

0821初心者です2009/01/19(月) 18:53:31
初心者ですが、スレ違いだったらすみません。
教えてください。
最近10日以内に変更したファイルやディレクトリ(新規作成ファイルを含む)を検索して、ディレクトリとファイル名の詳細(ls -ltrのような感じ)を変更時刻でソートして画面出力したいのですが、どなたかご教授お願いします。

ちなみに、IBMのAIXを使っています。
0822名無しさん@お腹いっぱい。2009/01/19(月) 18:57:12
>>821
変更時刻でソートをちゃんとやるのは難しい。

find / -mtime -10 -ls
あたりで我慢して。
0823名無しさん@お腹いっぱい。2009/01/19(月) 19:03:00
>>821
AIXは知らんが、-print0が使えるfindがあるなら、

find / -mtime -10 -print0 | xargs -0 ls -ldtr

なければGNU find入れれば使える。
0824名無しさん@お腹いっぱい。2009/01/19(月) 19:06:39
xargsを使うな!

>>821
find . -mtime -10 -exec ls -ldtr {} +


コマンドラインの最後、「+」 なので注意してね。
0825名無しさん@お腹いっぱい。2009/01/19(月) 19:06:56
GNUのlsなら--time-styleで時刻の表示形式を決められるので
ソートしやすい形式にすれば楽だと思うよ。
0826名無しさん@お腹いっぱい。2009/01/19(月) 19:10:50
>>823,824
それだとファイルが多いときにlsが複数回起動されて、lsによる
ソートが起動毎になっちゃうからだめなんじゃない?
0827名無しさん@お腹いっぱい。2009/01/19(月) 19:19:39
>>826
実用上問題ないからヨシとする
0828名無しさん@お腹いっぱい。2009/01/19(月) 19:25:53
なんで、問題ないってわかるんだよ。制限値は意外と小さいぞ。
0829初心者です2009/01/19(月) 19:49:11
822〜828の方々へ

早速のレスありがとうございます。
本当に助かりますし、心強く思います。
ただ、私はただいま会社にいませんので、すぐにでも試したいのですが試せないんです。
明日会社で必ず試してみます!
0830名無しさん@お腹いっぱい。2009/01/19(月) 20:16:21
1回のlsにおさまらなかったらこんな感じでいけると思う

find . -mtime -10 -exec ls -ld --time-style=full-iso {} + | sort -k 6,7

日付の表示形式が気に食わなければ+FORMATでdateコマンドと同様の
フォーマット文字列が使えるので工夫してくれ。
0831名無しさん@お腹いっぱい。2009/01/19(月) 20:19:38
GNUツール禁止
0832名無しさん@お腹いっぱい。2009/01/19(月) 20:19:51
まあ、あれだ。AIXだから GNUコマンド群は使えないというのがネックになるだろう
0833名無しさん@お腹いっぱい。2009/01/19(月) 20:33:02
find で -ls した結果を保存。
分単位でソート。
同じ分のファイルごとにグループに分けてls -ltrdでソート。
(グループ内にはそれほど多量にないと仮定)
連結。

コードは誰かまかせた。
0834初心者です2009/01/19(月) 20:41:25
たびたび、初心者です。
みなさん、レスありがとうございます。

「変更時刻でソートして画面出力」と書きましたが、誤解があってはいけませんので、目的を書きますが、
ファイルの新しいものが一番下にくるように画面出力したいのです。
正しくは、変更時刻とは分単位ではなく、タイムスタンプの順番です。
ですから、できることなら100分の1秒でも新しいファイルが下に来てほしいです。

この目的だと、どんな記述がよろしいでしょうか?




0835名無しさん@お腹いっぱい。2009/01/19(月) 21:12:36
(1)
find で -ls した結果を保存。

(2)
argsがオーバーフローしないように、
上から1000ファイルずつ区切ってそれぞれをls -ltrdでソート。

(3)
次に、上から500ファイルを飛ばして、
その次から1000ファイルずつ区切ってそれぞれをls -ltrdでソート。

(4)
今の状態を一時保存し、(2)と(3)をもう一度繰り返す。
その結果が一時保存した結果と変わっていれば、再度(2)から繰り返す。
変化がなくなればソート完了なので、これで終了。

コードは誰かまかせた。
0836名無しさん@お腹いっぱい。2009/01/19(月) 21:25:28
>>834
ファイルの持っているタイムスタンプは秒単位だから
1/100秒とかは無理

・・・AIXのFSは知らないけど
0837名無しさん@お腹いっぱい。2009/01/19(月) 21:36:19
GNU lsがないと秒単位のタイムスタンプも取得できないんだよなぁ
0838名無しさん@お腹いっぱい。2009/01/19(月) 21:40:19
通常ファイルだけならdiff -cでも取得できるでしょ。
ディレクトリはわからんなぁ。
0839名無しさん@お腹いっぱい。2009/01/19(月) 21:43:26
diff -c の裏技でタイムスタンプ取得できるのは
通常ファイルの中でも、テキストファイルだけ。
バイナリファイルだと diffに拒否される。
0840名無しさん@お腹いっぱい。2009/01/19(月) 21:46:15
こっちでは diff -ac でできるけど、OS依存?
0841名無しさん@お腹いっぱい。2009/01/19(月) 21:48:42
>>840
diff の -a は GNU 依存だろ。
0842名無しさん@お腹いっぱい。2009/01/19(月) 21:54:14
そうか。
じゃあ>>833>>835だな。
>>835って、2ファイルずつだとバブルソートをシェルスクリプトで実装する感じだな。
0843名無しさん@お腹いっぱい。2009/01/19(月) 22:03:34
tr とかで半角カナを消したいんですけどどうすればいいでしょう?
0844名無しさん@お腹いっぱい。2009/01/19(月) 22:05:35
んじゃ別解

mkdir ../temp
find . -mtime -10 -exec ln {} "../temp/`echo '{}'| tr / :`" \;
ls -t ../temp | tr : /
0845名無しさん@お腹いっぱい。2009/01/19(月) 22:07:14
>>821 >>834

適当な一時ディレクトリを作り、
その一時ディレクトリに find の結果出て来たファイルをすべて ln -s する。

その一時ディレクトリ上で、
ls -lLdtr を実行して結果を画面に表示。

一時ディレクトリをシンボリックリンクごと削除。

コードは誰かまかせた。
0846名無しさん@お腹いっぱい。2009/01/19(月) 22:10:18
勝ったな。完璧に勝った。
0847名無しさん@お腹いっぱい。2009/01/19(月) 22:11:39
>>844ってディレクトリはどうなんの?
0848名無しさん@お腹いっぱい。2009/01/19(月) 22:14:29
お題の「ファイル」という条件が抜けてたな。
0849名無しさん@お腹いっぱい。2009/01/19(月) 22:14:49
>>844 は、別ファイルシステムが含まれてると対応できないし、
ディレクトリ自体のタイムスタンプがチェックできないし、
ファイル名に : が含まれていると破綻する。

>>845 でいいじゃん。
0850名無しさん@お腹いっぱい。2009/01/19(月) 22:17:10
>>845>>844 も、
異なるディレクトリに同名のファイルがあったら破綻するのでは?

/hoge/file と /boke/file とか。
0851名無しさん@お腹いっぱい。2009/01/19(月) 22:19:42
>>844はそれを:で逃げようとしてるわけで(不完全だけど)、
>>845でうまくエスケープするコードも必要。
0852名無しさん@お腹いっぱい。2009/01/19(月) 22:19:53
みんな色々言ってるけど、実際に自分が必要となったら
PerlとかRubyとか使うんじゃないの?

find path -mtime -10 -print | perl -e 'chomp( @all = <> ); print join "\n", sort { -M $b <=> -M $a } @all;'
0853名無しさん@お腹いっぱい。2009/01/19(月) 22:22:15
自分なら GNU ls (coreutils)を入れて --time-style= で出力して
sort一発にするなぁ。
0854名無しさん@お腹いっぱい。2009/01/19(月) 22:23:58
そういうのを入れないでこのお題を解くという空気が流れているんだが
0855名無しさん@お腹いっぱい。2009/01/19(月) 22:26:12
>>854
>>853>>852 に答えたんだが、、
お題を解くのとは別に、実際に自分が必要になった場合の話。
お題の解は実際には実用にならないので。
0856名無しさん@お腹いっぱい。2009/01/19(月) 22:28:38
あれば使う。
無くてもやらなきゃならない場合がある。
0857名無しさん@お腹いっぱい。2009/01/19(月) 23:09:33
無理に一つのやり方に決めることもないんで、いろんなやり方を考えて
みる方が幅が広がっていいんじゃねー?
0858名無しさん@お腹いっぱい。2009/01/19(月) 23:21:28
symbolic linkと-Lを組み合わせるやり方は目から鱗だったが、
先のファイルがsymbolic linkだったときは結果が違ってしまう
のが惜しいね。
0859名無しさん@お腹いっぱい。2009/01/19(月) 23:42:08
posixには-Lが無いからハードリンクにしたのだが。
0860名無しさん@お腹いっぱい。2009/01/20(火) 00:07:19
AIXにはstat(1)はあるっけ?
0861名無しさん@お腹いっぱい。2009/01/20(火) 00:30:45
stderrとstdoutを端末に出力しつつ、それぞれ分けてファイルに出力したいのだけど、可能でしょうか?

command 2>> /tmp/stderr.log | tee -a /tmp/stdout.log

こんな感じでやってみてるのですが、上記だと端末にstderrは出ません。
0862名無しさん@お腹いっぱい。2009/01/20(火) 00:35:41
分けんのは無理だね。
別の端末でtail -f /tmp/stderr.logしなよ。
0863名無しさん@お腹いっぱい。2009/01/20(火) 06:42:12
>>861
できるよ。
(command | tee -a stdout.log) 2>&1 > /dev/tty | tee -a stderr.log


>>862
無理じゃないよ。
0864名無しさん@お腹いっぱい。2009/01/20(火) 09:28:24
zshなら素直にかけるんだけどね。

sh hoge.sh > >(tee stdout.log) 2> >(tee stderr.log)
0865名無しさん@お腹いっぱい。2009/01/20(火) 14:53:39
>>863
さらに、commandのexit statusを得ることは出来ないでしょうか?
0866名無しさん@お腹いっぱい。2009/01/20(火) 15:08:28
>>865
できるよ。

(((command; echo $? 1>&3) | tee -a stdout.log) 2>&1 > /dev/tty | tee -a stderr.log) 3>&1
0867名無しさん@お腹いっぱい。2009/01/20(火) 15:54:51
>>866
それだと、exit statusが表示されてしまうだけだ。

ややこしくなるけど↓かな。

(((command; echo $? 1>&3) | tee -a stdout.log) 2>&1 > /dev/tty | tee -a stderr.log > /dev/tty) 3>&1 | (read s; exit $s)
0868初心者です2009/01/20(火) 20:50:30
昨日質問させていただきました「821,829,834」です。
皆さん、本当にいろいろアドバイスいただき、ありがとうございました。
無事、できました!感激です!

特に、「824」さんの解答にあった通りにしたら、できました。
ありがとうございます。
ところで、もしこのレスを見ていたらで結構ですので、たびだび質問で恐縮ですが、
find . -mtime -10 -exec ls -ldtr {} +
の最後の+記号の意味はなんでしょうか?
私がもっている本で調べたりしても、のっていなかったので、もしよかったら教えてください。

他の方々の例もいろいろと勉強になると思い、試してみたのですが、まだまだ、私の勉強不足で思い通りに動かなかったりしました。
どうやら私の会社のUNIXは、GNUツールが使えないようです。残念・・・

でも、みなさんのアドバイス、本当にうれしかったです。
ありがとうございました。
また、何かありましたらご教授ください。
08698272009/01/20(火) 20:55:31
やっぱり「実用上問題ないからヨシ」じゃん
0870名無しさん@お腹いっぱい。2009/01/20(火) 21:11:22
ある日emacsあたりを新規インストールあるいは更新して、
全部出てこないじゃないかーと怒られる
0871名無しさん@お腹いっぱい。2009/01/20(火) 21:16:21
>>870
出てくることは出てくるだろ。
■ このスレッドは過去ログ倉庫に格納されています