シェルスクリプト総合 その8at UNIX
シェルスクリプト総合 その8 - 暇つぶし2ch521:名無しさん@お腹いっぱい。
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
死ぬほどどうでも良いですね。

900:名無しさん@お腹いっぱい。
07/08/02 20:28:27
>>898
おまい、100回くらい死ねよ


901:ウサチャソ
07/08/02 21:08:52
バージョンの略を var と書いてしまう奴は結構いるよな。

902:名無しさん@お腹いっぱい。
07/08/02 21:22:54
見たことないぞそんな奴。

903:名無しさん@お腹いっぱい。
07/08/02 21:25:20
スペルミスならもっと酷いのをいくらでも見たことがある

904:名無しさん@お腹いっぱい。
07/08/02 21:41:27
ここで伝説のuwariteが登場。


905:numbar warota
07/08/02 22:07:37
>>898
シェルスクリプトごときで1日も迷うねーよ。
それと、From:見る癖つけたほうが良い。

906:名無しさん@お腹いっぱい。
07/08/03 00:34:20

「対話的な利用についての話はスレ違い」ってあるけど、
どこに逝っていいのか教えて頂けないでしょうか~

expect があることは知ってるけど、
インストールが必要だからダメだって。

とりあえず、どういう選択肢があるか知りたいです。


あと perl の話になるんだけど、
Expect.pm を Makefile.pl とか CPAN での
インストールをしないで(起動ディレクトリにモジュールを置くだけとかで)
起動する方法があれば、誘導をお願いしたいです。




907:名無しさん@お腹いっぱい。
07/08/03 00:37:46
>>906
ポエムは確か別の板があったはずだぞ。

908:名無しさん@お腹いっぱい。
07/08/03 01:12:06
>>907

ポエム?

なんかアフォ扱いみたいな感じだけど、
変なこと書いてるんかなー? よく分からん。


とりあえず反応ありがと。


909:名無しさん@お腹いっぱい。
07/08/03 02:14:06
>906 は対話的の意味を勘違いしているに一票

910:名無しさん@お腹いっぱい。
07/08/03 02:17:29
>>906
インストールがダメって言うなら、現行環境に入ってる使えそうな道具立てはなんなのよ?

それとは別に、「対話利用についての話題禁止」の意味をつかめてないに一票


911:名無しさん@お腹いっぱい。
07/08/03 08:19:15
>>909,910

ぐぐってみた。↓に書いてある「対話」?
(例えばどんな話が禁止なのかは分からんが。。)

0からのbash 第1回:対話的シェルの使用法(1) 1.はじめに
URLリンク(www.stackasterisk.jp)


>>910

何を書けばいいんだろ。

telnet, ftp, rsh, perl

Expect.pm は上に書いたように
Windows での単体 exe みたいなイメージ
(インストールが必要ない)ならおkらしい




912:名無しさん@お腹いっぱい。
07/08/03 08:56:32
で、結局何をしたいのよ?

913:名無しさん@お腹いっぱい。
07/08/03 10:30:08
>911
やりたいことをできるだけ具体的に

914:名無しさん@お腹いっぱい。
07/08/03 17:58:16
今度、会社で、シェルを使わなければならない可能性が発生する恐れがあるかも知れない状況になる兆しが出て来ました。
とりあえず初心者がシェルの方を始めるには、どのシェルの方から始めればいいでしょうか?
開発ツールの方とか、デバッガーの方はGUIの方であるんでしょうか?
できればフリーの方を希望します。

915:名無しさん@お腹いっぱい。
07/08/03 18:11:06
>>914
> 可能性が発生する恐れがあるかも知れない状況になる兆しが出て来ました。
それぞれ20%と仮定すると、4段階あるから、0.16%だ。
悲観的すぎー



916:名無しさん@お腹いっぱい。
07/08/03 18:17:25
どれがいいかは会社に聞け。
GUI はないと思っていい。

917:名無しさん@お腹いっぱい。
07/08/03 18:18:59
まず日本語を勉強したほうがいいと思われ

918:名無しさん@お腹いっぱい。
07/08/03 22:35:37
>>914
sh

919:名無しさん@お腹いっぱい。
07/08/03 23:10:59
面白いと思ってやってるんだろうか? 低脳としか比喩できない釣りだ。

920:名無しさん@お腹いっぱい。
07/08/03 23:39:16
>>906

push(@INC, '/home/hiroyuki')

とかやればモヂュールのサーチパスに追加されるんじゃないの?

921:名無しさん@お腹いっぱい。
07/08/03 23:40:37
>>919
お前の語彙が少ないのはどうでも良い。

922:名無しさん@お腹いっぱい。
07/08/03 23:48:38
>>916
wishとかwkshとかPowerShellかもしれないじゃないか!


923:名無しさん@お腹いっぱい。
07/08/04 00:37:18
>>921
悔しいのか? でもつまらんものはつまらん。

