シェルスクリプト総合 その20at UNIX
シェルスクリプト総合 その20 - 暇つぶし2ch453:名無しさん@お腹いっぱい。
12/07/30 06:23:35.06
posixでは、echoには -n -e とかのオプションがない。
常に、-e オプションが付いたような状態で動作しなければならない。
例えば echo 'hoge\c' で改行なしになるとか、
echo -n は -n をそのまま(改行付きで)出力とか。

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

だからposixには実用性がない。


454:名無しさん@お腹いっぱい。
12/07/30 07:47:46.92
man echo
に、echoはポータビィリティに問題があり、代わりにprintfが使えると書いてる。

455:名無しさん@お腹いっぱい。
12/07/30 07:54:35.33
ばんな

456:名無しさん@お腹いっぱい。
12/07/30 07:56:07.99
>>454
それは知ってるよ。

ashはposixを満たしてると言う主張に対する反論ね。

457:名無しさん@お腹いっぱい。
12/07/30 07:59:52.14
>>454
FreeBSDのashにはprintfが組み込まれてない(外部)ので、
printfの使用はパフォーマンス的にダメージ。
実際、FreeBSDのスクリプトはechoが多用されてる。

458:名無しさん@お腹いっぱい。
12/07/30 08:58:27.43
> 常に、-e オプションが付いたような状態で動作しなければならない。
ダウト。-nは実装依存と書かれているわけだが。

459:名無しさん@お腹いっぱい。
12/07/30 09:33:41.12
>>458
いいや、バックスラッシュ付き文字の解釈は必須。
-n はオプションではないとも明記されてる。

460:名無しさん@お腹いっぱい。
12/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.

461:名無しさん@お腹いっぱい。
12/07/30 09:50:58.33
>>458
> -nは実装依存と書かれているわけだが。

実装依存なら使っちゃダメじゃんwww
FreeBSDのrcスクリプトは echo -n バンバン使ってるぞ。
この件だけでも「POSIXだけ守ってれば良い」の反証として十分だよね。

462:名無しさん@お腹いっぱい。
12/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はオプションじゃなく文字列として扱え、
以下の(\)シーケンスを認識しろ、

と書かれてるね。


463:名無しさん@お腹いっぱい。
12/07/30 09:59:16.71
それはここでbash依存の質問をしてくるようなもんw

464:名無しさん@お腹いっぱい。
12/07/30 10:06:31.42
>>461
FreeBSDが使っている事と「POSIXだけ守ってれば良い」は全く独立なわけだが。

>>462
それはSUSv2。POSIXじゃない。

465:名無しさん@お腹いっぱい。
12/07/30 10:07:00.53
お前ら、ちゃんとdashのことも考えろよな

466:名無しさん@お腹いっぱい。
12/07/30 10:14:40.58
>>464
いや、ここでは「POSIXだけ守ってれば良い」が否定されればそれでいいので
もう結論が出たよ。

>それはSUSv2。POSIXじゃない。
いや、POSIXだよ。1997年のだけど。
少なくともこの時点でのPOSIXがこんなことを言ってたんだから、
役に立たないというのも判ろうもの。

467:名無しさん@お腹いっぱい。
12/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 な仕様を利用するのは駄目だが。


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

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

469:名無しさん@お腹いっぱい。
12/07/30 10:33:03.72
>>それはSUSv2。POSIXじゃない。

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

さらっと嘘書くなよ。

URLリンク(en.wikipedia.org)
にちゃんと、
・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 の仕様
URLリンク(pubs.opengroup.org)
には、ちゃんと implementation-defined って書いてある。


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

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

オイオイ、規格書の読み方も知らんのか…
もし implementation-defined な仕様の利用が許されないのなら、
そもそも、なんでわざわざそんな仕様を決めるんだよ。
状況が許せば使っていいからに決まってるだろ。
規格書読む上では、implementation-defined と unspecified と undefined の
違いくらい常識だから、勉強しておくように。

471:名無しさん@お腹いっぱい。
12/07/30 10:45:07.83
>>470
論点がずれてるし、そんなこと言ってないよ。

「POSIXだけ守ってれば良い」という命題が否定されたので議論終了。

472:名無しさん@お腹いっぱい。
12/07/30 10:51:04.06
>>471

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

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

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

FreeBSD の OS 附属のスクリプトなんて、ポータブルである必要がそもそも
全くない。シェルは ash、OS は FreeBSD だけ考えれば十分だ。
だから、POSIX を守る必要なんてそもそもない。
そういうものを挙げて「POSIXだけ守ってれば良い」っていう意見への反論だと
思うってことは、お前がそもそも、何の話をしているのか理解してないって
ことだな。


473:名無しさん@お腹いっぱい。
12/07/30 10:54:17.05
>>472
>だから、POSIX を守る必要なんてそもそもない。


POSIXを守る必要なんてそもそもないんですね、駄目押しありがとう。

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

元々の噴飯ものの主張が
>>390
> ・bash/zsh/kshの共通項に合わせる
> か、
> ・純shに合わせる
> かの2択。
それで、共通項は手作業でAND取るんだって。プロwww
これでechoにかかわる非互換はどう解消されるんだろう。

475:名無しさん@お腹いっぱい。
12/07/30 11:03:16.64
なんだ、最初から「FreeBSD でだけ動けば良いスクリプト」の話をしてたのかよ。
そういう限定した話を、OS限定しないスレで明示せずに主張してたのか。
悲しい奴だな。

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

476:名無しさん@お腹いっぱい。
12/07/30 11:03:31.55
>>474
>これでechoにかかわる非互換はどう解消されるんだろう。

AND取る時点で自動的に解消されてるよ。

477:名無しさん@お腹いっぱい。
12/07/30 11:06:07.21
>>476
はあ?
bash/ksh/zsh/ashで動くスクリプト要求されたらどうするんですかあ?
ANDが空集合だから出来ません。と断るんですか? www
プロは仕事を選ぶ www

478:名無しさん@お腹いっぱい。
12/07/30 11:09:55.97
なんでこうトロくさいやり方に固執するかねえ。まあ、これまで うまく
いってたやり方を続けたいってのは人間の性質としてありがちではあるが。

ちょっと考えれば全部読んでANDするなんて効率悪いことぐらい分かりそうなのに。
エンジニアだったら、時間を効率的に使うことが美徳であることくらい知ってる
だろうに、恥ずかしくならないのかな。

479:名無しさん@お腹いっぱい。
12/07/30 11:11:49.79
>>477
実際にAND取ってみればわかるが、空集合にはならない。
その集合だけでOKの用途の場合はechoを使う。
そうじゃない場合はecho以外の手段を使う。

ところが、POSIX至上主義だとimplementation-definedと書かれてるだけで
何の解決にもならない。批判してるのはそういう点だよ。

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

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

まあ FreeBSD 5.X~8.X では、ちょっと遅いが、それは FreeBSD が一時期、
判断間違えてただけの話(しかも、もう直ってる)。
FreeBSD 5.X~8.X 固有のマイナーな問題点を、OS を限定しないスレで主張すんな。

481:名無しさん@お腹いっぱい。
12/07/30 11:16:06.92
> その集合だけでOKの用途の場合はechoを使う。
> そうじゃない場合はecho以外の手段を使う。
ぷぷぷ、POSIXと同じこと言ってることに気づいて無いの。 www

482:名無しさん@お腹いっぱい。
12/07/30 11:20:56.87
> ぷぷぷ、POSIXと同じこと言ってることに気づいて無いの。www

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



483:名無しさん@お腹いっぱい。
12/07/30 11:27:08.81
>>477 ってPOSIX読んでないだろ。
指摘されるまで AND取ったら空集合だと思い込んでたみたいだし。

484:名無しさん@お腹いっぱい。
12/07/30 11:48:32.16
>>483
はあ? AND取るのにPOSIXは関係ありませんが。
4つのシェルのANDとるなんてバカな作業はもちろんやったことないですけど。www

485:名無しさん@お腹いっぱい。
12/07/30 11:50:29.32
4つのシェルの仕様のANDをとるのがバカだということは分かるのに、
3つのシェルの仕様のANDをとるのはバカじゃないって思ってんの?
フツー1つの仕様(POSIX)読んで終りだろう、常識的に考えて。


486:名無しさん@お腹いっぱい。
12/07/30 11:54:55.78
>>485
やだなあ。レス番よく追ってよ。僕(>>477)は、3つのシェルの仕様のANDを
取ってる自称プロを弄ってた方だよ。

487:名無しさん@お腹いっぱい。
12/07/30 12:02:20.94
あ、そういうことか。勘違いした。
まあ >>477 の主張はちょっと不明確な気がする。
4つのシェルの仕様のANDとって、空集合になるなんてことはあまりない
(だいたいは代替手段がある)ので、何が言いたいのか分からないな。
4つのシェルの仕様をちゃんと読めば、目的が果たせることには変わりない。
問題なのは、それがとんでもない時間の無駄使いだってことだろう。


488:名無しさん@お腹いっぱい。
12/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取るしかない。

489:名無しさん@お腹いっぱい。
12/07/30 12:08:03.50
うん、今のたいていのシェルはPOSIX準拠だからね。ANDをとればPOSIXになる。
でも、自称プロは自分でANDを取る。 w
延べ数千人のレビューを経たPOSIXより、自分でANDを取った規約の方が上。

490:名無しさん@お腹いっぱい。
12/07/30 12:11:17.53
>>489
延べ数千人のレビューを得ても echo -E / echo -e を見落としたんですか?

491:名無しさん@お腹いっぱい。
12/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」は最後でいい。テストでコケるまで参照しなくても
いいくらいに優先順位が低い。



492:名無しさん@お腹いっぱい。
12/07/30 13:58:58.26
むしろFreeBSDやashが排除されるのが合理的。

493:名無しさん@お腹いっぱい。
12/07/30 14:03:07.82
FreeBSDだけやったところで、NetBSD, OpenBSD, DragonflyBSD,
それに Debian GNU/Linux があるぜ。
まあ FreeBSD だけに限っても無理だろうけど。

494:名無しさん@お腹いっぱい。
12/07/30 22:42:54.26
ポータブルなスクリプトを作るってスペースを減らすしかないんじゃないの?

495:名無しさん@お腹いっぱい。
12/07/30 23:13:07.54
んっ…はぁっ、あっ

496:名無しさん@お腹いっぱい。
12/07/31 00:37:56.28
そもそも改行無しのechoなんて使わなきゃいいのに

497:名無しさん@お腹いっぱい。
12/07/31 00:57:04.92
posixシェルを否定する唯一の材料みたいだからね。
ANDとる作業で工数水増ししてるのかもね。w

498:名無しさん@お腹いっぱい。
12/07/31 01:04:07.56
すみませn
""rm
という記述を見たんですが、""ってなんか意味があるんでしょうか?

499:名無しさん@お腹いっぱい。
12/07/31 02:14:35.41
rmがaliasになってるときにaliasを展開しないためじゃないかな


500:名無しさん@お腹いっぱい。
12/07/31 06:30:16.07
シェルスクリプト中で alias使うってすごいな。

501:名無しさん@お腹いっぱい。
12/07/31 12:35:16.71
>>500
だからだろ

502:名無しさん@お腹いっぱい。
12/07/31 12:46:26.03
シェルスクリプト中でジョブコントロールには勝てないだろw

503:名無しさん@お腹いっぱい。
12/07/31 14:19:59.11
ジョブコントロールはふつーに使うでしょ。
なんか重い処理を並列で走らせるときに

cmd1 &
cmd2 &
cmd3 &
wait

みたいな感じで。


504:名無しさん@お腹いっぱい。
12/07/31 14:34:56.99
>>503
それジョブコントロールちゃう。ただのバックグラウンド。

SIGTSTPで止めてバックに回して、
あとで fgしたりするやつ。

505:名無しさん@お腹いっぱい。
12/07/31 15:01:13.63
>>504
節子、を付けるべきだなw

506:名無しさん@お腹いっぱい。
12/07/31 15:07:12.60
バックグラウンドで動かすのもジョブコントロールの一部でしょ。

507:名無しさん@お腹いっぱい。
12/07/31 15:16:47.63
>>506
ちがう。

