トップページ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/
0590名無しさん@お腹いっぱい。2012/08/09(木) 19:47:45.98
>>588
高負荷時のことはどうでも良くて、
位相的にきっちり合わせたいということでしょ。

非同期で突然 sleep 1 を whileループで回せば、
最初から誤差が最大 0.99999... 秒になる。
これを、毎回 date +%N で 1秒未満の残り時間を把握しつつ
sleep 0.9821 とかすれば「位相」が同期する。
05915562012/08/09(木) 19:50:02.71
>>581
つーか、これでいいっすね。&使ってバックグラウンドに回しても表示効くのね。
しかもそいつをreadでインプット待ちにしておいて、インプット来たら殺すとかすげー。
でもこいつでsleep間隔いくら小さくしても、おいらの作ったスクリプトみたいに、echoの二重表示にならないのはどうしてなのか理屈がわからない。どうしてでしょう。
バックグラウンドジョブにしてるから?わかる人本当にお願いします。

>>582
そういう意図はありまくりんぐでしたけど、>>581さんのやり方でsleepの時間をさらに小さくするだけでいいように思います。負荷との兼ね合いですが。
0592名無しさん@お腹いっぱい。2012/08/09(木) 19:53:13.20
>>589
答えは、
 高負荷時には、date +%N の実行だけで数秒ないしそれ以上の
 時間がかかることがあるから
だ。

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

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

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

>>590
なるほど。
そういう意図であれば、確かに拡張sleepに依存するのもいいな。
0593名無しさん@お腹いっぱい。2012/08/09(木) 19:59:25.40
>>591
> でもこいつでsleep間隔いくら小さくしても、おいらの作ったスクリプトみたいに、echoの二重表示にならないのはどうしてなのか理屈がわからない。どうしてでしょう。

read と kill の間に、時間のかかるdateみたいな処理がないから、
その間にechoが動いてしまう可能性が確率的に非常に少ない。
そこにダミーのsleepでも入れれば二重表示にできるよ。
0594名無しさん@お腹いっぱい。2012/08/09(木) 20:01:56.63
>>593 の言う通りだ。

read x
sleep 1
kill $pid

に変更すれば、二重表示が簡単に確認できる。
05955562012/08/09(木) 20:12:11.80
>>593>>594
おぉ、本当だ。お前らかっこいいなぁ。ワクワクさん並に輝いてるわ。

どうも本当にありがとうございました。
05965272012/08/09(木) 21:43:53.53
後始末について聞いてみたかったんだけど
やめといたほうがいいのかな… (; ・ω・)
0597名無しさん@お腹いっぱい。2012/08/09(木) 21:56:40.30
終了したからいいよね。named pipeだった時の
>>541の後始末のタイミングは?
0598名無しさん@お腹いっぱい。2012/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 なしで動くだろうけど。
0599名無しさん@お腹いっぱい。2012/08/09(木) 22:32:03.31
>>598
<(...) や >(...) が named pipeで実装されてるFreeBSDのbashでちょっと
試してみたが、daemonみたいに子が先にexitして孫が残るケースでも無問題。

どうやら、named pipeに対する読み手と書き手が揃ってパイプがつながった段階で
unlink(2)される模様。プロセス実行中に先にunlinkされてる。
0600名無しさん@お腹いっぱい。2012/08/09(木) 22:34:14.50
検証どうも。
以外な結果だなあ。
孫が、引数をオープンする前に、たとえば10秒くらい待つような場合、
named pipe を管理するシェルはずっと待機しているってこと?
0601名無しさん@お腹いっぱい。2012/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);
}
}
0602名無しさん@お腹いっぱい。2012/08/09(木) 22:39:20.34
>>600
読み手と書き手が揃わない場合は、named pipe は放置されるww

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

なんてやると、lsコマンドも :コマンドもnamed pipeにアクセスしないから、
/tmp/np-sh-XXXXX みたいなファイルが残ったまま bashが終了できてしまう。
bash終了時にはunlinkしないみたい。
0603名無しさん@お腹いっぱい。2012/08/09(木) 22:42:25.58
cat <(ls)
でも残るんだが
0604名無しさん@お腹いっぱい。2012/08/09(木) 22:42:51.12
> 読み手と書き手が揃わない場合は、named pipe は放置されるww

これはひどいw
FreeBSD でも /dev/fd/ が実際にはあるわけだから、named pipe じゃ
なくて、そっち使うように直した方がいいんじゃ。
0605名無しさん@お腹いっぱい。2012/08/09(木) 22:46:21.67
>>603
残らないよ。(bash/FreeBSDで)
0606名無しさん@お腹いっぱい。2012/08/09(木) 22:48:04.29
> cat <(ls)
> でも残るんだが

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

