トップページunix
1001コメント289KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2012/06/08(金) 00:35:51.19
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。

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

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

前スレ
シェルスクリプト総合 その19
http://toro.2ch.net/test/read.cgi/unix/1323515200/
0396名無しさん@お腹いっぱい。2012/07/29(日) 09:29:52.83
俺はash関係なくPOSIXには否定的だけど、何の話?
0397名無しさん@お腹いっぱい。2012/07/29(日) 09:44:58.55
>>393
終了ステータスでの判定を一切やめて、標準エラーの文字列でのみ判定すれば?

ERROR=$(genext2fs ..略.. 2>&1 1>/dev/null)
if [ -n "$ERROR" ]; then
echo "$ERROR"
fi
0398名無しさん@お腹いっぱい。2012/07/29(日) 10:21:14.14
>>396
じゃあさ。

> bash/zsh/kshの共通項に合わせる
これどこにあるんだよ。無いならそれは現実的じゃないって事だよな。
0399名無しさん@お腹いっぱい。2012/07/29(日) 10:37:10.90
>>398
bash/zsh/kshの「現物」があるじゃん。
実際に実行させてチェックできる。

一方、POSIXはPOSIX通りに実装した現物がない。
実際に実行させてチェックできない。
0400名無しさん@お腹いっぱい。2012/07/29(日) 10:56:34.72
ポータビリティが必要ならシェルスクリプトは使わないで下さい。
0401名無しさん@お腹いっぱい。2012/07/29(日) 11:02:57.05
POSIXには現物がない。ハイ、ロンパー
0402名無しさん@お腹いっぱい。2012/07/29(日) 11:14:50.01
>>399
> bash/zsh/kshの「現物」があるじゃん。
> 実際に実行させてチェックできる。
ぷぷぷ、作るときは3つのマニュアル全部読みながら共通項を
拾い出して、作って動いて、おーけい、おーけい。
0403名無しさん@お腹いっぱい。2012/07/29(日) 11:35:07.43
POSIXには現物シェルがない。だから机上の空論って言われるんだよ。
0404名無しさん@お腹いっぱい。2012/07/29(日) 11:38:14.68
マニュアル3冊のAND取る作業は楽しいかい?
0405名無しさん@お腹いっぱい。2012/07/29(日) 11:46:03.68
当然のごとく複数のシェルのマニュアル参照しながらやってるけど、
煽るようなことか? あ、初心者だからマニュアル読むこと自体苦痛な人?

他にも、grepとか、findとか、OSによってオプションが違うコマンドは結構あるので
複数のOSのマニュアルをすぐに見られるようにしてある。
プロなら当然だよな。
0406名無しさん@お腹いっぱい。2012/07/29(日) 12:15:51.33
末端のプロ(笑い)が家内制手工業でANDとってる姿があわれ。
POSIXがAND取ってくれてるんだからそれを使えばいいのに。
0407名無しさん@お腹いっぱい。2012/07/29(日) 12:19:09.97
>>406
POSIXがAND取ってくれてた机上の空論では
実際のシェルは動かないんだよ、素人さん。
0408名無しさん@お腹いっぱい。2012/07/29(日) 12:19:25.10
また通信系SEプロさんですか
0409名無しさん@お腹いっぱい。2012/07/29(日) 12:21:49.12
posix崇拝してる割にposix外のletコマンドを平気で使ってるFreeBSDのashスクリプトの件に付いて。
0410名無しさん@お腹いっぱい。2012/07/29(日) 12:24:48.99
>>407
動くよ。動かないというなら実例を挙げる事。
0411名無しさん@お腹いっぱい。2012/07/29(日) 12:26:37.54
bash/ksh/zshのバージョンはどうするんだろう?
どれも最新のバージョンを使うこと前提?
0412名無しさん@お腹いっぱい。2012/07/29(日) 12:27:00.63
>>410
>>403
0413名無しさん@お腹いっぱい。2012/07/29(日) 12:32:10.32
夏、だなぁ

通信業界さんも夏休みですか?
0414名無しさん@お腹いっぱい。2012/07/29(日) 12:43:31.16
>>412
降参ですか?
0415名無しさん@お腹いっぱい。2012/07/29(日) 12:49:36.17
なんでやねん。欲嫁。
0416名無しさん@お腹いっぱい。2012/07/29(日) 12:51:26.75
>>409
見たことないので、/usr/srcにgrepかけてみたが、cddl/contrib/opensolarisの
下の.kshスクリプトに多数、contrib/amd/scriptsに一つ。