決定的な違いはプロセスグループIDの処理。
ジョブコントロールの場合は各コマンドのプロセスグループIDを別々にして、
親のシェルからは独立する。ttyの端末プロセスグループIDを
フォアグラウンドプロセスと同一にし、管理を行なう。

一方、ジョブコントロールなしの場合は、fork/execのあと、
単にwaitしないというだけの処理で、プロセスグループIDは親シェルと同じ。
だから、Ctrl-Cで同一プロセスグループIDのプロセスが死なないように
&を付けたコマンドはSIGINTを無視するようにしている。
(ジョブコントロール有りの場合はSIGINTはそのまま無視しない)


ジョブコントロールは、今のシェルなら set +m で無効にできる。
set +m でジョブコントロール無効にした状態でも
& や waitは実行できる。

純正/bin/shにはジョブコントロールがなかったが、
& や waitは当然実行できる。

508:名無しさん@お腹いっぱい。
12/07/31 15:31:33.28
>>499
それって\の方がシンプルだよね?

509:名無しさん@お腹いっぱい。
12/08/01 22:19:00.88
MNT=$(mount | grep "rootfs/proc")
if [ -z "$MNT" ]; then
mount -t proc proc ../rootfs/proc/
fi
この構文は短縮できないんでしょうか


510:名無しさん@お腹いっぱい。
12/08/01 22:22:35.02
>>509
mount | grep -q 'rootfs/proc' && mount -t proc proc ../rootfs/proc

511:510
12/08/01 22:23:46.64
&&ではなく、
|| に。

512:509
12/08/01 22:32:13.39
>>510
ははあー

513:名無しさん@お腹いっぱい。
12/08/02 08:59:36.06
いちいち判定しなくても二重にマウントされることはないんだから、
mount -t proc proc ../rootfs/proc/ >/dev/null 2>&1 || :
でいいじゃね?


514:名無しさん@お腹いっぱい。
12/08/02 09:25:31.26
いちいち||判定しなくても最後のステータスが有効なんだから、
mount -t proc proc ../rootfs/proc/ >/dev/null 2>&1; :
でいいじゃね?

515:名無しさん@お腹いっぱい。
12/08/02 09:28:56.05
書き込んだらセミコロン(;)消えた、、まあ、set -eなんてしてないという前提で。

516:名無しさん@お腹いっぱい。
12/08/02 20:18:32.37
jikken () {
command hoge $@
}
という関数を定義してたんですが

jikken -m "" -n "" unko

というコマンドを実行すると
hoge -m -n unko
というコマンドの実行になってしまうんですよね。
引数をきっちり hoge に渡すには
どうしたらいいんですかね

517:名無しさん@お腹いっぱい。
12/08/02 20:24:44.26
command hoge "$@"


518:名無しさん@お腹いっぱい。
12/08/02 20:29:19.70
>>517
ありがとう

519:名無しさん@お腹いっぱい。
12/08/08 12:58:57.06
bash だと変数の部分文字列を ${a:m:n} で取得できるけど、
同じことを bash の拡張機能を使わず、かつ内部コマンドだけでやる方法ってないかな?

いまは echo $a | cut -c$x-$y でやってるけど、
スクリプト中で何百回と呼ばれていて、これのせいでかなり速度が遅くなっちゃってる。


520:名無しさん@お腹いっぱい。
12/08/08 13:18:46.05
>>519
頭の3文字と後ろの2文字をカットしたい場合、

