07/05/16 23:44:33
ご返事いただきありがとうございます。
tail -f ログファイル名 | awk -f 手続きファイル
上記コマンドではawkによる整形結果を標準出力できる状態で、
さらにパイプでteeコマンドを実行してみましたがうまくログが
出力できませんでした。
名前付きパイプを作成し、オリジナルログの出力先を名前つきパイプにして
直接awkで名前つきパイプを標準入力状態にしても、tail -f のような画面に
標準出力はできますがファイルへのリダイレクトは無理でした。
難しいですねぇ。。
442:名無しさん@お腹いっぱい。
07/05/17 00:48:16
tee の使い方間違ってるだけだろ
443:ウサチャソ
07/05/17 00:52:02
>>441
tail -f をパイプすると、上手く動かないよ。
GNUのだとどうなんだろ?
「tail パイプ バッファリング」
でググると、それっぽい事いっぱいでてくるYO
444:名無しさん@お腹いっぱい。
07/05/17 18:41:18
a.shに . b.sh として読み込まれるb.shが自分の名前がb.shであると知る方法はありますか?
445:名無しさん@お腹いっぱい。
07/05/17 18:50:24
>>444
ない。
. で読む場合は $0もセットされないし。
446:名無しさん@お腹いっぱい。
07/05/17 19:05:57
>>445
ありがとうございます。
あらかじめ埋め込んでおくしかなさそうですね…。
447:416
07/05/17 23:00:53
>>443
バッファの問題だったんですね。
通常のawkはやめて、gawkのfflush関数を使うことでうまくいきました。
ありがとうございました。
448:名無しさん@お腹いっぱい。
07/05/18 19:10:57
シェルスクリプトでログインログアウトを自動化するにはどうしたらいいでしょうか?
もし良かったら数行のコマンドでレスお願いします。
449:名無しさん@お腹いっぱい。
07/05/18 19:15:55
>>448
何をやりたいのかもうちょい詳しく。
450:448
07/05/18 19:59:20
>>449
1.現在rootでログイン中。
2.testユーザーでログインして何か作業をする。
3.そしてまたrootに戻る。
これを自動化したいです。
451:名無しさん@お腹いっぱい。
07/05/18 20:03:21
>>450
su test 何か
もしくは
su - test 何か
違いについては man su 等を参照。
452:名無しさん@お腹いっぱい。
07/05/18 20:30:15
>>451
間違ってるよ。man su 等を参照するべきなのはオマエ。
453:名無しさん@お腹いっぱい。
07/05/18 20:59:46
>>450
sudoじゃダメなんか?
454:名無しさん@お腹いっぱい。
07/05/18 21:30:20
>>448
testユーザで実行するバッチファイルを作っておいて、
su - test -c バッチファイル
で実行しる。
455:名無しさん@お腹いっぱい。
07/05/18 21:35:19
バッチファイル
バッチファイル
バッチファイル
バッチファイル
wwww
456:名無しさん@お腹いっぱい。
07/05/19 00:37:47
ほんとうにloginしたいならexpectを使うとか
457:448
07/05/19 03:04:26
rootでログイン中
expectでsu - testとして
touch /home/test.txtを実行して
再度expectでsu - rootでrootになっても
/home/test.txtは作成されてませんでした
なぜでしょう?
458:名無しさん@お腹いっぱい。
07/05/19 10:21:42
パーミッションじゃないの?
/homeにtestユーザは書き込めないんでは。
459:名無しさん@お腹いっぱい。
07/05/20 04:33:32
質問。
11.22.33を
33.22.11に文字を反転させたい。
460:459
07/05/20 04:42:15
459は取り消し!
11.22.33を
a[0]=11
a[1]=22
a[2]=33
のように配列に代入したい。
よろしくお願いします。
461:名無しさん@お腹いっぱい。
07/05/20 05:39:47
宿題でつか
462:459
07/05/20 06:19:25
宿題でつ
463:459
07/05/20 07:14:05
スレ汚してごめんなさいできまつた
464:名無しさん@お腹いっぱい。
07/05/20 21:56:12
テキストファイルに、ファイルの場所がずらずら書かれていて
-----
/usr/local/etc/pussy001.jpg
/usr/local/etc/pussy002.jpg
/usr/local/etc/pussy003.jpg
:
-----
そこに書かれているファイルを指定した場所に移動させたいんです。
で、こんな感じで動くスクリプトを書きたいなぁと考えているんですが
cat list.txt | grep jpg | mv.sh /work/pussy
この mv.sh の書き方が分かりません。
465:名無しさん@お腹いっぱい。
07/05/20 22:02:27
>>464
mv `grep jpg list.txt` /work/pussy
で、一発。・・・で、pussyってww
466:名無しさん@お腹いっぱい。
07/05/20 22:47:23
>465
残念ながら、ファイル名にスペースがあるとだめでした。
sh, tcsh, bashで試してみましたが、どれも同じです。
467:名無しさん@お腹いっぱい。
07/05/20 23:18:02
>>464 の例では、ファイル名にスペースが入ってないじゃないか。
そういう条件は先に例に含めて書くこと。
ファイル名にスペースがある場合のやり方ももちろん知ってるが、
わざわざ教える気にならないので俺はパス。
468:名無しさん@お腹いっぱい。
07/05/20 23:25:45
>>466
IFS='
' mv `grep jpg list.txt` /work/pussy
469:名無しさん@お腹いっぱい。
07/05/21 00:42:01
(while read f; do mv "$f" dest/ ; done) < file
>>467
ファイルの長さを考慮しないgrep戦法しか提示しなかった奴が
そんな理屈をこねても見苦しいだけ。
470:名無しさん@お腹いっぱい。
07/05/21 06:22:05
>>469
残念ながら、ファイル名に \ があるとだめでした。
471:名無しさん@お腹いっぱい。
07/05/21 10:38:53
じゃあ諦めな。
472:名無しさん@お腹いっぱい。
07/05/21 11:09:30
>>471
ファイル名の \ を考慮しないを考慮しないwhile read戦法しか提示しなかった奴が
そんな理屈をこねても見苦しいだけ。
473:名無しさん@お腹いっぱい。
07/05/21 11:17:06
というか、>>469 って、元の質問の jpg で grepするの忘れてるじゃん。
テストだったら0点。
474:名無しさん@お腹いっぱい。
07/05/21 11:25:38
でもテストじゃないよ。
475:名無しさん@お腹いっぱい。
07/05/21 11:33:37
そういう香具師が、「それはケアレスミス。答えはわかってた」とか後で言うんだよな。
476:名無しさん@お腹いっぱい。
07/05/21 11:37:45
なんでそんな完璧にこだわるんだろ。
質問者のヒントになればいいじゃん。
477:名無しさん@お腹いっぱい。
07/05/21 16:16:07
低能同士、仲良く!
478:464
07/05/22 00:44:46
すみません、御礼が遅れました。
という訳で >465 >468 >469 全て参考になりました。特にIFS=~は初めて
知ったので成程と関心しました。
この場をお借りして厚く御礼申し上げます。
479:名無しさん@お腹いっぱい。
07/05/22 00:59:36
xargsは?
grep jpg list.txt | xargs -i mv {} /work/pussy
480:名無しさん@お腹いっぱい。
07/05/22 12:09:35
>>479
空白が含まれているとダメだろ。
481:名無しさん@お腹いっぱい。
07/05/22 14:28:33
grep jpg list.txt | tr '\n' '\0' | xargs -0 -i mv {} /work/pussy
482:名無しさん@お腹いっぱい。
07/05/22 14:39:38
>>481
ファイル名に改行が含まれてるとだめだろw
483:名無しさん@お腹いっぱい。
07/05/22 19:06:13
sudo find / -name '*pussy*' -exec rm -rf \{\} \;
484:名無しさん@お腹いっぱい。
07/05/22 19:18:18
デリミタが改行なリストなんだから要素に改行は含められないんじゃ?
改行入りファイル名を考慮するならリストは改行文字以外で区切るべき
だと思う.
485:名無しさん@お腹いっぱい。
07/05/22 19:20:20
ファイル名に改行を入れるアホなんてほっとけ(w
486:ウサチャソ
07/05/22 21:00:22
試しに作ってみた。
% touch aaaa^Maaaa
% ls -lF
aaaa*--r-- 1 ウサチャソ users 0 5月 22 20:58 aaaa
表示バグってるよ…
487:名無しさん@お腹いっぱい。
07/05/22 21:19:38
改行と復改の区別ができないお子様は犬... 以下略
488:ウサチャソ
07/05/22 21:37:01
>>487
改行のみ入れるのは面倒臭かったんだスマソ
489:名無しさん@お腹いっぱい。
07/05/22 21:57:27
>>488
$ touch 'aaaa
aaaa'
だろ。
$ > 'aaaa
aaaa'
でも可。
490:ウサチャソ
07/05/22 22:14:31
CTRL+Vが楽だったんで、つい…
ちなみに、>>489 でも >>486 でもCygwinだと同じ表示。
-rw-r--r-- 1 ウサチャソ なし 0 May 22 22:10 aaaa?aaaa
今日始めて知った。
491:ウサチャソ
07/05/22 22:15:58
あ゛っごめん、Cygwinは「--show-control-chars」が必要だった…。
スレ違いなんでもう消えます、スマソ
492:名無しさん@お腹いっぱい。
07/05/24 20:33:53
質問します。
lsnrctl >>_EOF_
set log_file listener.tmp
RET=$?
if [ $RET -ne 0 ];then
logger -t loglog -p local1.notice "切り替えに失敗しました"
exit 1
fi
exit
_EOF_
という事をしたいのですがどうしてもsetコマンド以降エラーに
なってしまいます。
対処法を教えていただけないでしょうか?
493:名無しさん@お腹いっぱい。
07/05/24 20:51:21
逆だ。
lsnrctl <<_EOF_
494:名無しさん@お腹いっぱい。
07/05/24 20:55:16
あと、ヒアドキュメントの部分は、LSNRCTLのコマンドしか受け付けないぞ。
495:名無しさん@お腹いっぱい。
07/05/24 21:23:10
すいません逆に書いてました。
やはりLSNRCTLコマンドしか受け付けないですか・・・
う~ん、どうしてもLSNCTLの中でシェルスクリプトの処理の記述を
したかったのですが無理そうですね。
ありがとうございました。
496:名無しさん@お腹いっぱい。
07/05/28 07:13:03
質問。
ファイルの最終から20行を削除したい。
どうしたらいいでしょうか?
497:名無しさん@お腹いっぱい。
07/05/28 07:46:41
>>496
wc で数えて、head で切り出すぐらいしか考え付かない
498:名無しさん@お腹いっぱい。
07/05/28 08:09:27
awk
499:名無しさん@お腹いっぱい。
07/05/28 08:33:29
tac なんてLinuxでもないかぎり標準装備じゃない罠
cat file | tac | sed '1,20d' | tac
500:名無しさん@お腹いっぱい。
07/05/28 12:43:49
無意味なcat出た
501:名無しさん@お腹いっぱい。
07/05/28 14:05:40
tacが使えなければ sed '1!G;h;$!d' すればいいじゃない。
502:名無しさん@お腹いっぱい。
07/05/28 15:55:05
cat!出た!cat出た!得意技!cat出た!cat!これ!cat出たよ~~!
503:名無しさん@お腹いっぱい。
07/05/28 16:13:35
>>502
楽しそうだな
504:名無しさん@お腹いっぱい。
07/05/28 18:27:43
俺は限界だと思った
505:名無しさん@お腹いっぱい。
07/05/29 00:14:45
tail つかって最後から20行みれ
で、>>499しる
506:名無しさん@お腹いっぱい。
07/05/29 00:58:13
基本的にサブシェルはshを新たに起動するよりは動作が軽いですよね?
507:名無しさん@お腹いっぱい。
07/05/29 01:26:05
>>498
awkには入力ファイルの行数を保持する組み込み変数はないんじゃね?
だから、結局wcでカウントしないとダメだったり。
508:名無しさん@お腹いっぱい。
07/05/29 01:47:08
は?
awk '{a[NR]=$0}NR>20{print a[NR-20]}'
509:名無しさん@お腹いっぱい。
07/05/29 02:37:14
>>508 短くていいが、でかいファイル通すとメモリが…
510:名無しさん@お腹いっぱい。
07/05/29 02:54:34
無理して一行でやるより、行舐めの回数が少ない方が好きだな。
511:名無しさん@お腹いっぱい。
07/05/29 02:57:15
>>510 ワンパスだし。消費メモリを考えればいいと思うが。
512:名無しさん@お腹いっぱい。
07/05/29 03:15:32
>>499
は論外。
513:名無しさん@お腹いっぱい。
07/05/29 09:33:18
awk '{if (FNR>20) print a[FNR%20]; a[FNR%20]=$0}'
514:名無しさん@お腹いっぱい。
07/05/29 10:12:43
20行分だけバッファして遅延して出力させて
ファイル末尾に到達したら終了させるとか。
515:名無しさん@お腹いっぱい。
07/05/29 19:07:30
>>514
書いてみよう
516:名無しさん@お腹いっぱい。
07/05/29 19:20:43
>>514 は
>>513 がやろうとした事(間違ってるがw)
517:名無しさん@お腹いっぱい。
07/05/29 19:44:45
>>496
こういう場合、ed を non-interactive に使うのがいい。
最後20行ということは、$-19から $までだから、
echo '$-19,$d
w outfile
q' | ed infile
↑で桶。
518:名無しさん@お腹いっぱい。
07/05/29 21:46:07
sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'
519:名無しさん@お腹いっぱい。
07/05/30 08:58:50
>>516 間違ってる?
520:名無しさん@お腹いっぱい。
07/05/30 19:17:11
質問なんですが・・
#!/bin/sh -
tmpfile=/tmp/program.$$
cat "$1" | tr ' ' '\n' > tmpfile
while read word
do
grep ${word} "$2" | いろいろと処理・・・
done < tmpfile
てな感じのスクリプトなのですが、
第一引数のファイル中に、例えば -i と言うような語があると
grep がオプションと解釈するのか何なのか、直後に while ループが
終了してしまいます。
'${'"$word"'}' だと grep には ${word} として渡されてしまいます。
何とかシェルを騙して grep に '-i' として渡す方法は無いでしょうか?
(渡す前に条件判断して先頭文字が - なら sed などで先頭に \ を
付加すると言うのも行けそうな気はしますが、出来れば余計なIFとか
変数とか無しで行きたいものです)
521:名無しさん@お腹いっぱい。
07/05/30 19:35:35
grep -e
grep -
522:520
07/05/30 19:53:07
>>521
ありがとう。
シェルを騙さなくても grep の方で用意されていましたか、
良く考えりゃ当然ですね。
523:名無しさん@お腹いっぱい。
07/05/30 21:22:55
オプション -- で、それ以降はオプションとは解釈しないってのは
結構な数のコマンドで使える。
524:520
07/05/30 23:07:09
>>523
ですね。
これまで -- なんて、はぁ?って感じでしたけど、
実に有用性が高いですね。
勉強になります。
525:名無しさん@お腹いっぱい。
07/06/02 11:43:37
質問
インターネットに接続できるか試すコマンドってありますか?
やりたいこと
インターネットに接続できたら echo "できます"
インターネットに接続できなかったら echo "できません"
としたいです。
526:名無しさん@お腹いっぱい。
07/06/02 11:59:13
インターネットとLANの区別をしなくていいのかな?
527:名無しさん@お腹いっぱい。
07/06/02 12:05:24
多分、この程度の精度でOKなんだろ。
if ping -c 1 www.yahoo.com >/dev/null 2>&1; then
echo "出来ます"
else
echo "出来ません"
fi
528:525
07/06/03 03:05:39
>>562>>527
ありがとうございます
できればヤフーなどの特定のサイトに依存せず
確実にインターネットに繋がるかどうか判断したいです。
もし無理なら特定のサイトでも構いませんが
こういう場合通例としてyahoo.comを使うのが適切でしょうか?
529:名無しさん@お腹いっぱい。
07/06/03 07:09:14
接続できていると分かったら、どこかと通信するんでしょ?
その通信相手にすればいいよ。
530:名無しさん@お腹いっぱい。
07/06/03 07:21:06
>>528
何が目的なん?
531:名無しさん@お腹いっぱい。
07/06/03 08:59:25
その通信相手がICMPブロックしてるかも知れないから、ブロックしてない
www.yahoo.comとかwww.google.comとか使えばいい。
532:名無しさん@お腹いっぱい。
07/06/03 11:01:00
>>528
君のほうから、どことつながったらインターネットに繋がっていると言えるかの
判断基準を出してくれないと先に進めないと思うよ。
533:名無しさん@お腹いっぱい。
07/06/03 12:04:41
相手もそうだがプロトコルもな。
ファイアウォールの具合でICMP通らないかもしらんし。
534:名無しさん@お腹いっぱい。
07/06/03 23:19:33
まぁ、スレ違いだな。
535:名無しさん@お腹いっぱい。
07/06/04 07:59:35
>>527
>if ping -c 1 www.yahoo.com >/dev/null 2>&1; then
関係ないが、この 2>&1
エラー対策でつか?
536:名無しさん@お腹いっぱい。
07/06/04 14:12:29
遅レスだが、
tail -r ファイル名| tail +20 | tail -r
でもいけた(tailばっかりでカッコ悪いか)
537:名無しさん@お腹いっぱい。
07/06/04 21:46:12
>>535
終了ステータスだけとれりゃいいので、エラーメッセージとか捨てる。
538:名無しさん@お腹いっぱい。
07/06/04 21:50:18
それを捨てるなんて、とんでもない!
539:ウサチャソ
07/06/04 23:49:23
きのうはおたのしみでしたね。
ウホッ
540:名無しさん@お腹いっぱい。
07/06/04 23:51:56
*「おお しんでしまうとは なにごとだ!」
*「アッー!」
541:名無しさん@お腹いっぱい。
07/06/05 06:33:28
vmstat 1 の結果の左側に`date +%H:%M:%S`(時分秒)を付けて流して表示させようとしています。
以前、gawkでstrftimeを利用して同じ事をしたのですが、今回使ってるサーバのawkは
gawkでない為に別の方法が必要です。
どうもウマイ方法が思いつきませんで・・・ご教示お願いします。
542:名無しさん@お腹いっぱい。
07/06/05 08:54:12
Perlあるなら
vmstat 1 | perl -MPOSIX -pe 'BEGIN{$|=1} print strftime q{%H:%M:%S }, localtime'
543:名無しさん@お腹いっぱい。
07/06/05 08:59:20
これは重そうだけど
vmstat 1 | while read line; do echo `date +%H:%M:%S` $line; done
544:名無しさん@お腹いっぱい。
07/06/05 20:13:14
>>539-540
DQ I ?
545:541
07/06/05 22:31:39
>>542
HP-UX10.20だったのですがperlが入っていませんでした(汗
でも、これを機会にperlもちょっとづつ勉強したいと思います。どもでした。
>>543
readがそんな使い方できるとは知りませんでした。
おかげさまでばっちり動きました。ありがとうございます。
546:名無しさん@お腹いっぱい。
07/06/05 23:39:38
bash.infoの説明だと
echo hoge | read v
で
echo $V →hoge
になるように読める
で、できないってことはわかったんだけど結局readはどう使うんですか
なんでwhile中だとうまく動くんでしょう
547:名無しさん@お腹いっぱい。
07/06/06 00:17:57
サブシェルが起動するから。
read で代入する変数はサブシェルのものだから、親シェルに戻ると忘れる。
while でなくても、下のような書き方をすれば {...} の中にかぎり有効。
echo hoge | {
read v
echo $v
}
あと、ksh はふつーに可能だったような記憶がうっすらとあるが自信ない。
548:名無しさん@お腹いっぱい。
07/06/06 15:14:41
質問
シェルスクリプトを、windowsでCD-Rに焼き、linuxで実行すると
改行がコマンドとして認識され、command not foundとなってしまいます。
普通に改行を改行として認識させることはできないのでしょうか?
549:名無しさん@お腹いっぱい。
07/06/06 16:33:41
よくわからんが改行コードの問題? 改行コードをLFで保存できるテキストエディタ使えよ
550:名無しさん@お腹いっぱい。
07/06/06 16:52:46
>>549
ありがとうとざいます
LFで保存したところ大丈夫でした。
ただし1行目だけはなぜかcommand not foundとなってしまう。。
551:名無しさん@お腹いっぱい。
07/06/06 20:15:14
log=20070101.log
$logを 2007-01-01
という風に、[西暦]-[月]-[日]な形にしたいのですが、どすればよいでしょうか?
どなたか、お力をお貸し下さいませ。
.log と取って、4桁、2桁、2桁ごとに「-」を挟む。というのはわかるのですが
方法や何のコマンド使ってよいものやら見当もつきません。お願いします!
552:名無しさん@お腹いっぱい。
07/06/06 20:26:09
echo $log | sed 's/\(....\)\(..\)\(..\).*/\1-\2-\3/'
553:名無しさん@お腹いっぱい。
07/06/06 20:30:18
>>552 ありがとうございました!出来ました!
sedは使えるつもりでいたんですが、まだまだの若輩者でしたorz
こんなに早く答えて頂いて本当に助かりました。
554:名無しさん@お腹いっぱい。
07/06/06 23:42:52
じぇっとすとりーーーむ~
555:名無しさん@お腹いっぱい。
07/06/06 23:42:59
シェルが何かは分かったのですが、シェルスクリプトが良く分かりません…
専門用語を交えないで言うと、どういったものなのでしょうか?
556:名無しさん@お腹いっぱい。
07/06/06 23:44:51
シェルが何かどうわかったか、専門用語を交えずに説明してからだ
557:名無しさん@お腹いっぱい。
07/06/07 00:11:41
レストランのメニューがシェル。コース料理がシェルスクリプト。
大分違うな…
558:名無しさん@お腹いっぱい。
07/06/07 00:35:32
URLリンク(e-words.jp)
専門的な概念なのに専門用語使うなというのは無理な話。
559:名無しさん@お腹いっぱい。
07/06/07 02:08:21
>>557
その説明で開眼しました!!
今ならどんなプログラムも書けそうです!!
(^ω^)
560:名無しさん@お腹いっぱい。
07/06/08 00:50:30
if [ -e foo ] ;
then
echo "foo exists."
else
echo "foo does not exist."
fi
これを Solaris 8の bash, cygwinの sh, bashで実行するとOK。
でも Solaris 8の shで実行した時だけ
test: argument expected
と出てしまいます。どうにも分かりません。助けて下さい…
561:名無しさん@お腹いっぱい。
07/06/08 03:13:50
Solarisなどの旧式shのtestコマンドには-eというものはない。
これは外部コマンドのtestも同様。
562:名無しさん@お腹いっぱい。
07/06/08 06:27:46
>>561
ダウト。
Solarisの外部コマンド版のtestの実体はkshスクリプトだから、
Solarisでも外部コマンド版のtestには -eオプションがある。
ただし、純正Bourneには -eがないので、使わないこと推奨なのは同意。
[ -f foo ] あたりで代用だな。
563:名無しさん@お腹いっぱい。
07/06/08 08:29:58
grepコマンドで検索した行の前後三行を出力するコマンドってないすか?
たとえば、以下のようなファイルがある。
----------------------------
aaa
bbb
ccc
ddd
eee
fff
ggg
----------------------------
grepコマンドをつかって、
$ grep ddd -a 333
とすると
bbb
ccc
ddd
eee
fff
と表示されるようなやつよ。
564:名無しさん@お腹いっぱい。
07/06/08 08:45:56
>>563
-A とか -B とかない?
565:名無しさん@お腹いっぱい。
07/06/08 10:35:48
>>563
普通にgrepだけで行けるぞ
grep -A 3 -B 3 'ddd' filename
566:名無しさん@お腹いっぱい。
07/06/08 10:44:10
普通は-Aとか-Bなんてない。
567:名無しさん@お腹いっぱい。
07/06/08 11:01:46
何が「普通」かなんて人それぞれでしょ。
-A がある grep とない grep がある。
それだけ。
568:名無しさん@お腹いっぱい。
07/06/08 11:02:54
目的達成できるなら、それでいいじゃん
569:名無しさん@お腹いっぱい。
07/06/08 11:03:45
grep -n して
sedで : より前だけ取り出して
awkにくべて前後の必要な行番号を全部計算して
sort -nuして
sedでsedのコマンドに成形しなおして
sedで抽出。
てゆうか、grepにこだわらずにawk1個の方がめちゃ楽そう。
570:名無しさん@お腹いっぱい。
07/06/08 11:04:44
>>569
awkだけだとどうなるの?
571:名無しさん@お腹いっぱい。
07/06/08 11:29:37
FreeBSDは変にsed使うよりawk1本に絞った方が軽い。
572:名無しさん@お腹いっぱい。
07/06/08 11:43:53
複数行のテキスト整形には弱い
普通は、prelとかrubyを使う
まあ、perlとかruby使えないから聞いてるんだろうけど
573:名無しさん@お腹いっぱい。
07/06/08 11:52:15
>>572
sedやgrepでどうしようかななんて考えてる時間が無駄だよな
perl覚えちゃたほうがいいのにね、これを機会に
574:名無しさん@お腹いっぱい。
07/06/08 11:55:16
これを機会にGNU grep入れちゃえ。
575:名無しさん@お腹いっぱい。
07/06/08 12:00:44
パタン行より前の行も表示しないといけないのでawk一本だとちょっと手間でしょ。
perlやrubyを使ってもそれは同じじゃないかな。
sed+awkなら
sed -e "$(awk '/pattern/{for (i=-2;i<=2;i++)if(i+NR>=0)print (i+NR) "{p;d;}"}' file|sort -nu)"';d' file
zshでしか試してないのでクォート回りはshだと違うかも知れんが、
だいたいこんな感じで。
576:名無しさん@お腹いっぱい。
07/06/08 12:19:38
GNUは偉大だな、改めて思った
577:名無しさん@お腹いっぱい。
07/06/08 12:26:01
当たり前じゃね?
だってGNU拡張は、ユーザが便利だと思うものを実装して
拡張していったんだから
きっと、>>563みたいなことを、数年前にも同じといってる人が
現れてんだよw
それで拡張されてる
578:名無しさん@お腹いっぱい。
07/06/08 12:40:49
GNU sed awk grep を使いましょうね
579:名無しさん@お腹いっぱい。
07/06/08 15:54:55
俺はgawk派
580:名無しさん@お腹いっぱい。
07/06/08 16:04:21
ガウォーク
581:名無しさん@お腹いっぱい。
07/06/08 16:14:46
GNU is Not UNIX
の意味がやっとわかったようでなにより
582:名無しさん@お腹いっぱい。
07/06/08 16:21:47
んでけっきょく >>563 はどうしたの?
583:名無しさん@お腹いっぱい。
07/06/08 16:25:28
GNU教に入信する準備をしてます
584:名無しさん@お腹いっぱい。
07/06/08 16:29:28
しこしこ、書いてんじゃね
585:名無しさん@お腹いっぱい。
07/06/08 17:38:00
mac でターミナルで操作しているのですが、safariでgoogleなどのページで
キーワードを打ち込んで検索させたりはできないものなんでしょうか?
初心者なんで仕組みなどわかりませんので構造上できないものなら教えてください
586:名無しさん@お腹いっぱい。
07/06/08 17:49:58
>>585
URLリンク(pc11.2ch.net)
587:名無しさん@お腹いっぱい。
07/06/08 21:02:22
シェルスクリプトとGUIアプリの連携ってか?
588:名無しさん@お腹いっぱい。
07/06/08 22:41:28
質問です!
---hoge.txt---
aaa
bbb
ccc
これを
---hoge.txt---
aaa
ccc
こうしたい。
sed -i "s/bbb//g" hoge.txtだと
---hoge.txt
aaa
ccc
こうなってしまう・・・
589:名無しさん@お腹いっぱい。
07/06/08 22:49:06
sed -i -e '/bbb/d'
590:名無しさん@お腹いっぱい。
07/06/08 23:03:06
>>589
ありがとうございます!
591:名無しさん@お腹いっぱい。
07/06/08 23:37:42
GNU sedは正規表現のエスケープまわりが腐ってるんだよなあ
それに、わざわざBourne Shellに縛ったスレなのに、GNU拡張に依存するのもどうかと思う
ポータビリティも勘案すると、perl使った方がいい
592:名無しさん@お腹いっぱい。
07/06/09 10:18:52
GNU grepの-oは便利
593:名無しさん@お腹いっぱい。
07/06/09 11:53:54
>>592
モレも-Po がマジ便利だと思う。
594:名無しさん@お腹いっぱい。
07/06/09 12:23:49
それを言ったらshよりzshのが便利だ
595:名無しさん@お腹いっぱい。
07/06/09 12:49:24
そうだよ
596:名無しさん@お腹いっぱい。
07/06/09 14:42:53
FreeBSDよりWIndowsのが便利だ
597:名無しさん@お腹いっぱい。
07/06/09 14:54:08
当たり前だろ
598:名無しさん@お腹いっぱい。
07/06/09 15:01:51
perlの書法がもっと自由度低かったら決定版たったのだが。
お行儀悪く書けてしまうのが悩みの種
599:名無しさん@お腹いっぱい。
07/06/10 01:08:21
お行儀良く書きたいならRubyなりPythonなりへ行けば良い
お行儀悪く書いても心が痛まないのがPerlの長所
600:名無しさん@お腹いっぱい。
07/06/10 01:10:39
use strict; するんだからそれほどひどいコードにはならないような
601:名無しさん@お腹いっぱい。
07/06/10 22:37:24
どーせワンライナーか数行でやれるようなのしかPerlで書かないから
どうでもいい
602:名無しさん@お腹いっぱい。
07/06/15 02:31:42
cshを勉強し始めたものです。
研究室で使うためです。
C言語もほとんど知らないので、取っ付きにくく、苦労してます。
今よく分からないのは、シェル変数と環境変数です。
普通に話に出てくるのですが、変数だとは理解してますが、違いが分かりません…
どなたか教えて頂けませんか?
603:名無しさん@お腹いっぱい。
07/06/15 02:41:57
シェル変数はシェルが使う
環境変数は(主に)呼び出されたコマンドが使う
それはいいとして、なんでcshかちゃんと確認しろ
csh使う必然性がなければ、shにしとけ
604:名無しさん@お腹いっぱい。
07/06/15 03:12:03
環境変数は子プロセスに引き継がれる。
シェル変数はそのシェルのみが使い、
子プロセスに引き継がれない。
605:602
07/06/16 01:09:53
レス有り難うございます。
なぜcshなのかと言うと、 今研究室で使われてるのがcshだとしか…
Cで書かれたソースプログラムをcshに渡して、
結果を他のプログラムに渡して……
って感じらしいです。
まだ学部なので、難しいプログラムは書けず、
既成のプログラムの値を変えて走らせたりするようです。
最近の課題が、あるcshの中身を渡され、理解してくるものでしたが、
プログラムの知識が無い自分にはさっぱりというわけです…
606:名無しさん@お腹いっぱい。
07/06/16 01:58:47
そんなに何種類もcshがあるのか?
607:名無しさん@お腹いっぱい。
07/06/16 03:31:44
cshで書かれたシェルスクリプトってとこじゃないか?
608:名無しさん@お腹いっぱい。
07/06/16 15:17:35
いや、cshの中身だぞ?
609:名無しさん@お腹いっぱい。
07/06/16 15:47:46
とりあえず>>605よ、
cshの中身というのはcshスクリプトという意味か?
610:名無しさん@お腹いっぱい。
07/06/16 16:11:27
こらこら、cshの話はもう終り。禁止。
611:名無しさん@お腹いっぱい。
07/06/16 16:53:10
GNU grepの話をしてもいいなら、cshも良くないか
612:名無しさん@お腹いっぱい。
07/06/16 18:01:05
良くない。
613:名無しさん@お腹いっぱい。
07/06/16 18:02:26
シェルスクリプトのスレでシェルのソースコードの話かぁ……
614:名無しさん@お腹いっぱい。
07/06/16 19:35:05
質問です。
ファイルの内容が同じものをリストアップする目的で、
対象ファイルのmd5sumを計算したいと考えています。
ただし、ファイルが大きいと時間がかかってしまうので、まずはファイル頭の
512バイトだけでmd5sumしたいです。以下のようなものを書いたのですが、
ファイル数が多い(1000とか)とプロセスの起動がボトルネックになってしまう
ようで、遅いです。
while read -r filename
do
dd if="${filename}" ibs=512 count=1 2> /dev/null | md5sum >> output
done < ${tempfile_prefix}2_filesize_onajiyatu
md5sumに先頭から512バイトだけで計算しろと指示することはできますか?
もしくは何かいい案ありますでしょうか?
615:名無しさん@お腹いっぱい。
07/06/16 19:45:20
えろ画の整理スクリプトかよ
616:名無しさん@お腹いっぱい。
07/06/16 19:49:09
違います。
エロ動画です。
だからでかいのです。
617:名無しさん@お腹いっぱい。
07/06/16 19:52:32
>>614
プロセス起動がネックならperlとかpythonとかrubyとか好きなのでやれ。
618:名無しさん@お腹いっぱい。
07/06/16 19:53:08
>>614
perl を使う
619:名無しさん@お腹いっぱい。
07/06/16 20:02:27
まずはファイルサイズで比較すればいいのに
620:名無しさん@お腹いっぱい。
07/06/16 20:11:47
粗く分けるのにmd5なんか使わんでも。
>>619 の通りファイルサイズが手軽だし、もし同じサイズで内容が違うものが
沢山ならファイル中の適当なところをhexdumpでもいいんじゃないの。
621:名無しさん@お腹いっぱい。
07/06/16 20:37:43
横から済まぬが
>>619,620
>> ${tempfile_prefix}2_filesize_onajiyatu
って書いてあるから、そもそも同じサイズ限定ではないのか?
622:名無しさん@お腹いっぱい。
07/06/16 20:40:36
同じファイルサイズのものだけでも1000ファイルもあるって、
結構集めまくったね、絵炉動画をw
623:名無しさん@お腹いっぱい。
07/06/16 21:03:28
>617,618
perlか・・・ついに手を出すときが来たか
>619,621
失礼しました。サイズ比較をあらかじめこんなのでやってます。
ls -l "$@" | sed 's/ \+/ /g' | cut -d ' ' -f 5,8 > ${tempfile_prefix}1_filesize_all
awk '{ if(a[$1,0]==0){a[$1,0]=1;a[$1,1]=$0;} else{if(a[$1,0]==1){print a[$1,1];} a[$1,0]++;print $0;} }' \
${tempfile_prefix}1_filesize_all > ${tempfile_prefix}2_filesize_onajiyatu
>620
ためしに512byteのgomi.txtを作ってみて、以下試しました。
%time (for i in `seq 1 1000`; do cat gomi.txt > /dev/null 2>&1 ; done;)
-> 1.486sec
%time (for i in `seq 1 1000`; do md5sum gomi.txt > /dev/null 2>&1 ; done;)
-> 1.510sec
これくらいのサイズだと処理内容はあまり影響なさそうです。
md5sumの方が比較しやすかったのです。
>622
いやいや、得ろ動画とか1000個とか例えばの話ですよw
624:名無しさん@お腹いっぱい。
07/06/17 00:32:06
>>614
まずは、ファイルサイズではじいたら?
625:名無しさん@お腹いっぱい。
07/06/17 00:34:24
すまん。@bitwarpなもんで、更新漏れだった。
忘れてくれ
626:名無しさん@お腹いっぱい。
07/06/17 03:14:21
xargsでもつかえば?
627:名無しさん@お腹いっぱい。
07/06/17 04:00:08
気が向いたんでやってみた
$ time (for f in tmp/*; do dd if=$f bs=512 count=1 2>/dev/null | md5sum; done)
065d30715dcffa21596406373a9124ac -
...中略...
ed4cf7b8f209f9ce630b5e76219357ae -
(; for f in Desktop/*(.); do; dd if=$f bs=512 count=1 2> /dev/null | md5sum; ) 0.09s user 0.38s system 49% cpu 0.960 total
$ time perl -M'Digest::MD5(md5_hex)' -e 'for (@ARGV) { open F,"<$_"; read F,$a,512; print md5_hex($a),"¥n" }' tmp/*
065d30715dcffa21596406373a9124ac
...中略...
ed4cf7b8f209f9ce630b5e76219357ae
perl -M'Digest::MD5(md5_hex)' -e Desktop/*(.) 0.02s user 0.02s system 18% cpu 0.193 total
628:名無しさん@お腹いっぱい。
07/06/17 17:51:50
xargs使えって
629:名無しさん@お腹いっぱい。
07/06/17 20:19:20
絵炉動画ファイルは、ファイル名にスペースとか特殊記号とか入りまくりである
ことが多いため、xargsは全く持って不適当。
630:名無しさん@お腹いっぱい。
07/06/17 21:13:28
それならfor文やreadでも難しくならないか・・
まxargsのほうがもっと不適当なのだろうが
631:名無しさん@お腹いっぱい。
07/06/17 21:16:22
>>629
man xargs
632:名無しさん@お腹いっぱい。
07/06/17 21:24:09
>>631 は何がしたいんだろうか? まったく外してるわけだが、、
633:名無しさん@お腹いっぱい。
07/06/17 21:26:16
>>631
$ ssh solarishost man xargs
634:名無しさん@お腹いっぱい。
07/06/17 21:33:38
ファイル名の問題以前に、個々のファイルごとに頭の512バイトを切り出したいわけ
だから、xargs使ったところでプロセス起動数は節約できない。
よって、>>626 >>628 は全く的はずれ。
635:名無しさん@お腹いっぱい。
07/06/17 21:34:10
>>632
はずしているのはお前の方。
find ~ -print0 | xargs --null
636:名無しさん@お腹いっぱい。
07/06/17 21:47:33
>>635
はずしているのはお前の方。
-print0 や xargs --null は、一般には使えない。(たとえばSolaris)
あと、>>634 が指摘してるように、今回の件は xargsでは解決しない。
よって、そういう意味でも外しているのは >>635 の方。
637:名無しさん@お腹いっぱい。
07/06/17 22:10:53
-print0で喜んでるのは石器人。
現代人はふつー find ... -exec ... +
638:名無しさん@お腹いっぱい。
07/06/17 22:21:02
>>632 から某頭の悪い粘着君臭がする。
639:名無しさん@お腹いっぱい。
07/06/17 23:03:19
て言うか、プロセス起動数が云々と言うなら md5sum を改造するなり、
ファイル名の取得からハッシュの計算までやるようなアプリ作ればい
いじゃん。
640:名無しさん@お腹いっぱい。
07/06/17 23:14:55
>>617-618で既に正答が出てるの何を今更…
641:名無しさん@お腹いっぱい。
07/06/18 00:13:31
答えそのものも>627に出てるわけだが...
642:名無しさん@お腹いっぱい。
07/06/18 00:36:28
#find ... -exec ... +
横レスだが知らなかった
ってか手元のmanにはない
643:名無しさん@お腹いっぱい。
07/06/18 03:34:11
最後の「+」ってなに?
644:名無しさん@お腹いっぱい。
07/06/18 08:19:20
xargsは同じプロセスを連続起動するから
工夫されていると聞いたことがある。
これは事実?
645:名無しさん@お腹いっぱい。
07/06/18 15:14:11
基礎的な質問ですいません。
bashで、シェル変数に値を突っ込み -zで存在を確認する手法ですが、
if [ -z $test ] ; then
echo "val exist"
else
echo "val isn't exist"
質問
1.[ -z $test ] と書くのはよろしくない?
2.[ -e $test ] とすると、シェル変数が存在しない時に真、
シェル変数が存在する時に偽となるのはなぜ?
結構、このパターンで利用してたのですが、2.の動作を確認すると、
なぜだか逆になっているような。じゃ、-zもよろしくないのかなぁ、と
ところで、みなさんは、環境変数やシェル変数の存在確認をどうやってますか?
宜しくお願いします。
646:名無しさん@お腹いっぱい。
07/06/18 15:23:43
>>645
まず、[ ] の中ではシェル変数は基本的にダブルクォートを付けること。
[ -z "$test" ] とする。この場合、$testがセットされていれば偽になる。
これだと真偽が逆になってわかりにくいので、
[ -n "$test" ] または -n は省略できるので [ "$test" ] とする。
[ -e $test ] は、$testがセットされていない時、[ -e ] となってしまい、
これは、"-e" という文字列がサイズゼロかどうか(この場合は2バイト)という
判定がなされるため、$testがセットされていないと真になる。
一方、$testがセットされていると、今度は -e は -eオプションとして解釈され、
$testの中身がファイル名とみなされるため、そんなファイルがなければ偽になる。
更に言うと、-e は Bourne shでは使えないため非推奨。
647:名無しさん@お腹いっぱい。
07/06/18 15:39:39
>>646
ありがとうございます。
うーーん、なるほど。1行目でよく分かりました。
648:名無しさん@お腹いっぱい。
07/06/18 16:11:12
丁寧に説明してもらった理由を理解したのかしてないのかよくわからん回答だな
649:名無しさん@お腹いっぱい。
07/06/18 16:12:07
このあたりものこともあって zsh で手抜きスクリプト書くことが多くなった
650:名無しさん@お腹いっぱい。
07/06/18 16:24:47
>>648
舌足らずですみません。
1行目で自分の間違いを気付き、
詳しい説明をしていただいたので助かりました、と書きたかったところでした。
-eオプションの非推奨コメントは特に助かります。
651:名無しさん@お腹いっぱい。
07/06/18 21:09:56
______
/ )))
/ /// /――-ミ
/ 彡彡 // / ヽ))
/ 彡彡 iiiiiiiiiiiiiii iiiiiiiiii|
/ 彡彡 < ・ > 、<・ >l
/ | ヽ 〉
/ ( | | __) | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
/ | ≡ /, ―― |ゝ < 馬鹿共にshellを与えるな!
/ | | L ___」 l ヾ \_________
_ミ l ______ノ ゞ_
| l ヾ ー / | l
| | \ー ‐/ | |
652:名無しさん@お腹いっぱい。
07/06/19 08:10:33
>>646
>>更に言うと、-e は Bourne shでは使えないため非推奨。
?????
653:名無しさん@お腹いっぱい。
07/06/19 08:30:50
>>652
教えて欲しいんなら「???」じゃなくて、ちゃんと日本語で書け。初心者君。
654:名無しさん@お腹いっぱい。
07/06/19 09:19:43
ところで-eがないshが標準で載ってるOSってどれ?
655:名無しさん@お腹いっぱい。
07/06/19 09:36:14
Solarisとか。SCOとか。Tru64とか。
656:名無しさん@お腹いっぱい。
07/06/19 11:36:15
>>655
今では使われていないOSばかりですね。じゃあ、-e使ってもいいですねw
657:名無しさん@お腹いっぱい。
07/06/19 11:45:45
つっ、釣られないぞ
658:名無しさん@お腹いっぱい。
07/06/19 13:41:51
>>653
では日本語で書かせていただきます。
私が学習に使用している O'REILLY の「詳解シェルスクリプト」によりますと、
/bin/sh 組込の test コマンドに於ける -e 表現は標準的なものとして記述され
POSIX で定義している旨明記されております。また更に今回の議題の発端である
>>645 質問子の環境と共通する bash 等での独自の拡張に付いて記述した件では、
条件判定構文中の -a 演算子について(非推奨です。 -e を使いましょう)
とまで明記されているものを、使用者の環境の多用性や使用目的の別など勘案せず
一言の下に「非推奨」と断定できる根拠を教えてください。 お願いします。
659:646じゃないけど
07/06/19 13:47:32
>>658
「Bourne shでは使えないため」って書いてあるじゃん。
それが重要かどうかは各自が判断すればいいこと。
660:名無しさん@お腹いっぱい。
07/06/19 13:51:15
>>658
POSIXは理想論ばかりで、現実に即してないんだよ。
いくらPOSIXでどうこう言っても、実際に動くかどうかがすべて。
test -e については、Solarisの/bin/shで動かないんだから、
OS共通のシェルスクリプトでは非推奨であるのは当然。
あと、別件で、-e の意味で -aを使ってはいけない(非推奨)なのはその通りだよ。
-a は別に ANDの演算子の意味があって、そちらの意味で使うべきだからね。
わかったら、今後は -e を使うなよ。今まで書いたシェルスクリプトで
-e を使ってるのがあったら、気づき次第直しとけよ。
661:658
07/06/19 14:12:59
予想通りの回答をどうもありがとうございました。
>>わかったら、今後は -e を使うなよ。今まで書いたシェルスクリプトで
-e を使ってるのがあったら、気づき次第直しとけよ。
ご心配有り難うございます。
そもそも機能が曖昧過ぎて過ぎて使おうと思ったことも御座いませんw
662:名無しさん@お腹いっぱい。
07/06/19 14:15:20
予想してたなら聞く必要ないだろ……。
むだに波風立てんなよ。
663:名無しさん@お腹いっぱい。
07/06/19 22:13:27
シェルスクリプトの互換性過敏症な奴っていじると面白いんだよ
664:名無しさん@お腹いっぱい。
07/06/19 23:22:07
ここにもユトラーか・・・・
665:名無しさん@お腹いっぱい。
07/06/19 23:28:40
>>663
export LANG=C とか書いてるのを見ると反応してしまうのは互換性過敏症ですか?
666:名無しさん@お腹いっぱい。
07/06/19 23:56:18
いや寧ろ互換性を指摘できる人がいて有難い
667:名無しさん@お腹いっぱい。
07/06/20 00:19:14
そんなこといって年寄りほめたらわらわらわいてくるぞ。
SunOS 3.5世代の俺なんかまだまだ甘ちゃんだ。
668:名無しさん@お腹いっぱい。
07/06/20 05:31:28
沸いてきてくれ
それぞUNIXの面白さの真髄だわ
669:名無しさん@お腹いっぱい。
07/06/20 09:12:11
仕事では一緒になりたくねえけどなw
670:名無しさん@お腹いっぱい。
07/06/20 21:45:49
ようするに、 POSIX が理想論で現実に即していないのは当然の話で、
現実がバラバラだから標準化が必要という理念が生まれたわけですわな。
で、各プラットフォームでそれぞれ POSIX に準拠する姿勢を示していながら
どうしても譲れない仕様への拘りがあるから未だに移植性の問題が取沙汰される。
そこの処の理を語らずに、只単に○○では使える or 使えないという議論に
終始するというのは如何にも思慮が浅いと言わざるを得まい。
671:名無しさん@お腹いっぱい。
07/06/20 22:08:39
実社会ではそういうもんだ
672:名無しさん@お腹いっぱい。
07/06/20 23:20:26
携帯電話みたいなものだね
いまだに携帯電話つかわないもうろくジジイとかいるかなw
673:名無しさん@お腹いっぱい。
07/06/21 01:34:39
じじいじゃないけど使ってないよ。
674:名無しさん@お腹いっぱい。
07/06/21 01:36:56
うわw
675:名無しさん@お腹いっぱい。
07/06/21 01:38:49
携帯電話使わない仕事というと、医者とかパイロットくらいか
676:名無しさん@お腹いっぱい。
07/06/21 01:53:54
というか、どこが「携帯電話みたいなもの」なのかさっぱりわからん。
677:名無しさん@お腹いっぱい。
07/06/21 03:01:35
痴呆がはじまった?
678:名無しさん@お腹いっぱい。
07/06/21 23:19:43
>>670
こだわりなんかないだろ、準拠するのが面倒なだけだよ。
準拠したからって売れ行きがたいして変わるわけでもないし。
>>675
院内では携帯は使わないけど緊急呼び出しが頻繁にあるような
医者もいるからなぁ。
パイロットは仕事中は使わないけど、そういう意味なら電車の
運転手なんかも同じだな。
て言うか、仕事中とか会社の中に限定すると携帯持たない/持て
ない奴はそれなりにいるし。
679:名無しさん@お腹いっぱい。
07/06/22 00:04:29
ケータイでも3G(高周波のやつ)は大丈夫らしいけど。
680:名無しさん@お腹いっぱい。
07/06/22 09:16:46
使えない奴にかぎって、くだらねえことに拘ってたりする
681:名無しさん@お腹いっぱい。
07/06/22 20:12:44
そろそろUNIXの話にでも戻す?
682:名無しさん@お腹いっぱい。
07/06/22 20:59:20
よしなに
683:名無しさん@お腹いっぱい。
07/06/22 23:11:19
>>678
>>準拠したからって売れ行きがたいして変わるわけでもないし。
売行きが変わらないからって騒ぐこともないでしょ。
拘りがなければ準拠する方がはるかに楽なのにねぇ
あくまで /bin/sh 標準なのは基本であって、実勢はケースバイケースで、
linux じゃ bash 標準だろうし、 solaris だって適宜 ksh なり使うだろうし、
パーソナルユースや $HOME/bin 限定使用とか、管理者でも同一プラット
ホームだけでの運用が多く、移植性のプライオリティーがさほど高くない
現況において、やいのやいのいう奴は要するに「言いたいだけ」ちゃうんかと。
684:名無しさん@お腹いっぱい。
07/06/22 23:53:48
> 拘りがなければ準拠する方がはるかに楽なのにねぇ
何が楽なのか詳しく書いて欲しいんだが。
商用ソフトってちょっと変えると、検証がスゲー大変なことぐらいは知ってるよな?
685:名無しさん@お腹いっぱい。
07/06/23 00:08:17
楽しいもの見つけてしまった。
URLリンク(sed.sourceforge.net)
URLリンク(www.student.northpark.edu)
組込みで使っているLinuxにgrepが入ってなくて
sedでシミュレートしたスクリプト書いたんだけど、
それ以上のことがいろいろできそうな感じなり。
おまけ
URLリンク(www.fepus.net)
686:名無しさん@お腹いっぱい。
07/06/23 00:11:08
>>683
Solarisは古いshとkshを選択できるからいいけど、
HP-UXとかAIXは/bin/shはkshそのもなんで選択の余地はない。
シェルごときで移植性とか言ってるアホが多いっていうのは同意。
687:名無しさん@お腹いっぱい。
07/06/23 03:31:47
視野が狭いのって、幸せでいいよね。
688:名無しさん@お腹いっぱい。
07/06/23 08:31:29
そう?いまどきシェルの互換性なんか気にしてる奴って幸せそうに見えないが。
689:名無しさん@お腹いっぱい。
07/06/23 09:38:27
シェルはさまざまなコマンドと組み合わせて使うしな。
コマンドにも完全な互換性がない以上、シェルスクリプトの互換性や移植性を気にし過ぎるのはアホ。
ささっと書いてテストして動きが変だったら、そのとき直せばいい。
シェルってそういうライトな使い方をするためのものでしょ。
690:名無しさん@お腹いっぱい。
07/06/23 10:04:55
互換性のことも知らずに、暢気に
[ -e file ] とか、export HOGE=hoge とか書いて、
「動いたからOK」とか言ってる香具師の方がアフォに見えるけどな。
691:名無しさん@お腹いっぱい。
07/06/23 10:28:19
「さくっと直せばいいじゃん」って言ってる奴はだいたい直したことがない奴だし。
692:名無しさん@お腹いっぱい。
07/06/23 10:32:04
そもそも、直す必要なんてない、動くから
693:名無しさん@お腹いっぱい。
07/06/23 11:05:10
>>692
>>690
694:名無しさん@お腹いっぱい。
07/06/23 11:08:34
何が問題か、具体的に
695:名無しさん@お腹いっぱい。
07/06/23 12:54:51
問題を理解できていないことが問題なんだろ。
696:名無しさん@お腹いっぱい。
07/06/23 13:08:14
互換性がいるのは移植する可能性がある場合だろうかと。
あるいは環境が一部不明な場合か。
ただ、知識としてはあれば有効だろうが
697:名無しさん@お腹いっぱい。
07/06/23 14:23:00
開発当初は特定のシステム限定であったとしても、実社会では
いつのまにかそんな制約はなくなってしまうものなのだよ。
ニートにはわからないだろうが。
698:名無しさん@お腹いっぱい。
07/06/23 14:53:17
自分の体験したことが、現実の全てだと思っている>>697がいるスレはここですか?
699:名無しさん@お腹いっぱい。
07/06/23 15:16:00
>>698
「全ての」と「存在する」の違いを未だ習ってないのかい? ぼーや
700:名無しさん@お腹いっぱい。
07/06/23 15:20:19
シェルで移植性の高いスクリプトを書くのはめんどうくさいので
Perlを使うようになりますた
701:名無しさん@お腹いっぱい。
07/06/23 16:25:18
それはそれで別の移植性の低さが問題になりそうな…
702:名無しさん@お腹いっぱい。
07/06/23 16:36:58
Solarisさえ無くなればシェルの互換性の問題はほとんど解決するよね。
703:名無しさん@お腹いっぱい。
07/06/23 16:55:08
UNIXのソフト開発標準を策定しようという取り組みはたくさんあった。
だがそうした標準は、POSIX(Portable Operating System Interface)のように
一般的過ぎて役に立たないか、あるいはUNIX戦争として知られる
Open Software Foundation対UNIX Internationalの企業連合間抗争に
巻き込まれるかだった。
704:名無しさん@お腹いっぱい。
07/06/23 17:09:49
mkmfのようにメタスクリプトを環境依存シェルスクリプトにコンパイルする
プログラムがあるといいと思います!
705:名無しさん@お腹いっぱい。
07/06/23 17:11:11
mkmfって、、また古い遺物を持ち出してきたなぁ、、
706:名無しさん@お腹いっぱい。
07/06/23 20:29:52
本当にそんな互換性が必要ならlintの一つや二つとっくにありそうな気がするが、
寡聞にして知らないなあ。
707:名無しさん@お腹いっぱい。
07/06/23 20:33:44
>>706
つ dash #まあ呼び出したコマンドの互換性まではチェックできないわけだが・・・
708:名無しさん@お腹いっぱい。
07/06/23 20:36:48
役に立たない、ただそれだけ
709:名無しさん@お腹いっぱい。
07/06/24 05:17:26
すべてのシェルが/bin/shを名乗るのを止めて
/bin/shを永久欠番化すれば解決
710:名無しさん@お腹いっぱい。
07/06/25 02:26:09
なんかすごい扱われようだな。
互換性を述べている人は割とバランスの取れたUNIX流の解釈だと思うぞ
711:名無しさん@お腹いっぱい。
07/06/25 03:02:50
どうせUnixなんて適当じゃねえか
varとかetcとか
システム変えることになったらどうせテンヤワンヤだ
712:名無しさん@お腹いっぱい。
07/06/25 05:49:56
ということにしたいんですね:)
713:名無しさん@お腹いっぱい。
07/06/25 23:17:51
>>710
素直に自分よりの解釈だと言えば?
714:名無しさん@お腹いっぱい。
07/06/25 23:43:08
>>685のは結構凄いと思うが、
>>517のedのヤツはもっと凄いな。
オレもed好きになろう。
715:名無しさん@お腹いっぱい。
07/06/26 15:37:00
edで日本語がうまく扱うほうほうがあれば言うことないのだが・・・・
716:名無しさん@お腹いっぱい。
07/06/26 15:40:11
sedにin-placeオプションがなくてperlをよく知らなかったころは
edでやってたな
717:名無しさん@お腹いっぱい。
07/06/26 15:40:12
>715
edより先におまえが日本語をうまく扱えるようになる必要がありそうだ
718:名無しさん@お腹いっぱい。
07/06/26 15:44:41
誰がうまいこといえと
719:名無しさん@お腹いっぱい。
07/06/26 21:37:41
てか、蒸し返すようで恐縮だけど
シェルスクリプトって、基本的に ash と ksh と bash で動けば
移植性で問題になることは極めて低いよね?
この三つで動いても駄目な環境って今どれほど実運用されているのだろうか?
720:名無しさん@お腹いっぱい。
07/06/26 23:39:23
>>719
Solarisが問題だな。Solarisにはkshが標準で付いてるとは言え、
シングルユーザモードでは使えない。
シングルユーザモードを含めたシステムスクリプトは依然、
/bin/shか/sbin/sh(単にstatic linkというだけで中身は/bin/shと同じ)の
範囲内で書く必要がある。
誰かが書いてたように、Solarisが無くなる(もしくは影響力が無くなる)なら、
シェルの互換性の問題は一気に解決するだろう。
721:名無しさん@お腹いっぱい。
07/06/27 00:25:59
Solarisの/binは/usr/binへのシンボリックリンクだからkshやbash使ってもいいんじゃない?
/usr/binの中には/bin/kshで書かれたコマンドもけっこうある。
Solarisのshの動きがヘンなのはたしかにときどきちょっと困る。
722:名無しさん@お腹いっぱい。
07/06/27 00:42:18
> Solarisの/binは/usr/binへのシンボリックリンクだから
マジで?
723:名無しさん@お腹いっぱい。
07/06/27 00:46:28
> シングルユーザモードでは使えない。
> シングルユーザモードでは使えない。
> シングルユーザモードでは使えない。
724:名無しさん@お腹いっぱい。
07/06/27 00:50:42
>>721
マジだよ。/sbinは別れてるけど。
>>720は/usrがマウントできない状況のことを言ってるんだと思うけど最近は/と/usrを分けないのもふつうなんじゃないかな。
725:名無しさん@お腹いっぱい。
07/06/27 00:53:11
どっちかっつーとそういう問題でなくて、
ふつースクリプトは#!/bin/shで書くけど/bin/shが何だかわかんねーじゃん?
って話では?
726:名無しさん@お腹いっぱい。
07/06/27 02:29:26
>>722
HP-UXもだな。
727:名無しさん@お腹いっぱい。
07/06/27 02:31:28
ashもいろいろ修正入ってる。
Solarisの/bin/shはそれこそSystemV7のころのものとほとんど変わっていない。
728:名無しさん@お腹いっぱい。
07/06/27 03:37:47
・・・ってシェルを使えじゃなくてPOSIXだか何かのsh規格に沿って書けって事だよな。
729:名無しさん@お腹いっぱい。
07/06/27 07:44:21
>>721
じゃなくて、シングルユーザーモードの時、
/sbin/shはあるが、
/sbin/kshは無い。
/sbin/shはstatic linkの/bin/sh(/usr/bin/sh)
だから、シングルユーザーモードも含めれば、
結局 /bin/shの文法の範囲で書かざるを得ないという話。
しかも、Solarisの/bin/shは古いままなので、
export a=b も、$(command)も test -e も、
ちょっと新しい書き方はすべて使えない。
730:名無しさん@お腹いっぱい。
07/06/27 08:03:47
互換性の話に便乗だけど、
一部のスクリプトで、未だに
${1+"$@"} って書いてあるのがある。
これ、もう "$@" でいいんじゃないか?
引数が0個の時に ""が残らないようにする措置だろうけど、
Solarisの/bin/shですらそんな不具合は発生しない。(確認済み)
なので、"$@"と書いて問題ないし、視認性上も "$@"と書くべきと思うんだが。
本当に ${1+"$@"}と書く必要がある /bin/shを搭載したOSって、
現存してる?
731:名無しさん@お腹いっぱい。
07/06/27 22:07:07
>>729
なんか Solaris のシングルユーザモードって不便そうですね。
CD 6枚焼いたけど、インストールを躊躇してしまうよ。
732:名無しさん@お腹いっぱい。
07/06/27 22:19:42
/ と /usr をわけたりしなければ気にする必要ないよ。
733:名無しさん@お腹いっぱい。
07/06/27 23:07:41
>>724, >>726
なるほどねぇ、知らんかったよ。ありがと。
>>730
書き換えるのが面倒なだけなんじゃないか?
目障りだと思うなら、君が片っ端から書き換えて動作検証してあげればいいと思う。
734:名無しさん@お腹いっぱい。
07/06/27 23:19:19
>>732
すんません BSD ユーザなもので、 / と /usr を分けるというのが
イマイチ良く解かりません。
ad0s1a に全部突っ込めって事ですか?
/var も /tmp も含めて・・・(よーするに swap 以外は同じパーテーション?)
Solaris だとそんなの有りなんだぁ。(BSDでも無いことは無いけど、なんだか・・)
735:名無しさん@お腹いっぱい。
07/06/27 23:36:43
OSは別に関係ない。パーティションの切り方なんて好みの問題だ。
736:名無しさん@お腹いっぱい。
07/06/27 23:43:05
>>735
でも、その好みの問題に対して Solaris はシングルユーザモードの
挙動をもってして、ユーザに介入してくる分けでしょう?
>>732 のレスからは、そういう風に読めるのだが?
737:名無しさん@お腹いっぱい。
07/06/28 00:09:08
どうでもいいけどよそでやってくんないかな。
738:名無しさん@お腹いっぱい。
07/06/28 05:10:23
>>730 の ${1+"$@"} てどうゆう意味なの??
なんか理解できん・・・(TT
739:名無しさん@お腹いっぱい。
07/06/28 05:18:04
>>734
NetBSDのデフォルトは分けないからBSDユーザーってのは言い訳にならない。
740:名無しさん@お腹いっぱい。
07/06/28 07:33:15
あと、未だに
if [ X$HOGE = X ]
なんてのも見かける。これも、
if [ "$HOGE" = '' ]
と書いたほうがいい。
むかーしのバージョンのtestで、$HOGEの内容が = だったような場合、
[ = = '' ] みたいになるとエラーになるtestに対する対処として、
X$HOGE とかいう回避法があったけど、今の testコマンドでそれが必要なのは
もう現存しないはず。
741:名無しさん@お腹いっぱい。
07/06/28 14:01:16
>むかーしのバージョンのtestで、$HOGEの内容が = だったような場合、
ちがう。
$HOGE の内容が -f だったような場合に対する対処だから、今でも有効。
742:名無しさん@お腹いっぱい。
07/06/28 14:16:42
>>741
$HOGE の内容が -f でも正常に動くんだけど。
[ -f = hoge ] みたいに、項が3つある時は、
-fはファイル存在オプションとはみなされないから
-f だった時駄目になるような/bin/sh搭載した OSって 何?
743:名無しさん@お腹いっぱい。
07/06/28 14:36:59
>>742
a="-f"
b="-a"
c="="
d=""
test X"$a" = X"$b" -a X"$c" = X"$d"
echo $?
test $a = $b -a $c = $d
echo $?
FreeBSD の ash、Solaris の sh, ksh、GNU bash いずれでも異なる結果になりました。
744:名無しさん@お腹いっぱい。
07/06/28 14:39:58
>>743
それは、複数の式を -a (AND) でつないだ場合の話。
それだと確かに式の評価がおかしくなることがあるが、
[ $HOGE = hoge ] なら、X$HOGE とする必要はなし。
Solarisの/bin/sh でも [ -f = -f ] は無問題。
745:名無しさん@お腹いっぱい。
07/06/28 14:43:14
-a 使ってるかどうかで場合わけするより
一律で X$HOGE にしといた方がおしゃれ。
746:名無しさん@お腹いっぱい。
07/06/28 14:48:53
>>745
-a 使う場合は、各評価式ごとに \( \) で括るのを推奨。
[ \( "$a" = "$b" \) -a \( "$c" = "$d" \) ]
↑みたいにね。これで、X"$HOGE" は不要。
747:名無しさん@お腹いっぱい。
07/06/28 14:54:19
>>744
> [ $HOGE = hoge ] なら、
クォート忘れてる。
> X$HOGE とする必要はなし。
ダウト。
そのへんの対バカ性能をどこまで頑張るかはヒューリスティックで実装依存。
たとえばFreeBSDのtestでは
$ HOGE='!'
$ [ "$HOGE" = hoge ]; echo $?
[: =: unexpected operator
2
となるので変数に任意の値を想定するなら "X$HOGE" = Xhoge は依然必要。
常にtestの引数が正しい式となるよう書くにしくはなし。
748:名無しさん@お腹いっぱい。
07/06/28 15:06:47
>>747 氏に聞きたいのだが、
>>730 についてはどうお考え?
${1+"$@"} は以前必要? もう不要で "$@"で桶?
749:名無しさん@お腹いっぱい。
07/06/28 15:09:08
ここでポリシー決めても
どこ使うんだろ。
750:名無しさん@お腹いっぱい。
07/06/28 17:18:00
こういう突っ込んだ話まで網羅してる本は無いの?
751:名無しさん@お腹いっぱい。
07/06/28 17:20:30
結局トラディショナルな書式に落ち着くんだよな...
752:名無しさん@お腹いっぱい。
07/06/28 17:25:52
文字列の比較なら [ X"$HOGE" = hoge ] なんてするより
case $HOGE in hoge) にするなぁ。
caseだと、たとえ$HOGEの中身が ! だとか -f -a とか特殊記号だったとしても
すべて無問題だから。
753:名無しさん@お腹いっぱい。
07/06/28 17:31:27
>>750
詳解シェルスクリプトを企画するか
754:名無しさん@お腹いっぱい。
07/06/28 17:35:22
需要ないだろー
755:名無しさん@お腹いっぱい。
07/06/28 17:37:22
wikiでいいんじゃね
756:名無しさん@お腹いっぱい。
07/06/28 17:38:15
需要とかそういうことに興味あるのかしら?
757:名無しさん@お腹いっぱい。
07/06/28 17:39:17
>>756
本売るつもりなら大事でしょ。
758:名無しさん@お腹いっぱい。
07/06/28 17:40:07
需要ないだろ。問題になるのSolarisだけだし、Solarisユーザーの人数が、、、
759:名無しさん@お腹いっぱい。
07/06/28 17:41:25
>>757
>>756 が言ってるのは、ユーザーがシェルの互換性に興味あるのか? ってことでは
(需要に興味があるかどうかじゃなく)
760:名無しさん@お腹いっぱい。
07/06/28 17:49:09
今時、シェルスクリプトの本なんて、全く売れないとは言わないにしても
何冊くらい売れるんだ?
このスレでも>>4にある本の話なんて全然出ないし。
761:名無しさん@お腹いっぱい。
07/06/28 17:50:30
入門書はそれなりに売れるんじゃないの?
そういうの読む人がここの話に参加しづいらいだけで。
762:名無しさん@お腹いっぱい。
07/06/28 17:52:47
getopts は互換性あるの?
763:名無しさん@お腹いっぱい。
07/06/28 17:59:17
>>762
よほど古いシェルじゃない限り互換性ある。でもなぜか出番なくてあまり使わない。
764:名無しさん@お腹いっぱい。
07/06/28 18:02:34
詳説正規表現もこんなのみんな興味あるのかよとかおもったけど
意外に受けたらしいから
765:名無しさん@お腹いっぱい。
07/06/28 18:11:11
互換性があって、どのシェルでも使えるのに、
使ってるの見たことないコマンドの筆頭が readonly だな。
766:名無しさん@お腹いっぱい。
07/06/28 18:12:21
>>763
ありがとうございます。
もうひとつ質問なんですが、ポータブルかつ安全に一時ファイルを作成するにはどうすればいいのでしょうか。
767:名無しさん@お腹いっぱい。
07/06/28 18:12:31
UNIXシェルの新刊はここ2年くらいやたら出たが、
もうこの分野で出ても意味ないわな。
カーニハン&パイクとブルース・ブリンけあればいいんじゃないか。
768:名無しさん@お腹いっぱい。
07/06/28 18:17:41
>>766
どこまでの安全性を言ってるのかわからないけど、
(unask 77; > /tmp/hoge$$)
じゃだめかい?
mktempコマンドは、必ずしもあるとは限らないと仮定するべきなのだろうか?
769:名無しさん@お腹いっぱい。
07/06/28 18:21:56
mktemp(1) を勧める文書は「pidは容易に推測できるので危険」とか書いてますよね。
実用上はほとんど問題にならないのでしょうが、気持ち悪いので何か安全な方法があるのかお尋ねしました。
770:名無しさん@お腹いっぱい。
07/06/28 18:31:34
本当に安全でないといけないなら、
mkdirとかでちゃんとロックして、
失敗したら別の名前で試すとかするしかない。
作るディレクトリのパーミッションちゃんとしとけば
推測されてもかゆくもないでしょ。
771:名無しさん@お腹いっぱい。
07/06/28 18:49:36
cat /dev/urandom | od -x
772:名無しさん@お腹いっぱい。
07/06/28 19:09:45
>>771
/dev/urandom はポータブルではないわけで、、
773:名無しさん@お腹いっぱい。
07/06/28 19:10:47
こういう時はお約束だろ
>>771
catが無駄です。
774:名無しさん@お腹いっぱい。
07/06/28 19:45:41
正規表現もそれぞれで実装がまちまちなのに、なにを言ってるのか
775:名無しさん@お腹いっぱい。
07/06/28 19:53:31
そもそも正規表現エンジンが内蔵されてる sh なんかあったっけ?
776:名無しさん@お腹いっぱい。
07/06/28 20:07:27
詳説シェルスクリプトが必要とされているな
777:名無しさん@お腹いっぱい。
07/06/28 20:09:05
なんで正規表現の話が出てきたんだ?
778:名無しさん@お腹いっぱい。
07/06/28 20:13:15
774さんの説明に期待
779:名無しさん@お腹いっぱい。
07/06/29 01:27:29
激しくどうでもいいが、Solarisの/sbin/shは動的リンクされているぞ。
ていうか、間違いだらけの知識を持ってるやつほどSolarisをバカにする傾向があるな。
780:名無しさん@お腹いっぱい。
07/06/29 01:33:43
>>779
Sol10 からね。Sol9 までは static link。
781:名無しさん@お腹いっぱい。
07/06/29 03:23:19
最近Solarisを使いだした奴に限って、Solarisをマンセーしたがる傾向があるな
の間違いでした
782:名無しさん@お腹いっぱい。
07/06/30 16:06:14
>>748
747じゃないけど "$@" -> ${1+"$@"} とするのは set -u でもエラーにならない為かと
すくなくともある環境では0を除いた位置変数が未設定なら前者はパラメータ未設定エラーになるから
別に""の互換性の理由だけで${1+"$@"}にする訳ではないでしょ
783:782
07/06/30 16:14:29
誤) 為かと
正) 為でもあるかと
784:名無しさん@お腹いっぱい。
07/06/30 17:05:31
>>782
実際に ${1+"$@"} が使われてるのは set -u のところじゃない。
コマンドのラッパーで引数を渡す時の話。
なので、>>782 の話は当たっていない。
785:名無しさん@お腹いっぱい。
07/06/30 17:10:16
${1+"$@"} と書くのは、位置パラメータがない場合に
空文字列が残らないようにするため。
他に、${@+"$@"} という書き方もある(あった)。
今議論になってるのはそこじゃなくて、
未だに ${1+"$@"} が必要なシェルが現存しているかどうか、
現存しているなら そのOS名は? という質問。
786:名無しさん@お腹いっぱい。
07/06/30 17:59:27
>>784-785
「でもあるかと」と訂正してるんだが
実際 set -u 設定状態でコマンドラッパーに"$@"で渡そうとしても
$@ を評価(展開)する段階で未設定と判定された訳で
空文字列が残るかどうかなんて今時大抵解消されてるでしょ
幾つかのOS、幾つかのB系シェルを触ったことはあるけど個人的には見たことがない
ただ単純に ${1+"$@"} -> "$@" として問題ないか?と聞かれたら
set -u で問題が起きるからダメだと
787:名無しさん@お腹いっぱい。
07/06/30 18:24:29
>>786
で、その set -u で問題が出たOSって何?
788:782
07/06/30 18:25:32
上の文、言葉のチョイスが変だわ
もともと空文字列対応で今時 ${1+"$@"} とする必要はあるか?かもしれんが、
たとえその為の対応が不要になったとしても、${1+"$@"} -> "$@" にしていいことにはならんよと言いたい
理由は以下のスクリプトを実行するとエラーになる環境もあるからと
#!/bin/sh
set -u
echo "$@"
789:名無しさん@お腹いっぱい。
07/06/30 18:29:44
>>788
だから、そのエラーになる環境は何なのかと。
俺のところの *BSD/Solarisとあと犬で、エラーになるのはひとつもないのだが。
790:名無しさん@お腹いっぱい。
07/06/30 18:56:23
>>789
そのSolarisじゃないの? ほんとに試してみた? バージョンによるのかな?
結局互換性の最大の問題はいつもSolarisだなww
791:名無しさん@お腹いっぱい。
07/06/30 20:36:50
古いSolarisで見限っちゃったやついっぱいいるからな
いまのSolarisをしらない奴がいてもしょうがない
792:名無しさん@お腹いっぱい。
07/07/03 01:38:27
今のソラリスは早いの?
おそーーーーーーーーいので、あまり使いたくない。
793:名無しさん@お腹いっぱい。
07/07/03 12:33:55
昔からCPUなりのスピードは出てると思うがな...
794:名無しさん@お腹いっぱい。
07/07/04 12:36:32
rm -rf /なんてもう古い
時代はmv /bin /ms.green
795:名無しさん@お腹いっぱい。
07/07/04 22:29:33
誰か教えて。Bシェルで
test 1000000 -lt 9999999999
の結果が正にならないんだけど。数値型の値に制限とかあるのかな?
796:名無しさん@お腹いっぱい。
07/07/04 22:31:41
>>795
bashだと無問題。「正」じゃなくて「真(0)」な。
797:名無しさん@お腹いっぱい。
07/07/04 22:35:06
小さい値だとちゃんと真(0)になるんだけどなんでかな。
798:名無しさん@お腹いっぱい。
07/07/04 22:35:10
>>795
実装依存だな。シェルによっては 31bit整数最大の 2147483647 が扱える最大値。
799:名無しさん@お腹いっぱい。
07/07/04 22:37:55
>>798
ありがと。ちなみに対処法って何かあったりする?違う言語使うしかないか。
800:名無しさん@お腹いっぱい。
07/07/04 22:42:13
>>799
bcに喰わせるとか。bcだともっと大きい数まで扱える。
echo '1000000 < 9999999999' | bc
bcでは、testとは逆で、真の場合1になって、それが標準出力に出る。
801:名無しさん@お腹いっぱい。
07/07/04 22:55:38
ありがとう。試してみます。
802:名無しさん@お腹いっぱい。
07/07/05 22:47:11
ipアドレスを0101って2進数にするにはまず・・・・・・・・なにすればいいの?
803:名無しさん@お腹いっぱい。
07/07/05 23:01:13
小数点までを取り出す
804:名無しさん@お腹いっぱい。
07/07/06 01:13:45
こんなのでどうだろう
(echo obase=2; echo 1.2.3.4 | tr '.' '\012') | bc | xargs -n 1 printf %.8d
805:名無しさん@お腹いっぱい。
07/07/06 01:23:00
もちょっとカイゼン:
旧:(echo obase=2; echo 1.2.3.4 | tr '.' '\012') | bc | xargs -n 1 printf %.8d
新:printf %d%.8d%.8d%.8d `echo obase=2.1.2.3.4 | tr . \; | bc`
806:名無しさん@お腹いっぱい。
07/07/06 10:00:27
shebang が #!/bin/shのシェルスクリプト test.shを PATHの通った$HOME/bin に置いたところ、
tcsh では $ test.sh で動作するのに、
bash では $ test.sh で動作せず、
$ bash -c test.sh でも動作しませんでした。
/usr/local/bin/以下に置いたところ、
bash上の $ test.shは動作しましたが、
やはり、$ bash -c test.sh は動作しません。
この原因は、どのあたりにあるのでしょうか。
ヒントでよいので教えてください。
807:名無しさん@お腹いっぱい。
07/07/06 10:26:25
>>806
(t)cshと(ba)sh では、PATHの変数が違う。本当はPATHを通し忘れているというオチ。
あるいは、.bashrcでPATHが再設定されてしまっているとか。
808:806
07/07/06 10:42:36
>>807
bash上で、$ set | grep PATH すると、$HOME/binも入っているのですが、
やっぱり、PATH関係っぽいですよねぇ。
$ bash -c test.shができないのが気持ち悪いです。
ちなみに、$ $HOME/bin/test.sh では実行できました。
809:名無しさん@お腹いっぱい。
07/07/06 10:46:13
>>808
setじゃなくて、printenvで確認した方がいい。
シェル変数のPATHのみセットされていて、exportされてない可能性がある。
すると、bash -c とかやった時、新しいbashにはPATHが引き継がれないから、
そういう現象が起きる。
810:806
07/07/06 10:59:27
>>809
exportされないというのは盲点でした。
おっしゃるとおり、
$ printenv | grep PATH
をしたところ、$HOME/binも含まれていました。
一応、.bashrcでの設定はきいているんですよね。
ググったところ、Cygwin上では、
bashのバグ?かなにかで、bash -c がきかない現象があるようです。
遅くなりましたが、自分の環境は linux 、bash 3.1 です。
811:名無しさん@お腹いっぱい。
07/07/06 11:09:47
ユーザ名だけ伏せていいから、完全なスクリーンダンプ出せ
812:806
07/07/06 12:10:14
>>811
席を外していまして、遅くなってすいません。
スクリーンダンプは以下のようなものでよろしいでしょうか。
実はtest.shは、navi2chインライン画像表示のためのシェルスクリプトで引数もとります。
i) bash上で実行
$ bash --verbose -c navi2ch.makethumb URLリンク(www.google.co.jp)
navi2ch.makethumb
$ sh -x navi2ch.makethumb URLリンク(www.google.co.jp)
+ tmp=/tmp/navi2ch-thumbnails
+ origfile=/tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif
+ thumbfile=/tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
+ thumbsize=300x150
+ '[' '!' -f /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif ']'
+ '[' -z '' ']'
+ /usr/bin/wget URLリンク(www.google.co.jp) -q -N -x -P /tmp/navi2ch-thumbnails
+ '[' '!' -f /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
+ thumbsize=300x150
+ '[' '!' -f /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif ']'
+ '[' -z '' ']'
+ /usr/bin/wget URLリンク(www.google.co.jp) -q -N -x -P /tmp/navi2ch-thumbnails
+ '[' '!' -f /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif ']'
++ identify -format %n /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif
+ scene=1
+ '[' '!' -s /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg -o /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg -ot /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif ']'
+ '[' 1 -gt 1 ']'
+ convert -sample 300x150 /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
+ echo -n /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
/tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
813:806
07/07/06 12:13:07
>>812
上の方の
$ bash --verbose -c
では、画像は取得されませんでした。
下の方の
$ sh -x
は、画像が取得されました。
814:名無しさん@お腹いっぱい。
07/07/06 12:18:15
なんかよくわからんけど
フルパス指定じゃだめ?
815:名無しさん@お腹いっぱい。
07/07/06 12:32:04
改行コードが CRLF になってないか?
816:名無しさん@お腹いっぱい。
07/07/06 12:39:22
>>812
test.shが問題だというから、
ちゃんと問題を切り分けて小さくしてるのかと思ったら、それかよ
.bashrcの中身も、printenv PATH そのものも、隠さず出したら?
817:806
07/07/06 12:52:00
/usr/local/bin/下のnavi2ch.makethumbを消し、~/bin/navi2ch.makethumbだけにして、
もう一度試したところ、bash上でも
$ navi2ch.makethumb 引数
が実行できました。
しかし、
$ bash -c navi2ch.makethumb 引数
は、やはり実行できませんでした。
>>814
フルパス指定だとbash上でも実行できます。
一応、回避策として、/usr/local/bin/に置いているので、具体的な支障はないのですが、
"bash -c"だけがうまく動いてくれないのはなぜだろうと不思議に思って、質問しました。
だから、本当はこんなにレスしていただくほどのことでなくて、申し訳ないです。
>>815
nkf でチェックしたところ、EUC-JPでした。(環境はja_JP.UTF-8)
cat -v で見ても、改行コードらしきものはありませんでした。
818:名無しさん@お腹いっぱい。
07/07/06 13:06:23
PATHの問題は知らんけど、引数を渡すのなら
bash -c 'navi2ch.makethumb 引数'
じゃないと駄目だろ
819:806
07/07/06 13:07:41
>>816
#!/bin/sh
echo test
のようなシェルスクリプトですと、~/bin/以下に置いて、
$ bash -c test.sh
test
と実行できます。
$ printenv PATH
/home/mona/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
ふだんbashを使っていないので、~/.bashrcはありものです。
~/.bashrc
PATH=$HOME/bin:$PATH
↑とりあえず、これだけにしました。
これでもやはり、
$ bash -c navi2ch.makethumb URLリンク(www.google.co.jp)
では画像を取得できませんでした。
"bash -c"はいろいろときびしそうですね。
820:806
07/07/06 13:12:21
>>818
$ bash -c 'navi2ch.makethumb 引数'
で画像を取得出来ました。
超基本的なことに気付かず、おさわがせして申し訳ないです。
どうもすみませんでした。
ほんとうにごめんなさい。
821:名無しさん@お腹いっぱい。
07/07/15 17:20:37
URLリンク(blog.miraclelinux.com)
(sleep $ALIVE_TIME; ps $$ && kill -INT $$; sleep 1; ps $$ && kill -KILL $$)
1秒待ってもう1度だけkillしてるのはなぜなんですかね?
822:名無しさん@お腹いっぱい。
07/07/15 17:56:03
>>821
よく見ろ。-INT と -KILL で違うだろ。
823:名無しさん@お腹いっぱい。
07/07/15 22:02:12
本当だ。失礼しますた。
824:名無しさん@お腹いっぱい。
07/07/16 22:04:04
シェルスクリプトでif文に正規表現による文字列一致条件を記述できないでしょうか?
sedなどを使ってやればできないことはないですが、
if文一発でできればいいなと。。
825:名無しさん@お腹いっぱい。
07/07/16 22:07:47
>>824
できない。
正規表現と言ってるが、実際にはワイルドカードで十分なことが多い。
ワイルドカードなら ifの代わりに caseを使えばできる。
826:名無しさん@お腹いっぱい。
07/07/16 22:08:01
case使え。
827:名無しさん@お腹いっぱい。
07/07/16 22:25:25
モレはいっつもテストコマンドの中でegrep使ってるけど・・・・素人なのでアフォな事やってるのかも。
828:名無しさん@お腹いっぱい。
07/07/16 23:48:40
if expr $string : $regex >/dev/null; then
...
829:名無しさん@お腹いっぱい。
07/07/17 23:10:26
>>827
機能・性能に問題なきゃそれで充分だろ。
コンピュータ (て言うか、道具) なんて楽するためにあるんだから。
830:827
07/07/17 23:45:10
じゃあ、>>824もそれでよろ(w
831:名無しさん@お腹いっぱい。
07/07/22 20:41:39
UNIX上からリモートでWindowsのバッチを起動させるシェルスクリプトを
作りたいのですが、実装イメージがまったくわからず困ってします。
Win相手に対してrshは使えないであろうし。。。何かいい方法をご存知の方
いらっしゃいませんか。よろしくお願いいたします。
832:名無しさん@お腹いっぱい。
07/07/22 20:44:38
スレ違い
833:名無しさん@お腹いっぱい。
07/07/22 21:38:16
>>831
cygwin + sshdとかな。
834:名無しさん@お腹いっぱい。
07/07/22 23:07:17
>>831
Windows が 2k / XP なら、telnet でどうぞ。
835:名無しさん@お腹いっぱい。
07/07/22 23:07:46
>>831
>Win相手に対してrshは使えないであろうし
使えるよ
URLリンク(sohda.net)
URLリンク(www.uhero.info)
836:824
07/07/22 23:08:49
実行時間は case < expr < sed だったので
結局、caseにしときました。
837:831
07/07/22 23:48:25
>>833>>835
アドバイスありがとうございます。cygwinについて
あまり知識がないので調べてみます。
>>834
telnetで可能ということは、Win上でtelnetサービスを
稼動させておけばいいということでしょうか?
明日にでも実施してみようと思います。
ありがとうございました。
838:名無しさん@お腹いっぱい。
07/07/24 01:24:43
> telnetで可能ということは、Win上でtelnetサービスを
> 稼動させておけばいいということでしょうか?
手元の 2k だと特にわざわざ入れた覚えはないから、多分
標準で入ってると思う。
サービスの中に telnet ってあるはずだから、それを起動
するだけ。
常用するなら、スタートアップの種別を「自動」にする。
839:名無しさん@お腹いっぱい。
07/07/24 03:17:55
telnetは対話型だから、ダメというかめんどくさいだろ。
840:名無しさん@お腹いっぱい。
07/07/24 07:39:36
expectとか使えばいいだけじゃないの?
841:名無しさん@お腹いっぱい。
07/07/24 21:43:20
下記のようなファイル検索をするシェルを作ったのですがうまく動きません
#!/bin/csh
echo 検索するファイル名を入力してください:
set filename = $<
(find /* -name $filename -type f -print > /dev/tty) > & /dev/null
「hoge.txt」を検索する場合はうまくいくのですが、
ワイルドカードを用いた「hoge\*」の検索をすると検索を行わずに一瞬で終了してしまいます。
setで変数に"\*"を入力するのは不可能なのでしょうか?
842:名無しさん@お腹いっぱい。
07/07/24 21:45:14
今日はカレーにする
843:名無しさん@お腹いっぱい。
07/07/24 21:50:39
>>841
>>1
844:名無しさん@お腹いっぱい。
07/07/24 21:52:21
・シェルスクリプトのことをシェルってゆーな
クオートすれば?
845:名無しさん@お腹いっぱい。
07/07/24 22:31:26
シェルってゆうな。クズ。
csh捨てろ。クズ。
846:名無しさん@お腹いっぱい。
07/07/24 22:34:46
スルーカ
847:名無しさん@お腹いっぱい。
07/07/24 22:44:48
>>843-845
すんまそん、会社でシェルシェル言ってるもんで癖がついてました。
クオート試してみることにします。
cshは会社の都合なんすよ
848:名無しさん@お腹いっぱい。
07/07/25 06:21:28
>>847
最初の行に
sh
と書きゃいいじゃん。
849:名無しさん@お腹いっぱい。
07/07/25 12:34:58
>>848
実社会で勉強してね
cshからshに変えるのは容易ではないのだよ
シェルスクリプトは1人で作るのではないし
1つの会社で作るものでもない
850:名無しさん@お腹いっぱい。
07/07/25 14:06:37
つまり、1人だけではなく1つの会社だけでもなく、
いくつもの会社にまたがって何人もの人がよってたかって
>>841みたいなスクリプトを書いているわけだな。すげぇ。
つーか、csh を使うにしてもせめて #!/bin/csh -f にしろよ。
851:名無しさん@お腹いっぱい。
07/07/25 14:13:50
>>841
の例は、わざわざcshの欠点が目立つような典型例だな。
ワイルドカードの展開の問題とか、
findのstderrを捨てるために苦労してるところとか。
そもそも、findをインタラクティブに実行させるようなスクリプトは、
システム管理用スクリプトじゃない。初心者ユーザー向けに作ったものだろ。
こんなの、/bin/shで書き直せば一発。
>>841 が抱えているcshでの問題も一気に解決する。
>>849 へ。
みんな実社会で「cshスクリプトは使わない」が常識だといってるんだよ。
>>849 は自分の会社名を公表しない方がいいよ。会社の不名誉になるからね。
852:名無しさん@お腹いっぱい。
07/07/25 14:15:45
cshじゃなきゃだめな会社ってどこ?
853:849
07/07/25 14:57:09
>>851
ま、会社名を挙げる気は無いけど、
おれんとこでは全部のスクリプトがcshだし
スクリプトの作成・保守を依頼している会社も
cshで作るようになっている。
OSが古いもの・新しいものが混在しているのも
理由ではあるが、
常識など、会社によって違うものだろ。
シェルがダメなのは分かるが、
シェルを変えろとか無理な話だ
854:名無しさん@お腹いっぱい。
07/07/25 14:59:19
HP-UXでkshを使っているのですが、C-p・C-nで履歴検索ができるとmanpageに書いてあるのですが、
実行しても何も起きません。
どうすればよいのでしょうか?
また、linuxのbashみたいに↑↓キーで履歴表示をしたいのですが、
kshで実現可能でしょうか?
855:名無しさん@お腹いっぱい。
07/07/25 15:07:05
>>853
> OSが古いもの・新しいものが混在しているのも理由ではあるが、
/bin/shが存在しないUnixなんて無いんじゃないのか
> シェルがダメなのは分かるが、シェルを変えろとか無理な話だ
へえ。cshがダメなのははるか前からの常識なのに、誰もその
やりかたを変えようとせず、変えるのは「無理」だと思ってるんだ。
しかも古いスクリプトだけでなく、新しいスクリプトもわざわざ
cshで書き、ゴミを製造し続けていると。
勿論、C++やJavaやPythonなんて誰も使わないんだろうな。
ソース管理は未だにCVSでさえない、いやソース管理なんて概念もないね?
お前さんがアホなのか、会社がアホなのかは知らないが、実に見事に
アホだな。
856:名無しさん@お腹いっぱい。
07/07/25 17:35:21
会社の都合なら仕方ないんだから
そんなに必死に弁解しなくていいよ
857:名無しさん@お腹いっぱい。
07/07/25 20:55:10
>>853
だってさ、起動スクリプトとかOSに元々内蔵されてるスクリプトはshだよね?
そういうスクリプトを修正する時も、cshで書き直してるの?
858:名無しさん@お腹いっぱい。
07/07/25 23:13:35
棄てる気になれば簡単に捨てられる。棄てられないのは>>853がヘタレなだけ。
859:名無しさん@お腹いっぱい。
07/07/25 23:54:41
恐ろしいことにうちはコーディングルールでcsh使うことになってるorz
おまけに最近スクリプトでsql実行してるのを、「COBOLで実装しろ」って指摘された…
SQLの使い方調査があって、スクリプトが調査範囲から漏れたからだと。
860:名無しさん@お腹いっぱい。
07/07/26 00:27:56
>>859
つまりOSインストール時からあるスクリプトも全部cshで書き直してるって事か?
861:名無しさん@お腹いっぱい。
07/07/26 00:40:11
間違っているルールを変更できないなんて将来の無い会社だな。
862:名無しさん@お腹いっぱい。
07/07/26 01:32:53
>>859
なんでcsh使うことになったの?
863:名無しさん@お腹いっぱい。
07/07/26 04:05:17
袋叩きw
csh好きな勉強不足の若者の脳内会社なんだから許してやれよw
864:名無しさん@お腹いっぱい。
07/07/26 10:27:50
某社と某社はcshだったな
皆さんがんばってね
865:名無しさん@お腹いっぱい。
07/07/26 14:51:51
古いBroadVisionなんかだと、パッケージに
cshで書かれたシェルスクリプトがいっぱい付いてくるから
仕方が無い
866:名無しさん@お腹いっぱい。
07/07/26 14:57:19
会社で使うシェルスクリプトなんてコマンド順番に起動して
戻り値チェックするくらいのもんだからな。
867:名無しさん@お腹いっぱい。
07/07/26 17:05:58
それですむならそれでいい
868:名無しさん@お腹いっぱい。
07/07/26 18:40:09
ジュセッペさんお元気?
869:名無しさん@お腹いっぱい。
07/07/27 00:19:38
Zshまんせー
870:名無しさん@お腹いっぱい。
07/07/27 01:30:36
>>866
俺はシェルスクリプトがないと会社で生きて行けんが。
871:名無しさん@お腹いっぱい。
07/07/27 02:53:31
これお勧め:
つ ln /bin/sh /bin/csh
もっといいのは#!起動された時にスクリプトを調べて
昔からのcshスクリプトなら「しょうがなく」csh、じゃなきゃ
shにディスパッチするようにするとか。Linuxなら簡単だな。
872:名無しさん@お腹いっぱい。
07/07/27 04:33:23
まぁ、/bin/shのシェルスクリプトを書かせたらbashスクリプトを書きやがったとか
*.shのファイルを開いたらbashスクリプトだったなんて事を無くす為なら
cshしか使うなってのもありかも知れん。
873:名無しさん@お腹いっぱい。
07/07/27 07:10:12
ないないw
874:名無しさん@お腹いっぱい。
07/07/27 08:49:35
20年モノのcshスクリプトが10万行単位である
とかね
875:名無しさん@お腹いっぱい。
07/07/27 23:08:29
csherは平気でコピペで行数倍増するから10万行も妄想じゃないな。
876:名無しさん@お腹いっぱい。
07/07/27 23:22:10
そんなコードだったな
877:名無しさん@お腹いっぱい。
07/07/27 23:53:59
昔、(偽装)派遣で行ったところは csh が標準だったよ。
ひ孫請の俺がルールを変えるなんて無理だった。
当然ソース管理なんて概念もない。ファイルはタイムスタンプ
(mtime)で管理してたよ。もー馬鹿かアフォかと。
とりあえず、自分のコードは SCCS で管理してた。
当然フリーソフトウェアなんて得たいの知れないものは
使用禁止。
まだあの会社あるかな…
878:名無しさん@お腹いっぱい。
07/07/28 00:03:54
某独立系大手とか
某システム系大手とか
879:名無しさん@お腹いっぱい。
07/07/28 01:05:38
folder>------folder1---test
|
---folder2---test
folder1内にある実行ファイルtestを実行して、
その終了を待って、folder2内のtestを実行する
というスクリプトを作ったんですが、folder2の実行が行われません。
どこがいけなかったんでしょうか?ご教授ください。
#!/bin/sh
for i in 1 2
do
cd folder$i
nohup test
wait $!
cd ..
done
880:名無しさん@お腹いっぱい。
07/07/28 01:12:09
まず、なんでいちいちwait入れるのかわからん。
ほっとけば、終わってからしか次が実行されんだろ?
あと、本当にtestって名前なのか?
/bin/testかビルトインのtestが動いてるだけでは?
881:879
07/07/28 01:24:56
>880
実際は、testっていうプログラムじゃないんですけど、
実行すると1日くらい走り続けるものです。
wait入れなくて実行したら、二重に実行されてしまったので。
二重に走らないようにしたいので、wait入れたのですが。
882:名無しさん@お腹いっぱい。
07/07/28 01:58:54
実行したいモノを列挙すればいいんじゃね?
それで満たせない要件は後だしでくるような気もするけど
883:名無しさん@お腹いっぱい。
07/07/28 02:20:46
cronかなんかで後から起動しちゃってるだけ?
waitって子プロセスの終了待つだけなんだから
バックグラウンドで動かさん限り無意味
884:名無しさん@お腹いっぱい。
07/07/28 03:15:41
awkについて質問です。
echo "<tr><td></td></tr>" | awk '{print $1, $2, $3, $4}'
とすると、以下のように分解して代入されるようにしたいのですが、
awkのオプションをどのように指定すればよいでしょうか?
(同じことができるなら、awk以外でも構いません)
$1=<tr>
$2=<td>
$3=</td>
$4=</tr>
よろしくご教授お願いします。
885:名無しさん@お腹いっぱい。
07/07/28 07:42:41
sed 's/></> </g' < "<tr><td></td></tr>" | awk '{print $1, $2, $3, $4}'
886:名無しさん@お腹いっぱい。
07/07/28 08:52:38
< "<tr><td></td></tr>"
この部分は何だ?
887:名無しさん@お腹いっぱい。
07/07/28 09:32:29
そのくらいわからないのか
<tr><td>< というディレクトリの下に
td>< という子ディレクトリがあって、その下に
tr> というファイルがある。
その内容が
<tr><td></td></tr>
なのだ。
888:名無しさん@お腹いっぱい。
07/07/28 09:46:10
hagewarosu
889:名無しさん@お腹いっぱい。
07/07/28 16:48:50
>>884
なんで echo の中で FS 使っちゃいけないの?
890:名無しさん@お腹いっぱい。
07/07/28 16:52:40
おばあちゃんの遺言で
891:名無しさん@お腹いっぱい。
07/08/01 00:31:16
for f in 'ls -1'
do
echo ${f}
done
とか
for s in 'cat hoge.txt'
do
echo ${s}
done
なんかは、基本だな
892:名無しさん@お腹いっぱい。
07/08/01 01:12:54
>>891
何が言いたいのかさっぱりわからん。
893:名無しさん@お腹いっぱい。
07/08/01 02:11:41
if分で「$numbarが10から1000の間なら」という分岐は可能でしょうか?
if [ $numbar = 10 -o $numbar = 11...]
と地道に書いていくしかだめですか?
894:名無しさん@お腹いっぱい。
07/08/01 02:24:09
っman test
895:名無しさん@お腹いっぱい。
07/08/01 02:38:29
case $number in
[1-9][0-9]|[1-9][0-9][0-9]|1000)
....
;;
esac
896:名無しさん@お腹いっぱい。
07/08/01 08:14:47
>>895
0点
897:numbar warota
07/08/01 21:58:49
>>893
[ "$number" -ge 10 -a "$number" -le 1000 ]
898:名無しさん@お腹いっぱい。
07/08/01 22:58:41
>>897
引っかけ問題に引っかかりましたねぇ。
>>893 の問題では、シェル変数名は number じゃなくて numbar
前任者から引き継いだスクリプトとかで変数名がミススペルで、
自分が正しいスペルで書き足すと動かなくて1日悩むこと、よくあるでしょ?
そのための練習問題でした。
899:名無しさん@お腹いっぱい。
07/08/01 23:03:02
>>898
死ぬほどどうでも良いですね。