トップページunix
987コメント278KB

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。2012/11/15(木) 18:57:33.11
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 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でそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その20
http://toro.2ch.net/test/read.cgi/unix/1339083351/
0937名無しさん@お腹いっぱい。2013/10/25(金) 14:11:52.49
ナポリタン食べたい
0938名無しさん@お腹いっぱい。2013/10/25(金) 14:14:05.60
&
0939名無しさん@お腹いっぱい。2013/10/25(金) 14:18:35.58
>ナポリタン食べたい

1 : 投げ槍
2 : 匙を投げる
3 : exit
0940名無しさん@お腹いっぱい。2013/10/25(金) 14:27:36.78
子プロセスじゃなくてスレッドで処理したいのかな
0941名無しさん@お腹いっぱい。2013/10/25(金) 14:44:32.40
>>932
931 は

#!/bin/bash
fo() {
echo Child
sleep 3
}

fo&
echo Parent
wait

こういうことじゃないかな。
0942名無しさん@お腹いっぱい。2013/10/25(金) 20:57:40.43
>>934
何で違うと思うのか説明しろボケ

正しく理解してるなら質問しにくる必要ないよな。
さっさと失せろ。
0943名無しさん@お腹いっぱい。2013/10/25(金) 21:14:32.85
forkして、親プロセスのみexitして、子プロセスをinitの子供にするみたいなこと
やりたいんじゃないかな。
>>941 だと子プロセスがバックグラウンドになってしまう。
子プロセスもフォアグラウンドのまま親だけexitしたいみたいな。
0944名無しさん@お腹いっぱい。2013/10/25(金) 21:48:30.71
それならば、バックグランドで実行して親のシェルプロセスはそのまま終了すればいい。
0945名無しさん@お腹いっぱい。2013/10/25(金) 22:18:42.82
>>944
それだとやはりバックグラウンドプロセスのままになってしまう。
バックグラウンドプロセスはsignalの扱いがフォアグラウンドと違うから。
そこ理解してない奴多いんだけどさ。
0946名無しさん@お腹いっぱい。2013/10/25(金) 23:31:08.32
>>945
説明が下手なのが一番の問題
「本当にやりたいこと」がさっぱり分からない