>>605
バージョンは?
0607名無しさん@お腹いっぱい。2012/08/09(木) 22:50:00.77
>>604

ls /dev/fd 3< file

↑これとか実行してみるとわかるが、
FreeBSDの /dev/fd は、0 1 2 しかファイル記述子に対応してない。(3以降ダメ)
0608名無しさん@お腹いっぱい。2012/08/09(木) 22:50:56.70
>>606
FreeBSD-8.1 bash-4.1.7
0609名無しさん@お腹いっぱい。2012/08/09(木) 22:55:26.55
>>607
マジか、知らなかった… が、確かにそのようだ。確認した。
NetBSD あたりから動く実装持ってくればいいのに。
NetBSD の方では、zsh も bash も /dev/fd/ 使ってる。
0610名無しさん@お腹いっぱい。2012/08/09(木) 22:58:20.47
bash-4.2.37/FreeBSD-9.0だけど残る
0611名無しさん@お腹いっぱい。2012/08/09(木) 23:02:10.30
よくよく確認したら、3以上のディスクリプタについても、
FreeBSD-4.3 なら動いたよ。
/dev/fd/* の実体はキャラクタ型のデバイス・ファイルなので、
デバイス自体はたぶん FreeBSD-7 でも動くんじゃないかな。

つまり、devfs 導入時にデグレったんだ、これ。
0612名無しさん@お腹いっぱい。2012/08/09(木) 23:05:07.38
FreeBSD-7.3 上で bash-4.2 の配布物そのままを野良ビルドしてみたが、
やっぱり named pipe が /var/tmp/ に残るね。
bash のバージョンの違いが原因ではなさそう。
0613名無しさん@お腹いっぱい。2012/08/09(木) 23:10:05.47
残らないという環境の>>608は、何が原因なんだろう
そもそも、bashに、named pipeの中身が書かれたり読まれたという事実がわかるのか?
0614名無しさん@お腹いっぱい。2012/08/09(木) 23:14:54.36
> そもそも、bashに、named pipeの中身が書かれたり読まれたという事実がわかるのか?

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

まあ kdump(1) と同じことするって手がないわけじゃないが、
bash のやるようなことじゃない。
0615名無しさん@お腹いっぱい。2012/08/09(木) 23:14:56.99
>>613
オレもそれ考えてたんだけど、
named pipeに対して select(2)してパイプがつながったかどうか検出してるとか。
0616名無しさん@お腹いっぱい。2012/08/09(木) 23:15:48.98
cat <(ls) して、しばらくほっといたら消えた!
0617名無しさん@お腹いっぱい。2012/08/09(木) 23:16:35.39
読み手が繋がったことは、それじゃ分からないよ。
書き手についても、書き込みが起こるか、あるいは書き込みオープン後クローズ
されれば分かるけど、書き込みオープンされただけじゃ分からない。
0618名無しさん@お腹いっぱい。2012/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が読まれたかどうかを確認していることになる。

どうやってかは知らない。
0619名無しさん@お腹いっぱい。2012/08/09(木) 23:51:57.74
そもそも残ってることって問題か?/tmp 以下なら再起動で消えそうだけど
別の話だけど、名前付きパイプだと全く関係の無い別のプロセスからも
読み書きできるから大丈夫なのって思う
0620名無しさん@お腹いっぱい。2012/08/09(木) 23:58:35.21
パーミッションが自分にしか出てないからいいんじゃない?
0621名無しさん@お腹いっぱい。2012/08/10(金) 00:09:04.36
>>609
kldload fdescfs
0622名無しさん@お腹いっぱい。2012/08/10(金) 00:39:28.35
dbus-*地獄とか勘弁w
0623名無しさん@お腹いっぱい。2012/08/10(金) 01:00:01.40
/var/tmpだから再起動じゃ消えない。
頻繁に呼ばれるCGIとかでこれが起きたらやっぱりやだよ。
0624名無しさん@お腹いっぱい。2012/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する。
0625名無しさん@お腹いっぱい。2012/08/10(金) 01:13:15.04
bash実装の場合、ソース読むと、
コマンド列の最後のコマンド終了した時に消してるみたい。
0626名無しさん@お腹いっぱい。2012/08/10(金) 01:18:16.27
そだね。
cat <(ls)
だと、子シェルが死ぬタイミングがちょっと遅れるみたいで、
直後にはfifoがunlinkされない。
cat <(ls); sleep 1
だと、確実に残らない。
0627名無しさん@お腹いっぱい。2012/08/10(金) 01:19:10.77
結論としてnamed pipe版プロセス置換はカス。でいい?
0628名無しさん@お腹いっぱい。2012/08/10(金) 01:21:11.65
>>627
OK! おやすみ!
0629名無しさん@お腹いっぱい。2012/08/10(金) 01:34:51.13
最近のFreeBSDではmount -t fdescfs fdescfs /dev/fd
してからbashを作るとpipe+/dev/fdで作成される。
0630名無しさん@お腹いっぱい。2012/08/10(金) 01:39:01.51
>>629
コンパイル時決め打ちだからちょっとまずいね。
0631名無しさん@お腹いっぱい。2012/08/10(金) 01:58:31.64
send-prしといて
0632名無しさん@お腹いっぱい。2012/08/10(金) 07:29:33.75
質問させてください。

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

while :
do
  `nc -l 12345`
done

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

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



0633名無しさん@お腹いっぱい。2012/08/10(金) 07:34:47.58
>>632

` ` が余計だろ。
0634名無しさん@お腹いっぱい。2012/08/10(金) 07:57:12.67
>>632
わざわざシェルスクリプトにしなくても、

nc -k -l 12345

を発行(笑)すればcloseしても終了しないよ。
0635名無しさん@お腹いっぱい。2012/08/10(金) 13:05:30.89
発行って言葉使っちゃいかんの?
0636名無しさん@お腹いっぱい。2012/08/10(金) 13:07:59.84
コマンドは普通は「実行」する。
0637名無しさん@お腹いっぱい。2012/08/10(金) 13:23:20.11
起動だな
0638名無しさん@お腹いっぱい。2012/08/10(金) 13:32:30.35
execute
0639名無しさん@お腹いっぱい。2012/08/10(金) 13:39:44.13
起動は終了を伴わないdaemonプロセスのような場合。

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

> を起動
とは使わない。
> のように起動
0640名無しさん@お腹いっぱい。2012/08/10(金) 13:49:30.52
>>639
ktkr
0641名無しさん@お腹いっぱい。2012/08/10(金) 14:01:15.32
コマンドラインで打つならinvokeってのもあるんだぜ。
issueは機械語命令レベルならアリだけどな。
0642名無しさん@お腹いっぱい。2012/08/10(金) 14:24:21.06
そういえば命令は発行するもんだな。
0643名無しさん@お腹いっぱい。2012/08/10(金) 15:47:16.98
汎用機やDBの世界はjobをissueする。
0644名無しさん@お腹いっぱい。2012/08/10(金) 17:51:11.83
>>624, >>625



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

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


0645名無しさん@お腹いっぱい。2012/08/10(金) 18:01:48.99
検知というかブロックね。
0646名無しさん@お腹いっぱい。2012/08/10(金) 18:03:28.19
>>645
open()に O_NONBLOCK フラグ付けて呼べば「検知」できるだろ。
0647名無しさん@お腹いっぱい。2012/08/10(金) 18:04:12.63
>>645
なにいってんの?
read側のオープンをブロックするって何?
0648名無しさん@お腹いっぱい。2012/08/10(金) 18:04:46.74
fdescfsって何故デフォで有効になってないの? 何か問題あるの?
procfsがデフォで有効になってないこととも関係ある?
0649名無しさん@お腹いっぱい。2012/08/10(金) 18:07:24.02
>>646
O_NONBLOCKで行けるなら、昨日誰かが言ってた select()でも検知できそうだな。
0650名無しさん@お腹いっぱい。2012/08/10(金) 18:16:22.36
bashは書込みopenでO_NONBLOCKつけてないよ。
相手が読出しopenしてブロック解除されたことで「検出」してる。
0651名無しさん@お腹いっぱい。2012/08/10(金) 18:33:26.93
cmd1 <(cmd2)
だと
1. named pipe作成
2. 読み出しオープン→cmd1実行
3. 書き込みオープン→cmd2実行
こんな順のはず。SIGPIPE/EPIPE食らわないように。
0652名無しさん@お腹いっぱい。2012/08/10(金) 19:26:29.50
>>648
procfsもfdescfsも、Linuxのエミュレーションのためにあるような代物なのです。
fdescfsを使わない方がシステムとして美しい。
/dev/fd/ なんて使わずにnamed pipeできっちり実装した方がいいのです。
0653名無しさん@お腹いっぱい。2012/08/10(金) 19:36:16.75
どうぞどうぞ
0654名無しさん@お腹いっぱい。2012/08/10(金) 19:52:21.85
> procfsもfdescfsも、Linuxのエミュレーションのためにあるような代物なのです。

またそういう嘘をつかないように。
/proc/ も /dev/fd/ も、どちらもベル研UNIX発祥の由緒正しいアイディアだよ。
*BSD や Linux だけじゃなく、Solaris 含む SVR4 系 UNIX でも実装されてる。
0655名無しさん@お腹いっぱい。2012/08/10(金) 20:09:40.36
発祥について言ってるんじゃなくて、
FreeBSDって、6か7かあたりで /procをマウントしなくなったじゃん。
Linuxとは違って各コマンドが /procに依存してない。
だから今のFreeBSDは /procを外す方向でしょ。
fdescfsの方は知らんけど。
0656名無しさん@お腹いっぱい。2012/08/10(金) 20:13:34.09
FreeBSDって何で/procデフォルトでマウントしないんだろうか。
FreeBSDハンドブックあたりには「セキュリティ上の理由」みたいなこと書いてあったような気がするけどその理由が良く分からんかった。
Linuxでは/procに頼ってるソフト結構あるせいでFreeBSDでは動かなかったりしそう。
0657名無しさん@お腹いっぱい。2012/08/10(金) 20:14:23.29
>>652のような街頭演説はFreeBSDのスレでどうぞ。
0658名無しさん@お腹いっぱい。2012/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/*を削った方がいいし、サポートする
つもりなら、もうちょっとなんとかした方が。
0659名無しさん@お腹いっぱい。2012/08/10(金) 20:27:13.36
だからsend-prを!
0660名無しさん@お腹いっぱい。2012/08/10(金) 20:28:39.42
/procとptrace(2)じゃほとんど機能かぶらないけど…
0661名無しさん@お腹いっぱい。2012/08/10(金) 20:33:35.24
ストリーム読んでパースするより構造体で取得できるsysctlの方がrobust
0662名無しさん@お腹いっぱい。2012/08/10(金) 20:35:08.85
>>660
ベル研のprocfs登場時の主要機能は、子プロセス以外のプロセスを、
デバッガでアタッチすることだったんよ。
今どきのptrace(2)は標準でこの機能を含んでいるので、
若者は知らなくても仕方ないが。

ptrace(2)にない機能のうち一部は、NetBSDの場合sysctlのproc階層で
サポートしてたりするが、FreeBSDのsysctlって、proc階層はないんだっけ。
0663名無しさん@お腹いっぱい。2012/08/10(金) 20:37:40.19
>>661
NetBSDの偉い人が/procについて言ってたのは、まさにそういう話だった希ガス。
robustだし、余計なエンコード→デコードとか、ファイルシステムとして
見せるための諸々のオーバーヘッドがなくて効率的だとか。
0664名無しさん@お腹いっぱい。2012/08/10(金) 20:41:55.71
ptrace(2)する代わりに/procでioctlする糞インターフェースは死んだも同然じゃん。
/procをread/writeしてメモリ、ファイル、統計情報読み書き、設定変更するくらいで。
0665名無しさん@お腹いっぱい。2012/08/10(金) 20:46:25.76
>>663
それは/proc経由でシグナル送ったり、リソース設定変更/取得したりする時の話でしょ。
/proc全てを0/1で考える必要はないよね。
Named pipeをunlinkする戦略練るより、fd叩くほうがずっと便利だもの。
0666名無しさん@お腹いっぱい。2012/08/10(金) 20:47:55.89
procfsとfdescfsの話題は混ぜるな危険。
0667名無しさん@お腹いっぱい。2012/08/10(金) 20:50:45.89
/proc/cpuinfoとか無理すぎ。
process関係ないw
processorじゃ!とかなしよん
06686632012/08/10(金) 20:52:29.93
>>665

それはfdescfsの話だから。
procfsの存在価値は疑問だけど (ptraceやsysctlの方がいい)、
/dev/fd/* はあった方がいいよ。
FreeBSD上で問題を今すぐ解決するには、fdescfsを使うのが楽だけど、
FreeBSD的にはdevfs を直す方がいいのかもしれん。
よく知らないけど。
0669名無しさん@お腹いっぱい。2012/08/10(金) 20:55:14.28
>>667
さすがにLinuxの人も無理に気づいたみたいで、最近は/procじゃなくて
/sys階層に入れるようにしてるよね。
過去に入れちゃった奴はておくれで残ってるけど。南無南無。
0670名無しさん@お腹いっぱい。2012/08/10(金) 20:59:10.47
sysctlのように型がかっちり決まってるのもいいけど、
/proc, /sysみたいにテキストになってるもの素敵やん。
0671名無しさん@お腹いっぱい。2012/08/11(土) 00:12:39.76
>>670
スクリプト言語から使うときなんかはテキストの方が楽だったりするね
(言語によるけど)。
そういう場合はprocfsやkernfsを使えばいいんだよ。
低級言語で書かれたOS付属コマンドまでそういうのに頼る必要はないけど。
0672名無しさん@お腹いっぱい。2012/08/11(土) 00:20:16.15
性能重視じゃないスクリプトなら
中継用のコマンドをユーザーランドに置いておけばよくて、
カーネルがサポートしなくてもいいよね
0673名無しさん@お腹いっぱい。2012/08/11(土) 01:49:37.99
sysctlコマンドなんて、まさにそういう中継用コマンドだな。
/dev/fd/* みたいなのは、なんらかのカーネルサポートが必要だが。
0674名無しさん@お腹いっぱい。2012/08/14(火) 03:35:46.04
PS1っていう環境変数は
bashだけのものですか?
他のシェルでも使える?
0675名無しさん@お腹いっぱい。2012/08/14(火) 09:38:22.60
PS1とPS2はすべてのシェル共通。PS3 PS4はbashとかのみ。

ただし、PS1とかの中の特殊文字の解釈はシェルごとに異なる。
0676名無しさん@お腹いっぱい。2012/08/14(火) 20:07:54.88
標準入力からzipする場合のファイル名って変えられないでしょうか?

echo abcde | zip test.zip -

ってやると圧縮ファイルに標準入力データを追加できるのですが
追加されたファイル名が「-」になってしまいます。
ファイルをディスクに書かずに、パイプを使ってzip圧縮までやりたいです。
0677名無しさん@お腹いっぱい。2012/08/14(火) 20:15:26.80
ln -s /dev/stdin hoge.txt
echo abcde | zip test.zip hoge.txt

とか。symlinkは許せ。
0678名無しさん@お腹いっぱい。2012/08/14(火) 22:50:08.33
>>677
希望が見えました。ありがとう。
0679名無しさん@お腹いっぱい。2012/08/14(火) 23:00:48.31
zip扱うライブラリがperlやpythonにある。そういうの使うと簡単。
0680名無しさん@お腹いっぱい。2012/08/15(水) 05:39:00.88
>>677
普通にtemporaryファイルつくって消したら?
0681名無しさん@お腹いっぱい。2012/08/15(水) 06:50:20.97
なんの役にも立たない >>680 をわざわざ書く意味がわからん
0682名無しさん@お腹いっぱい。2012/08/16(木) 00:43:00.83
例えばVAR=`df- h` というような場合に
echo $VAR とすると全て一行で表示されてしまいますが、
元のdfの出力結果をそのまま表示するようにするにはどうしたらいいでしょうか?
0683名無しさん@お腹いっぱい。2012/08/16(木) 00:47:05.41
echo "$VAR"

って最近似たような質問見たような。
0684名無しさん@お腹いっぱい。2012/08/16(木) 01:01:11.89
>>683
すいません、""の存在をすっかり忘れていました。
ありがとうございました。
0685名無しさん@お腹いっぱい。2012/08/16(木) 13:52:12.32
演算結果を変数に入れるにはどうしたらよいか
echo $((91-72)) はちゃんと出るけど
A=$((91-72)) は出来ない。
まさかいちいちA=`echo $((91-72))`ってやんの?
0686名無しさん@お腹いっぱい。2012/08/16(木) 13:57:08.74
>>685
$ A=$((91-72))
$ echo $A
19

できてるけど
0687名無しさん@お腹いっぱい。2012/08/16(木) 14:00:53.80
echo $((91-72)) は出来て、
A=$((91-72)) は出来ない、という環境は何か?
というエスパー検定だろw ちょっと上級の問題だな。
0688名無しさん@お腹いっぱい。2012/08/16(木) 16:01:24.16
「スクリプトを終了したら $Aがセットされていません」系か?
0689名無しさん@お腹いっぱい。2012/08/16(木) 17:14:30.15
sum=0; cat file | while read i; do sum=$(($sum+$i)); done; echo $sum
系とエスパー
■ このスレッドは過去ログ倉庫に格納されています