a=ABCDEFG
b=${a#???}
echo "${b%??}"

みたいにするしかないかな。この例では DE が残る。

521:名無しさん@お腹いっぱい。
12/08/08 14:17:12.55
ありがとう。それは考えたんだけど、位置を数値指定したいんだよね。
? を指定回数数並べた文字列を作るのにまためんどくさい手間がかかるのはちょっと。

とはいえ、やっぱり方法はそれしかないよなぁ。


522:名無しさん@お腹いっぱい。
12/08/08 14:18:52.44
>>521
printf %.5s '??????????????'

で5個の ????? が得られるよ。

523:名無しさん@お腹いっぱい。
12/08/08 14:20:25.24
欲しいのはこっちだろ
printf "%.*s" 5 '?????????????????????????????'

524:名無しさん@お腹いっぱい。
12/08/08 14:24:59.78
>>523
>>522 で合ってる。 %.${a}s にすればいいだけ

525:名無しさん@お腹いっぱい。
12/08/08 14:35:28.32
おお、ありがとです。なんとかなりそうだ。

526:名無しさん@お腹いっぱい。
12/08/08 15:49:08.27
実行速度が3倍になった。ありがとう。

527:名無しさん@お腹いっぱい。
12/08/08 21:33:50.42
名前付きパイプの使い方を修得した (`・ω・´)

一時ファイルの代わりにこれを使えばHDDガリガリしなくて済むんだよね?

528:名無しさん@お腹いっぱい。
12/08/09 00:33:59.19
まあその通りだが、いまのシェルだと
diff -u <(ls /old) <(ls /new)
とかできるから、わざわざ名前つけたりは、ほとんどしなくなったなあ。

529:名無しさん@お腹いっぱい。
12/08/09 06:48:33.30
>>528 のことを「名前付きパイプ」って呼んでる可能性もあるわけで・・
(mkfifoのことじゃなくて)

530:名無しさん@お腹いっぱい。
12/08/09 10:01:01.43
そうだとすると言葉の誤用なので (実装は pipe(2)でできるし)、
それはないと思いたいところだけどなあ。どうだろね。

531:名無しさん@お腹いっぱい。
12/08/09 10:45:19.41
>>530
実装依存だな。(言葉の誤用ではない)
FreeBSDだと本当にnamed pipeで実装されてるよ。

bash$ file <(:)
/tmp/sh-np-4033202023: fifo (named pipe)

532:名無しさん@お腹いっぱい。
12/08/09 10:57:37.18
コマンドがパス名を必要としている引数位置で使うのに、
どうやってnamed pipe以外で実装するんだよ。

533:名無しさん@お腹いっぱい。
12/08/09 10:59:51.72
>>532
Linuxだと、普通のpipeで実装して、それを/dev/fd/n(/proc/self/fd/n)経由で参照する 。
だからnamed pipeにする必要はない。

534:名無しさん@お腹いっぱい。
12/08/09 11:09:46.25
Named pipeの後始末は誰がする?

535:名無しさん@お腹いっぱい。
12/08/09 11:47:08.57
私自らが処罰を与える

536:名無しさん@お腹いっぱい。
12/08/09 11:49:03.21
>>531
いや、実装依存だから、名前の誤用なんだよ。
「<(コマンド)」の実装に常に named pipe が必要ならばともかく、
pipe(2) で実装されたり named pipe で実装されたりするものを、
named pipe って呼んじゃ駄目でしょ。


537:名無しさん@お腹いっぱい。
12/08/09 11:50:51.69
>>534
「<(コマンド)」の場合なら、これを解釈するシェルが始末する。

自力で named pipe 作ってるシェルスクリプトなら、ふつうは
そのスクリプトの中で trap とか使ってやるんじゃない?
(named pipe の目的にもよるので状況によりけりだけど)

538:名無しさん@お腹いっぱい。
12/08/09 12:06:58.48
>>536
もともと「named pipeを自動で」という設計思想で設計されたものだから、
結果の実装がどうあれ、named pipeと呼んで良い。

539:名無しさん@お腹いっぱい。
12/08/09 12:13:15.06
>>527がおいてけぼりになっとる。

540:名無しさん@お腹いっぱい。
12/08/09 12:23:57.33
上の例だとdiff終了時点でshellが削除だろうね。

541:名無しさん@お腹いっぱい。
12/08/09 12:31:51.13
全子孫が終了するまで削除しちゃだめだよね。

こんなのとか
daemon hoge <(hage)

542:名無しさん@お腹いっぱい。
12/08/09 13:19:33.96
>>538
え、そんなの初めて聞いたぞ。

「"named pipe" "shell script"」でググって出てくる上位5サイトに
「<(コマンド)」や「>(コマンド)」の話が、チラっとも出てこない
ことからして、君の組織だけで生まれたローカルな用法なんじゃねえ?

543:名無しさん@お腹いっぱい。
12/08/09 13:32:16.61
プロセス置換 (process substitution) がサポートされるのは、 名前付きパイプ (FIFO) または ファイル・ディスクリプターの /dev/fd 形式での指定 をサポートしているシステムです。

544:名無しさん@お腹いっぱい。
12/08/09 13:35:52.74
UNIX domain socketでも何とかなるでしょ。

545:名無しさん@お腹いっぱい。
12/08/09 13:40:06.41
>>543はbashのman page

546:名無しさん@お腹いっぱい。
12/08/09 13:40:10.34
>>544
UNIX domain socketでは、そのファイル名を渡されたコマンド側が
open()でオープンできないから無理。

547:名無しさん@お腹いっぱい。
12/08/09 13:41:12.87
>>544
openできないからだめ。

548:名無しさん@お腹いっぱい。
12/08/09 14:21:53.82
>>543
「コマンド置換」と、
「名前つきパイプ または ファイル・ディスクリプターの /dev/fd 形式での指定」が、
きちんと分離して書かれてるね。

しかも、名前つきパイプが使えることと、コマンド置換が使えることは等価ではない
(ファイル・ディスクリプターの /dev/fd 形式での指定ができればコマンド置換が
使える)ことも明確に書かれている。

ますます >>538 が、何を読んで、コマンド置換のことを名前つきパイプだと
思い込んだのか知りたくなるな。まさか >>543 の文章じゃないよな。

549:548
12/08/09 14:26:25.67
s/コマンド置換/プロセス置換/
だった。

550:名無しさん@お腹いっぱい。
12/08/09 14:26:36.71
初期のshellは”コマンド置換”的な文法だったと「UNIX原典」にあった。

551:名無しさん@お腹いっぱい。
12/08/09 14:27:37.29
>>548
「コマンド置換」??www

いつの間にコマンド置換に話になったんだよw

プロセス置換を理解していない無知自慢かよwww

552:名無しさん@お腹いっぱい。
12/08/09 15:34:32.97
<( … )の形でパイプが使えると知らなかったときは
/dev/shmに一時ファイル作ってガリガリ言わんようにしてたな
他に何も代わりの方法を思いつかなかったからだが

パイプって読取る方が書込む方より遅かった場合、書込む方は待たされるのか?
最近マルチコアが当たり前だし、キャッシュも利くだろうから、
一時ファイル作る方が速く処理が終わるかもしれん

553:名無しさん@お腹いっぱい。
12/08/09 15:52:20.68
>>552
> パイプって読取る方が書込む方より遅かった場合、書込む方は待たされるのか?
でかい出力処理 | less
とかやったことないの?

> 最近マルチコアが当たり前

> 一時ファイル作る方が速く
が、全然つながんねえ

554:名無しさん@お腹いっぱい。
12/08/09 15:56:31.53
> > 最近マルチコアが当たり前
> と
> > 一時ファイル作る方が速く
> が、全然つながんねえ

だね。
名前つき/なしに関わらず、パイプやソケットならマルチコアで
並列に動く可能性がある(マルチコアを生かせる)けど、
ファイル経由してたら、シングルコアと性能変わらん。

>>551
で、結局、「プロセス置換のことを、named pipe と呼ぶ」っていうのは
どこかの組織のローカルルールの話だったってことで OK?
世の中に広まってる話なら、ソースよろ



555:名無しさん@お腹いっぱい。
12/08/09 16:12:16.26
>>554
ggrks

556:名無しさん@お腹いっぱい。
12/08/09 16:17:46.74
世界最強のシェルスクリプトを作ったのでみんなで使ってください。
たぶんzshでしか動きません:)

command-line clock - Pastebin.com
URLリンク(pastebin.com)


>>read -t1 q ## -t1=timeout option 1 second.

ところで、ここを-t0.001とかどんどん小さな値にしていくと、終了時の動作(適当にEnterとか入力して終わらせてください。)として
breakした後にまだechoってるような表示になってまうことが10回起動・終了すれば1回ぐらいあるような感じなんですが、
これってなんでなんですか。

557:名無しさん@お腹いっぱい。
12/08/09 16:26:30.18
readの次に
sleep 0.5
とか入れてみればほぼ100%再現するよ

558:名無しさん@お腹いっぱい。
12/08/09 16:28:06.39
>>555
答えられないのね。

559:名無しさん@お腹いっぱい。
12/08/09 16:29:35.46
>>557
うん、そうなんですよね。どういうことなんでしょうか。
ていうか、プログラムのコピペミスってますね、さーせん。

560:名無しさん@お腹いっぱい。
12/08/09 16:33:00.69
あぁ、sleep中に打ち込んでるからってことでしょうか。なるほろ×2。
本当にありがとうございました。

561:名無しさん@お腹いっぱい。
12/08/09 16:36:14.11
>>555
グーグルは存在の検索はできるが、非存在の検索は出来ない。

562:名無しさん@お腹いっぱい。
12/08/09 16:36:26.28
いや、でもやっぱりそれっておかしくねえ?
readの変数への代入がwhileループ始まるより遅いってこと?

563:名無しさん@お腹いっぱい。
12/08/09 16:38:02.93
あぁ、おかしくないか、打ちこんでる間のタイムアウトの方が早くて次のループに入ってるだけの話か。そういうことっすよね?
本当にありがとうございました。

564:名無しさん@お腹いっぱい。
12/08/09 16:38:42.42
改行して、whileで一度中に入って、時刻表示して、次のreadで取り込まれて、while抜ける

565:名無しさん@お腹いっぱい。
12/08/09 16:39:14.15
>>562
変数への代入じゃなくて、
read実行開始時に端末のバッファをフラッシュする関係で
直前のEnterを取りこぼすということ。

566:名無しさん@お腹いっぱい。
12/08/09 16:42:25.90
>>565
いや、それは違うだろ

567:名無しさん@お腹いっぱい。
12/08/09 16:45:15.73
read -t 0.01 とか sleep 0.5 とか、Linux限定全開ですな

568:名無しさん@お腹いっぱい。
12/08/09 16:47:58.63
昔gccがgasにpipeで渡すか、それとも一時ファイルかという議論があった時は、
性能評価のレポートによりpipeで渡す方が効率が良いということになった。
もちろんSSDが主流になるといろいろと変わってくると思われるが。

569:名無しさん@お腹いっぱい。
12/08/09 16:49:47.73
read -t は駄目だけど、sleep 0.5 は *BSD でも動くよ。
まあどっちも POSIX 外で、移植性はないけどな。

570:名無しさん@お腹いっぱい。
12/08/09 16:52:50.82
zsh限定って最初から断わってんだから、read -t も有り

571:名無しさん@お腹いっぱい。
12/08/09 16:55:46.68
sleepってビルトイン関数じゃないからzsh関係ないような。

572:名無しさん@お腹いっぱい。
12/08/09 17:02:39.79
だからー
sleep 0.5 は *BSD で可なので、Linux限定ではない
read -t は zsh で可なので、Linux限定ではない

573:556
12/08/09 17:18:27.14
-tの時間を少なくしていくと、
While文の条件判定の所で一番時間が掛かるようになっていって、
そこの間でEnterを打ち込むから、echoが二度効いてしまうように見えるってことかな?

最初はecho中にEnterが効いてるからと思ったけど、それならWhileループに二度目突入しないものね。

574:名無しさん@お腹いっぱい。
12/08/09 17:25:58.46
readがタイムアウトした瞬間から、
echoの最初の文字を出力する瞬間までの、どこでもありうるね
echoが二度効いてるんじゃなくて、Enterで次の行に行っちゃったから、
そこにechoしてるだけ。

575:名無しさん@お腹いっぱい。
12/08/09 17:58:01.77
世界最強ってところには誰も突っこまないのか。

576:名無しさん@お腹いっぱい。
12/08/09 18:20:53.39
そこつっこんでも面白くならない。

577:名無しさん@お腹いっぱい。
12/08/09 18:38:20.10
突っ込まれたくないなら世界で2番目くらいに強いって言っとけばいい

所で、時計なのに一定時間待つって処理でいいの?タイマ設定してシグナル送ってもらった方が正確じゃね

578:556
12/08/09 18:59:37.13
command-line clock v2 - Pastebin.com
URLリンク(pastebin.com)

ちょっと改変して、コマンドのreturnの値を条件式として使うように、
こんな風にしてみました。

でも、こうしても-tの値を減少させていくと、二重にechoってるようになるのが
どうしても解せません。なんでだよ!さすがにおかしいだろ!
やっぱり順次処理されてないのでは?

>>577
そんな格好いいのが出来るなら、敗北は認めなければなりませんね。
そこに美しさがあれば世界金メダルは譲ります。

579:名無しさん@お腹いっぱい。
12/08/09 19:02:59.50
readでタイムアウトしてからechoまで0秒じゃないんだから、
そこでEnter打ったらなるんだよ
echoの前に sleep 入れてみたら確認できるだろ

580:556
12/08/09 19:06:32.81
>>579
あ、前のechoが残ってるのか、
どうやらオバカさん世界一の金メダルは私のもののようですね。ふっふっふっ。

本当にどうもありがとうございました。

581:名無しさん@お腹いっぱい。
12/08/09 19:18:48.76
てゆーか、この程度なら、別に zsh の read -t とか、
BSD&Linux の拡張 sleep とかに依存せず、POSIX 範囲内で書けないか?
こんな感じ。

#!/bin/sh

while :; do printf "\r%s" "$(date +%Y-%m-%dT%H:%M:%S%:z)"; sleep 1; done &
pid=$!
read x
kill $pid


582:名無しさん@お腹いっぱい。
12/08/09 19:25:37.74
sleep 1 だと遅延が蓄積して、どこかで2秒進んだりするから、
1秒未満でもうちょっと細かく再表示したいっていう意図じゃないの?


583:名無しさん@お腹いっぱい。
12/08/09 19:26:03.35
>>581
せっかくそこまでするなら $( ) は ` ` にすべき。

584:名無しさん@お腹いっぱい。
12/08/09 19:35:13.63
> sleep 1 だと遅延が蓄積して、どこかで2秒進んだりするから、
> 1秒未満でもうちょっと細かく再表示したいっていう意図じゃないの?

対話的シェルにリアルタイム保証なんてないから、read -t の時刻指定を
いくら細かくしたところで、マシン負荷が高くなれば、2秒どころかもっと
進む可能性はあるよ。そういう、対話的シェルで実現困難な仕様は、そもそも
盛り込むべきじゃないだろう。

ちょっとの負荷で2秒とびが嫌だっていうなら、拡張sleepに依存して
sleep 1 を sleep 0.9 ぐらいにするって手は、まあないわけではない。
read -t や sleep で指定する秒数をあまり小さくすると、無駄なマシン負荷が
増えるので、あまり小さくするのは推奨せんが。

>>583
Solaris の古いシェルとかで動かすことも考慮するなら、その通りだな。
まあ、そこは常識で分かると判断した。

585:名無しさん@お腹いっぱい。
12/08/09 19:36:24.68
それをいっちゃあ、リアルタイムOSじゃないのに、xclockとかありえんって話になる

586:名無しさん@お腹いっぱい。
12/08/09 19:39:33.95
date +%N で現在時刻のナノ秒を取得して、
それを sleep 0.123 とかの小数点以下に(計算の上)反映すれば
無駄にプロセスを使わずにうまく同期できるのでは?

587:名無しさん@お腹いっぱい。
12/08/09 19:41:11.55
逆逆。
リアルタイムOSじゃないので、xclockだって、更新間隔が1秒より大きくなる
こともある。それが仕様。
xclock にだって不可能なことを、シェルスクリプトに求めるなんて、そもそも
そういう要求自体がおかしいってこと。

588:名無しさん@お腹いっぱい。
12/08/09 19:43:59.25
>>586
高負荷時のことを考慮に入れるのなら、そんなんじゃ全くもって無理。

鯆管って、ほんとリアルタイム処理を分かってないなーって言っちゃうよ。
ちゃんと考えてみなよ。

どうしても分かんなければ説明するので、その場合は降参と宣言することw

589:名無しさん@お腹いっぱい。
12/08/09 19:46:52.91
よし降参だ説明くれ

590:名無しさん@お腹いっぱい。
12/08/09 19:47:45.98
>>588
高負荷時のことはどうでも良くて、
位相的にきっちり合わせたいということでしょ。

非同期で突然 sleep 1 を whileループで回せば、
最初から誤差が最大 0.99999... 秒になる。
これを、毎回 date +%N で 1秒未満の残り時間を把握しつつ
sleep 0.9821 とかすれば「位相」が同期する。

591:556
12/08/09 19:50:02.71
>>581
つーか、これでいいっすね。&使ってバックグラウンドに回しても表示効くのね。
しかもそいつをreadでインプット待ちにしておいて、インプット来たら殺すとかすげー。
でもこいつでsleep間隔いくら小さくしても、おいらの作ったスクリプトみたいに、echoの二重表示にならないのはどうしてなのか理屈がわからない。どうしてでしょう。
バックグラウンドジョブにしてるから?わかる人本当にお願いします。

>>582
そういう意図はありまくりんぐでしたけど、>>581さんのやり方でsleepの時間をさらに小さくするだけでいいように思います。負荷との兼ね合いですが。


592:名無しさん@お腹いっぱい。
12/08/09 19:53:13.20
>>589
答えは、
 高負荷時には、date +%N の実行だけで数秒ないしそれ以上の
 時間がかかることがあるから
だ。

分かりやすい例でいうと、メモリが溢れていて、date コマンド
どころか、シェルまで swap に追い出されていて、スラッシング
しまくりの状況を考えてみるといい。

たとえメモリが足りててても、CPUその他のリソースが足りてなければ
数秒程度の遅延は普通に起こる。

まあ、鯆管的には、そんなに高負荷になる前にリソースなりマシンなりを
増やせってことになるので気にしてないだろうが、高負荷を気にしないなら
sleep 0.9 でも十分だ。

>>590
なるほど。
そういう意図であれば、確かに拡張sleepに依存するのもいいな。

593:名無しさん@お腹いっぱい。
12/08/09 19:59:25.40
>>591
> でもこいつでsleep間隔いくら小さくしても、おいらの作ったスクリプトみたいに、echoの二重表示にならないのはどうしてなのか理屈がわからない。どうしてでしょう。

read と kill の間に、時間のかかるdateみたいな処理がないから、
その間にechoが動いてしまう可能性が確率的に非常に少ない。
そこにダミーのsleepでも入れれば二重表示にできるよ。

594:名無しさん@お腹いっぱい。
12/08/09 20:01:56.63
>>593 の言う通りだ。

read x
sleep 1
kill $pid

に変更すれば、二重表示が簡単に確認できる。

595:556
12/08/09 20:12:11.80
>>593>>594
おぉ、本当だ。お前らかっこいいなぁ。ワクワクさん並に輝いてるわ。

どうも本当にありがとうございました。

596:527
12/08/09 21:43:53.53
後始末について聞いてみたかったんだけど
やめといたほうがいいのかな… (; ・ω・)

597:名無しさん@お腹いっぱい。
12/08/09 21:56:40.30
終了したからいいよね。named pipeだった時の
>>541の後始末のタイミングは?

598:名無しさん@お腹いっぱい。
12/08/09 22:20:41.64
よく知らんけど、たぶん、named pipe を使ったプロセス置換の実装の場合、
>>541 は、うまく動かない可能性もあるんじゃないかな。
まだ使用する前なのに消されてしまうことがあると予想。

ただ、コマンド hoge が既に named pipe をオープンし終えていれば、
ディレクトリツリーから named pipe が消されても、named pipe の実体は
残っている。その場合は動く。
というわけで、これは 消される前にオープンできるか否かという
race condition があるケースであり、うまいこと動くこともあるとは思う。

named pipe ではなく、pipe と /dev/fd/ を使った実装なら、
そういう race condition なしで動くだろうけど。


599:名無しさん@お腹いっぱい。
12/08/09 22:32:03.31
>>598
<(...) や >(...) が named pipeで実装されてるFreeBSDのbashでちょっと
試してみたが、daemonみたいに子が先にexitして孫が残るケースでも無問題。

どうやら、named pipeに対する読み手と書き手が揃ってパイプがつながった段階で
unlink(2)される模様。プロセス実行中に先にunlinkされてる。

600:名無しさん@お腹いっぱい。
12/08/09 22:34:14.50
検証どうも。
以外な結果だなあ。
孫が、引数をオープンする前に、たとえば10秒くらい待つような場合、
named pipe を管理するシェルはずっと待機しているってこと?

601:名無しさん@お腹いっぱい。
12/08/09 22:35:20.24
おまえらのために実験してやったぞ
シェルの実装依存だ

zsh: 親が死んだらさっさと消す
bash: みんな死んでもbash自体が終了しても消さない
他は誰か試せ

テストコード
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void check(char *path) {
if (access(path, F_OK) == 0) printf("%s exists\n", path);
else printf("%s does not exist\n", path);
}

int main(int argc, char *argv[]) {
sleep(1); check(argv[1]);
sleep(1);
if (fork()) {
printf("forked\n");
sleep(1); check(argv[1]);
sleep(1); printf("parent exits\n");
exit(0);
} else {
sleep(3); check(argv[1]);
sleep(1); printf("child exits\n");
exit(0);
}
}


602:名無しさん@お腹いっぱい。
12/08/09 22:39:20.34
>>600
読み手と書き手が揃わない場合は、named pipe は放置されるww

例えば、
bash$ ls <(:)
bash$ exit

なんてやると、lsコマンドも :コマンドもnamed pipeにアクセスしないから、
/tmp/np-sh-XXXXX みたいなファイルが残ったまま bashが終了できてしまう。
bash終了時にはunlinkしないみたい。

603:名無しさん@お腹いっぱい。
12/08/09 22:42:25.58
cat <(ls)
でも残るんだが

604:名無しさん@お腹いっぱい。
12/08/09 22:42:51.12
> 読み手と書き手が揃わない場合は、named pipe は放置されるww

これはひどいw
FreeBSD でも /dev/fd/ が実際にはあるわけだから、named pipe じゃ
なくて、そっち使うように直した方がいいんじゃ。

605:名無しさん@お腹いっぱい。
12/08/09 22:46:21.67
>>603
残らないよ。(bash/FreeBSDで)

606:名無しさん@お腹いっぱい。
12/08/09 22:48:04.29
> cat <(ls)
> でも残るんだが

FreeBSD-7.3 + bash-4.0.24 の組合せで確認した。
確かに /var/tmp/sh-np-数字 という名称で残る。

>>605
バージョンは?


607:名無しさん@お腹いっぱい。
12/08/09 22:50:00.77
>>604

ls /dev/fd 3< file

↑これとか実行してみるとわかるが、
FreeBSDの /dev/fd は、0 1 2 しかファイル記述子に対応してない。(3以降ダメ)

608:名無しさん@お腹いっぱい。
12/08/09 22:50:56.70
>>606
FreeBSD-8.1 bash-4.1.7

609:名無しさん@お腹いっぱい。
12/08/09 22:55:26.55
>>607
マジか、知らなかった… が、確かにそのようだ。確認した。
NetBSD あたりから動く実装持ってくればいいのに。
NetBSD の方では、zsh も bash も /dev/fd/ 使ってる。

610:名無しさん@お腹いっぱい。
12/08/09 22:58:20.47
bash-4.2.37/FreeBSD-9.0だけど残る

611:名無しさん@お腹いっぱい。
12/08/09 23:02:10.30
よくよく確認したら、3以上のディスクリプタについても、
FreeBSD-4.3 なら動いたよ。
/dev/fd/* の実体はキャラクタ型のデバイス・ファイルなので、
デバイス自体はたぶん FreeBSD-7 でも動くんじゃないかな。

つまり、devfs 導入時にデグレったんだ、これ。

612:名無しさん@お腹いっぱい。
12/08/09 23:05:07.38
FreeBSD-7.3 上で bash-4.2 の配布物そのままを野良ビルドしてみたが、
やっぱり named pipe が /var/tmp/ に残るね。
bash のバージョンの違いが原因ではなさそう。

613:名無しさん@お腹いっぱい。
12/08/09 23:10:05.47
残らないという環境の>>608は、何が原因なんだろう
そもそも、bashに、named pipeの中身が書かれたり読まれたという事実がわかるのか?

614:名無しさん@お腹いっぱい。
12/08/09 23:14:54.36
> そもそも、bashに、named pipeの中身が書かれたり読まれたという事実がわかるのか?

そう、自分もそれが疑問だった。
kqueue(2) にはそういう機能なさそうだから、無理じゃないか。

まあ kdump(1) と同じことするって手がないわけじゃないが、
bash のやるようなことじゃない。

615:名無しさん@お腹いっぱい。
12/08/09 23:14:56.99
>>613
オレもそれ考えてたんだけど、
named pipeに対して select(2)してパイプがつながったかどうか検出してるとか。

616:名無しさん@お腹いっぱい。
12/08/09 23:15:48.98
cat <(ls) して、しばらくほっといたら消えた!

617:名無しさん@お腹いっぱい。
12/08/09 23:16:35.39
読み手が繋がったことは、それじゃ分からないよ。
書き手についても、書き込みが起こるか、あるいは書き込みオープン後クローズ
されれば分かるけど、書き込みオープンされただけじゃ分からない。

618:名無しさん@お腹いっぱい。
12/08/09 23:41:09.94
bash-4.2.37/FreeBSD-9.0だけど

cat <(ls)
した直後は確実に/var/tmp/sh-np-hogeが残っている。
けど、Enter押して次のプロンプトが出たときに消える。
別の端末でlsして確認した。

: <(ls)
だと消えない。
けど、誰かが cat /var/tmp/sh-np-hoge すると、
次のプロンプトを出すときに消える。

: <(ls)
して、bashをさっさとexitしてしまうと、
誰かが cat /var/tmp/sh-np-hoge しても、永久に残る。

つまり、named pipeを作ったbashが、プロンプトを出すか何かの時点で、
named pipeが読まれたかどうかを確認していることになる。

どうやってかは知らない。


619:名無しさん@お腹いっぱい。
12/08/09 23:51:57.74
そもそも残ってることって問題か?/tmp 以下なら再起動で消えそうだけど
別の話だけど、名前付きパイプだと全く関係の無い別のプロセスからも
読み書きできるから大丈夫なのって思う

620:名無しさん@お腹いっぱい。
12/08/09 23:58:35.21
パーミッションが自分にしか出てないからいいんじゃない?


621:名無しさん@お腹いっぱい。
12/08/10 00:09:04.36
>>609
kldload fdescfs

622:名無しさん@お腹いっぱい。
12/08/10 00:39:28.35
dbus-*地獄とか勘弁w

623:名無しさん@お腹いっぱい。
12/08/10 01:00:01.40
/var/tmpだから再起動じゃ消えない。
頻繁に呼ばれるCGIとかでこれが起きたらやっぱりやだよ。

624:名無しさん@お腹いっぱい。
12/08/10 01:06:07.46
bashのソース(subst.c)読んだ。自分用まとめ。

・ <(hoge) が出てくると、mkfifoしてforkする。
・ 親シェルはそのfifoと子シェルpidをひもづける。
・ 子シェルはそのfifoをwrite openする。
・ fifoのwrite openは、readするプロセスがいなければブロックされる。
・ だから : <(hoge) だと、hogeは起動されず、子シェル状態のまま。
・ readするプロセスが現われたら、openが成功し、dup2してstdoutにつなぐ。
・ parse_and_executeを呼んで中でforkしてhogeを実行する。
・ hogeが終わったら子シェルは死ぬ。
・ 親シェルは定期的(コマンド起動のタイミングとか)にfifoにひもづけられた子シェルの状況を調べて、死んでたらfifoをunlinkする。


625:名無しさん@お腹いっぱい。
12/08/10 01:13:15.04
bash実装の場合、ソース読むと、
コマンド列の最後のコマンド終了した時に消してるみたい。

626:名無しさん@お腹いっぱい。
12/08/10 01:18:16.27
そだね。
cat <(ls)
だと、子シェルが死ぬタイミングがちょっと遅れるみたいで、
直後にはfifoがunlinkされない。
cat <(ls); sleep 1
だと、確実に残らない。

627:名無しさん@お腹いっぱい。
12/08/10 01:19:10.77
結論としてnamed pipe版プロセス置換はカス。でいい?

628:名無しさん@お腹いっぱい。
12/08/10 01:21:11.65
>>627
OK! おやすみ!

629:名無しさん@お腹いっぱい。
12/08/10 01:34:51.13
最近のFreeBSDではmount -t fdescfs fdescfs /dev/fd
してからbashを作るとpipe+/dev/fdで作成される。

630:名無しさん@お腹いっぱい。
12/08/10 01:39:01.51
>>629
コンパイル時決め打ちだからちょっとまずいね。

631:名無しさん@お腹いっぱい。
12/08/10 01:58:31.64
send-prしといて

632:名無しさん@お腹いっぱい。
12/08/10 07:29:33.75
質問させてください。

現在、'nc -l 12345'コマンドを発行し、それに対しsocket通信を行い、期待した通信が行われているか確認しています。
しかし、上記コマンドでは1回closeしてしまうと、上記コマンドも終了してしまいます。
連続的にsocket通信を行い、期待した結果が入っているかチェックを行いたかったので、以下のようなスクリプトを書きました

while :
do
  `nc -l 12345`
done

しかし、上記を実行して、socket通信を行うと、なぜか、送信したデータを表示するのではなく、実行しようとして、エラーメッセージが出ます
socket通信を受けるたびに、nc -l... コマンドを発行し通信内容を表示するにはどうすればいいのでしょうか?

よろしくお願いいたします。





633:名無しさん@お腹いっぱい。
12/08/10 07:34:47.58
>>632

` ` が余計だろ。

634:名無しさん@お腹いっぱい。
12/08/10 07:57:12.67
>>632
わざわざシェルスクリプトにしなくても、

nc -k -l 12345

を発行(笑)すればcloseしても終了しないよ。

635:名無しさん@お腹いっぱい。
12/08/10 13:05:30.89
発行って言葉使っちゃいかんの?

636:名無しさん@お腹いっぱい。
12/08/10 13:07:59.84
コマンドは普通は「実行」する。

637:名無しさん@お腹いっぱい。
12/08/10 13:23:20.11
起動だな

638:名無しさん@お腹いっぱい。
12/08/10 13:32:30.35
execute

639:名無しさん@お腹いっぱい。
12/08/10 13:39:44.13
起動は終了を伴わないdaemonプロセスのような場合。

> nc -k -l 12345
に使うのは正しいが、

> を起動
とは使わない。
> のように起動

640:名無しさん@お腹いっぱい。
12/08/10 13:49:30.52
>>639
ktkr

641:名無しさん@お腹いっぱい。
12/08/10 14:01:15.32
コマンドラインで打つならinvokeってのもあるんだぜ。
issueは機械語命令レベルならアリだけどな。


642:名無しさん@お腹いっぱい。
12/08/10 14:24:21.06
そういえば命令は発行するもんだな。

643:名無しさん@お腹いっぱい。
12/08/10 15:47:16.98
汎用機やDBの世界はjobをissueする。

644:名無しさん@お腹いっぱい。
12/08/10 17:51:11.83
>>624, >>625



> ・ fifoのwrite openは、readするプロセスがいなければブロックされる。

そうか、これで read 側のオープンを検知できるのね。勉強になった。
この named pipe を使わう場合の実装、面倒臭そうだなー。




645:名無しさん@お腹いっぱい。
12/08/10 18:01:48.99
検知というかブロックね。

646:名無しさん@お腹いっぱい。
12/08/10 18:03:28.19
>>645
open()に O_NONBLOCK フラグ付けて呼べば「検知」できるだろ。

647:名無しさん@お腹いっぱい。
12/08/10 18:04:12.63
>>645
なにいってんの?
read側のオープンをブロックするって何?


648:名無しさん@お腹いっぱい。
12/08/10 18:04:46.74
fdescfsって何故デフォで有効になってないの? 何か問題あるの?
procfsがデフォで有効になってないこととも関係ある?

649:名無しさん@お腹いっぱい。
12/08/10 18:07:24.02
>>646
O_NONBLOCKで行けるなら、昨日誰かが言ってた select()でも検知できそうだな。

650:名無しさん@お腹いっぱい。
12/08/10 18:16:22.36
bashは書込みopenでO_NONBLOCKつけてないよ。
相手が読出しopenしてブロック解除されたことで「検出」してる。

651:名無しさん@お腹いっぱい。
12/08/10 18:33:26.93
cmd1 <(cmd2)
だと
1. named pipe作成
2. 読み出しオープン→cmd1実行
3. 書き込みオープン→cmd2実行
こんな順のはず。SIGPIPE/EPIPE食らわないように。

652:名無しさん@お腹いっぱい。
12/08/10 19:26:29.50
>>648
procfsもfdescfsも、Linuxのエミュレーションのためにあるような代物なのです。
fdescfsを使わない方がシステムとして美しい。
/dev/fd/ なんて使わずにnamed pipeできっちり実装した方がいいのです。

653:名無しさん@お腹いっぱい。
12/08/10 19:36:16.75
どうぞどうぞ

654:名無しさん@お腹いっぱい。
12/08/10 19:52:21.85
> procfsもfdescfsも、Linuxのエミュレーションのためにあるような代物なのです。

またそういう嘘をつかないように。
/proc/ も /dev/fd/ も、どちらもベル研UNIX発祥の由緒正しいアイディアだよ。
*BSD や Linux だけじゃなく、Solaris 含む SVR4 系 UNIX でも実装されてる。


655:名無しさん@お腹いっぱい。
12/08/10 20:09:40.36
発祥について言ってるんじゃなくて、
FreeBSDって、6か7かあたりで /procをマウントしなくなったじゃん。
Linuxとは違って各コマンドが /procに依存してない。
だから今のFreeBSDは /procを外す方向でしょ。
fdescfsの方は知らんけど。

656:名無しさん@お腹いっぱい。
12/08/10 20:13:34.09
FreeBSDって何で/procデフォルトでマウントしないんだろうか。
FreeBSDハンドブックあたりには「セキュリティ上の理由」みたいなこと書いてあったような気がするけどその理由が良く分からんかった。
Linuxでは/procに頼ってるソフト結構あるせいでFreeBSDでは動かなかったりしそう。

657:名無しさん@お腹いっぱい。
12/08/10 20:14:23.29
>>652のような街頭演説はFreeBSDのスレでどうぞ。

658:名無しさん@お腹いっぱい。
12/08/10 20:24:09.55
NetBSDの場合、/procよりptrace(2)の方が効率いいから/proc積極的に使う
意味ないじゃんみたいなことを偉い人が言ったせいだって話を、どっかで
誰かが書いてたような気がする。
NetBSDは昔っから/procはマウントしてない。

で、fdescfs使うかどうかはあまり問題じゃなくて、/dev/fd/*がちゃんと
使えればそれでいいんだと思うよ。devfs登場前のFreeBSDとか、NetBSDとかは
fdescfsなしでも/dev/fd/*が、まあまあちゃんと使えたわけで、だったら
fdescfsなしでもいいじゃんみたいな発想だと思う。
devfs導入時に、/dev/fd/*が中途半端な状態になっちゃった(3未満の
ディスクリプタに対してしか動かなくなった)のが真の問題でしょう。
サポートしないつもりなら/dev/fd/*を削った方がいいし、サポートする
つもりなら、もうちょっとなんとかした方が。

659:名無しさん@お腹いっぱい。
12/08/10 20:27:13.36
だからsend-prを!

660:名無しさん@お腹いっぱい。
12/08/10 20:28:39.42
/procとptrace(2)じゃほとんど機能かぶらないけど…

661:名無しさん@お腹いっぱい。
12/08/10 20:33:35.24
ストリーム読んでパースするより構造体で取得できるsysctlの方がrobust

662:名無しさん@お腹いっぱい。
12/08/10 20:35:08.85
>>660
ベル研のprocfs登場時の主要機能は、子プロセス以外のプロセスを、
デバッガでアタッチすることだったんよ。
今どきのptrace(2)は標準でこの機能を含んでいるので、
若者は知らなくても仕方ないが。

ptrace(2)にない機能のうち一部は、NetBSDの場合sysctlのproc階層で
サポートしてたりするが、FreeBSDのsysctlって、proc階層はないんだっけ。

663:名無しさん@お腹いっぱい。
12/08/10 20:37:40.19
>>661
NetBSDの偉い人が/procについて言ってたのは、まさにそういう話だった希ガス。
robustだし、余計なエンコード→デコードとか、ファイルシステムとして
見せるための諸々のオーバーヘッドがなくて効率的だとか。

664:名無しさん@お腹いっぱい。
12/08/10 20:41:55.71
ptrace(2)する代わりに/procでioctlする糞インターフェースは死んだも同然じゃん。
/procをread/writeしてメモリ、ファイル、統計情報読み書き、設定変更するくらいで。

665:名無しさん@お腹いっぱい。
12/08/10 20:46:25.76
>>663
それは/proc経由でシグナル送ったり、リソース設定変更/取得したりする時の話でしょ。
/proc全てを0/1で考える必要はないよね。
Named pipeをunlinkする戦略練るより、fd叩くほうがずっと便利だもの。

666:名無しさん@お腹いっぱい。
12/08/10 20:47:55.89
procfsとfdescfsの話題は混ぜるな危険。

667:名無しさん@お腹いっぱい。
12/08/10 20:50:45.89
/proc/cpuinfoとか無理すぎ。
process関係ないw
processorじゃ!とかなしよん

668:663
12/08/10 20:52:29.93
>>665

それはfdescfsの話だから。
procfsの存在価値は疑問だけど (ptraceやsysctlの方がいい)、
/dev/fd/* はあった方がいいよ。
FreeBSD上で問題を今すぐ解決するには、fdescfsを使うのが楽だけど、
FreeBSD的にはdevfs を直す方がいいのかもしれん。
よく知らないけど。

669:名無しさん@お腹いっぱい。
12/08/10 20:55:14.28
>>667
さすがにLinuxの人も無理に気づいたみたいで、最近は/procじゃなくて
/sys階層に入れるようにしてるよね。
過去に入れちゃった奴はておくれで残ってるけど。南無南無。


670:名無しさん@お腹いっぱい。
12/08/10 20:59:10.47
sysctlのように型がかっちり決まってるのもいいけど、
/proc, /sysみたいにテキストになってるもの素敵やん。

671:名無しさん@お腹いっぱい。
12/08/11 00:12:39.76
>>670
スクリプト言語から使うときなんかはテキストの方が楽だったりするね
(言語によるけど)。
そういう場合はprocfsやkernfsを使えばいいんだよ。
低級言語で書かれたOS付属コマンドまでそういうのに頼る必要はないけど。

672:名無しさん@お腹いっぱい。
12/08/11 00:20:16.15
性能重視じゃないスクリプトなら
中継用のコマンドをユーザーランドに置いておけばよくて、
カーネルがサポートしなくてもいいよね

673:名無しさん@お腹いっぱい。
12/08/11 01:49:37.99
sysctlコマンドなんて、まさにそういう中継用コマンドだな。
/dev/fd/* みたいなのは、なんらかのカーネルサポートが必要だが。

674:名無しさん@お腹いっぱい。
12/08/14 03:35:46.04
PS1っていう環境変数は
bashだけのものですか?
他のシェルでも使える?

675:名無しさん@お腹いっぱい。
12/08/14 09:38:22.60
PS1とPS2はすべてのシェル共通。PS3 PS4はbashとかのみ。

ただし、PS1とかの中の特殊文字の解釈はシェルごとに異なる。

676:名無しさん@お腹いっぱい。
12/08/14 20:07:54.88
標準入力からzipする場合のファイル名って変えられないでしょうか?

echo abcde | zip test.zip -

ってやると圧縮ファイルに標準入力データを追加できるのですが
追加されたファイル名が「-」になってしまいます。
ファイルをディスクに書かずに、パイプを使ってzip圧縮までやりたいです。


677:名無しさん@お腹いっぱい。
12/08/14 20:15:26.80
ln -s /dev/stdin hoge.txt
echo abcde | zip test.zip hoge.txt

とか。symlinkは許せ。

678:名無しさん@お腹いっぱい。
12/08/14 22:50:08.33
>>677
希望が見えました。ありがとう。


679:名無しさん@お腹いっぱい。
12/08/14 23:00:48.31
zip扱うライブラリがperlやpythonにある。そういうの使うと簡単。

680:名無しさん@お腹いっぱい。
12/08/15 05:39:00.88
>>677
普通にtemporaryファイルつくって消したら?

681:名無しさん@お腹いっぱい。
12/08/15 06:50:20.97
なんの役にも立たない >>680 をわざわざ書く意味がわからん

682:名無しさん@お腹いっぱい。
12/08/16 00:43:00.83
例えばVAR=`df- h` というような場合に
echo $VAR とすると全て一行で表示されてしまいますが、
元のdfの出力結果をそのまま表示するようにするにはどうしたらいいでしょうか?


683:名無しさん@お腹いっぱい。
12/08/16 00:47:05.41
echo "$VAR"

って最近似たような質問見たような。

684:名無しさん@お腹いっぱい。
12/08/16 01:01:11.89
>>683
すいません、""の存在をすっかり忘れていました。
ありがとうございました。

685:名無しさん@お腹いっぱい。
12/08/16 13:52:12.32
演算結果を変数に入れるにはどうしたらよいか
echo $((91-72)) はちゃんと出るけど
A=$((91-72)) は出来ない。
まさかいちいちA=`echo $((91-72))`ってやんの?

686:名無しさん@お腹いっぱい。
12/08/16 13:57:08.74
>>685
$ A=$((91-72))
$ echo $A
19

できてるけど

687:名無しさん@お腹いっぱい。
12/08/16 14:00:53.80
echo $((91-72)) は出来て、
A=$((91-72)) は出来ない、という環境は何か?
というエスパー検定だろw ちょっと上級の問題だな。

688:名無しさん@お腹いっぱい。
12/08/16 16:01:24.16
「スクリプトを終了したら $Aがセットされていません」系か?

689:名無しさん@お腹いっぱい。
12/08/16 17:14:30.15
sum=0; cat file | while read i; do sum=$(($sum+$i)); done; echo $sum
系とエスパー

690:名無しさん@お腹いっぱい。
12/08/16 18:10:35.35
echo $(( `wc -l a.txt` / 2 ))
ってなんでエラーになるの?

691:名無しさん@お腹いっぱい。
12/08/16 18:14:24.15
>>690
wcの出力にファイル名(a.txt)が出ちゃうから。

echo $(( `wc -l < a.txt` / 2 ))
で桶

692:名無しさん@お腹いっぱい。
12/08/16 20:20:08.24
>>691
ありがとう

693:名無しさん@お腹いっぱい。
12/08/17 12:54:21.22
>>671
ベタテキストよりオブジェクトそのままの方が扱いやすい。

694:名無しさん@お腹いっぱい。
12/08/17 14:11:13.11
亀レスで新しい内容なしw

695:名無しさん@お腹いっぱい。
12/08/18 09:29:13.33
2点教えて下さい。
linuxのシェルでの問題です。
①aaa="a b";echo ${aaa}
a b と半角スペースがなぜ詰まるのでしょうか?
②SJISテキストファイル編集時の文字化け
 やりたい事、csv2ファイル入力し、双方マッチングし
 条件により、行データを出力するしないを制御するだけのものです。
 そこで、head,cat,sort,uniqコマンドを|で通した後をリダイレクト
 で出力したものに関しては文字化けは見受けられなかった。
 文字化けが発生したのは
 read LINEで一行読込
 echo ${LINE} >> out.cvs で追加出力
 とした場合のみ
 前者後者あまり違いが内容に思われるのですが対策って有るでしょうか?
 ちなみにlinux側の文字コードはutf8設定です。
 当編集シェル実行時のみ文字コードを環境変数なりで変えることは
 可能でしょうか?またその方法は有効でしょうか?

よろしくお願いします。


696:名無しさん@お腹いっぱい。
12/08/18 09:37:46.51
1 echo "${aaa}"
2 readはバックスラッシュを解釈する。したがってSJISでは利用できない。

697:名無しさん@お腹いっぱい。
12/08/18 09:39:32.05
>>695
機種依存文字使うな

aaa="a b";echo "$aaa"

echo "$LINE"

同じような質問が、>>683 で出たばかり

698:名無しさん@お腹いっぱい。
12/08/18 09:42:26.61
>>695
どうせbashだろうから、

IFS= read -r LINE
echo "$LINE"

でいいな。

699:名無しさん@お腹いっぱい。
12/08/18 09:56:30.06
早速の多数の方、回答ありがとうございます。
1.機種依存注意します。
2.類似質問分からず失礼しました。
職場ではnetに繋げないため、別の場所からの質問でした。
直ぐの確認できませんが、後ほど確かめます。
ありがとうございました

700:名無しさん@お腹いっぱい。
12/08/18 10:32:16.48
>>697
スレチですまんのだが、丸数字は10年以上前に UNICODE に採用されているし、
UTF-8 表示できない環境でまともに Web 閲覧できるとは思えないし、MAC も
最早 Windows 側にあわせてるらしいので機種依存文字として指摘するのもそろそろ
終わりにして良いんじゃないかな。

701:名無しさん@お腹いっぱい。
12/08/18 10:46:31.57
UNICODEの丸数字とSJISの丸数字はコードが違う。

702:名無しさん@お腹いっぱい。
12/08/18 10:56:37.52
UNICODE ?x2460;
SJIS ①

703:名無しさん@お腹いっぱい。
12/08/18 11:02:46.61
>>700
Web上で単純閲覧は出来ても、コピー(引用)編集時に化けるという問題があるよ。

704:名無しさん@お腹いっぱい。
12/08/18 14:37:23.03
機種依存なんだからそんな問題が発生する機種を使ってる奴が悪いw

705:名無しさん@お腹いっぱい。
12/08/18 14:43:39.83
にちゃんにきておいて機種依存文字がどうのって...
ばかじゃね?

706:名無しさん@お腹いっぱい。
12/08/18 14:46:18.51
SJISの丸数字使いはこの板ではバカにされてもしょうがない。

707:名無しさん@お腹いっぱい。
12/08/18 15:04:19.06
未だにこんなこという爺さんが生き残ってたんだ。すげー。

708:名無しさん@お腹いっぱい。
12/08/18 15:26:19.78
丸文字は見た目がバカっぽい。

709:名無しさん@お腹いっぱい。
12/08/18 15:33:34.03
そんなひっぱるほどの話でもない。

710:名無しさん@お腹いっぱい。
12/08/18 16:26:28.28
機種依存馬鹿

711:名無しさん@お腹いっぱい。
12/08/18 16:49:46.33
掲示板ならいいけどソースコードの中で丸数字見たらヤな気分になる人は多いのでは

712:名無しさん@お腹いっぱい。
12/08/18 16:53:07.24
>>704、706
なんだかな。。。

>>711
意味不明なオレ様英語で書かれるより遥かにマシ。

713:名無しさん@お腹いっぱい。
12/08/18 17:39:52.74
>>711
確かに。ヘタな英語のほうがまだマシだな。

714:名無しさん@お腹いっぱい。
12/08/18 22:13:16.26
695です。
心配でしたので、自分のPCにcygwinをいれて試してみました。
1,2点確認取れました。
全く同じ環境ではないですが、問題なさそうですね。
安心しました。助かりました。
ありがとうございました。

715:名無しさん@お腹いっぱい。
12/08/19 08:36:59.51
>>700
2chのエンコードコードがUTF-8なら同意見なんだが、残念ながらSJISだ。
そして、SJISのコードページが複数あり、HTMLのshift_jisが機種依存文字を明確に定義していない以上、機種依存問題は残る。
ただ、その中でも丸数字は現在Webクライアントで使われているほとんどのコードページで共通なので問題は起きないとは思う。

716:名無しさん@お腹いっぱい。
12/08/19 08:55:36.89
UTF-8な板もあるんじゃないの?

717:名無しさん@お腹いっぱい。
12/08/19 09:32:20.05
>>716
どの板?

718:名無しさん@お腹いっぱい。
12/08/19 13:27:36.99
外国語の特殊文字の顔文字が2chに氾濫してる御時勢に機種依存文字とか何だか。
スレ違いなので誘導?です↓
2chで外国語の特殊文字を使うには[unicode][専ブラ] 2
スレリンク(gogaku板)

719:名無しさん@お腹いっぱい。
12/08/19 14:00:34.37
>>718
その板も Shift_JISだねw

720:名無しさん@お腹いっぱい。
12/08/19 17:08:00.35
今の2chで機種依存文字っつーと丸数字よりケータイ絵文字の印象が強いな

721:名無しさん@お腹いっぱい。
12/08/20 00:07:04.29
引数のファイル名とかディレクトリ名を
正規化してフルパスにしたいんだけど
一番かっこういい方法はどんな手順?

722:名無しさん@お腹いっぱい。
12/08/20 00:10:53.29
linuxならreadlink -fかrealpath
FreBSDならrealpath

723:名無しさん@お腹いっぱい。
12/08/20 00:37:28.76
>>722
NetBSDではどうしたらいいんでしょうか

724:名無しさん@お腹いっぱい。
12/08/20 00:40:15.07
GNU binutilsか何かにrealpathは入ってるから、入れろ

725:名無しさん@お腹いっぱい。
12/08/20 00:40:16.43
Perlのrealpath関数でも使っておけ

726:名無しさん@お腹いっぱい。
12/08/20 01:00:03.17
acroreadの起動スクリプト(シェルスクリプト)とか参考になるんじゃないかな

727:名無しさん@お腹いっぱい。
12/08/20 01:56:51.87
>>721
完璧な方法

1 openする
2 fstatかける
2 /からinode,dev一致するファイルを探す

728:721
12/08/20 02:27:37.26
>>722-727
ありがとう
readlink -f
を使うことにします

729:名無しさん@お腹いっぱい。
12/08/20 06:32:20.27
>>727
それだと対象ファイルがパーミッションでopenできない時に使えない。

openせずに直接 statした方が良い。

730:名無しさん@お腹いっぱい。
12/08/20 06:40:53.50
>>726
acroreadの起動スクリプトって、ls -lの出力をsedしたりしてるから、
path名に特殊記号とかスペースが入ってる場合を考慮してないし、
全然完璧じゃないよ。

731:名無しさん@お腹いっぱい。
12/08/21 15:37:54.91
パイプで最初の一行目だけを取得するにはどう書けばよいでしょうか?
ls -t | <最初の一行目を抽出するコマンド>
のような使いかたがしたいのですが。

732:名無しさん@お腹いっぱい。
12/08/21 15:42:20.18
すみません、宿題で使うので説明も書いてほしいです。

733:名無しさん@お腹いっぱい。
12/08/21 15:42:47.76
head -n1 じゃダメなのん?

734:名無しさん@お腹いっぱい。
12/08/21 15:48:22.55
宿題なら他人と同じ答じゃ評価低いよな。

head -n 1 や head -1 は多数が回答するから面白くない。

sed -n 1p あたりで回答しとけ。評価上がるぞ。

735:名無しさん@お腹いっぱい。
12/08/21 15:51:18.32
>>731
俺と同じ授業か? 俺は awk NR==1 で提出するから真似するなよ。

736:名無しさん@お腹いっぱい。
12/08/21 15:57:36.75
じゃあ俺はbrainf*ckあたりで一行目を表示するスクリプト書くわー

737:名無しさん@お腹いっぱい。
12/08/21 15:59:31.28
オレこれ↓
ls -t | (read f; echo "$f")

738:731
12/08/21 16:00:29.24
教えていただけてありがとうございました。

739:名無しさん@お腹いっぱい。
12/08/21 16:48:36.64
sed -n 1pとhead -n 1じゃ前者はカス。
何故カスかという効率の差に関して記述すれば評価上がるぞ。

740:名無しさん@お腹いっぱい。
12/08/21 16:51:32.61
>>739
sed 1q ならどうですか?

741:名無しさん@お腹いっぱい。
12/08/21 16:58:40.58
headとかsedのプロセス起動のコストを考えると
シェル側でパイプ開いてreadするのが最強

742:名無しさん@お腹いっぱい。
12/08/21 20:14:52.48
シェルへのパッチをレポートに貼るのか

743:名無しさん@お腹いっぱい。
12/08/22 01:21:58.16
printf 'r !ls -t\n1p\nw' | ed -

パイプは使ったが
> ls -t | <最初の一行目を抽出するコマンド>
の形になってないからだめか

744:743
12/08/22 01:29:14.30
ls -t | printf "i\n`cat /dev/stdin`\n.\n1p\nw" | ed -

こうしたら一応できた

745:名無しさん@お腹いっぱい。
12/08/22 01:40:47.17
FreeBSDではedがworldに含まれてるから当然インストールされてるんだけど
Linux系ではed入ってないことも多いんだよなあ。

746:名無しさん@お腹いっぱい。
12/08/22 02:57:14.91
そうだっけ?Linuxでも割と入ってるイメージがある
中身はもしかしたらexモードのvim.tinyとかだったりするのかも知らんがw

747:名無しさん@お腹いっぱい。
12/08/22 03:14:43.87
Linuxならedなしbusyboxなディストリビューションもあるわけで。

748:名無しさん@お腹いっぱい。
12/08/22 15:08:45.07
edが入っていないなんてもはやunixじゃないな…ああ元々unixじゃなかった。

749:名無しさん@お腹いっぱい。
12/08/22 22:33:02.24
fedoraに普通に入ってる ed-1.5-3.fc17.x86_64

750:名無しさん@お腹いっぱい。
12/08/22 23:14:05.90
そういうことは聞いてない。

751:名無しさん@お腹いっぱい。
12/08/26 11:54:24.95
初歩的な質問ですみません
グレイヴコマンド(例:echo `date` の`date`)はネストできませんが、
ネストしたような働きをさせるにはどうコマンドしたらよいでしょうか

752:名無しさん@お腹いっぱい。
12/08/26 12:01:34.46
>>751
echo `echo ¥`date¥``

753:名無しさん@お腹いっぱい。
12/08/26 12:03:20.51
$()が使える環境ならそっちを使う方がいいかもしれん

754:名無しさん@お腹いっぱい。
12/08/26 12:11:27.99
なるほど ありがとうございます

755:名無しさん@お腹いっぱい。
12/08/30 23:13:56.24
初歩的な質問ですみません。
レッドハットとHP-UX混在環境です。

サーバーA、サーバーB、サーバーCとあり
全て異なるネットワークに属しているサーバで
ftpやhulftでのファイルやり取りを行います。

サーバー間でファイルの送受信を行うスクリプトを組むのですが、
ファイルごとに組むと100本近くになってしまうため、外部定義ファイルにパスなどを記述し
そこからパスなどを読んで処理するような作りをかんがえてます。

例えばhulftならhulft idを引数にしてそのhulft idの行にファイルのパスやファイル名、
sendなのかrecvなのかを記載しそれらをスクリプト内で代入出来ればいいんじゃないか
と思ったのですが具体的な構文がいまいち浮かびません。

またサーバーA上にシェルA、サーバーB上にシェルBといて
シェルBはシェルAからキックされる場合、引数や変数は継承されますでしょうか。

756:名無しさん@お腹いっぱい。
12/08/30 23:23:26.73
>>755
ファイル名にスペース等が含まれていないなら、

for file in `cat 外部定義ファイル`; do ...
で行ける。

異なるサーバー上のシェルに変数は継承されない。
引数は明示的に引数を渡せば当然継承される。

757:名無しさん@お腹いっぱい。
12/08/31 09:31:26.31
どのシェルが普通なのか俺には分からない
少なくとも、バッシュやZSHかな大別できるのは…
Kshは癖があるな。
シェルを実行するためには、chmodのコマンド手続きがいるだろ?
そんなこと初心者には周知されていない。
コマンド入力にしても ./付けるとかひと工夫しないとだめだ。
この件も初心者には周知されていない。
初心者と言ってもシェル経験者ならPATHで権限を付ける知識くらいはある。
しかし、Windowsの経験者にはPATHの概念さえ聞いたことも何ができるかも
わからない筈だ。

758:名無しさん@お腹いっぱい。
12/08/31 09:47:52.57
詩の宿題かなんか?

759:名無しさん@お腹いっぱい。
12/08/31 12:48:53.44
export PATH="$PATH,."

760:名無しさん@お腹いっぱい。
12/08/31 12:50:56.18
>>759
馬鹿は無理に答えなくていいよw

761:名無しさん@お腹いっぱい。
12/08/31 13:04:38.23
>>760
どっか間違ってました?

762:名無しさん@お腹いっぱい。
12/08/31 13:07:21.17
,じゃなく:だろ、と
.を含めちゃいかんだろ、と。

763:名無しさん@お腹いっぱい。
12/08/31 13:08:11.26
>>757
勉強不足を人のせいにされてもなぁ。

764:名無しさん@お腹いっぱい。
12/08/31 13:21:45.38
>>762
ああコロンでしたかすいません
前読んだ本にはlsっていうウイルスがカレントディレクトリにあったときに備えて.は置かない方がいいって書いてたけどPATHの後ろに書いとけば大丈夫かと



あとWindowsにもPATH変数はあるけどコントロールパネル->システム->どっかのタブ->環境変数って辿らないと設定するとこまでたどりつけなくてしかも再起動しないと反映されないありさまだったような

765:名無しさん@お腹いっぱい。
12/08/31 14:24:17.00
slっていうウイルスがいるかもよ

766:名無しさん@お腹いっぱい。
12/08/31 15:34:17.51
バッシュと呼ぶのやめようぜ。
かなりカッコ悪い。

767:名無しさん@お腹いっぱい。
12/08/31 15:39:47.48
良く口頭でビーシェルみたいな言い方する人いるけど
あれってbashのことなんだろうか。

768:名無しさん@お腹いっぱい。
12/08/31 16:03:33.42
そういうネタはいいです

769:名無しさん@お腹いっぱい。
12/08/31 23:12:05.50
>>764
大丈夫じゃねーよ、バカ。

770:名無しさん@お腹いっぱい。
12/09/01 02:21:32.43
触るな危険

771:名無しさん@お腹いっぱい。
12/09/01 09:17:52.29
grepして見つかった行の前5行を出力するってできないでしょうか?


772:名無しさん@お腹いっぱい。
12/09/01 09:27:17.81
マッチした行を含めていいなら -B 6 でいいと思う

773:名無しさん@お腹いっぱい。
12/09/01 09:31:57.03
-B 5 だろw

774:名無しさん@お腹いっぱい。
12/09/01 14:01:09.12
ここでの話しはレベルが高いのか低いのかようわからんな

775:名無しさん@お腹いっぱい。
12/09/02 04:13:15.79
ash=エーシェル
bash=バッシュ
csh=シーシェル
d-shell=ディーシェル
sh=ビーシェル
tcsh=ティーシーシェル
zsh=ゼットシェル

バッシュだけアホみたい。

776:名無しさん@お腹いっぱい。
12/09/02 09:58:21.31
zshはcshにそろえて読まなきゃ駄目よ


777:名無しさん@お腹いっぱい。
12/09/02 10:08:27.84
>>775
「z」は、
イギリス発音なら「ゼッ『ド』」
アメリカ発音なら「ズィー」
どこにも「ゼット」なんて発音はない。
中学英語からやり直しだなw

778:名無しさん@お腹いっぱい。
12/09/02 15:38:49.68
Zを日本人がゼットって読むのはイギリス英語が基だったのか。勉強になった

779:名無しさん@お腹いっぱい。
12/09/02 16:01:49.22
>>777
俺も z はズィーと習ったけどさ、
zsh をズィーシェルと読むヤツには会った事無い。

780:名無しさん@お腹いっぱい。
12/09/02 17:01:28.91
で、dashは?

781:名無しさん@お腹いっぱい。
12/09/02 17:05:15.94
>>780
鉄腕

782:名無しさん@お腹いっぱい。
12/09/02 17:34:15.94
>>781
ググるとそっちばっかりヒットするよなw

783:名無しさん@お腹いっぱい。
12/09/03 00:53:44.84
ゼットシェルで問題ないよ。
[zed-?el]が[?]に接続して、無声化して[zet-?el]

784:名無しさん@お腹いっぱい。
12/09/03 11:20:15.54
そもそもとしてゼッドもゼットもどちらも正しいけどな

785:名無しさん@お腹いっぱい。
12/09/03 11:35:09.44
zshは「ズシュ」

786:名無しさん@お腹いっぱい。
12/09/05 02:43:38.45
いつもざしゅって読んじゃう。

787:名無しさん@お腹いっぱい。
12/09/05 07:54:36.01
ザシャァッ(車田調

788:名無しさん@お腹いっぱい。
12/09/07 00:21:56.75
雑種


789:名無しさん@お腹いっぱい。
12/09/08 13:09:33.30
ゼットエスエイチとか
ゼットシェル

日本人なんだからZの読み方にこだわる必要なし

790:名無しさん@お腹いっぱい。
12/09/08 15:23:53.34
だな。今後はゼータシェルって言うことにするよ

791:名無しさん@お腹いっぱい。
12/09/09 11:41:33.37
世紀末風に言うとジードシェル

792:名無しさん@お腹いっぱい。
12/09/09 13:14:38.93
もっと捻るかマトモなネタないのかよ

793:名無しさん@お腹いっぱい。
12/09/09 13:22:46.94
仕事で古いパソコンを使っています。OSはUNIX-OSです。
このマシンにbashを入れたいのですが、UNIX-OS用のbashバイナリが
入手できるところをご存知の方いらっしゃいましたら、入手先を教えて下さい。

ソースからコンパイルするのは、私があまりUNIX-OSに詳しくないので、あまり気が
進まないのですが、もしもコンパイルするしかないのでしたら、ソース入手先を
教えて頂けないでしょうか。
また、コンパイルしか手段が無いとしたら、UNIX-OSでは、bashのバージョンいくつまで
対応可能でしょうか。

794:名無しさん@お腹いっぱい。
12/09/09 13:35:34.28
ネタにしてはつまらなすぎる。マジな質問ならば今のキミの知識では無理としか答えようがない。

795:名無しさん@お腹いっぱい。
12/09/09 14:25:33.64
2台セットの激安PCを買ったんですが、テレビが付いてなくて、、
ケーブル買ってやっと居間のテレビにつないだんですけど、
電源を入れるとオペラシステム、ナンバーTが見つかった、
みたいなシェル画面が出て先に進みません。2台ともそうです。
この後どういうシェルコマンドを打てばいいのでしょうか?

796:名無しさん@お腹いっぱい。
12/09/09 17:39:59.21
よくわかんないけどシェルの事ならシェルに聞いてみるのが一番いいよ。
URLリンク(www.shell.co.jp)

797:名無しさん@お腹いっぱい。
12/09/09 18:20:22.56
ありがとうございました。今環境がないので今度客先で試してみます。

798:名無しさん@お腹いっぱい。
12/09/09 18:42:25.39
いいクオリティしてますね

799:名無しさん@お腹いっぱい。
12/09/11 12:23:14.32
マスコミは特亜系エセ左翼・カルト宗教団体が行っている組織的な嫌がらせ、集団ストーキング、電磁波悪用、「ガスライティング」を報道しろ

800:名無しさん@お腹いっぱい。
12/09/13 01:14:45.24
全くシェルスクリプトを触ったことない素人なのですが、cdを変更して
あるファイルをmakeするのが面倒なので自動化させたいです。
させたい処理はcd変更→makeの2点だけです。
ですが、うまくいきません。(シェルが一瞬立ち上がってそのまま終了します)
シェルにどういう引数を与えて起動させればいいでしょうか。

801:名無しさん@お腹いっぱい。
12/09/13 01:23:56.91
make -C directory

802:名無しさん@お腹いっぱい。
12/09/13 01:31:25.80
>>801
どういうことでしょうか?
bash make -C directoryでしょうか?
えーと、makeは-fオプションで行いたいので、bash make -f directoryですか?

803:名無しさん@お腹いっぱい。
12/09/13 01:35:05.89
>>801
あ、いや、つまり-Cでcd変更を兼ねるわけですね。理解しました
それで、その前にシェルを起動させなければいけないのですが、シェル起動→make -C directoryまでを
一連の動作として行うにはどうすればいいでしょう亜k?

804:名無しさん@お腹いっぱい。
12/09/13 02:03:13.41
んっと、自分の考えた「手段」に固執して
シェル起動とかいう独自用語使ってるとアドバイス来ないよ。
「何をしたら何が起きてほしい」と「目的」が重要。

805:名無しさん@お腹いっぱい。
12/09/13 02:32:36.62
リンクか何かをクリックしたらbashが起動してmakefileしたいです。

806:名無しさん@お腹いっぱい。
12/09/13 02:35:29.22
しかしシェルスクリプトを直接起動するのはNGで、必ずbashに引数を与えて起動させなければならないとします

807:名無しさん@お腹いっぱい。
12/09/13 02:40:38.93
そして最も求めている手段がshにオプション引数としてシェルスクリプトを与えて起動し、makefileする方法です

808:名無しさん@お腹いっぱい。
12/09/13 06:26:57.77
はい、次の方どうぞ

809:名無しさん@お腹いっぱい。
12/09/13 06:38:48.75
先生、ぼくも同じ物を探しています

810:名無しさん@お腹いっぱい。
12/09/13 07:40:19.71
「cd変更」って何だ。

811:名無しさん@お腹いっぱい。
12/09/13 07:52:00.73
マウントしなおすんだと思ってたw

812:名無しさん@お腹いっぱい。
12/09/13 08:36:35.52
しきりに「シェルを起動」って言ってるのは、
端末エミュレータ起動のことだろうとエスパー。
あるいはcygwin環境なのかも試練。

が、そういう低レベルの質問はお断りなので、
次の方どうぞ


813:名無しさん@お腹いっぱい。
12/09/13 08:40:27.04
>>805-807
デスクトップと端末エミュレータとshとbashとシェルスクリプトとオプション引数とmakeとmakefileとcdとカレントディレクトリと手段と目的がごっちゃになってる。
整理して出直せ。


814:名無しさん@お腹いっぱい。
12/09/13 10:11:28.58
端末エミュレーターxtermはUNIX系のほとんどのOSに対応してるって聞いたんですが、
xtermでFreeBSDのコマンドが実行できません。FreeBSDは対応してないんでしょうか?
関係あるかどうかわかりませんが、ホストOSはLinuxです。

815:名無しさん@お腹いっぱい。
12/09/13 10:21:58.22
お薬出しておきますね

次の方どうぞ

816:名無しさん@お腹いっぱい。
12/09/13 21:30:04.47
>>814
FreeBSDもLinuxもUNIXじゃありません。

817:名無しさん@お腹いっぱい。
12/09/13 21:34:21.69
>>816
この板にfreeBSDスレ立ってますがイタチと言われません
→freeBSDはUNIX

UNIX系OS用ソフトの大半はLinuxで動きますしディレクトリ構造が同じです
→LinuxはUNIXライク


818:名無しさん@お腹いっぱい。
12/09/13 21:51:52.27
>>817
freeBSDなんていうあなたが発明したシステムが
UNIXかどうかは、ほかの人にはわかりません。

819:名無しさん@お腹いっぱい。
12/09/13 22:11:31.87
出されたお薬はちゃんと飲んでください

820:名無しさん@お腹いっぱい。
12/09/13 22:18:29.90
ハイ、わかりますた。
でも飲んだか飲んでないか、すぐ忘れちゃうんです。

821:名無しさん@お腹いっぱい。
12/09/13 23:02:26.98
飲んだかどうか記録するシェルスクリプト作るといいです

822:名無しさん@お腹いっぱい。
12/09/13 23:28:44.84
そのスクリプトを起動する事を忘れちゃうんです

っつーかある意味、マジな話、一日一度、cronやatを使えず、どうしても手動で
動かさなければならない手順を、結構いつも忘れてしまう…

823:名無しさん@お腹いっぱい。
12/09/13 23:29:59.39
$ while true; do sleep 86400; ./hoge; done


824:名無しさん@お腹いっぱい。
12/09/13 23:40:27.06
まぁ、1日1回動かしゃいいって訳じゃなくて、例えば商用マシンからログ類を集計して、
USBメモリにコピって、テストマシンにアップロードして、集計して、そんで最終的に
得られたデータを所定のExcelのシートに記入して、その結果出てきた情報を
ログに書き込んでスクリプトを実行する、みたいな作業だ

昔は派遣の人にお願いしてたんだが、コストカットで人が減っちまった

自動化できるんならしたいわマジ

825:名無しさん@お腹いっぱい。
12/09/13 23:41:01.52
trueの代わりに : で、とか
むしろ、sleep 86400 を条件にすりゃいんじゃねとかの、誘い水かね?


826:名無しさん@お腹いっぱい。
12/09/13 23:44:38.84
>>825
それだとkillall sleepされたときに一緒に終了されちゃうじゃん。


827:名無しさん@お腹いっぱい。
12/09/13 23:48:41.09
なんでsleep名指しで殺すんだよ

828:名無しさん@お腹いっぱい。
12/09/13 23:53:12.25
>>825
while sleep 86400; do ./hoge; done
だと、最初の実行まで24時間待たされる。

敢えてsleepを条件に入れたいなら、
while ./hoge; sleep 86400; do :; done
だな。

でもこれだと結局 :コマンドが要るから、素直に
while :; do sleep 86400; ./hoge; done
かな。

829:名無しさん@お腹いっぱい。
12/09/13 23:55:28.62
処理に10秒かかるスクリプトだと、毎日毎日10秒ずつ起動時刻が遅くなっていくんだな

830:名無しさん@お腹いっぱい。
12/09/14 10:42:32.57
f(){ ./hoge; sleep 86400; f;}; f

831:名無しさん@お腹いっぱい。
12/09/14 11:03:37.39
そして再帰が深くなりすぎて落ちる、と。


832:名無しさん@お腹いっぱい。
12/09/14 11:04:58.51
末尾最適化するようにbash改造すれば大丈夫

833:名無しさん@お腹いっぱい。
12/09/14 12:35:38.76
>>824
っていうか、なんで出来ないの?
Excelのシートに記入するところは苦戦しそうだけど。

834:名無しさん@お腹いっぱい。
12/09/14 16:45:58.07
windows使っていいなら簡単でしょ。板違いなだけで。
寧ろUSBメモリ移動が鬼門。

835:名無しさん@お腹いっぱい。
12/09/15 13:19:37.17
grepでタブを検索したいんですがどうしたらいいでしょうか

egrep "\t" *.txt
だと、tを検索してしまいます。

836:名無しさん@お腹いっぱい。
12/09/15 13:22:50.87
あと、STX(アスキーコード0x02)も検索したいのですが
こっちもやり方がよくわかりません。
ついでに教えてください。

837:名無しさん@お腹いっぱい。
12/09/15 13:32:23.77
8進printfしてコマンド置換かな

838:名無しさん@お腹いっぱい。
12/09/15 13:38:45.62
>>835

対話環境での話ならCTRL-Vあたりがクォート機能に割り当てられている
シェルなら

$ grep '[CTRL-V][TAB]' *.txt

スクリプトの中ならエディタでTABコード書けるだろ。


839:名無しさん@お腹いっぱい。
12/09/15 13:44:39.15
スクリプトは expand -8 とかで清書する場合もあるし、意味を持ったTABをじかに書くべきじゃないな

(じゃあMakefileは? というのは無しで)

840:名無しさん@お腹いっぱい。
12/09/15 15:06:46.92
>>835
URLリンク(linuxjm.sourceforge.jp)
grep $'\t' *.txt

841:名無しさん@お腹いっぱい。
12/09/15 21:55:57.05
>>835
grepでというのには反則だけど
perl -ne 'print if /\t/'


842:名無しさん@お腹いっぱい。
12/09/15 21:59:20.76
perl使うのはこのスレでは禁止
grep -P なら許す

843:名無しさん@お腹いっぱい。
12/09/15 23:49:50.18
grep -e "$(printf '\t')"

844:名無しさん@お腹いっぱい。
12/09/16 09:58:27.49
巨大なディレクトリツリーの差分(ファイルの有無だけでいい)を取りたいんですが、
rsync以外で効率のいいやり方を教えて下さい。
diff -rqやfind | sort | diffでは遅すぎるのでもっといいやり方は無いでしょうか。

845:名無しさん@お腹いっぱい。
12/09/16 10:10:52.16
>>844
diff <(ls -aR /dir1) <(ls -aR /dir2)

846:名無しさん@お腹いっぱい。
12/09/16 10:21:29.26
>>845
ありがとうございます。確かに速いですね。
ただ、lsの出力がファイル名だけなので、diffからファイルのパスが分からないのが困ります。
他にdir1にあってdir2に無いファイルを相対/絶対パスで取得できる方法はありませんか?
情報後出しで済みません。

847:名無しさん@お腹いっぱい。
12/09/16 10:26:29.46
ごめんなさい、今確認したところfind | sort | diffでもそれなりに速いことが分かりました。
勝手に遅いと思い込んでいました。とりあえずこの方法でやってみます。
回答して下さった方どうもすみませんでした。

848:名無しさん@お腹いっぱい。
12/09/16 10:56:10.15
ちなみに自分が試したのは

diff -u <(cd old/ && find . | sort) <(cd new/ && find . | sort) | grep '^\+./'
rsync -naiO --ignore-existing new/ old/ | awk '{print $2}'
diff -rq old/ new/

で、上から順に速いことが分かりました。御参考まで。

849:名無しさん@お腹いっぱい。
12/09/16 12:14:22.36
ディレクトリの比較は dircmp が使えるなら、dircmp を使うといいかもしれない

どちらかのみ含まれるファイルを取り出すのに diff -u して grep ^+ してるけど
commを使うといいかもしれない

850:名無しさん@お腹いっぱい。
12/09/16 12:24:49.73
>>838-843
みなさん、ありがとうございました!
うちにきて弟をファックしてもいいですよ。

851:名無しさん@お腹いっぱい。
12/09/16 14:49:42.09
>>849
ありがとうございます。

comm -13 <(cd old/ && find . | sort) <(cd new/ && find . | sort)

と書き換えてスッキリしました。
dircmpのほうは古いUNIXにあったコマンドみたいですね。
自分はLinuxなので使えませんでしたが、参考になりました。

852:名無しさん@お腹いっぱい。
12/09/16 14:54:15.88
dircmpってSolarisに付いてるけど、
結局diffでファイルの中身比較するから遅いよ。
(ファイルの中身は比較しないで欲しいという目的なら)

853:名無しさん@お腹いっぱい。
12/09/16 18:27:09.74
>>852
URLリンク(src.opensolaris.org)

-dオプションをつければdiffを呼ぶ
そうでない場合でも、ファイルサイズが同じ場合には cmp を呼ぶみたいですね

なるほど、同じファイル名でも違うファイルかどうかを判定する必要があるのかdircmpは

854:名無しさん@お腹いっぱい。
12/09/18 14:23:13.01
ちょっと質問です。

例えば echo "test" という 1 行だけのシェルスクリプトを作成して、foo.sh という名前で
保存します。このファイルのパーミッションを 744 にしてコマンドラインで ./foo.sh と叩くと
正常に実行できてしまいました。

シェバング行が無いのに、何故実行できてしまうのでしょう? おそらく基本的なところで
私の理解が不足しているのだと思いますので「ここを読め!」等のポインタで結構ですので、
どなたかご教示いただけないでしょうか。

ちなみに FreeBSD、AIX、CentOS で試してみましたが、いずれも同じ結果でした。

855:名無しさん@お腹いっぱい。
12/09/18 14:29:46.54
ないときは /bin/sh でも呼ぶようになってんじゃないの。
ちゃんと調べてないけど。

856:名無しさん@お腹いっぱい。
12/09/18 14:30:51.05
カーネルソースを読め。

857:名無しさん@お腹いっぱい。
12/09/18 14:31:10.83
>>854
昔のUNIXではシェバング行なんてなかった。
テキストファイルであっても chmod +xされていればexec()される。
まずはバイナリと仮定してカーネルのexec()を呼び出す。
するとフォーマットが合わないのでエラーで返ってくる。
このあと、コマンドラインのシェルの判断で、
「sh ファイル名」の形に修正して再度カーネルのexec()を呼び直す。
これでシェルスクリプトとして実行される。

シェバング行がある場合は最初からその行に書かれたシェルのスクリプトとして
カーネル側のexec()で直接実行される。

858:名無しさん@お腹いっぱい。
12/09/18 15:12:12.83
ユーザーはソフトのインストール禁止ですが、
最近、ユーザーでも自分のホームフォルダーにソフトをコピーし、
X権限をすることによってソフトが実行できてしまうことが判明しました。
これはOSのセキュリティーボールではないのでしょうか?
ユーザーのフォルダーではたとえX権限がされていても
実行できないようなおすすめのシェルって何ですか?
必要ならカーネルにバッチを当てる方法も、やもうえません。

859:名無しさん@お腹いっぱい。
12/09/18 15:15:18.02
コピペ改変
スレリンク(unix板:775番)

860:名無しさん@お腹いっぱい。
12/09/18 15:19:10.12
>>858
とりあえず /home以下をnoexecでmountしちゃえば?

861:名無しさん@お腹いっぱい。
12/09/18 15:27:38.12
つまらんネタにかまうな。

862:名無しさん@お腹いっぱい。
12/09/18 15:52:29.12
>>857
> するとフォーマットが合わないのでエラーで返ってくる。

これは先頭の2byteを見ていたのね。
そこから#!を使うことになった。comment(#) + execute(!)

昔の実行形式の先頭2byteがどういう値だったかは、
/usr/share/file/magic/pdpを見るといい。
古典的なUNIXでは/etc/magicにある。
典型的なテキストファイルでは使わないシーケンスになってる。

863:854
12/09/18 16:18:19.96
おまいら早いですねw (褒めてます)

>>857
> このあと、コマンドラインのシェルの判断で、
> 「sh ファイル名」の形に修正して再度カーネルのexec()を呼び直す。

ありがとうございます。この部分以外は自分の理解とおおむね一致していました。
自分の理解度を再確認できて良かったです。

ただ、「シェルの判断で~」の部分ってシェルのマニュアルにはちゃんと書かれて
いるのか、それとも「昔からそういうもんだ。ソース読め」のどちらなんでしょう?

手元では tcsh / ksh / bash で同じ挙動だったので「昔からそういうもんだ」
なのかな、という予感です。

864:名無しさん@お腹いっぱい。
12/09/18 16:23:15.64
マニュアルに書いてあるかどうかと昔からそういうもんかどうかって
択一じゃないと思う。

865:名無しさん@お腹いっぱい。
12/09/18 16:34:37.60
shellがmagic numberを見て、shell scriptを自分で実行するようになったのは、
bash移行のことじゃないか? それまではexecve(2)におまかせだったはず。

866:名無しさん@お腹いっぱい。
12/09/18 16:50:35.22
一応手持ちのGentooマシンで調べてみたけど
GNU bash 4.2.37ではまだexecveしてENOEXECが返されるのを確認してから
そのスクリプトを読み直して処理してるみたい。

867:名無しさん@お腹いっぱい。
12/09/18 21:16:25.81
どーでもいいけど昔のHP-UXで一行目がシェバングじゃないコメント行だと
ログインシェルで解釈されたような気がする。


868:名無しさん@お腹いっぱい。
12/09/19 11:56:29.71
#!/bin/cat
Hello,world!

って書いてもcatが起動しないんだけど、なんで?

869:名無しさん@お腹いっぱい。
12/09/19 11:59:22.55
ごめん、起動してたわ

870:名無しさん@お腹いっぱい。
12/09/19 12:06:17.94
cat -n で起動したらいろんな誤解が一瞬で解けた

871:名無しさん@お腹いっぱい。
12/09/19 12:07:42.49
日記か。

872:名無しさん@お腹いっぱい。
12/09/19 13:51:27.02
知識の共有だ

873:名無しさん@お腹いっぱい。
12/09/19 20:18:30.82
A=`./hoge | cat`
みたいなとき、./hogeのエラーを検知してリトライしたいんだけど
どうしたらいいかな


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