どこでこれを見たんだい?
> posix崇拝してる割にposix外のletコマンドを平気で使ってるFreeBSDのashスクリプトの件に付いて。
0417名無しさん@お腹いっぱい。2012/07/29(日) 12:51:49.11
POSIXには現物がない。ハイ、ロンパー
覆すにはPOSIX通りに実装したシェルを作って持って来い。
(上位互換とかじゃダメだぞ。POSIX以外の文法も一切動いてはイカン)
0418名無しさん@お腹いっぱい。2012/07/29(日) 12:53:59.46
ふーむ、3つのシェルのANDとった規格(笑)と合同なシェルは存在するのか?
(上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
0419名無しさん@お腹いっぱい。2012/07/29(日) 12:56:27.23
>>418
直接存在しなくても現物シェルのANDで表せるんだからOK。

POSIXの場合は現物シェルのANDでも表せない。
0420名無しさん@お腹いっぱい。2012/07/29(日) 13:16:53.94
その現物シェル達はお前が言い出した条件満たしてないじゃん。
> (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)

それともAND規格でのみ動作するとかいうスイッチでもあるのか?
0421名無しさん@お腹いっぱい。2012/07/29(日) 13:22:40.49
むかーし見た流れだな

自称プロ(夏休み中)はスルーでよくねえか
0422名無しさん@お腹いっぱい。2012/07/29(日) 13:25:05.75
>>420
POSIXの場合は現物シェルのANDでも表せないので、
持ってくるとしたら上位互換しかなくなる。それじゃダメと言ってるだけ。

bash/zsh/kshは現物シェルのANDで表せる。

実践的には、scriptを書いた後に
$ bash script
$ zsh script
$ ksh script
でチェックできる。これが実際にANDを取ると言うことだ。

POSIXではそれができない。
0423名無しさん@お腹いっぱい。2012/07/29(日) 13:28:30.18
posixか、bash/zsh/kshのand?かで議論されてますが、
/bin/sh主義の私はどうすればいいでしょうか??
/bin/sh主義的にもposixは糞であることに同意ですが。
0424名無しさん@お腹いっぱい。2012/07/29(日) 13:33:07.06
自分から言い出した条件をあっさり撤回して意味不明の言い訳繰り返す
家内制手工業のプロさん。

> (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
0425名無しさん@お腹いっぱい。2012/07/29(日) 13:35:51.04
>>423
v7シェルでいいんじゃないかな。シェル関数すらない孤高の頂で頑張ってください。
ところで、posixシェルのどこが糞なんだい?
0426名無しさん@お腹いっぱい。2012/07/29(日) 13:38:15.67
POSIXには現物がない。ハイ、ロンパー
0427名無しさん@お腹いっぱい。2012/07/29(日) 13:39:10.75
>>424
撤回してないぞ。よくよめ。
0428名無しさん@お腹いっぱい。2012/07/29(日) 13:39:29.54
AND規格には現物がない。はい、ロンパー
0429名無しさん@お腹いっぱい。2012/07/29(日) 13:41:58.86
>>427
bashもzshもkshも全部AND規格(笑)の上位互換
0430名無しさん@お腹いっぱい。2012/07/29(日) 13:43:45.90
>>428
それ以前にPOSIXには現物がないんだから >>428 では論破になってない。

A,Bという二つのものに対して、Bのみ満たす条件を示された時、
A信者が A,Bとも満たさない条件を持ってきて だから Bもダメだといってるようなもの。
それで A が良いことにはならない。
0431名無しさん@お腹いっぱい。2012/07/29(日) 13:52:44.60
>>439
> それ以前にPOSIXには現物がないんだから >>428 では論破になってない。
それ以前にAND規格には現物がないんだから >>426 では論破になってない。

> A,Bという二つのものに対して、Bのみ満たす条件を示された時、
違うよ、Aが満たしていないという(現物がない)と言っているのが>>426

> A信者が A,Bとも満たさない条件を持ってきて だから Bもダメだといってるようなもの。
> それで A が良いことにはならない。

現物がないという条件なら両方同じと言っているだけだ。
0432名無しさん@お腹いっぱい。2012/07/29(日) 14:15:04.40
POSIXは現物シェルのANDでも表せない。ハイ、ロンパー
0433名無しさん@お腹いっぱい。2012/07/29(日) 14:43:09.24
>>413
これか、「夏だなぁ厨」ってのは
0434名無しさん@お腹いっぱい。2012/07/29(日) 14:48:40.91
夏はまだ、始まったばかり。
0435名無しさん@お腹いっぱい。2012/07/29(日) 14:50:44.43
>>423
VMwareの上でSolaris2.5を動かして確認してる。
0436名無しさん@お腹いっぱい。2012/07/29(日) 17:01:06.41
AND規格の現物シェルは存在しない。はい、ロンパー
0437名無しさん@お腹いっぱい。2012/07/29(日) 17:07:14.87
POSIXは現物シェルのANDでも表せない。ハイ、ロンパー
bash/zsh/kshのANDは、現物シェルのANDで表せる。ハイ、ロンパー
0438名無しさん@お腹いっぱい。2012/07/29(日) 17:10:50.82
スーパーセットなシェルじゃダメだという主張は引っ込めるのか?
> (上位互換とかじゃダメだぞ。POSIX以外の文法も一切動いてはイカン)
0439名無しさん@お腹いっぱい。2012/07/29(日) 17:15:25.23
bash/zsh/kshのANDは、現物シェルのANDのスーパーセットじゃなくてイコール。
ハイ、ロンパー
0440名無しさん@お腹いっぱい。2012/07/29(日) 17:25:31.70
>>439
↓この各々のシェルは、AND規格のスーパーセットだよなあ。w
家内制手工業の自称プロには難しすぎるかな。?

$ bash script
$ zsh script
$ ksh script
0441名無しさん@お腹いっぱい。2012/07/29(日) 17:36:32.38
ルイージ理論的には違う。はい論破www
0442名無しさん@お腹いっぱい。2012/07/29(日) 17:51:38.94
飽きない?
0443名無しさん@お腹いっぱい。2012/07/29(日) 17:56:40.12
どうでもいいが、$ zsh -y script にするべきだな。
SH_WORD_SPLITを有効にしないと互換性ないよ。
0444名無しさん@お腹いっぱい。2012/07/29(日) 18:10:03.73
うつみみどり
0445名無しさん@お腹いっぱい。2012/07/29(日) 18:31:38.08
ハイハイロンパールームロンパールーム
0446名無しさん@お腹いっぱい。2012/07/29(日) 21:35:16.58
家内制手工業の自称プロはANDとる作業に戻ったらしい。
0447名無しさん@お腹いっぱい。2012/07/29(日) 21:45:10.93
久しぶりに来たら変なの湧いてるな。
ash, bash あたりは POSIXシェルの現物じゃん。
zshは >>443 の言う通り微妙に違うけど。
POSIXに現物がないとか言ってる奴は、CやC++でも
言語規格も知らずにプログラム書くのか?ありえん。
(単に英語が苦手だから最新の規格書が読めなくてこだわってるだけだったりしてw)

基本、POSIXを参照して調べて、ashあたりで動作確認すれば
いいと思うけどな。(POSIX外の拡張が少ないという意味で)

とは言うものの、俺はまだ古いSolarisの保守とかもしてるので、
POSIX範囲内でも使えない機能とかあって鬱なのだが。orz
幸い、Solaris 5.8でもシェル関数は使える。
これがなきゃ死んでるところだ。
0448名無しさん@お腹いっぱい。2012/07/29(日) 21:47:07.40
bashで書いておいてbashがない環境ならbashをインストールする。
って手段すら取れないような環境にいるやつってどれだけいるんだろ。
0449名無しさん@お腹いっぱい。2012/07/29(日) 21:58:53.44
まあそれで良ければbashでもいいと思うよ。

でも、ちゃんと言語仕様を勉強してれば、POSIX範囲内で書くのも苦じゃ
ないので、bash入れる手間はたいしたことないけど、それも省くために
POSIX範囲内で書くってのもアリでしょ。

もっと多いのはオープンソースでソフトウェアを配布する場合で、
*BSDとかDebianとかはbashが入ってる保証はないから(入れるのは簡単だけどね)、
POSIX範囲内におさまるように(時にはv7 シェル程度でも動くように)書くのが普通。
0450名無しさん@お腹いっぱい。2012/07/29(日) 22:08:43.38
さすがにシェルファンクションないv7はない。
0451名無しさん@お腹いっぱい。2012/07/29(日) 22:13:23.77
まあ自分で普通に書く場合は、それが最低譲れない線だわ。
ただautoconf使う場合は、autoconfマクロでシェル関数を代替できるので、
シェル関数使わずに書くけど。
0452名無しさん@お腹いっぱい。2012/07/29(日) 22:14:29.06
autoconfマクロじゃなくてm4マクロと言うべきか?
まあ意味分かるよね。
0453名無しさん@お腹いっぱい。2012/07/30(月) 06:23:35.06
posixでは、echoには -n -e とかのオプションがない。
常に、-e オプションが付いたような状態で動作しなければならない。
例えば echo 'hoge\c' で改行なしになるとか、
echo -n は -n をそのまま(改行付きで)出力とか。

FreeBSDのashはその仕様に従っていないので、
posixだけ見て書くとechoの部分が正常に動かない。

だからposixには実用性がない。
0454名無しさん@お腹いっぱい。2012/07/30(月) 07:47:46.92
man echo
に、echoはポータビィリティに問題があり、代わりにprintfが使えると書いてる。
0455名無しさん@お腹いっぱい。2012/07/30(月) 07:54:35.33
ばんな
0456名無しさん@お腹いっぱい。2012/07/30(月) 07:56:07.99
>>454
それは知ってるよ。

ashはposixを満たしてると言う主張に対する反論ね。
0457名無しさん@お腹いっぱい。2012/07/30(月) 07:59:52.14
>>454
FreeBSDのashにはprintfが組み込まれてない(外部)ので、
printfの使用はパフォーマンス的にダメージ。
実際、FreeBSDのスクリプトはechoが多用されてる。
0458名無しさん@お腹いっぱい。2012/07/30(月) 08:58:27.43
> 常に、-e オプションが付いたような状態で動作しなければならない。
ダウト。-nは実装依存と書かれているわけだが。
0459名無しさん@お腹いっぱい。2012/07/30(月) 09:33:41.12
>>458
いいや、バックスラッシュ付き文字の解釈は必須。
-n はオプションではないとも明記されてる。
0460名無しさん@お腹いっぱい。2012/07/30(月) 09:49:52.52
実装定義と書かれているわけだが。

A string to be written to standard output. If the first operand is -n,
or if any of the operands contain a backslash ( '\' ) character,
the results are implementation-defined.
0461名無しさん@お腹いっぱい。2012/07/30(月) 09:50:58.33
>>458
> -nは実装依存と書かれているわけだが。

実装依存なら使っちゃダメじゃんwww
FreeBSDのrcスクリプトは echo -n バンバン使ってるぞ。
この件だけでも「POSIXだけ守ってれば良い」の反証として十分だよね。
0462名無しさん@お腹いっぱい。2012/07/30(月) 09:54:33.32
echo


OPERANDS
The following operands are supported:
string
A string to be written to standard output. If any operand is -n,
it will be treated as a string, not an option.
The following character sequences will be recognised within any of
the arguments:

\a Write an alert character.


-nはオプションじゃなく文字列として扱え、
以下の(\)シーケンスを認識しろ、

と書かれてるね。
0463名無しさん@お腹いっぱい。2012/07/30(月) 09:59:16.71
それはここでbash依存の質問をしてくるようなもんw
0464名無しさん@お腹いっぱい。2012/07/30(月) 10:06:31.42
>>461
FreeBSDが使っている事と「POSIXだけ守ってれば良い」は全く独立なわけだが。

>>462
それはSUSv2。POSIXじゃない。
0465名無しさん@お腹いっぱい。2012/07/30(月) 10:07:00.53
お前ら、ちゃんとdashのことも考えろよな
0466名無しさん@お腹いっぱい。2012/07/30(月) 10:14:40.58
>>464
いや、ここでは「POSIXだけ守ってれば良い」が否定されればそれでいいので
もう結論が出たよ。

>それはSUSv2。POSIXじゃない。
いや、POSIXだよ。1997年のだけど。
少なくともこの時点でのPOSIXがこんなことを言ってたんだから、
役に立たないというのも判ろうもの。
0467名無しさん@お腹いっぱい。2012/07/30(月) 10:16:54.62
>>457
> FreeBSDのashにはprintfが組み込まれてない(外部)ので、
> printfの使用はパフォーマンス的にダメージ。

微妙にダウトだな。
FreeBSD 9.0 からは printf は builtin に戻ったよ。
FreeBSD 4.X までも builtin だったので、5.X〜8.X の間は外部コマンド。
まあ builtin から外したのが判断誤りだったってことだな。
NetBSD の場合、昔からずっと builtin のまま。

> 実際、FreeBSDのスクリプトはechoが多用されてる。

OS 附属のスクリプトは、implementation-defined な仕様を利用してもいい
んだよ。undefined な仕様を利用するのは駄目だが。
0468名無しさん@お腹いっぱい。2012/07/30(月) 10:22:50.67
>>467
>OS 附属のスクリプトは、implementation-defined な仕様を利用してもいい
>んだよ。undefined な仕様を利用するのは駄目だが。

後出し条件追加ですか?w
0469名無しさん@お腹いっぱい。2012/07/30(月) 10:33:03.72
>>それはSUSv2。POSIXじゃない。

> いや、POSIXだよ。1997年のだけど。

さらっと嘘書くなよ。

ttp://en.wikipedia.org/wiki/Single_UNIX_Specification
にちゃんと、
・1997: Single UNIX Specification version 2
・2001: POSIX:2001, Single UNIX Specification version 3
 Beginning in 1998, a joint working group known as the Austin Group
 began to develop the combined standard that would be known as the
 Single UNIX Specification Version 3 and as POSIX:2001 (formally:
 IEEE Std 1003.1-2001).
って、書いてあるだろ。SUS と POSIX が統合されたのは、SUSv3 から。
SUSv2 は POSIX じゃない。

で、SUSv3 の echo の仕様
ttp://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html
には、ちゃんと implementation-defined って書いてある。
0470名無しさん@お腹いっぱい。2012/07/30(月) 10:40:01.92
>>OS 附属のスクリプトは、implementation-defined な仕様を利用してもいい
>>んだよ。undefined な仕様を利用するのは駄目だが。

> 後出し条件追加ですか?w

オイオイ、規格書の読み方も知らんのか…
もし implementation-defined な仕様の利用が許されないのなら、
そもそも、なんでわざわざそんな仕様を決めるんだよ。
状況が許せば使っていいからに決まってるだろ。
規格書読む上では、implementation-defined と unspecified と undefined の
違いくらい常識だから、勉強しておくように。
0471名無しさん@お腹いっぱい。2012/07/30(月) 10:45:07.83
>>470
論点がずれてるし、そんなこと言ってないよ。

「POSIXだけ守ってれば良い」という命題が否定されたので議論終了。
0472名無しさん@お腹いっぱい。2012/07/30(月) 10:51:04.06
>>471

嘘書いておいて、謝罪もなしか、厚顔無恥とはお前のためにあるような
言葉だな。

> 論点がずれてるし、そんなこと言ってないよ。
> 「POSIXだけ守ってれば良い」という命題が否定されたので議論終了。

論点がずれているのは、おまえさんの方。
もともと「POSIXだけ守ってれば良い」っていうのは、
「ポータブルなスクリプトを書く」という目的を達成するための手段の話だ。

FreeBSD の OS 附属のスクリプトなんて、ポータブルである必要がそもそも
全くない。シェルは ash、OS は FreeBSD だけ考えれば十分だ。
だから、POSIX を守る必要なんてそもそもない。
そういうものを挙げて「POSIXだけ守ってれば良い」っていう意見への反論だと
思うってことは、お前がそもそも、何の話をしているのか理解してないって
ことだな。
0473名無しさん@お腹いっぱい。2012/07/30(月) 10:54:17.05
>>472
>だから、POSIX を守る必要なんてそもそもない。


POSIXを守る必要なんてそもそもないんですね、駄目押しありがとう。
0474名無しさん@お腹いっぱい。2012/07/30(月) 11:01:41.95
家内制手工業に従事する自称プロは「POSIXだけ守ってれば良い」とかいう
命題勝手に作り出してそれを強制終了する以外にチンケなプライド守る方法が
無くなってしまったんだよ。

元々の噴飯ものの主張が
>>390
> ・bash/zsh/kshの共通項に合わせる
> か、
> ・純shに合わせる
> かの2択。
それで、共通項は手作業でAND取るんだって。プロwww
これでechoにかかわる非互換はどう解消されるんだろう。
0475名無しさん@お腹いっぱい。2012/07/30(月) 11:03:16.64
なんだ、最初から「FreeBSD でだけ動けば良いスクリプト」の話をしてたのかよ。
そういう限定した話を、OS限定しないスレで明示せずに主張してたのか。
悲しい奴だな。

一応指摘しておくが、たとえ「FreeBSD でだけ動けば良いスクリプト」を書く
場合でも(POSIX を守る『必要』はないが)、「POSIX を読んで理解しておく」
方がいいことは明白だ。
POSIX を参照せず、個々のシェルのマニュアルだけ読んでいるってのは、
C++言語の仕様も知らずに、Visual C++ のマニュアルだけ読んでるってのと
同じで、全く褒められた話じゃないからな。
もちろん、ash/bash/zsh すべてで動くスクリプトを書くつもりがあるのであれば、
たとえ FreeBSD 限定であっても POSIX を読んでおいた方がいい。その方が
知識取得の効率がいいからな。
ash/bash/zsh すべてのマニュアルを読んでおくのも勿論良い姿勢で、これまで
それで済んでいたのは分かるが、効率の点からは POSIX を読まないというのは
損であるとしか言いようがない。まあ自分の時間を無駄にしたいのであれば、
それでも構わんが、一般論としてスレでそれを主張するのはやめとけ。
0476名無しさん@お腹いっぱい。2012/07/30(月) 11:03:31.55
>>474
>これでechoにかかわる非互換はどう解消されるんだろう。

AND取る時点で自動的に解消されてるよ。
0477名無しさん@お腹いっぱい。2012/07/30(月) 11:06:07.21
>>476
はあ?
bash/ksh/zsh/ashで動くスクリプト要求されたらどうするんですかあ?
ANDが空集合だから出来ません。と断るんですか? www
プロは仕事を選ぶ www
0478名無しさん@お腹いっぱい。2012/07/30(月) 11:09:55.97
なんでこうトロくさいやり方に固執するかねえ。まあ、これまで うまく
いってたやり方を続けたいってのは人間の性質としてありがちではあるが。

ちょっと考えれば全部読んでANDするなんて効率悪いことぐらい分かりそうなのに。
エンジニアだったら、時間を効率的に使うことが美徳であることくらい知ってる
だろうに、恥ずかしくならないのかな。
0479名無しさん@お腹いっぱい。2012/07/30(月) 11:11:49.79
>>477
実際にAND取ってみればわかるが、空集合にはならない。
その集合だけでOKの用途の場合はechoを使う。
そうじゃない場合はecho以外の手段を使う。

ところが、POSIX至上主義だとimplementation-definedと書かれてるだけで
何の解決にもならない。批判してるのはそういう点だよ。
0480名無しさん@お腹いっぱい。2012/07/30(月) 11:14:59.11
> ところが、POSIX至上主義だとimplementation-definedと書かれてるだけで
> 何の解決にもならない。批判してるのはそういう点だよ。

いや、POSIXに従うのであれば printf を使えば解決する。FreeBSD でも動くよ。

まあ FreeBSD 5.X〜8.X では、ちょっと遅いが、それは FreeBSD が一時期、
判断間違えてただけの話(しかも、もう直ってる)。
FreeBSD 5.X〜8.X 固有のマイナーな問題点を、OS を限定しないスレで主張すんな。
0481名無しさん@お腹いっぱい。2012/07/30(月) 11:16:06.92
> その集合だけでOKの用途の場合はechoを使う。
> そうじゃない場合はecho以外の手段を使う。
ぷぷぷ、POSIXと同じこと言ってることに気づいて無いの。 www
0482名無しさん@お腹いっぱい。2012/07/30(月) 11:20:56.87
> ぷぷぷ、POSIXと同じこと言ってることに気づいて無いの。www

ご苦労さんとしか言いようがないよなあ。
POSIX にズバリそのまま書いてあることを、3つのマニュアルを見比べて、
自分の頭の中でANDするという手間ヒマかけて再発見とか。
まあ、それだけ暇な仕事なんだろう。ある意味うらやましいな。
真似は絶対したくないがw

0483名無しさん@お腹いっぱい。2012/07/30(月) 11:27:08.81
>>477 ってPOSIX読んでないだろ。
指摘されるまで AND取ったら空集合だと思い込んでたみたいだし。
0484名無しさん@お腹いっぱい。2012/07/30(月) 11:48:32.16
>>483
はあ? AND取るのにPOSIXは関係ありませんが。
4つのシェルのANDとるなんてバカな作業はもちろんやったことないですけど。www
0485名無しさん@お腹いっぱい。2012/07/30(月) 11:50:29.32
4つのシェルの仕様のANDをとるのがバカだということは分かるのに、
3つのシェルの仕様のANDをとるのはバカじゃないって思ってんの?
フツー1つの仕様(POSIX)読んで終りだろう、常識的に考えて。
0486名無しさん@お腹いっぱい。2012/07/30(月) 11:54:55.78
>>485
やだなあ。レス番よく追ってよ。僕(>>477)は、3つのシェルの仕様のANDを
取ってる自称プロを弄ってた方だよ。
0487名無しさん@お腹いっぱい。2012/07/30(月) 12:02:20.94
あ、そういうことか。勘違いした。
まあ >>477 の主張はちょっと不明確な気がする。
4つのシェルの仕様のANDとって、空集合になるなんてことはあまりない
(だいたいは代替手段がある)ので、何が言いたいのか分からないな。
4つのシェルの仕様をちゃんと読めば、目的が果たせることには変わりない。
問題なのは、それがとんでもない時間の無駄使いだってことだろう。
0488名無しさん@お腹いっぱい。2012/07/30(月) 12:02:51.87
POSIXでは、echoの引数に -n が(最初に)使われてる場合、
または
バックスラッシュが使われている場合が implementation-defined
と書かれている。

実はこれダウトなんだよ。
bashやzshのechoとか、-E (大文字)も特別扱いするから、(-eもだけど)

echo -E は、POSIXで言うところのimplementation-definedに該当しないはずなのに
ポータビリティーがない。

-E -e の件はPOSIX読んだだけでは書かれていないから、
正確なことを知るには自分でAND取るしかない。
0489名無しさん@お腹いっぱい。2012/07/30(月) 12:08:03.50
うん、今のたいていのシェルはPOSIX準拠だからね。ANDをとればPOSIXになる。
でも、自称プロは自分でANDを取る。 w
延べ数千人のレビューを経たPOSIXより、自分でANDを取った規約の方が上。
0490名無しさん@お腹いっぱい。2012/07/30(月) 12:11:17.53
>>489
延べ数千人のレビューを得ても echo -E / echo -e を見落としたんですか?
0491名無しさん@お腹いっぱい。2012/07/30(月) 12:18:41.90
> -E -e の件はPOSIX読んだだけでは書かれていないから、
> 正確なことを知るには自分でAND取るしかない。

お、珍しくマトモな意見だな。
POSIX の仕様が -n に限ってるのは、BSD の仕様をベースにしてるからだな。
だから *BSD で /bin/sh 使う分には POSIX だけで OK だけど、bash や zsh
だとまずい。
実際、俺は - で始まる文字列は単に避けるか、どうしても必要な場合は
printf 使うようにしてるんだよね。

規格は基本、実装の後追いだから、Linux 起源の仕様がどんどん POSIX に
採り入れられている現状からして、そのうち、echo の仕様も訂正されるん
じゃないかな。(でも getline(3) みたいなウンコはやめて欲しかったがなorz)

こういう齟齬は避けられないから、テストは不可欠だし、できれば各シェルの
マニュアルも確認しておいた方がいい。
でも、順番としてはまず POSIX が最初で、各シェルのマニュアルを参照するのは
後だよ。こういう例外を除き、ほとんどの場合、POSIX が仕様の AND をとっていて
くれるので、その方がずっと効率がいいからな。

だから、「各シェルのマニュアルも読んだ方がいいよ」って言うのなら主張として
いいんだよ。だが「POSIX は要らん。各シェルのマニュアルのANDだけで良い」と
いう主張はおかしい。まず最初に POSIX を確認すべき。
「各シェルのマニュアルのAND」は最後でいい。テストでコケるまで参照しなくても
いいくらいに優先順位が低い。

0492名無しさん@お腹いっぱい。2012/07/30(月) 13:58:58.26
むしろFreeBSDやashが排除されるのが合理的。
0493名無しさん@お腹いっぱい。2012/07/30(月) 14:03:07.82
FreeBSDだけやったところで、NetBSD, OpenBSD, DragonflyBSD,
それに Debian GNU/Linux があるぜ。
まあ FreeBSD だけに限っても無理だろうけど。
0494名無しさん@お腹いっぱい。2012/07/30(月) 22:42:54.26
ポータブルなスクリプトを作るってスペースを減らすしかないんじゃないの?
0495名無しさん@お腹いっぱい。2012/07/30(月) 23:13:07.54
んっ…はぁっ、あっ
■ このスレッドは過去ログ倉庫に格納されています