「理解していない奴多い」とかいう以前に何がしたいのか伝わっていないから
>>944のような回答が出る
0947名無しさん@お腹いっぱい。2013/10/26(土) 00:41:27.22
飽くまで想像だけど、
親と子にPIDが違うだけでほぼ同じ処理をさせたいとする。
たまには親か子かを意識して違う処理に分岐するかもしれない。
ってとき、シェルスクリプトでどう書くのがスマート?
0948名無しさん@お腹いっぱい。2013/10/26(土) 08:16:46.51
>>946
実際やりたいことなんかなくてただイチャモンつけたいだけなんだろう。
0949名無しさん@お腹いっぱい。2013/10/26(土) 08:40:28.46
forkはしたいけどexecはしなくないってことでないの?
0950名無しさん@お腹いっぱい。2013/10/26(土) 09:03:06.42
>>949
それで何をしたいのか。
0951名無しさん@お腹いっぱい。2013/10/27(日) 13:55:20.94
それでソース詠唱したいw
0952名無しさん@お腹いっぱい。2013/10/28(月) 19:24:43.07
bashでfork出来ないってことをどうして認めないのか謎
0953名無しさん@お腹いっぱい。2013/10/28(月) 19:47:19.68
オワドの涙は0円
今井の挨拶100円
0954名無しさん@お腹いっぱい。2013/10/28(月) 19:48:57.98
      ____
     /____\
   /ィ赱、i_i_r赱ミ\
  / ̄ ̄ ̄ィ'。_。ヽ ̄ ̄\   レオナルド
  |    / _lj_ }    |
  \    、{ ^' ='= '^'   /
       ____
     /____\
   /ィ赱、i_i_r赱ミ\
  / ̄ ̄ ̄ィ'。_。ヽ ̄ ̄\   ラファエロ
  |    / _lj_ }    |
  \    、{ ^' ='= '^'   /
       ____
     /____\
   /ィ赱、i_i_r赱ミ\
  / ̄ ̄ ̄ィ'。_。ヽ ̄ ̄\   ドナテロ
  |    / _lj_ }    |
  \    、{ ^' ='= '^'   /
       ____
     /____\
   /ィ赱、i_i_r赱ミ\
  / ̄ ̄ ̄ィ'。_。ヽ ̄ ̄\   ラファエロ
  |    / _lj_ }    |
  \    、{ ^' ='= '^'   /
0955名無しさん@お腹いっぱい。2013/10/28(月) 20:17:23.16
>>952
UNIX系のOSでfork(vfork)以外に子プロセスを生成する方法ってある?
bashで関数をバックグラウンドで実行するときって、forkしてるんじゃないの?
0956名無しさん@お腹いっぱい。2013/10/28(月) 20:20:09.08
>>955
clone
0957名無しさん@お腹いっぱい。2013/10/28(月) 21:13:14.15
質問してる奴もよく理解してないみたいだが
forkじゃなくてsetsidができるかどうかじゃないの?
0958名無しさん@お腹いっぱい。2013/10/28(月) 23:38:12.10
>>952
そもそも質問者が言うforkが何を指しているのか分からん
エスパー待ち
0959名無しさん@お腹いっぱい。2013/10/28(月) 23:43:57.16
>>931じゃねえの?
0960名無しさん@お腹いっぱい。2013/10/28(月) 23:51:19.29
fork()しただけで親プロセスと同じプロセスグループに属してる状態が欲しいってことか
sh関数をバッググランド実行すると親プロセスとは別のプロセスグループに設定されてから実行されるから、
fork()じゃないと言いたいわけね?
日本語不自由すぎだろw
0961名無しさん@お腹いっぱい。2013/10/29(火) 08:45:24.15
クズい質問者にダラダラつきあってんじゃねーよ
甘やかすな
0962名無しさん@お腹いっぱい。2013/10/29(火) 09:40:23.28
ゆとりだから関数でサブプロセス化することも制御の仕方も分かってないだけだろ
要するに初めに覚えた言語の関数じゃないと理解できないただのアホ
裏で動いてる本質的な処理が全く分かってない
0963名無しさん@お腹いっぱい。2013/10/29(火) 09:58:38.32
出てこなくなった質問者を擁護してもしかたないんだけど、
プリミティブとしてのforkが欲しかったんじゃないの?
その方が細かい制御ができる場合もあるし。
もちろんCのfork()しか理解してないという可能性も高いけど。
0964名無しさん@お腹いっぱい。2013/10/29(火) 10:40:09.56
もうこの話終わりでいいだろ。
0965名無しさん@お腹いっぱい。2013/10/29(火) 12:23:39.69
開発のforkだったりして
0966名無しさん@お腹いっぱい。2013/10/29(火) 14:01:49.81
>>955
rfork
0967名無しさん@お腹いっぱい。2013/10/29(火) 14:39:31.73
俺たちはエスパーになる特訓中。
0968名無しさん@お腹いっぱい。2013/10/29(火) 16:04:45.35
実際のところ、bashでforkのみする方法ってあるの?
0969名無しさん@お腹いっぱい。2013/10/29(火) 16:20:49.30
>>968
関数を呼んだり、コマンドを実行したりせずに、ということなら
無いんじゃないか。
0970名無しさん@お腹いっぱい。2013/10/29(火) 16:37:25.49
fork が必要なら別の言語使った方がいいね。
09719212013/10/29(火) 19:39:57.67
みんなありがとう
0972名無しさん@お腹いっぱい。2013/10/29(火) 21:08:55.09
このままスレ埋まりそうな勢いだなw
0973名無しさん@お腹いっぱい。2013/10/29(火) 21:39:12.02
case文の途中で抜けたいんだけど
breakつかうと上のfor文抜けちゃうので
どうしたらいいか よいアイデアを 出すのだ
0974名無しさん@お腹いっぱい。2013/10/29(火) 21:40:59.80
goto
0975名無しさん@お腹いっぱい。2013/10/29(火) 21:55:13.39
gotoをend行き以外で使うの恐い
0976名無しさん@お腹いっぱい。2013/10/29(火) 21:58:12.02
てか、gotoってcshかよ
0977名無しさん@お腹いっぱい。2013/10/30(水) 07:59:22.95
ラベル付きbreakってないんだっけ。
0978名無しさん@お腹いっぱい。2013/10/30(水) 14:04:29.64
caseにbreakは無いのでド壺ってるわけで、ラベル付きbreakはあったとしても役立たず
0979名無しさん@お腹いっぱい。2013/10/30(水) 14:39:46.49
if文で続きの処理をしなければいいだけ。
case $foo in
bar) baz; if qux; then quux; fi ;;
esac
0980名無しさん@お腹いっぱい。2013/10/30(水) 15:13:47.48
>>979
ありがとう
やっぱこのダサい方法しかないか
0981名無しさん@お腹いっぱい。2013/10/30(水) 16:16:09.22
ひらめいた
こんなのどう?
for onlyonceforbreakincase in 1; do
case $foo in
bar) baz; if qux; then break; fi; quux ;;
esac
done
0982名無しさん@お腹いっぱい。2013/10/30(水) 17:47:57.45
え、continueってこういう時使うんじゃないの
0983名無しさん@お腹いっぱい。2013/10/30(水) 18:11:18.13
>>982
それじゃ、case文の後が実行されないだろ
0984名無しさん@お腹いっぱい。2013/10/30(水) 22:42:14.92
これ、バグ?

#!/bin/sh
LANG=C
export LANG
d=^`date "+%b %d %H:%M"`
echo $d
d=^`env TZ="JST offset 00:01" date "+%b %d %H:%M"`
echo $d

(実行結果:env TZ付きで打つと%Hがたぶん%mで出てくる)
^Oct 30 19:19
^Oct 30 10:18

dateの-vでこと無きを得たけど。
0985名無しさん@お腹いっぱい。2013/10/30(水) 23:17:08.28
If TZ appears in the environment but its value is a null string,
Coordinated Universal Time (UTC) is used.
09869842013/10/31(木) 00:13:45.03
>>985
うまく書けますた。thx
アホなこと書いちゃった(^_^; 試した時期が悪かったなw
09879842013/10/31(木) 00:21:28.73
ちょっと訂正。TZでうまく(-1分の時刻を表示)書けてはいなくて、結局date -vを採用した。
TZは、UTC+15とかでフツーにhour単位でズラすのは知ってたから、勘違いした。
'offset'付けるとNGなのね。
レス数が950を超えています。1000を超えると書き込みができなくなります。