924:名無しさん@お腹いっぱい。
07/08/04 00:41:13
おや、>>914 が餌をまいているのに、
「シェルってゆーな」の人が登場する可能性が発生する恐れがあるかも知れない状況になる兆しが出て来ませんねぇ

925:名無しさん@お腹いっぱい。
07/08/04 02:19:39
シェルってゆーな

926:名無しさん@お腹いっぱい。
07/08/04 07:31:21
>>915

X 恐れ
◯ 虞れ

927:名無しさん@お腹いっぱい。
07/08/04 09:22:51
>>926
それを言うなら、送り仮名が違う

×虞れ
○虞

ただし、「虞」は常用漢字じゃなく、現在では「恐れ」と表記するのが標準。
ぐぐってみても、「○○する恐れ」は多数ヒットするが、「○○する虞」はごくわずか。

928:名無しさん@お腹いっぱい。
07/08/04 09:34:48
>>924
お前、センスが皆無な上に致命的に頭悪いな。
> シェルスクリプトをシェルとゆうな。
なので、>>914は(呆れるほどつまらない釣りだが)誤用無し。

929:926
07/08/04 14:34:15
>>927
うちのAnthyはそこまでバカじゃない。
送り仮名は「敢えて」俺が書き足した物。

>>ぐぐってみても、「○○する恐れ」は多数ヒットするが、
>>「○○する虞」はごくわずか。

世の中全体が、バカになって来たということですな。
(負の)probabilityをterribleと表記することの
とんでもなさに違和感を感じないとはねぇ・・・

930:名無しさん@お腹いっぱい。
07/08/04 14:39:54
>>929
英語でも I'm afraid ... って言うじゃん。
単に可能性だけじゃなく、もしそうだったら困ると言うニュアンスがあるから
「恐れ」で的確。
いいことに対しては確率が低くても「恐れ」とは言わないし。

ちなみに、probabilityは 0 <= probability <= 1 でしか定義できない。
負のprobabilityなんて言ってる時点で、お前数学も苦手だっただろw

931:名無しさん@お腹いっぱい。
07/08/04 15:26:14
悪い事象の発生するおそれって意味じゃないの。
930はprobability=(数学的)確率というバカの一つ憶えしかしてないから
早合点したんだろう。蓋然性って日本語知ってるか?

932:名無しさん@お腹いっぱい。
07/08/04 15:40:52
>>931
確率を蓋然性と言い替えたところで本質は変わらない。
(数学以外でも)「負の確率」なんて存在しない。
「負の確率」という言葉が出てしまった時点で、アンタの負け。

933:931
07/08/04 16:15:22
てんで指摘を理解してないな。俺は929じゃないし。
日本語も英語もダメな人みたいだね。

934:名無しさん@お腹いっぱい。
07/08/04 16:18:28
もし「悪い事象が起きる確率」のことを「負の確率」と言ったのなら、
それは数学だけじゃなく日本語としてもおかしい。
確率を理解していないことになる。
よって、>>931 のように弁護しても、やはり >>929 は間違い。

935:931
07/08/04 16:21:39
やっぱり理解してないなw

936:名無しさん@お腹いっぱい。
07/08/04 16:22:41
>>934は負の遺産とか負の感情とかいう言葉も使わないんだろうな。


937:名無しさん@お腹いっぱい。
07/08/04 16:37:03
>>936
負の遺産は本当に「負」だろうが。
借金はマイナスの遺産。マイナスだからこそ「負」と言って正しい。

ところが、確率は絶対に「負」にはならない。
負の確率なんて存在しない。

938:名無しさん@お腹いっぱい。
07/08/04 16:45:18
新聞でも、「…する恐れ」って書いてるよ。

>>936 は別の意味で「負」を理解してないなw

939:名無しさん@お腹いっぱい。
07/08/04 17:08:59
937は借金のことを負の遺産というと思ってるのか。


940:名無しさん@お腹いっぱい。
07/08/04 17:17:16
>>939
借金が負の遺産として一番わかりやすい例ということだろ。
いずれにしても負の遺産はマイナスのものに違いない。

で、「負の遺産」を持ち出しても、「負の確率」を正当化することはできない、
という点は理解してますか?

941:名無しさん@お腹いっぱい。
07/08/04 17:20:47
じゃあ負の感情についても論破してみて。


942:名無しさん@お腹いっぱい。
07/08/04 17:28:35
>>941
好感度を数値化できるものとする。
平常心での好感度は0で、何かに好感を持った時プラスの好感度になる。
逆に嫌悪感を持てば、マイナスの好感度になる。
マイナスの好感度は「負の感情」と言ってもいい。
だから「負」で正しい。
(だから「負の確率」を肯定する材料にはならない)

943:名無しさん@お腹いっぱい。
07/08/04 18:37:06
>>942
別の高尚なスレッドでやってください。

944:名無しさん@お腹いっぱい。
07/08/04 19:36:54
そうだな。
どうせ表現するならエロでやってくれなきゃわからん。

945:名無しさん@お腹いっぱい。
07/08/04 21:33:50
漢和辞典ひいてみると、虞の項目には「可能性」という文字はないが、恐れには「可能性」と書いてある。
どちらの項目にも「心配する」の意味はある。
広辞苑でも、恐れのほうが虞より先に載っている。
probabilityは見こみで考えたらいいじゃないかな。

946:名無しさん@お腹いっぱい。
07/08/04 21:54:59
>>945
邪魔だと言っている。

意味が分からないならお得意の広辞苑を引いてくれ。

947:名無しさん@お腹いっぱい。
07/08/05 18:41:23
エアコンの室外機が壊れたんですが
お金がないのです
どうしたらいいでしょうか?

948:926
07/08/05 18:59:36
>>930-945
夜勤明けに遊びに行って、帰ってきたらば
この有様w
板違いだけど感受性がおもしろすぎて、嬉しくなるねぇ。

ちなみに(負の)probabilityってのは、
negativeな蓋然性の意味で用いた訳だが・・

あ、あと「マイナスの確率」ってのも
概念的には存在しうるね。
(数学ではなく統計学になるけど
日本語として間違いでは無いよね)
虚数よりは遥に理解しやすい。

949:名無しさん@お腹いっぱい。
07/08/05 19:53:10
>>948
土曜に夜勤か。ご苦労さん。
俺は優雅な休日だった。

950:名無しさん@お腹いっぱい。
07/08/05 23:00:59
>>948
符号付(確率)測度なんて、数学では大して珍しくも無い概念だが…?

951:名無しさん@お腹いっぱい。
07/08/06 07:38:00
ハッシュ汽盆!!

952:名無しさん@お腹いっぱい。
07/08/06 16:33:27
自己顕示欲の固まりが集まるスレはここでつか?

953:名無しさん@お腹いっぱい。
07/08/06 20:18:07
その確立200%

954:名無しさん@お腹いっぱい。
07/08/06 20:23:11
まあ、おれは例外だけどなw

955:名無しさん@お腹いっぱい。
07/08/06 21:15:58
>>953
×確立
○確率

国語苦手かよw

956:名無しさん@お腹いっぱい。
07/08/07 00:56:36
200%も突っ込みどころだろw

957:名無しさん@お腹いっぱい。
07/08/08 03:18:10
すみません。
シェルスクリプトというかコマンド一発で
デバイス(eth0とかeth1とか)を出力することってできますか?
もしよかったらコマンド一発でおしえてください。お願いします。

958:名無しさん@お腹いっぱい。
07/08/08 03:57:05
くだ質へいきなさい。

959:名無しさん@お腹いっぱい。
07/08/08 09:44:57
Linuxの話ならこっちな。
くだらねえ質問はここに書き込め! Part 150
スレリンク(linux板)

960:名無しさん@お腹いっぱい。
07/08/08 09:52:29
すみません。
シェルスクリプトというかコマンド一発で
デバイス(fxp0とかde1とか)を出力することってできますか?
もしよかったらコマンド一発でおしえてください。お願いします。

961:名無しさん@お腹いっぱい。
07/08/08 10:04:34
つまんね。

962:名無しさん@お腹いっぱい。
07/08/08 10:26:35
>>960
まずはいっぱつやらせろ。話はそれからだ。

963:名無しさん@お腹いっぱい。
07/08/08 10:50:43
アッーーーーーー!

964:名無しさん@お腹いっぱい。
07/08/08 16:53:39
ふむ
analyzeってことか

965:名無しさん@お腹いっぱい。
07/08/08 17:40:37
くそつまんねえネタはやめろ

966:名無しさん@お腹いっぱい。
07/08/08 18:08:48
ふむ
お通じ快適ってことか

967:名無しさん@お腹いっぱい。
07/08/08 21:00:51
くそスレ化するかどうかのふんばり時だな

968:名無しさん@お腹いっぱい。
07/08/09 21:06:16
CentOS Linux on Xen
tcsh 6.13.00

たまになんだけど、
cd dir
ls | echo 1
ls | echo 1 ; echo
ってやったあとに
ls
って打つとtcshが固まるのは何故??

バージョンあげれですかそうですか。

969:名無しさん@お腹いっぱい。
07/08/09 21:10:05
>>968
それはXenとかCentOSにフィードバックしてあげれば?

スレ違いとか板違いっぽいけど

970:名無しさん@お腹いっぱい。
07/08/09 21:10:47
>>968
くそスレ化のための燃料ですか?

971:名無しさん@お腹いっぱい。
07/08/09 21:12:46
>969
はえーなw
そうするわ<フィードバック

再現できた。
ls | echo 1^C
ls

972:名無しさん@お腹いっぱい。
07/08/10 10:31:14
aシェルの中でbコマンドをバックグラウンドで実行した場合、
bはまだ実行中だけど、aが終了したときにbにシグナルを送って強制的に終了することってできますか?




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