08/03/02 01:59:50
find の行にほかに何か書いたんじゃ?
find /path/to/hoge -name "*.txt" > ~/list${dir}_list
かなぁ。
find /path/to/hoge/ てすると結果が /path/to/hoge//dir になるぽい。
ちょっと今Macしか手元にないのでちょっと挙動が違うかもね。
俺もあんまり詳しくないんでw
113:104
08/03/02 02:28:31
>>112
何も書いてないですね。自分に出来るかわからないですけど教えてもらったのを
参考に弄ってみたいと思います。
Macもコマンド使えるんですかー 知りませんでしたw
ありがとうございました。一旦、スレを離れます。
114:名無しさん@お腹いっぱい。
08/03/05 00:49:41
HOGE=20080302022831
たとえば2008年3月2日 2時28分31秒を意味する
みたいな環境変数あったとして、
これに180秒足すとか、
時刻の加減算したいのだけどなんかいい方法ない?
115:名無しさん@お腹いっぱい。
08/03/05 01:14:43
date -j -f %s $(($(date -j -f %Y%m%d%H%M%S "$HOGE" +%s) + 180)) +%Y%m%d%H%M%S
みたいな?OSというかdateによるけど。
116:名無しさん@お腹いっぱい。
08/03/05 04:26:24
UNIX epochは素晴らしい。
64bitにした時signedにしてないシステムがあるのは嘆かわしい。
117:名無しさん@お腹いっぱい。
08/03/05 14:50:47
dateコマンドはシステムによって違いすぎるから、ほとんどの日付計算はperlに丸投げ
118:名無しさん@お腹いっぱい。
08/03/06 13:08:35
ある
テキストファイルに"aaa"という文字列が入っていたら[処理A]を
テキストファイルに"bbb"という文字列が入っていたら[処理B]を
ってシェルスクリプトだけでできるかな?
bashで。
119:名無しさん@お腹いっぱい。
08/03/06 13:19:01
bashは知らんがshで
case $(cat x.txt) in
*aaa*) echo 'do A';;
*bbb*) echo 'do B';;
esac
120:名無しさん@お腹いっぱい。
08/03/06 13:23:09
両方入っていたら?
121:名無しさん@お腹いっぱい。
08/03/06 13:25:03
>>119
すげえ!頭の構造が違う!
ありがとう。
122:名無しさん@お腹いっぱい。
08/03/06 13:25:45
>>120
泣きながら修正する
123:名無しさん@お腹いっぱい。
08/03/06 14:12:58
>>119
ファイルサイズがでかいとつらそうだな
124:名無しさん@お腹いっぱい。
08/03/06 14:15:27
grep -s aaa file && echo 処理A
grep -s bbb file && echo 処理B
125:名無しさん@お腹いっぱい。
08/03/06 15:36:21
>>119
それ bash。
純正 shでは動かん。
126:名無しさん@お腹いっぱい。
08/03/06 15:41:02
>>125
すげー理屈だな。
127:名無しさん@お腹いっぱい。
08/03/06 15:43:33
まぁbashで動くならいいんじゃね。
128:名無しさん@お腹いっぱい。
08/03/06 15:49:49
純正 shって何?
129:名無しさん@お腹いっぱい。
08/03/06 16:02:36
Version 7 あたりか
130:名無しさん@お腹いっぱい。
08/03/06 16:34:24
俺は124みたいな方法が好み
$( )が動くのはkshからか?
131:名無しさん@お腹いっぱい。
08/03/06 16:49:43
>>124
それだと今のgrepでは行が表示されちゃうよ。
骨董品のような環境しか使ってないことバレますよw
132:名無しさん@お腹いっぱい。
08/03/06 17:59:52
*BSDユーザはbash依存にはうるさいが、ash依存「$( )とかexport A=aとか」には
無頓着な傾向があるな。
133:名無しさん@お腹いっぱい。
08/03/06 18:27:06
export A=aはkshでも出来るからどうでも良い
134:名無しさん@お腹いっぱい。
08/03/06 18:41:48
現実に純正shとやらが載ってる環境なんて今時滅多になかろうし、
テンプレにある議論の基準として参照できそうなのもPOSIXの仕様くらいなので
仕方ない面もあると思う。
>>132は*BSDユーザに何をみてshの仕様を判断することを期待しているの?
135:名無しさん@お腹いっぱい。
08/03/06 19:02:35
そもそも「純正 sh」って表現が意味わからん。
136:名無しさん@お腹いっぱい。
08/03/06 19:04:57
そうですか。Solarisは今時滅多にないですか、、
137:名無しさん@お腹いっぱい。
08/03/06 19:07:57
>>134
「純正 sh」なんて言わないで
「FreeBSD の /bin/sh で試した」とか言えばいいじゃん。
138:名無しさん@お腹いっぱい。
08/03/06 19:09:10
はいはいashash
139:名無しさん@お腹いっぱい。
08/03/06 19:10:00
>>137 は勘違いしてるね。
FreeBSD の /bin/sh は 純正 sh じゃない。(ashだから)
だから、FreeBSD の /bin/sh では >>119 が動いてしまう。
純正 shでは動かないけど。
140:名無しさん@お腹いっぱい。
08/03/06 19:35:26
>>139
純正shって結局何? System 7のshが純正ってことでいい?
>>137
それじゃ一般化した議論ができないよ。
まず、$( )とかexport A=aとかが純正shとやらにはありません、
ということを*BSDユーザに対して説得力ある説明をするにはどうするの?
141:名無しさん@お腹いっぱい。
08/03/06 19:42:05
>>140
別に一般化しなくていいと思うけどな。
「(OS 名) の /bin/sh では動かないよ」でいいじゃん。
142:名無しさん@お腹いっぱい。
08/03/06 20:20:17
「Solarisの/bin/shには$( )とかexport A=aとかがありません」これでいい?
143:名無しさん@お腹いっぱい。
08/03/06 20:33:05
その調子で、Solaris以外も全部列挙していってくれ。
144:名無しさん@お腹いっぱい。
08/03/06 20:42:22
Solarisはいまどきめったにないです
145:名無しさん@お腹いっぱい。
08/03/06 21:13:15
多くの商用UNIXは互換のために古いshが残されてる。
Solarisの場合、多くのスクリプトがkshベースになってるけどな。
146:名無しさん@お腹いっぱい。
08/03/06 21:21:53
商用UNIXがもうそれほど多くないです
147:名無しさん@お腹いっぱい。
08/03/06 21:25:27
しょうよねぇ
148:名無しさん@お腹いっぱい。
08/03/06 22:24:07
HP-UXは11iでbourneは完全になくなった
149:名無しさん@お腹いっぱい。
08/03/07 06:51:44
実装とmanだけで、ちゃんとした仕様がないんだから、
純正shなんて言っても始まらない。
今はPOSIXが標準。
>>1
>・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
なんて馬鹿げてる。
150:名無しさん@お腹いっぱい。
08/03/07 07:01:33
POSIX sh や ksh を前提にしてもいいかもね
151:名無しさん@お腹いっぱい。
08/03/07 07:14:25
よくないだろw
152:名無しさん@お腹いっぱい。
08/03/07 07:22:03
そう?
Bourne Shellを前提にするよりはいろいろと有効だとおもうけど
153:名無しさん@お腹いっぱい。
08/03/07 08:22:29
正直、AT&Tの純正/bin/shが使える環境の方が特殊。
原理主義者は別スレ立ててそこでやってくれ。
そこで永遠に添削してれば良かろう。
つ 【純正/bin/shが】シェルスクリプト【唯一の正当なsh】
154:名無しさん@お腹いっぱい。
08/03/07 08:46:54
いやだから、Solarisの/bin/shが現存するんだって。Solarisももう特殊なのか?
155:名無しさん@お腹いっぱい。
08/03/07 09:13:02
特殊な部類と言われてもそれほど驚かないけど。
/bin/shをposix shに置き換えていないのはまだ生きているものの中ではsolarisぐらい?
156:名無しさん@お腹いっぱい。
08/03/07 09:48:19
使用シェルを明示すればいいだけのような気がする。
それでも差異を知っておくのは別に悪いことじゃないと思うんだけど、
特定のOSしか相手にしない連中ならそれでもいいか。
157:名無しさん@お腹いっぱい。
08/03/07 09:58:02
つまり純正shとかいってたのは、Solarisで動かないのは認めねーってのがホンネかw
158:名無しさん@お腹いっぱい。
08/03/07 10:20:04
Solarisなんて現場ではもうほとんど使われてないだろ。
使われているのは昔のマシンで、移行が面倒だからそのまま動いてるだけのもの。
そういうマシンは保守のみで、新規にスクリプトを書くことはないので、
結局Solaris用のスクリプトなんてもう書くことはない。
159:名無しさん@お腹いっぱい。
08/03/07 10:25:19
自分の場合、Solarisに限らず古めの商用UNIXをお守りすることがある。
入れ替えろつってもムリな環境ってのはあるから。装置の一部になってるとか。
OSのアップグレードすらムリだったり。
若い連中には/bin/shと書いておきながらbash前提のスクリプト書くやつが
いたりするんだが、犬以外の作業ではまっていたりする。
そんなやつは知識が足りてないから、なかなか解決できないのが笑えるよ。
160:名無しさん@お腹いっぱい。
08/03/07 10:25:56
>>158
自分の知ってる世界がすべてだと思わない方がいいよ。
161:名無しさん@お腹いっぱい。
08/03/07 10:50:13
Bourne shを前提にすればSolarisのshすら拡張されている。
162:名無しさん@お腹いっぱい。
08/03/07 10:51:15
>>160
こういうふうに、反論する(反例を示す)わけでもなく、
一般論だけ言って本人は反論したつもりになってるのって間違ってるよな。
163:名無しさん@お腹いっぱい。
08/03/07 10:57:52
>>161
じゃあ、Solarisの/bin/shで使えて、Bourne shでは使えない例を1つ以上挙げて。
あらかじめ言っとくけど、あくまでシェルスクリプトとしてね。
インタラクティブモードでの拡張は別。(set -mでjob controlが使えるようになるとか)
164:名無しさん@お腹いっぱい。
08/03/07 11:16:01
^ がパイプとして動くshはまだどっかにある?
165:名無しさん@お腹いっぱい。
08/03/07 11:23:50
>>163
関数。
166:名無しさん@お腹いっぱい。
08/03/07 11:28:01
オリジナルBourne shellって一体どのバージョンのこと指しているの?
POSIXなら仕様のversionでどれかはっきりするけども。
オリジナルBourne shellって言っても、どれか特定すら出来ないでしょ。
後から行われたバグフィックスは含むのか含まないのか。
167:名無しさん@お腹いっぱい。
08/03/07 11:39:06
>>164
Solarisの/bin/sh は ^ がパイプとして機能する。Bourne sh踏襲のため。
168:名無しさん@お腹いっぱい。
08/03/07 11:58:56
反例ないようだし、実質 Solaris /bin/sh基準でいいんじゃね?
169:名無しさん@お腹いっぱい。
08/03/07 12:04:57
可哀想に、耄碌して目も見えなくなったのか……
170:名無しさん@お腹いっぱい。
08/03/07 12:07:54
基準なんているか?
質問者の環境で動けばいいじゃん。
171:名無しさん@お腹いっぱい。
08/03/07 12:17:05
そういうことにしてしまうとbashを排除する口実がなくなる。
172:名無しさん@お腹いっぱい。
08/03/07 12:38:31
実質POSIX sh基準でよさそうだな。SUSv3と一体化したし。
173:名無しさん@お腹いっぱい。
08/03/07 12:40:50
だから、それじゃSolarisで動かないとあれほど、、
174:名無しさん@お腹いっぱい。
08/03/07 12:43:10
Solaris爺様には必要なときにSolarisではどうするかと質問してもらうということでいいんじゃない。
175:名無しさん@お腹いっぱい。
08/03/07 12:44:44
Solarisはkshがあるから、POSIXのコード渡されても問題ないでしょ。
176:名無しさん@お腹いっぱい。
08/03/07 12:44:57
POSIX信者もbashと同様にウザイことに最近気がついた。
177:名無しさん@お腹いっぱい。
08/03/07 12:46:14
Bourne shell原理主義者もな。
178:名無しさん@お腹いっぱい。
08/03/07 12:47:28
学生のときSolarisにお世話になった俺は心情的にはSolaris使える人を維持できるよう
このスレも気を配った方がいいとは思うのだが、昨日からの流れ見てると
到底このスレのSolaris使いを擁護する気にはなれないwww もうPOSIX shスレでいーよ。
179:名無しさん@お腹いっぱい。
08/03/07 12:53:45
せっかくだからPOSIXと由緒正しいBourne shellの違いを上げてみる?
[[ 新test式 ]]
$(( 算術式 ))
引数がない場合の"$@"問題
180:名無しさん@お腹いっぱい。
08/03/07 13:00:43
そもそもtestがbuiltinだ、ボケ
181:名無しさん@お腹いっぱい。
08/03/07 13:01:17
そもそもtestがbuiltinじゃないだ、ボケ
182:名無しさん@お腹いっぱい。
08/03/07 13:01:43
建設的な話のもっていきかただとは思うが、まず
> 由緒正しいBourne shell
とやらを特定しようぜ。できればSolaris以外のソースで頼むわ。
Solarisのshをもってきてこれが純正だっつーならバージョンも明記でな。
いまのところ、Version 7のshがそれということになりかねない。
183:名無しさん@お腹いっぱい。
08/03/07 13:04:09
なりつつある、の方が適当だったか。
184:名無しさん@お腹いっぱい。
08/03/07 13:11:16
人は皆、理想のシェルを追い続ける旅人のようなものさ。
185:名無しさん@お腹いっぱい。
08/03/07 13:18:46
$( コマンド ) < POSIX
186:名無しさん@お腹いっぱい。
08/03/07 13:30:45
>>184
理想でいえば、rc はなかなかいいよ(単なるまぜっかえし)
187:名無しさん@お腹いっぱい。
08/03/07 13:35:48
仮にPOSIXで桶にしてしまうと、
print hoge (printfじゃないよ、読み間違えるなよ)
なんてのも桶になってしまう。
POSIX的にはechoは非推奨で、printに書き換えなきゃならないからな。
で、*BSDユーザーからは printなんてコマンドねーよ、って話になる。
188:名無しさん@お腹いっぱい。
08/03/07 13:42:10
>>187
はつみみなのでソースよろ。
189:名無しさん@お腹いっぱい。
08/03/07 13:56:56
echoはプラットフォームごとに違いが大きいからなあ。
190:名無しさん@お腹いっぱい。
08/03/07 14:10:08
Solarisに至っては内蔵コマンドなのにPATHによって挙動が変化するしね
191:名無しさん@お腹いっぱい。
08/03/07 16:36:46
POSIXにprintコマンドなどない。
POSIXについてすら>>187のように妄想を語り出す奴がいるようでは
仕様を特定できないBourne shでは到底基準にならないな。
192:名無しさん@お腹いっぱい。
08/03/07 16:51:06
とりあえず、間を取ってkshぐらいで動けばまぁ文句も出にくいかと。
193:名無しさん@お腹いっぱい。
08/03/07 17:39:04
>>191
xpg4ってPOSIXじゃないの?
194:名無しさん@お腹いっぱい。
08/03/07 17:48:55
Unix95とかUnix2003(OSXのあれ)とかと同類。
はっきりいって一番どうでもいい規格w
195:名無しさん@お腹いっぱい。
08/03/07 21:06:07
仕様を手に入れやすいというメリットはあるね。
196:名無しさん@お腹いっぱい。
08/03/07 22:50:06
>>193
違うよ。
197:名無しさん@お腹いっぱい。
08/03/07 23:36:16
>>190
> Solarisに至っては内蔵コマンドなのにPATHによって挙動が変化するしね
マジ? ちょっと信じられないんだけど。
198:名無しさん@お腹いっぱい。
08/03/07 23:39:35
>>179
> せっかくだからPOSIXと由緒正しいBourne shellの違いを上げてみる?
関数が内部コマンドより優先 > POSIX
# [[ test式 ]] ってPOSIXだったかなあ…
199:名無しさん@お腹いっぱい。
08/03/08 01:38:57
>>163
${parameter##word}
${parameter#word}
${parameter%%word}
${parameter%word}
200:名無しさん@お腹いっぱい。
08/03/08 07:55:45
>>199
それはSolarisの/bin/sh でも使えない。よって例にならない。
201:名無しさん@お腹いっぱい。
08/03/08 08:21:28
POSIXだからといって [[ ]] を使ったりすると
*BSDユーザーが困るだろ。だからPOSIXを尺度にすることは事実上無理がある。
202:名無しさん@お腹いっぱい。
08/03/08 10:54:49
[[ ~ ]] はPOSIXじゃないのでその主張には無理がある。
203:名無しさん@お腹いっぱい。
08/03/08 11:11:35
>>197
$ sh -c 'type echo; echo -n hoge'
echo is a shell builtin
-n hoge
$ PATH="/usr/ucb:$PATH" sh -c 'type echo; echo -n hoge'
echo is a shell builtin
hoge (改行なし)
204:名無しさん@お腹いっぱい。
08/03/08 12:07:28
じゃあ、kshって結構 POSIXとはかけ離れてるんだ。
205:名無しさん@お腹いっぱい。
08/03/08 12:29:33
kshをフルに使って書いたものはPOSIX shで動かないという意味では。
kshにあってPOSIXで採用されなかったものとしては、select文もそうだね。
206:名無しさん@お腹いっぱい。
08/03/08 12:42:50
実際のスクリプトでは全く使われていないのに
参考出品のリファレンスみたいに /usr/xpg4/bin/sh
を置いてるSolarisって一体、、、
しかも、/usr/xpg4/bin/shはPOSIXじゃないし、
/usr/xpg4/bin/shが新標準だとしても
未だに/usr/xpg4/bin/shで /bin/shを置き換える気配もないし、、
207:X/Open
08/03/08 12:44:44
>>206
> しかも、/usr/xpg4/bin/shはPOSIXじゃないし、
( ゚д゚)ポカーン
208:名無しさん@お腹いっぱい。
08/03/08 12:54:38
>>207
>>196 ( >>193 )
209:名無しさん@お腹いっぱい。
08/03/08 12:55:25
>>207
>>194
210:X/Open
08/03/08 13:04:11
違うのは当たり前だろ
POSIXと違うとか
新標準とか
アホかと思う
211:名無しさん@お腹いっぱい。
08/03/08 13:06:00
/usr/xpg4/bin/shを置くなら、
なぜ /usr/posix/bin/sh を置かないのか、って話かな?
212:名無しさん@お腹いっぱい。
08/03/08 13:06:30
その違うのをどうしましょうって話じゃないですか。
213:名無しさん@お腹いっぱい。
08/03/08 13:22:56
XPG4準拠のが別途用意してあるのはいいことだ。
/bin/shと置き換えるとか、>>206は意味不明すぎ。
214:名無しさん@お腹いっぱい。
08/03/08 21:16:51
autotoolsの吐くconfigureで使われているか否か、は移植性の判定材料になるだろうか。
215:名無しさん@お腹いっぱい。
08/03/08 21:37:59
BSDヲタが騒ぐからautoconfは控えることw
216:名無しさん@お腹いっぱい。
08/03/08 21:43:42
Solarisの/usr/xpg4/bin/shも、HP-UX、AIXの/bin/shも実体はkshだっつうの。
で、kshはPOSIXに一応準拠している。というかPOSIXが後付でkshの仕様をパクっただけ。
ただし、仕様が曖昧なところが多いから、
POSIX志向が強いbashなんかとkshでも、結構挙動が違っているところがある。
217:名無しさん@お腹いっぱい。
08/03/08 21:49:08
実体一緒でもargv[0]が違えば挙動が違うでしょ。
218:名無しさん@お腹いっぱい。
08/03/13 15:52:12
Solarisでは/usr/xpg4/bin/shとkshは別バイナリだぞ。嘘書くな。
ハードリンクもしてないし、当然argv[0]も見てない。cmp比較してから書けよ。
219:名無しさん@お腹いっぱい。
08/03/13 16:29:01
ソースレベルでは99%同じだけどな。
220:名無しさん@お腹いっぱい。
08/03/14 19:19:44
指定フォルダ以下のファイル数を
findを使って調べたいのです。
どなたかヘルプおながいします
221:名無しさん@お腹いっぱい。
08/03/14 19:32:16
wc -l で行数を数えればいいんじゃねの
222:名無しさん@お腹いっぱい。
08/03/14 19:45:19
フォルダって何ですか?
223:名無しさん@お腹いっぱい。
08/03/14 22:03:10
>>222
> フォルダって何ですか?
わろた
224:名無しさん@お腹いっぱい。
08/03/14 22:11:38
>>222
素人さんにも通じるディレクトリの一般的な呼び方です。
225:名無しさん@お腹いっぱい。
08/03/14 23:57:27
質問です。
NETWORK |AAAA BBB CCCC
|AAAA BBB CCCC
AAAA |BBBB CCCC DDDD
BBBB |UUUU DDDD FFFF
このような5000行のテキストからヘッダー以外の最初のカラムを抜き出したいのですが
ヘッダーと2行目の空白も抜き出してしまい、うまくいきません。
元のファイルをいじらず、うまくヘッダーを除いたカラムを抜き出せませんか?
どうか教えていただけないでしょうか?
226:名無しさん@お腹いっぱい。
08/03/15 00:15:30
sed -n 's/^[^|]*|//p' | awk '{ print $1 }'
sedは文字単位、awkはカラム単位と分担する
227:名無しさん@お腹いっぱい。
08/03/15 00:17:47
「ヘッダーと2行目の空白も抜き出し」た後に、先頭の2行を削ればいいのでは。
うんたらかんたら | { read x; read x; cat; }
228:名無しさん@お腹いっぱい。
08/03/15 00:22:25
sed -ne '3,$p' | ...
229:名無しさん@お腹いっぱい。
08/03/15 04:59:25
ヘッダってのは一カラム目の事なのか?
下手な説明だなw
230:名無しさん@お腹いっぱい。
08/03/15 05:15:04
>>225
sed '1,2 d; s/|.*//'
awk -F '|' 'NR > 2{ print $1 }'
cut -d '|' -f 1 | tail +3
231:名無しさん@お腹いっぱい。
08/03/15 09:23:42
>>226
sedでできることはすべてawkでもできるんだから、
awkを使うならsedは使っちゃ駄目。
1個のawkでできるのにsedと分担するのはバッドデザイン。
今回の場合は結局sedだけでできるんだから、
>>230 が最良回答だな。
232:名無しさん@お腹いっぱい。
08/03/15 09:32:56
>>230
> sed '1,2 d; s/|.*//'
できてないやんw
233:名無しさん@お腹いっぱい。
08/03/15 09:39:22
俺は仕様がわからんのだが…
二行目以外にも1カラム目が空白の行があるんじゃないのか?
それなら、
awk 'NR > 1 { if ($2 !~ /^\|/) print $1; }'
234:名無しさん@お腹いっぱい。
08/03/15 09:42:21
>>231
>>sedでできることはすべてawkでもできるんだから
それは違う。
また、仮に出来ることでも
分担させることで、何をやっているのか明確になるなら無問題。
決してバッドデザインなどでは無い。
235:名無しさん@お腹いっぱい。
08/03/15 09:49:07
>>234
それは awkプログラムになれていない者の考え。
236:名無しさん@お腹いっぱい。
08/03/15 09:51:13
>>232
できてるだろ。
237:名無しさん@お腹いっぱい。
08/03/15 09:54:56
というか、>>226 の sedの部分、間違ってるやん。
1カラム目を逆に削除してるww
sedすらロクに書けない者が「分担」ですかw
何をやっているのか明確になってるはずなのに、こんな明らかな間違いですかww
238:名無しさん@お腹いっぱい。
08/03/15 10:05:16
>>234
sed でできて awk でできないことってたとえば何?
239:名無しさん@お腹いっぱい。
08/03/15 10:52:44
>>237
おれは別に当人じゃないけど、
問題文を君とは違う解釈をしているだけで、
間違いではないと思う。
>>238
さあ?例えば出力の判定が遥か前方に有る場合とか?
240:名無しさん@お腹いっぱい。
08/03/15 10:59:45
>>235
なれていないの定義が良く解らんが、
シェルのラッパを被っただけのawkスクリプトを書くわけじゃなくて、
シェルスクリプトを書くためにはawkプログラムを知悉する必要は無いと思う。
当人がsedで書いた方が後でメンテをし易いと思うなら、
そうすべきと思うことを阻害する理由は何もない。
241:名無しさん@お腹いっぱい。
08/03/15 12:45:14
一行野郎でどっちも使ってるけどそれぞれに良さはあるよ。
置換処理は sed の方が簡単に書ける。
カラム指向の処理は awk が便利。
ただ、sed の出力を awk に食わせるのは無駄が多いと思う。
たいていはどちらかだけで書けるだろうから。
俺はややこしくなってきたら perl とか ruby に逃げちゃうし。w
シェルスクリプトで重要なのはメンテする人が分かりやすい事だと
思っているからこの考えを無理強いするつもりは無いけどな。
242:名無しさん@お腹いっぱい。
08/03/15 13:33:44
>>225を良く読むと、>>233が正解仕様のような気がするのだが…
243:名無しさん@お腹いっぱい。
08/03/15 14:43:31
awk -F"|" 'NR>1{print $1}'
244:名無しさん@お腹いっぱい。
08/03/15 14:47:46
それじゃ二行目の空白が出力される。
>>225はデータに全角空白が含まれるから仕様が良くわからん。
245:名無しさん@お腹いっぱい。
08/03/15 23:11:58
質問です。
二つのファイルがあります。
ファイルAには以下の内容。
-----------------------
aaa
bbb
ccc
ddd
eee
fff
ggg
-----------------------
ファイルBには以下の内容がかいてあります。
-----------------------
bbb
ccc
-----------------------
ファイルAからファイルBの内容を除去したファイルCを作りたいのですが、
どのようにすればよいでしょうか?
(ファイルAやファイルBの内容は、時々かわります。)
246:名無しさん@お腹いっぱい。
08/03/15 23:28:15
Bの各行が独立したパターンならgrep -f Bでよさそうだけど、
bbb
ccc
という塊で削除したいならそうもいかんよな。
diff -u A B | sed -n '1,/^@/d;/^-/s/^-//p'
とか?
247:名無しさん@お腹いっぱい。
08/03/15 23:29:04
おっと
×grep -f B
○grep -vf B
248:名無しさん@お腹いっぱい。
08/03/15 23:31:32
>>245
ほれ、作ってやったよ。
#!/bin/sh
cmd='cat fileA'
while read str
do
cmd="$cmd | grep -v $str"
done < fileB
eval $cmd
249:名無しさん@お腹いっぱい。
08/03/15 23:36:03
>>248
それだったら、grep -vf fileB fileA でいいじゃん。
>>247 がすでに答えてる。
250:名無しさん@お腹いっぱい。
08/03/16 14:52:28
ファイルA,Bの並びが同じで、ファイルAにだけある行があるという場合は
commが使える。
251:名無しさん@お腹いっぱい。
08/03/18 00:36:36
>>250
commって辞書順に並んでないと使えないよ。
たぶん、このケースはプログラムで一行づつチェックするしかないと思うんだ。
252:名無しさん@お腹いっぱい。
08/03/18 05:09:00
fgrepにした方が安全。-eも付けて。
253:名無しさん@お腹いっぱい。
08/03/18 10:25:45
solarisのシェルスクリプトで教えてください。
スクリプト内で自分自身が置かれているディレクトリの絶対パスを取得したいのですが上手くいきません。
$0にパスが格納されていると聞いて以下のコードをtest.shとして実行したのですが./testという結果しか返ってきません。
#!/bin/bash
/bin/echo $0
どうすれば絶対パスを取得できますか?
254:名無しさん@お腹いっぱい。
08/03/18 10:28:28
>>253
pwd
255:名無しさん@お腹いっぱい。
08/03/18 10:39:20
>>254
できましたー!
本当にありがとうございます。
256:名無しさん@お腹いっぱい。
08/03/18 10:48:09
( cd `dirname $0` && pwd )
が妥当では?
257:名無しさん@お腹いっぱい。
08/03/18 10:50:59
$0 書き替えて呼ばれたら無効だけどな。
URLリンク(www.nurs.or.jp)
258:名無しさん@お腹いっぱい。
08/03/18 11:08:19
>>255
>>254 は嘘回答だお。本当にありがたいかw
スクリプトが置かれているディレクトリじゃなくて、
スクリプトを実行したディレクトリが表示されるだけ。
259:名無しさん@お腹いっぱい。
08/03/18 11:09:29
回答っていうか、ヒントでしょ。
そのまま使うわけがない。
260:名無しさん@お腹いっぱい。
08/03/18 11:18:52
ヒントとしても質が低いな
261:255
08/03/18 11:26:10
すいません。
cronで動かしたら違うディレクトリを持ってきました。
どうすれば良いでしょうか。
262:名無しさん@お腹いっぱい。
08/03/18 11:38:23
>>261
だから言っただろ
263:255
08/03/18 11:44:49
>>262
迂闊でした。
264:名無しさん@お腹いっぱい。
08/03/18 11:50:16
その後のレスぜんぜん読んでないのな。
265:255
08/03/18 11:58:38
cd `dirname $0` && pwd でできました!
本当にありがとうございました。
266:名無しさん@お腹いっぱい。
08/03/18 12:11:02
次はスペース付きパスでハマるわけだな
267:255
08/03/18 13:01:56
かさねがさねすいません。
cd `dirname $0` && pwd
↑
この結果、どうやれば変数に格納できますか?
268:名無しさん@お腹いっぱい。
08/03/18 13:46:23
>>267
` ` のネスティングの問題だな。
hoge=`cd \`dirname $0\` && pwd`
269:名無しさん@お腹いっぱい。
08/03/18 13:49:00
問題: >>268 を、スペースを含むPATHでも対応できるように書き直せ
270:名無しさん@お腹いっぱい。
08/03/18 13:59:14
hoge=$(cd "$(dirname $0)" && pwd) でお
271:名無しさん@お腹いっぱい。
08/03/18 14:06:30
>>270
不正解
272:名無しさん@お腹いっぱい。
08/03/18 14:13:19
>>271
なんで?
273:255
08/03/18 14:17:06
今度こそ本当にできました!
皆さん本当に本当にありがとうございました。
>>269
わ、わかりません。
もっと勉強して出直します。
274:名無しさん@お腹いっぱい。
08/03/18 14:25:44
>>272
$0 自体がスペースを含んでたら駄目だろ。実験すれば一発。
あと、$( ) じゃなくてあくまで ` ` で書いて欲しいな。
275:名無しさん@お腹いっぱい。
08/03/18 14:35:18
>>274
> $0 自体がスペースを含んでたら駄目だろ。実験すれば一発。
気づかんかった。
> あと、$( ) じゃなくてあくまで ` ` で書いて欲しいな。
エスケープが多いと見にくくない?
276:名無しさん@お腹いっぱい。
08/03/18 16:27:40
$( )で問題なし
277:名無しさん@お腹いっぱい。
08/03/18 16:34:22
>>276
あるだろ。
278:名無しさん@お腹いっぱい。
08/03/18 16:35:58
ヒント:元質問者のOS
279:名無しさん@お腹いっぱい。
08/03/18 16:36:10
最終的にカレントディレクトリもスペースを含むことを考えて、
hoge="`cd \"\\`dirname \\"$0\\"\\`\" && pwd`"
かな?
手許に環境がないから、誰か実験してw
280:名無しさん@お腹いっぱい。
08/03/18 16:43:31
>>279
不正解
281:名無しさん@お腹いっぱい。
08/03/18 16:44:53
$(cmd)はPOSIX shellにはあるから問題ないだろ
282:名無しさん@お腹いっぱい。
08/03/18 16:46:24
>>277
どんな問題があるの?
283:名無しさん@お腹いっぱい。
08/03/18 16:57:56
NGワード推奨「P○SIX」
284:名無しさん@お腹いっぱい。
08/03/18 16:59:32
回答してる奴に茶々入れる奴はうざいですねw
285:名無しさん@お腹いっぱい。
08/03/18 17:10:01
ろくな内容じゃないのにね。
286:名無しさん@お腹いっぱい。
08/03/18 17:36:34
>>280
そんなの見りゃわかる。
どうせ、書くならもっと有意義なことを書いてもらいたい。
287:名無しさん@お腹いっぱい。
08/03/18 17:37:38
否定以外書いたらそこの浅さがバレルじゃない
288:名無しさん@お腹いっぱい。
08/03/18 18:00:26
>>286
見りゃわかるならお前が正解書けばいいじゃないか。
本当はわからなかったんだろ?
289:名無しさん@お腹いっぱい。
08/03/18 18:06:15
と威勢だけは大変よろしいのでした
290:名無しさん@お腹いっぱい。
08/03/18 18:16:52
hoge=$(cd "$(dirname "$0")" && pwd)
dirname $0にスペースが含まれていてもok。
291:名無しさん@お腹いっぱい。
08/03/18 18:23:46
>>290
じゃあ、それを ` ` を使って書いた場合は?
292:名無しさん@お腹いっぱい。
08/03/18 18:25:01
290ですが、なんか妙なタイミングで書いちゃったみたいねw
私は290が今日はじめてなので念のため。
Solarisということなので``でも書いときます。たぶんこれでいいはず。
hoge=`cd "\`dirname "$0"\`" && pwd`
293:名無しさん@お腹いっぱい。
08/03/18 18:26:46
>>292
正解
294:名無しさん@お腹いっぱい。
08/03/18 18:32:07
Bシェル教えてください。
次のようなシェルがあり、関数func1のコードは変更せず、かつ画面に"aaa"と表示させたいんです。
<Bシェル>
func1(){
exit 1
}
func1
echo "aaa"
perlのevalみたいな制御ができれば嬉しいんですが、
Bシェルでこれを実現させる法ありませんか?
<perl>
eval{
func1;
};
if($?){
…
}
295:名無しさん@お腹いっぱい。
08/03/18 18:36:37
func1をサブシェルで実行。(func1)
296:名無しさん@お腹いっぱい。
08/03/18 18:36:59
・シェルスクリプトのことをシェルってゆーな
return 1
297:名無しさん@お腹いっぱい。
08/03/18 18:38:16
func1変更禁止かorz
298:名無しさん@お腹いっぱい。
08/03/18 19:34:19
func1(){
exit 1
}
echo "aaa"
func1
これで良いんじゃね?w
299:294
08/03/18 20:11:07
>>295
ありがとう。それでなんとかなりそう。
>>296
そうしたいのはやまやまなんですがね。
>>298
さすがにそれは無理。
300:名無しさん@お腹いっぱい。
08/03/18 20:17:01
呼び方変えるくらいすぐできるでしょ。
301:名無しさん@お腹いっぱい。
08/03/18 20:35:30
>>295 で解決済。それ以外の回答はハズレ。
302:名無しさん@お腹いっぱい。
08/03/18 21:50:16
はいはい
303:名無しさん@お腹いっぱい。
08/03/18 22:07:59
シェルの入門書を見て↓のようなシェルを書きましたが動きません。
原因は何ですか?
#!/bin/sh
echo Hoge World
304:名無しさん@お腹いっぱい。
08/03/18 22:34:38
#!/bin/sh
echo Hoge World
305:名無しさん@お腹いっぱい。
08/03/18 22:36:29
>>303
滑ってるよ
306:名無しさん@お腹いっぱい。
08/03/18 22:40:00
>>304
ええ、ですからそう書いたのですが、動かないんです、、
307:名無しさん@お腹いっぱい。
08/03/18 22:43:37
それOS windowsだよ
308:名無しさん@お腹いっぱい。
08/03/18 22:49:50
>>303
コンパイラは何使いましたか? バージョンによって使えない命令があります。
309:名無しさん@お腹いっぱい。
08/03/19 02:06:49
>>303
えすぱーくますた
chmod +x hoge.sh
./hoge.sh
じっこーけんげんじゃね?
310:名無しさん@お腹いっぱい。
08/03/19 03:43:04
全然違うなw
311:名無しさん@お腹いっぱい。
08/03/19 07:20:45
>>309
動きました
ありがとうございました!
312:名無しさん@お腹いっぱい。
08/03/19 07:44:57
>>311 はにせもの。
>>309 それはすでにやってます。まだ動きません。
313:名無しさん@お腹いっぱい。
08/03/19 08:14:54
「シェル」を書いてるんだから、それだけじゃ難しそうだな…
シェルスクリプトだとすると
echo の e が全角なのが気になるが実際は違うよな?
314:名無しさん@お腹いっぱい。
08/03/19 08:20:19
またシェル開発者ですね、わかります
315:名無しさん@お腹いっぱい。
08/03/19 08:39:01
そうです。開発に配属されたら、シェルを書けることが必須だったんです。
ちょっと焦ってます、、
316:名無しさん@お腹いっぱい。
08/03/19 08:41:15
天然だw
317:名無しさん@お腹いっぱい。
08/03/19 13:02:17
仕事でシェル書くの?
318:名無しさん@お腹いっぱい。
08/03/19 13:18:46
シェルスクリプトで引っかかってるようだと
開発部門でやっていくの大変じゃない?
319:初心者
08/03/19 14:36:50
すいませんシェルスクリプトで0から9を
横に0123456789
と表示したいのですが、数字を縦にしか表示できなくて。
どなたか教えてください。
320:名無しさん@お腹いっぱい。
08/03/19 14:38:59
>>319
for((i=0;i<=9;i++)){ echo -n $i;};echo
321:初心者
08/03/19 14:46:18
>>320
ありがとうございます。
for 変数 in リスト
do
処理
done
の形で書くことは出来るのでしょうか?
たびたびすいません。
322:名無しさん@お腹いっぱい。
08/03/19 14:47:41
>>321
for i in 0 1 2 3 4 5 6 7 8 9;do echo -n $i;done;echo
323:初心者
08/03/19 14:58:57
ありがとうございました。
処理の部分で使われている -n はどういった意味なのですか?
324:名無しさん@お腹いっぱい。
08/03/19 15:04:07
これは醜い
325:名無しさん@お腹いっぱい。
08/03/19 15:06:41
seq -s "" 0 9
326:名無しさん@お腹いっぱい。
08/03/19 15:10:11
これは酷い初心者です
327:初心者
08/03/19 15:11:07
すいません。酷いのはわかってますが、本当はじめたばかりで。
でも、ちゃんと意味も理解していかないとと思いましたので・・
328:名無しさん@お腹いっぱい。
08/03/19 15:21:49
>>325
seq: command not found
329:名無しさん@お腹いっぱい。
08/03/19 15:26:38
あのー(汗 どうしてこんなむずかしいことが出来るの? すごいよ。君たちは。感心してます^^。ガンバってくださいね。
330:名無しさん@お腹いっぱい。
08/03/19 15:57:41
>>323
man echo
331:名無しさん@お腹いっぱい。
08/03/19 16:10:09
>>322 の実行結果
-n 0
-n 1
-n 2
-n 3
-n 4
-n 5
-n 6
-n 7
-n 8
-n 9
??? なぜ?
332:初心者
08/03/19 16:10:44
>>330
ありがとうございました。
man コマンドを見るのを忘れてました。助かりました。
333:名無しさん@お腹いっぱい。
08/03/19 16:12:15
問題:
>>322 をOSに依存しないようにポータブルにせよ
334:名無しさん@お腹いっぱい。
08/03/19 16:15:05
printfを使えばよい
335:名無しさん@お腹いっぱい。
08/03/19 16:34:16
echo 0123456789
336:名無しさん@お腹いっぱい。
08/03/19 16:41:14
>>334 外部コマンドを使わずに
>>335 論外
337:名無しさん@お腹いっぱい。
08/03/19 16:50:16
>>334
printfがないOSもある
338:名無しさん@お腹いっぱい。
08/03/19 16:53:48
printfがだめならこれでどうだ
if [ "`echo -n`" = "-n" ]; then
echon() { echo "$@\c"; }
else
echon() { echo -n "$@"; }
fi
for i in 0 1 2 3 4 5 6 7 8 9; do echon $i; done; echo
339:名無しさん@お腹いっぱい。
08/03/19 16:57:15
out=;for i in 0 1 2 3 4 5 6 7 8 9; do out=$out$i;done;echo $out
340:名無しさん@お腹いっぱい。
08/03/19 17:08:07
dateコマンドってミリ秒の取得できますか?
341:名無しさん@お腹いっぱい。
08/03/19 17:11:17
>>340
GNU dateなら +%N でできる。
342:名無しさん@お腹いっぱい。
08/03/19 17:11:22
実装によるんじゃね
343:名無しさん@お腹いっぱい。
08/03/19 17:31:41
当日の日付をミリ秒まで取得したいです。ミリ秒の精度としては
3桁でよいみたいです。
344:名無しさん@お腹いっぱい。
08/03/19 17:33:48
人の話を聞かんやっちゃな。
345:名無しさん@お腹いっぱい。
08/03/19 17:35:27
申し訳ないです。
date +%Nでできたので、実際にやりたいことを書いてみました。
346:名無しさん@お腹いっぱい。
08/03/19 17:40:06
m=`date +%N | head -c 3`
date +'%Y年%m月%d日 %H:%M:%S.'"$m"
347:名無しさん@お腹いっぱい。
08/03/19 17:43:52
>>346
一旦変数に入れる意味ないやん。
date +'%Y年%m月%d日 %H:%M:%S.'`date +%N | head -c 3`
348:名無しさん@お腹いっぱい。
08/03/19 17:52:53
>>346-347
dateを2回起動してるのが無駄。
date +'%Y年%m月%d日 %H:%M:%S.%N'|head -c 27;echo
349:名無しさん@お腹いっぱい。
08/03/19 17:58:13
sed 's/......$//'
350:名無しさん@お腹いっぱい。
08/03/19 17:58:42
>>348
27文字で決め打ちしてると、年月日などの文字数が変わった時困る。
↓の方がエレガント
expr "`date +'%Y年%m月%d日 %H:%M:%S.%N'`" : '\(.*\....\)'
351:名無しさん@お腹いっぱい。
08/03/19 18:17:21
date +'%Y年%m月%d日 %H:%M:%S.%3N'
352:名無しさん@お腹いっぱい。
08/03/19 18:47:39
文字列処理の話はいいから、date +%Nが使えないOSではどうするんだよ?
353:名無しさん@お腹いっぱい。
08/03/19 18:48:36
泣き寝入りです。
354:名無しさん@お腹いっぱい。
08/03/19 20:18:36
GNU dateをインストールする
355:名無しさん@お腹いっぱい。
08/03/19 21:12:16
000でごまかす
356:名無しさん@お腹いっぱい。
08/03/19 22:16:36
>>317
周りにtclsh改造して自前のシェル作る奴いるからなきにしもあらず
#半導体業界のtcl好きは異常だと思う…
357:名無しさん@お腹いっぱい。
08/03/19 22:25:23
こんなプログラムを持ち運ぶ(精度はマイクロ秒だけど)
#include <stdio.h>
#include <sys/time.h>
int main(int argc, char **argv)
{
struct timeval tv;
if (gettimeofday(&tv, NULL))
perror("error!\n");
printf("%d\n", tv.tv_usec);
return 0;
}
358:名無しさん@お腹いっぱい。
08/03/19 22:32:57
>>356
そのためのツールだし。> TCL
359:名無しさん@お腹いっぱい。
08/03/19 22:35:19
>>357
持ち運ぶなら、持ち運びやすいようにショートコーディングに徹しなさい。
#include<sys/time.h>
main(){struct timeval t;gettimeofday(&t,0);printf("%d\n",t.tv_usec);}
360:名無しさん@お腹いっぱい。
08/03/19 22:40:37
>>359
ショートコーディングというからには、#includeなんてしちゃ無駄だろ。
main(){int t[2];gettimeofday(t,0);printf("%0d\n",t[1]);}
%dは%0dに直しておいた。桁揃えのため。
361:名無しさん@お腹いっぱい。
08/03/19 22:47:45
>>360
もっと短くなるよ。int宣言も無駄だね。
main(t){gettimeofday(&t,0);printf("%0d\n",1[&t]);}
362:名無しさん@お腹いっぱい。
08/03/19 22:50:27
>>360
桁揃えは %06d じゃないのか?
363:名無しさん@お腹いっぱい。
08/03/19 22:58:39
やべえ。こいつら正気じゃねえ。
364:名無しさん@お腹いっぱい。
08/03/19 23:04:37
日頃古いshへの移植性で争ってるスレとは思えない
365:名無しさん@お腹いっぱい。
08/03/19 23:05:16
改行はむしろ余計なのではないか?
366:名無しさん@お腹いっぱい。
08/03/19 23:05:36
じゃあ、まとめるとこんな感じ?
↓ gccコンパイル込みでシェル関数にしたよ
#!/bin/sh
micro_sec() {
echo 'main(t){gettimeofday(&t,0);printf("%06d\n",1[&t]);}'|gcc -xc -
./a.out; rm a.out
}
hoge=`micro_sec`
echo $hoge
367:名無しさん@お腹いっぱい。
08/03/20 00:56:56
>>363 UNIX板は、やぱスゲーひといるよね
まだまだすごいことができるのだと思いますが
Cも知りたくなってきたw
368:名無しさん@お腹いっぱい。
08/03/20 01:44:52
スゲーんじゃなくて悪乗りしてるだけだと思うが
>>366
echo はいらんだろ?
369:名無しさん@お腹いっぱい。
08/03/20 02:49:33
#!/usr/bin/tcc -run
#include <sys/time.h>
void
main(void) {
struct timeval tv;
gettimeofday(&tv, NULL);
printf("%.6d\n", tv.tv_usec);
}
370:名無しさん@お腹いっぱい。
08/03/20 04:21:02
>>321
$ for m in `jot 10 0`; do echo -n $m; done
0123456789
jotも知らんとは>>321よ、なさけない。
371:名無しさん@お腹いっぱい。
08/03/20 07:23:13
>>370
$ jot
jot: command not found
372:名無しさん@お腹いっぱい。
08/03/20 07:27:07
>>368
欲嫁。言いたいのはmicro_sec()の部分だけ。
下のechoとかはmicro_secの使い方の1例を挙げてるだけだろ。
直接表示なら micro_secを直接実行でいいし、
変数に入れたなら、変数に入っているという確認のためにechoしてるだけ。
373:名無しさん@お腹いっぱい。
08/03/20 07:29:18
>>369
/usr/bin/tcc: command not found
374:名無しさん@お腹いっぱい。
08/03/20 07:32:25
>>372
いや、そこではねくて
375:名無しさん@お腹いっぱい。
08/03/20 07:37:35
>>374
シェル関数の中のechoは必要だろ。gccの標準入力に食わせるために。
echoなしでヒアドキュメント( << )でやる方法は
一時ファイルができるから美しくない。
ヒアドキュメントを使わずに、echoも使わない方法ってある?
376:名無しさん@お腹いっぱい。
08/03/20 12:09:43
>>373
sudo aptitude install tcc
377:名無しさん@お腹いっぱい。
08/03/20 12:26:21
>>376
sudo: command not found
378:名無しさん@お腹いっぱい。
08/03/20 12:27:52
$ su
Enter password:
su: password incorecct.
$
379:名無しさん@お腹いっぱい。
08/03/20 14:52:56
なんかbashでcを組んでしまう勢いだなww
380:名無しさん@お腹いっぱい。
08/03/20 17:18:16
>>366
まあジョークだろうからどうでもいいが、
現在時刻をミリ秒単位の精度で得るために
まずその場でコンパイルを始めるってどういう設計だwww
381:名無しさん@お腹いっぱい。
08/03/20 21:28:00
tcc ってARM?
382:名無しさん@お腹いっぱい。
08/03/21 00:06:22
Tiny C Compiler
URLリンク(fabrice.bellard.free.fr)
TinyCC mailing list
URLリンク(mail.freesoftware.fsf.org)
Ubuntu
URLリンク(packages.ubuntu.com)
Debian
URLリンク(packages.debian.org)
RPM
URLリンク(fr2.rpmfind.net)
TinyCC Changelog
URLリンク(fabrice.bellard.free.fr)
version 0.9.21:
- ARM target support
383:あ
08/03/21 09:28:07
文字列のaからzを
for 変数 in リスト
の形で表すにはどうしたらよいのでしょうか?
384:名無しさん@お腹いっぱい。
08/03/21 10:12:32
$ for i in `seq 97 122`; do printf '\x'`echo "obase=16;$i" | bc`; done
seqなければwhile + exprで
385:名無しさん@お腹いっぱい。
08/03/21 10:42:58
>>383
for i in `perl -le 'print for a..z'`; do echo $i; done
386:名無しさん@お腹いっぱい。
08/03/21 10:49:30
>>384-385 という冗談はさておき、シェルスクリプトとしてやるにはどうしたらよいのでしょうか?
387:名無しさん@お腹いっぱい。
08/03/21 10:52:03
bashなら
for i in {a..z}; do echo $i; done
388:名無しさん@お腹いっぱい。
08/03/21 10:55:41
>>386
シェルスクリプトだろ。冗談はよせよ。
389:名無しさん@お腹いっぱい。
08/03/21 10:57:05
まあ、perl使うのは反則だわな
390:名無しさん@お腹いっぱい。
08/03/21 11:00:08
for i in a b c d e f g h i j k l m n o p q r s t u v w x y z
391:名無しさん@お腹いっぱい。
08/03/21 11:02:45
>>387
動くのか?
392:名無しさん@お腹いっぱい。
08/03/21 11:03:07
ボーンなら、
for i in `bash -c 'echo {a..z}'`; do echo $i; done
393:名無しさん@お腹いっぱい。
08/03/21 11:04:04
>>391
動くだろ。bash3以降だけどな。
394:名無しさん@お腹いっぱい。
08/03/21 11:07:09
つーか元の要求がよくわからん。
395:名無しさん@お腹いっぱい。
08/03/21 11:17:07
どれも>>390これとそれほどタイプ数がかわらないという
396:名無しさん@お腹いっぱい。
08/03/21 11:32:31
yes ''|cat -n|head -122|tail -26|while read i; do printf "%o¥n" $i;done|while read o;do printf "¥¥$o¥n";done
すごく無駄なことをやった気がする。
397:名無しさん@お腹いっぱい。
08/03/21 11:37:14
for i in \
`echo 'main(c){for(c=97;c<123;c++)printf("%c ",c);}'|gcc -xc -;./a.out;rm a.out`
do
echo $i
done
398:名無しさん@お腹いっぱい。
08/03/21 11:44:50
IOCCCみたいになってきたな
399:名無しさん@お腹いっぱい。
08/03/21 12:25:20
IOSSC International Obfuscated Shell Script Contest
400:名無しさん@お腹いっぱい。
08/03/21 14:19:42
むしろIntranational
401:名無しさん@お腹いっぱい。
08/03/23 04:35:19
すんまそ
date を使って
20080322123456
年月日時分秒の書式でファイルを作りたい
cmd 1 10000
第1引数 +n秒 (-1なら引く)
第2引数 第1引数を行ってm回繰り返す。
while (n<$2)
do
touch `date '+ expr $a'`
a=a+$1
done
みたいなことをしたいですが、どうすれば良いですか?
402:名無しさん@お腹いっぱい。
08/03/23 05:13:42
誰か翻訳頼む
403:名無しさん@お腹いっぱい。
08/03/23 08:39:07
>>401
できたよ
↓
#!/bin/sh
n=$1
i=1
while [ "$i" -le "$2" ];
do
date +%Y%m%d%H%M%S -d "$n second"
n=`expr "$n" + "$1"`
i=`expr "$i" + 1`
done
ただし、GNU date必須。
補足:
>>402 わからないなら黙ってろ
404:名無しさん@お腹いっぱい。
08/03/23 08:41:55
>>403 で動作(表示)確認してから、
date +%Y%m%d%H%M%S -d "$n second"
を
touch `date +%Y%m%d%H%M%S -d "$n second"`
に直すとファイルが作れる。
405:401
08/03/25 01:16:11
ありがと
あしたやってみる。
感謝です。
406:名無しさん@お腹いっぱい。
08/03/25 23:05:33
GNU date必須なんて答で、恥ずかしくないの?
407:名無しさん@お腹いっぱい。
08/03/25 23:20:15
>>406
じゃ、お前、GNU date使わないバージョンの回答しろよな。
408:名無しさん@お腹いっぱい。
08/03/25 23:58:42
恥ずかしいなら黙ってればいいのに。
409:名無しさん@お腹いっぱい。
08/03/26 09:43:59
>>406
そんなコト言い出したらきりがない。
相手の環境が分かっていて、そこに GNU date が無いなら酷いが
質問者はそんな情報出した?
# なかったとしても「ぢゃGNU date 入れよ」ってなるかもシランがそれは知らん。
410:名無しさん@お腹いっぱい。
08/03/26 09:59:39
>>406
not speak, write scripts.
411:名無しさん@お腹いっぱい。
08/03/26 11:00:39
GNU date使わずにポータブルにやるなら、
awkあたり使った方がいい。
date +%Y%m%d%H%M%S -d "$n second"
を、
awk 'BEGIN{print strftime("%Y%m%d%H%M%S", systime()+'$n')}'
に書き直す。
>>406
答えられないなら黙ってろ。
412:名無しさん@お腹いっぱい。
08/03/26 11:37:03
>>411
それ、GNU awk必須だろw
413:名無しさん@お腹いっぱい。
08/03/26 12:13:04
2chで他人に黙ってろとかいう奴にろくな奴はいない。
414:名無しさん@お腹いっぱい。
08/03/26 12:36:48
ひとつの解を出す分だけ、貴殿よりマシだと思う
415:名無しさん@お腹いっぱい。
08/03/26 12:51:58
自分で設定した「ポータブルにやるなら」という問題に対して
出したものがポータブルじゃないのに解を出したことになるのだろうか。
416:名無しさん@お腹いっぱい。
08/03/26 14:23:46
まぁ>>406よりは随分マシw
417:名無しさん@お腹いっぱい。
08/03/26 14:51:14
これでどうだ。ポータブルだろw
#!/bin/sh
my_date()
{
echo 'main(t,b){t=time(0)+'$1';strftime(&b,16,"%Y%m%d%H%M%S\n",localtime(&t));printf(&b);}' | gcc -xc - 2>/dev/null
./a.out; rm a.out
}
n=$1
i=1
while [ "$i" -le "$2" ];
do
my_date "$n"
n=`expr "$n" + "$1"`
i=`expr "$i" + 1`
done
418:名無しさん@お腹いっぱい。
08/03/26 14:56:56
おしいな。
gccのところがccなら。
419:名無しさん@お腹いっぱい。
08/03/26 15:01:06
>>418
ccにすると、「language optional software package not installed」って出て
動かないOSがあるから、gccの方がポータブル。
~
420:名無しさん@お腹いっぱい。
08/03/26 16:48:33
strftimeのない昔のUNIXは切り捨て?
421:名無しさん@お腹いっぱい。
08/03/26 16:55:18
strftime()使わずに、struct tmの中身を直接printf()すればいいかな。
422:名無しさん@お腹いっぱい。
08/03/26 17:27:15
コード長くなっちゃうなぁ。
テストしやすいように、$1 $2 はデフォルトを入れるようにしておいた。
#!/bin/sh
my_date()
{
echo '
#include <time.h>
main(){struct tm *t;int i;i=time(0)+'$1';t=localtime(&i);
printf("%04d%02d%02d%02d%02d%02d\n",
t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);}
' | gcc -xc - 2>/dev/null
./a.out; rm a.out
}
set ${1-5} ${2-3}
n=$1
i=1
while [ "$i" -le "$2" ];
do
my_date "$n"
n=`expr "$n" + "$1"`
i=`expr "$i" + 1`
done
423:名無しさん@お腹いっぱい。
08/03/26 17:47:31
ネタひっぱりすぎ
424:名無しさん@お腹いっぱい。
08/03/28 00:31:20
日付関係はperlでやらないか。結構古くても入ってるでしょ、perl。
425:名無しさん@お腹いっぱい。
08/03/28 03:21:18
誰かshell scriptでDateTimeライブラリ書け。
426:401
08/03/28 05:18:13
できました。
ありがとう。
ひっぱって悪いですが>401の内容で
20080322123456FreeBSD
20080322123456NetBSD
20080322123456OpenBSD
のように第3引数を「FreeBSD」のようにしてファイル名に付けたい
です。
自分でやってみましたが
touch `date +%Y%m%d%H%M%S -d "$n second" `$3
とか
d=date +%Y%m%d%H%M%S -d "$n second"
f=$d$3
touch `echo $f`
としますが
invalid argumentなど出ます。
この場合は、どうしたらいいですか。
gnu dateですた
427:名無しさん@お腹いっぱい。
08/03/28 06:54:01
>>426
> touch `date +%Y%m%d%H%M%S -d "$n second" `$3
ここで date がエラーを吐いているのなら n に値を代入し忘れている可能性が高い。
まず $n の値を確認しろ。
428:401
08/03/28 07:10:23
すみません。
家で、今確認しました。
>>426で
touch `date +%Y%m%d%H%M%S -d "$n second" `$3
と書きましたが。
touch `date +%Y%m%d%H%M%S -d "$n second" $3`
のようにしてエラーが出ていました。
$3の前後に「`」を移動する
いま、>>426のようにしたら意図通りできました。
会社でもやってみます。
すんませーーーん
429:名無しさん@お腹いっぱい。
08/03/28 08:12:00
ここに来てる人、OSはUNIXだよね? (FreeBSDとかSolarisとか)
GNU dateって、わざわざインストールしてるの?
まさか犬じゃないよね?
430:名無しさん@お腹いっぱい。
08/03/28 09:45:54
してる。
GNU testも、gwakも。
犬がどうしたとかそんな馬鹿な偏見はないから。
431:名無しさん@お腹いっぱい。
08/03/28 11:59:03
>>429
FreeBSDはUNIXなの?
432:名無しさん@お腹いっぱい。
08/03/28 12:25:21
FreeBSD=unixで良いじゃん。
別に定義の話をしてるわけじゃなし。
433:名無しさん@お腹いっぱい。
08/03/28 12:33:51
FreeBSDをUNIXに含めるんであれば
Linuxを含めない理由ないでしょ。
434:名無しさん@お腹いっぱい。
08/03/28 12:55:21
LinuxはLinux板という専用の隔離板があるので、
そちらに行けば良いと思います。
435:名無しさん@お腹いっぱい。
08/03/28 13:36:03
そうなればそうなるわな
436:名無しさん@お腹いっぱい。
08/03/28 15:15:13
UNIX でも通用するポータブルなスクリプトを知りたいならここだと思ってた。
437:名無しさん@お腹いっぱい。
08/03/28 15:43:48
じゃあ GNU date使っちゃ駄目じゃん。
438:名無しさん@お腹いっぱい。
08/03/29 02:50:31
AIX4ばっかりの仕事の俺に愛の手を!GNU系でもインストールなんて許されてねぇ
439:名無しさん@お腹いっぱい。
08/03/29 04:06:52
Cもだめってこと?
440:名無しさん@お腹いっぱい。
08/03/29 10:57:42
--prefix=$HOMEで入れちまえ、とかなんとか。
でもコンパイラも入ってなかったりするのさ。
441:名無しさん@お腹いっぱい。
08/03/29 11:19:10
というわけでGNU date必須の回答を出して悦に入るのは恥知らず。
442:名無しさん@お腹いっぱい。
08/03/29 11:19:14
だったらいまあるものでなんとかすればいいじゃない
443:名無しさん@お腹いっぱい。
08/03/29 11:21:33
今回の場合、GNU以外のdateでは不可能。
444:名無しさん@お腹いっぱい。
08/03/29 13:18:57
dateというファイル名でperlで組めばお題は満足する。
安易に不可能とか言い切って恥ずかしくないの?
445:名無しさん@お腹いっぱい。
08/03/29 13:30:29
一時、awkが有料のUNIXあったよな。
446:名無しさん@お腹いっぱい。
08/03/29 13:33:30
>>444
perlを使ったらシェルスクリプトじゃない。
perlが非標準のUNIXもある。
447:名無しさん@お腹いっぱい。
08/03/29 13:36:23
perlが入っていればそれでいいけどねー
448:名無しさん@お腹いっぱい。
08/03/29 13:45:27
>>446
おまえの脳内定義の「シェルスクリプト」で使用可能なコマンドを列挙しろ。
そしてそれ以外は認めないというスレを立ててそっちに行け。
449:名無しさん@お腹いっぱい。
08/03/29 13:52:40
>>444
じゃあ、perl使ってGNU dateそっくりのスクリプト書いてみろよ。
どうせそれもできないのに知ったかで言ってるんだろ。
450:名無しさん@お腹いっぱい。
08/03/29 13:53:09
まあ当該質問の環境でperlが使えるかは未知数だから…
451:名無しさん@お腹いっぱい。
08/03/29 14:07:54
autoconfが生成するconfigureって移植性は相当意識してるらしいね。
autoconfの本(紙の)読んだらいろいろクドクドかいてあった。
452:名無しさん@お腹いっぱい。
08/03/29 14:08:44
GNU dateの互換である必要は全く無い。
こんな単純な事に気付かなくて恥ずかしくないの?
453:名無しさん@お腹いっぱい。
08/03/29 14:17:19
問題はそこじゃないから
454:名無しさん@お腹いっぱい。
08/03/29 14:30:54
うん、
> GNU date必須の回答を出して悦に入るのは恥知らず。
これに尽きるね。
455:名無しさん@お腹いっぱい。
08/03/29 15:03:37
>>452
GNU dateの互換である必要ないから、
回答例を1例でも挙げてみろよ。まだ1例も挙げてないじゃないか。
やっぱり知ったかなんだろ?
456:名無しさん@お腹いっぱい。
08/03/29 15:41:56
別解を提示する事と
> GNU date必須の回答を出して悦に入るのは恥知らず。
は、独立という事に気付かないって恥ずかしくないの?
457:名無しさん@お腹いっぱい。
08/03/29 16:00:12
なんだ、やっぱり解答できないんだ。
458:名無しさん@お腹いっぱい。
08/03/29 16:49:25
恥の上塗りしないで引っ込んでりゃいいのに。
459:名無しさん@お腹いっぱい。
08/03/29 18:30:19
GNU date が優秀なのは分かったから
それを使わないポータブルでエレガントな別解プリーズ
460:名無しさん@お腹いっぱい。
08/03/29 18:54:53
Perlだとこうか($nに秒単位の差分をいれてね)
perl -MPOSIX -le "print POSIX::strftime(q{%Y%m%d%H%M%S}, localtime($n+time))"
これは未検証だがどうだろうか
date -r $(expr $(date +%s) + $n) +%Y%m%d%H%M%S
461:名無しさん@お腹いっぱい。
08/03/29 18:58:27
POSIX dateには-uしかなかったからこれはポータブルじゃないね
次の人お願い
462:名無しさん@お腹いっぱい。
08/03/29 19:13:48
彼によるとGNU date以外の回答はシェルスクリプトじゃ無くなるようですよ。
何しろそれ以外の解は存在しないらしいですから。
463:名無しさん@お腹いっぱい。
08/03/29 19:14:47
>>462
糞粘着しねよ
464:名無しさん@お腹いっぱい。
08/03/29 19:41:47
ようやく恥というものがわかったのか?
465:名無しさん@お腹いっぱい。
08/03/29 21:11:30
正直dateとかどうでもいいよw いつまで続けんのw
466:名無しさん@お腹いっぱい。
08/03/29 21:50:26
もうテンプレにLinux禁止、GNUコマンド禁止って入れとけよ
467:名無しさん@お腹いっぱい。
08/03/29 22:04:49
じゃあ、perlもGNUモノだから禁止ですね。
468:名無しさん@お腹いっぱい。
08/03/29 22:13:41
>>467
?
469:名無しさん@お腹いっぱい。
08/03/29 22:14:53
恥ずかしいなら黙ってればいいのに。
470:名無しさん@お腹いっぱい。
08/03/29 22:16:35
perlはGPLであってGNUじゃないでしょ?
# Artistic Licenseも選択できる。
471:名無しさん@お腹いっぱい。
08/03/29 22:24:54
perlはもともとスレ違いだから禁止。
ときどき空気読まずにperlでの解答する香具師居るが、単にスレ違いが見過ごされているだけ。
472:名無しさん@お腹いっぱい。
08/03/29 23:27:53
質問者の環境で動けばそれでいいじゃない。
473:名無しさん@お腹いっぱい。
08/03/29 23:30:34
>>445
BSD拡張が有料だった時代もあったなあ。
474:名無しさん@お腹いっぱい。
08/03/29 23:37:41
>>439
Cもダメ。C必須のアプリを入れるならOKだけれど!かなしい!
475:名無しさん@お腹いっぱい。
08/03/29 23:40:00
>>472
そうだね
476:名無しさん@お腹いっぱい。
08/03/29 23:43:06
>>474
つ ハンドコンパイル
477:名無しさん@お腹いっぱい。
08/03/30 00:10:24
>>476
それだ!
よく考えたら、適当な環境でクロスコンパイルすればいいのか
478:名無しさん@お腹いっぱい。
08/03/30 00:11:22
風紀委員がうるさいから禁止事項にはしないほうが良い。
479:名無しさん@お腹いっぱい。
08/03/30 00:41:27
質問者の環境で動けばどうでもいいよ
480:名無しさん@お腹いっぱい。
08/03/30 03:56:12
既に遠い過去の>>428 で解決しててな
481:名無しさん@お腹いっぱい。
08/03/30 03:58:09
>>441
くだらん事書いて、刺された方が切れたんだろ?
おまえ、第三者から見て、評論家だけで役にたって無い気がするぞ。
空気悪くなってんだから、少し考えてはどうですか?
482:名無しさん@お腹いっぱい。
08/03/30 09:01:53
恥ずかしいなら黙ってればいいのに。 > 自称被害者
483:名無しさん@お腹いっぱい。
08/03/30 19:01:21
自覚なしに恥の上塗りをするのは勝手
484:名無しさん@お腹いっぱい。
08/03/30 20:43:35
svn help|sed -n '/^ \([a-z]\+\) \?.*/{s//\1/p}'
の出力をリストとして処理するんですが
改行をデリミタとして分解すると分解後のリストの中に""のような空の要素ができてしまいます
echoの-nオプションのように最終行の改行を出力しないようにする方法を教えてください
現在は分解する前に部分文字列を作る関数でsubstring(0, str.length())のようにして取り除いてます
485:名無しさん@お腹いっぱい。
08/03/30 21:22:52
>>484
コマンド置換で一旦変数に取り込めば最後の改行はカットされるけどな。
変数の値を参照する時も echo -n で参照。
hoge=`svn help|sed -n '/^ \([a-z]\+\) \?.*/{s//\1/p}'`
echo -n "$hoge"
486:名無しさん@お腹いっぱい。
08/03/30 21:53:57
どうもありがとうございました
なんかのソースに付いてるようなスクリプトでわざわざ代入しているのにはこういう理由もあったんですね
487:名無しさん@お腹いっぱい。
08/03/31 02:16:54
とりあえず正常化
仕切り直していきましょう
488:名無しさん@お腹いっぱい。
08/03/31 03:17:20
Mysqlバックアップ処理や別サーバへのFTP通信等を
行いたいのですが、
mysqldump -u root -p password
のようなコマンドを打つとpsなどで
パスワードがローカルユーザーに漏れる可能性があるかと思います。
何か良い隠ぺい策ってないでしょうか?
489:名無しさん@お腹いっぱい。
08/03/31 03:21:23
expectスクリプト
490:名無しさん@お腹いっぱい。
08/03/31 04:11:10
expect以外のよい方法ってないでしょうか?
パスワード遮蔽のみのために
expectを用いるのは結構つらいと感じましたので。。。。
すいません。。。。
491:名無しさん@お腹いっぱい。
08/03/31 06:29:31
原則としてコマンドライン引数にパスワードを直接書くのはダメ。
mysqldumpの仕様によるのでここではなくMySQLのスレ(データベース板?)できくべきだが
・パスワードをファイルに保存してそれを引数に与える
・コマンドが読む設定ファイルにパスワードを書く
・環境変数でパスワードを与える
などコマンドラインで暴露しない方法が必ずある筈。調べてみて。
492:名無しさん@お腹いっぱい。
08/03/31 07:03:12
正常化したかと思ったらスレ違いネタ,,
493:名無しさん@お腹いっぱい。
08/03/31 08:14:21
>>490
バックアップ専用のユーザを作って、そのユーザで実行すれば他のユーザからは隠蔽される。
他のユーザから見えてしまうような環境なら、別マシンで実行すべし。
494:名無しさん@お腹いっぱい。
08/03/31 08:19:50
はぁ?
495:名無しさん@お腹いっぱい。
08/03/31 10:21:08
> ・環境変数でパスワードを与える
嘘を教えないように。
496:名無しさん@お腹いっぱい。
08/03/31 10:29:56
おそらく、環境変数をコマンドラインで展開せずに、
実行コマンドが直接 getenv()とかで環境変数を読めば問題ないと
勘違いしたんだろうが、環境変数にパスワードを設定するのは論外。
ps e すれば環境変数の内容は丸見え。
497:名無しさん@お腹いっぱい。
08/03/31 10:33:59
>>495
嘘じゃなくて推測でしょ。
498:名無しさん@お腹いっぱい。
08/03/31 10:51:36
うそ【嘘】
2 正しくないこと。誤り。
499:名無しさん@お腹いっぱい。
08/03/31 10:52:41
正しい方法知ってるなら教えてあげたら?
500:名無しさん@お腹いっぱい。
08/03/31 11:07:28
お前自分で書いてるだろ。
> mysqldumpの仕様によるのでここではなくMySQLのスレ(データベース板?)できくべきだが
このスレでは、コマンドラインで暴露しない方法として「環境変数でパスワード渡す」は真っ赤な嘘。
という事を指摘すればよい。
お前、プライド(ぷぷっ)に実力が追いついてないぞ。
501:名無しさん@お腹いっぱい。
08/03/31 11:21:38
APOPみたいにチャレンジからMD5で計算して渡すように
仕様変更すればいいんだよw
502:名無しさん@お腹いっぱい。
08/03/31 11:29:22
引数に渡すときに?
いずれにせよ、どこかで生パスワードが必要じゃん。
503:名無しさん@お腹いっぱい。
08/03/31 11:41:46
>>502
だからAPOPみたいにって言ってるだろ。
APOPの結果を引数に付けて丸見えになっても無問題。
504:名無しさん@お腹いっぱい。
08/03/31 11:50:52
そのAPOPの結果を求めるコマンドにはどうやってパスワードを...
505:名無しさん@お腹いっぱい。
08/03/31 11:54:44
環境変数で渡すんだよ!
506:名無しさん@お腹いっぱい。
08/03/31 11:59:34
最初のコマンドはexpectスクリプト使えば(以下無限ループ
507:名無しさん@お腹いっぱい。
08/03/31 12:04:33
>>504
結果を求めるコマンドが、別ファイルからパスワードを読めばいいだけ。
頭使えw
508:名無しさん@お腹いっぱい。
08/03/31 12:18:34
>>507
つまらんな。仕様変更するならパスワード不要の方法に変更しろ。
509:名無しさん@お腹いっぱい。
08/03/31 12:24:29
というか、仕様変更するなら最初からファイルからパスワードを読むように
仕様変更すればいいだけ
510:名無しさん@お腹いっぱい。
08/03/31 12:35:12
expectが大きすぎるならttyrec/ttyplayだね。
本人登場しないし、この話題はもういいんじゃない?
511:名無しさん@お腹いっぱい。
08/03/31 13:27:19
>>510
ttyrec/ttyplayでどうやるの?
512:510
08/03/31 14:04:25
そこまでやるのはスレ違いだからマニュアル読んで。
513:名無しさん@お腹いっぱい。
08/03/31 14:10:20
>>512
man ttyrec 読んだけど >>488 に使えそうな機能見あたらないよ。
どの辺に書いてあるの?
514:名無しさん@お腹いっぱい。
08/03/31 14:12:46
見つけられないなら仕方ないですねw
515:名無しさん@お腹いっぱい。
08/03/31 14:35:22
>>496
君の使ってるOSだとpsで他ユーザのプロセスも環境変数が見えるの?
見えるとしたらそれ、脆弱性だから。
Solarisでもパッチ出てるだろ。
516:名無しさん@お腹いっぱい。
08/03/31 14:53:58
MySQL 6.0の公式リファレンスでは
(5.5.6. Keeping Your Password Secure
URLリンク(dev.mysql.com))
-pオプションはインセキュアであるとして、セキュアな方法として
* Store your password in an option file.
* Store your password in the MYSQL_PWD environment variable.
を挙げてるな。
環境変数が問題だというならMySQLの公式リファレンスも直させなきゃな。
まあ、頑張れw
517:名無しさん@お腹いっぱい。
08/03/31 14:57:01
裏も取らずにテキトーなこと言うやつが多過ぎるな。
518:名無しさん@お腹いっぱい。
08/03/31 15:33:42
Solarisのはこれか。
URLリンク(sunsolve.sun.com)
Solution Type Sun Alert
Solution 200448 : Security Vulnerability With The "/usr/ucb/ps" Command
Impact
A security vulnerability in the "/usr/ucb/ps" (see ps(1B)) command may allow unprivileged local users the ability to see environment variables and their values for processes which belong to other users.
519:名無しさん@お腹いっぱい。
08/03/31 16:35:03
>>517
そりゃ、不適当なこと言っちゃダメだろ
520:名無しさん@お腹いっぱい。
08/03/31 21:49:36
security.bsd.see_other_uids=0
で良いのでは無いか?
他のOSの事は知らないけど。
521:名無しさん@お腹いっぱい。
08/03/31 22:12:21
>>516
おいおい、自分の厨房っぷりを隠そうと嘘を嘘で上塗するのか?
続きに「極端にインセキュアと考えなければならなくて、使用すべきでない」と
書いてあるじゃないか。
それとも本物の中学生か? 英語読めるようになってから出直しておいで。
Section 4.2.2.2, 懼Using Option Files懼�, discusses option files in more detail.
Store your password in the MYSQL_PWD environment variable. This method of specifying
your MySQL password must be considered extremely insecure and should not be used.
Some versions of ps include an option to display the environment of running processes.
If you set MYSQL_PWD, your password is exposed to any other user who runs ps. Even on
systems without such a version of ps, it is unwise to assume that there are no other
methods by which users can examine process environments. See Section 2.14, 懼Environment Variables懼�.
522:名無しさん@お腹いっぱい。
08/03/31 23:48:17
文字化けしてるな。>>516はさすがに逃亡だろうな。だから恥ずかしいなら黙っていろと...
環境変数でパスワード渡していいのは小学生までという結論でいいか?
URLリンク(dev.mysql.com)
Store your password in the MYSQL_PWD environment variable. This method of specifying
your MySQL password must be considered extremely insecure and should not be used.
Some versions of ps include an option to display the environment of running processes.
If you set MYSQL_PWD, your password is exposed to any other user who runs ps.
Even on systems without such a version of ps, it is unwise to assume that there are
no other methods by which users can examine process environments.
See Section 2.14, "Environment Variables".
523:名無しさん@お腹いっぱい。
08/04/01 00:14:26
mysql*についてはmy.cnfに書いとけ、そして600にしとけ、でいいんでは?
524:名無しさん@お腹いっぱい。
08/04/01 00:31:31
psで環境変数が他人にばれるOSってどれ?
525:名無しさん@お腹いっぱい。
08/04/01 00:51:39
>>524
KKCに匹敵する恥晒しといてまだ粘着してるの? 恥ずかしいなら黙っていればいいのに。
> Even on systems without such a version of ps, it is unwise to assume that there are
> no other methods by which users can examine process environments.
たとえ、そのようなpsが無いシステム上でも、ユーザーがプロセスの環境変数を調べる他の方法が
無いと仮定するのは賢くありません。
526:488
08/04/01 02:06:50
・パスワードをファイルに保存してそれを引数に与える
とのことですが、
password.txt にpasswordを入力して
mysqldump -u root -p < password.txt
をしてみましたが、うまく動きませんでした。
なんとなくリダイレクト(の逆?)の使い方を間違っている気はします。
特にmysqldumpに限らず、
-pオプションが使えるその他のコマンドなどでも
共通で使えるセキュアな方法を取りたいのですが、
具体的にどんな記述にすればよかとでしょうか?
527:名無しさん@お腹いっぱい。
08/04/01 04:02:15
つ >>523
528:名無しさん@お腹いっぱい。
08/04/01 07:27:08
>>524
>>518 が言ってる通りSolarisだろな。patchも割りと最近のものだし。
そう頻繁にpatch当てられない環境とか、あえて古いバージョンのまま使わなければ
ならない環境とかありそうだし、古いpsは結構残っているのでは。
529:名無しさん@お腹いっぱい。
08/04/01 07:36:05
ucbにあるやつでは一番使うコマンドだな。
530:名無しさん@お腹いっぱい。
08/04/01 10:02:05
>>526
通常、パスワードは/dev/ttyをオープンしてそこから読むので、リダイレクトしても駄目。
他のコマンドでも共通で使えるセキュアな方法はexpect(もしくはそれに類する、擬似端末
から流し込める)コマンド。
>>528
自称セキュリティ研究者の厨房が騒ぎ立てるまでは、環境変数が読めるのが仕様だった。
今でも*BSDは厨房の戯言として相手にしていない。
こんな基本的なことも知らないのが複数人いるはず無いので、自演の可能性9割だな。
自演までして恥ずかしくないの?
しかもpsだけの問題じゃないという事も指摘されてるのに、恥ずかしいなら引っ込んでなよ。
531:名無しさん@お腹いっぱい。
08/04/01 13:05:06
>>530
つ >>523
すでに別の最適解が示されてるのに、話戻して expectはないだろw 流れ欲嫁。
532:名無しさん@お腹いっぱい。
08/04/01 13:14:32
>>530
FreeBSDでは ps e で、自分以外のプロセスの環境変数は表示しないようになってるよ。
嘘書くんじゃない。
533:名無しさん@お腹いっぱい。
08/04/01 13:15:56
>>531
恥ずかしいなら黙ってればいいのに。
my.cnfはその他のコマンドで共通に使えるのか?
>>526
> -pオプションが使えるその他のコマンドなどでも
> 共通で使えるセキュアな方法を取りたいのですが、
534:名無しさん@お腹いっぱい。
08/04/01 13:17:32
>>533
>>490
>expect以外のよい方法ってないでしょうか?
535:名無しさん@お腹いっぱい。
08/04/01 13:42:07
FreeBSDのpsが自分以外の環境変数を表示してたのは前世紀の話。変更は1999年。
536:名無しさん@お腹いっぱい。
08/04/01 14:07:07
「恥ずかしいなら引っ込んでなよ」が口癖の
>>530 氏の発言録:
(ps が他人のプロセスの環境変数を表示してしまう問題について)
>自称セキュリティ研究者の厨房が騒ぎ立てるまでは、環境変数が読めるのが仕様だった。
>今でも*BSDは厨房の戯言として相手にしていない。
要約すると、
「*BSDでは、psで他人のプロセスの環境変数を表示できても、それは仕様であって
それを問題視するのは自称セキュリティ研究者の戯言。
今でも*BSDではpsで他人のプロセスの環境変数を表示できる」
恥ずかしいですかwww
537:名無しさん@お腹いっぱい。
08/04/01 14:13:09
>>530は取り下げよう。俺は恥は知っているからな。
538:名無しさん@お腹いっぱい。
08/04/01 14:26:28
>>536
この人にとっての今はだいたい10年前と思うと辻褄が合う気がする。
>>537
> psだけの問題じゃない
も取り下げということでいいのか?
psのsetuidを落とすのがworkaroundということは普通に考えれば
ps固有の問題ということになると思うのだが。
違うなら違うでいいので具体例を出すなりして立証してくれ。
まさか引用した箇所にそう書いてあるからそうなんだとか言わんよな。
539:名無しさん@お腹いっぱい。
08/04/01 14:30:05
psがsetuidで動作していたのっていつの時代? それも10年前かw
540:名無しさん@お腹いっぱい。
08/04/01 14:55:01
平ユーザが ps e で他ユーザの環境変数が見えない OS でも、
実行したのが root なのであれば見えるでしょ。
別ホストで動いている mysql に接続しようとしていて、
そのホストの root がその mysql の権限を持ってないのであれば、
mysql のパスワードは root に知られちゃマズいわけで、
やっぱり環境変数でパスワードを渡すのはよろしくない。
もっとも、それをいったら chmod 600 my.cnf も同じだけどな。
541:名無しさん@お腹いっぱい。
08/04/01 14:58:03
>>538
> psだけの問題じゃない
これはmysqlが言っていること、
URLリンク(www.google.com)
これらが安全だと示してくれればオレは取り下げる。もしくは「環境変数は安全」という仕様でもよい。
542:名無しさん@お腹いっぱい。
08/04/01 15:02:51
>>541
> オレは取り下げる
というのは「オレが(も)主張する」が前提だよな。当然その立証が先。
543:名無しさん@お腹いっぱい。
08/04/01 15:05:17
途中で送ってしまった。
>>541
> オレは取り下げる
というのは「オレが(も)主張する」が前提だよな。当然その立証が先。
それができなきゃ取り下げざるを得ないのであって、安全だと示してくれれば
などと条件をつけられる立場ではない。
544:名無しさん@お腹いっぱい。
08/04/01 18:32:47
>>543
話そらすなよ。
名無しのお前が環境変数は安全だと主張している。
mysqlの公式ドキュメントは安全だと考えていない。
権威の無いお前が安全だと立証しろ。
545:名無しさん@お腹いっぱい。
08/04/01 23:15:20
>>540
rootが信用できないマシンに重要な情報を置くな。
(環境変数以前の問題でしょ?)
546:名無しさん@お腹いっぱい。
08/04/02 01:32:52
>>539
かなり昔前からkmemグループによる管理だぞ。
もう20年近く立っているはず。
最近/procがいい加減なことが多いが。
547:名無しさん@お腹いっぱい。
08/04/02 06:59:36
>>546
psがkmemグループ(setgid)で動作していたのっていつの時代? それも10年前かw
548:名無しさん@お腹いっぱい。
08/04/02 08:12:22
>>544
自分で証明できないものだから権威とやらに頼るとは、まさしくこれだな
>>538
> まさか引用した箇所にそう書いてあるからそうなんだとか言わんよな。
話をそらしているというか露骨に逃げてるのは君の方だ。
この議論において根拠を提示できないなら意味がない。
恥を知っているというのは口先だけだったな。
549:名無しさん@お腹いっぱい。
08/04/02 11:12:51
>>548
多くの人がレビューした文書と、名無しのお前の主張じゃぶっちぎりでお前のほうが信憑性が低い。
お前が立証しろ。当たり前だ。
550:名無しさん@お腹いっぱい。
08/04/02 13:16:10
議論というのは発言者が誰であれ根拠に基づいて行うのが当たり前。
勝負あったな。
551:名無しさん@お腹いっぱい。
08/04/02 13:33:58
つか本人が言ってたよね。
> 自称セキュリティ研究者の厨房が騒ぎ立てるまでは、環境変数が読めるのが仕様だった。
それが脆弱性としてアドバイザリまで出されてるってことは
今(10年前ではないw)は他人の環境変数は読めないのが仕様ってことでしょ。
違うというなら仕様として他人の環境変数読めるものを出してみろと。
552:名無しさん@お腹いっぱい。
08/04/02 13:36:36
psに限らず、が抜けてた。
553:名無しさん@お腹いっぱい。
08/04/02 15:17:59
質問があります。
shまたは、bashで、makeのように、
2つのファイルを比較して、新しいファイルが生成されている
時だけ処理をしたいのですが、shellへの理解が足りない
ためにうまく動かないので、教えてもらえると助かります。
こんな感じです。
do_iconv(){
echo "mv ${i} ${i}.old"
echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}"
}
for i in *.html
if [ -e ${i}.old ]
then
if [[ ${i} -nt ${i}.old ]]
then
do_iconv
fi
else
do_iconv
fi
done
554:名無しさん@お腹いっぱい。
08/04/02 15:31:28
>>553
> echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}"
した時点で、${i}の方が常に${i}.oldより新しくなるじゃないか。
本当は何がしたいんだ?
555:名無しさん@お腹いっぱい。
08/04/02 15:53:19
>>554
それより前に if [[ ${i} -nt ${i}.old ]] で比較してるだろ。
わからないなら黙ってろ。
556:名無しさん@お腹いっぱい。
08/04/02 15:54:56
>>553
for i in *.html
の次の行に
do
が抜けてる。
557:553
08/04/02 15:55:02
>> 554
本当は、上記に書いてますがシェルスクリプトでmake
みたいなことがしたいです。
ちなみに、
>> echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}"
>した時点で、${i}の方が常に${i}.oldより新しくなるじゃないか。
で、ハッとして touch ${i}.old をiconvの後にしてみましたが
変わりません。
$ ls -la --time=ctime *.html
-rw-r--r-- 1 foo bar 5388 2008-04-02 14:23 SandBox.html
-rw-r--r-- 1 foo bar 4323 2008-04-02 14:06 Travel.html
$ ls -la --time=ctime *.old
-rw-r--r-- 1 foo bar 5374 2008-04-02 14:06 SandBox.html.old
-rw-r--r-- 1 foo bar 3334 2008-04-02 14:06 Travel.html.old
のようなときに、SandBox.htmlだけ iconv 処理をしたいのです。
558:名無しさん@お腹いっぱい。
08/04/02 15:56:54
>>553
とりあえずforにはdoつけろな。
559:553
08/04/02 15:58:24
>> 556
御指摘ども、本当のスクリプトには入れてます。
いまは要点だけ抜き出すと、下記のような感じにしています。
do_iconv(){
echo "mv ${i} ${i}.old"
echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}"
echo "touch ${i}.old"
}
for i in *.html
do
if [ -e ${i}.old ]
then
if [[ ${i} -nt ${i}.old ]]
then
do_iconv
fi
else
do_iconv
fi
done
560:名無しさん@お腹いっぱい。
08/04/02 16:01:10
>>557
おい、--time=ctime かよ。mtimeじゃなくて。
シェルの[[ ]] の -nt では、ctimeでの比較はできない。
mtimeのみ。
本当にctimeでやりたいんなら無理。
561:名無しさん@お腹いっぱい。
08/04/02 16:06:09
えっと、次は、
> うまく動かない
の中身プリーズ。
562:名無しさん@お腹いっぱい。
08/04/02 16:06:49
>>561
>>560
563:553
08/04/02 16:22:10
>> 561
うまくいかないの、ココロは、意図は、SandBox.htmlだけ iconv したい
のですが、プログラムは SandBox.html および Travel.html の
両方を iconv しようとします。
>> 560
ctimeはダメですか。リダイレクトでファイルを作るから、ctimeでないと
ファイルの作成時刻を比較できないと思ってました。がーん、他の方法
を考えなくては
564:名無しさん@お腹いっぱい。
08/04/02 16:24:32
makeを使えばいいんじゃないか?
565:553
08/04/02 16:27:05
>> 564
はい。makeを使うことを考えます。
ありがとうございました>みなさん
566:名無しさん@お腹いっぱい。
08/04/02 16:31:00
>>564-565
アフォか。
makeだって mtimeで比較するよ。
ctimeでの比較が必須なら make使ったって問題は解決しない。
(ctimeの意味を誤解していて、実はmtimeでもOKなら話は別だが)
567:名無しさん@お腹いっぱい。
08/04/02 16:37:06
>>563
>リダイレクトでファイルを作るから、ctimeでないと
>ファイルの作成時刻を比較できない
↑
は誤解してるようだね。
だとすると mtimeで比較して問題ないことになる。
とすると、>>559 のスクリプトでうまく動いているはず。
うまく動いているのに、>>557 で --time=ctime で見ているもんだから、
うまく動いていないと思い込んでいるだけ、というオチ。
568:名無しさん@お腹いっぱい。
08/04/02 16:39:24
汚いシェル関数だなぁ。echo消せ。引数使え。
569:名無しさん@お腹いっぱい。
08/04/02 16:50:19
[ ] と [[ ]] が同居するスクリプトを初めて見た。どっちかに統一しろよ。
[ ] の方推奨だが。
testの -nt は純正シェルでは使えない。
${i} なんて書くくらいなら "$i" って書け。
{ } 付けただけじゃスペース入りファイル名とかの問題回避できないぞ。
570:名無しさん@お腹いっぱい。
08/04/02 17:28:49
純正シェル(笑)
571:553
08/04/02 17:52:14
>> 567
誤解してました。
>> 568
shell関数まで添削してもらえるとは恐縮です。
>> 569
ありがとう。[[ ]]ではなく[ ] を使います。
あと、"$i"の記法はshellの本を注意深く読んだらちゃんと書いてありました。
下記のように直して、実行したら意図どおりに動いてます。m(_"_)m
==========================================
#/bin/bash -x
do_iconv(){
mv $1 "$1".old
/usr/bin/iconv -f euc-jp -t utf-8 < "$1".old > $1
touch "$1".old
}
for i in *.html
do
if [ -e "$i".old ]
then
if [ "$i" -nt "$i".old ]
then
do_iconv "$i"
fi
else
do_iconv "$i"
fi
done
======================================
572:553
08/04/02 17:52:54
bash -x の実行例
+ for i in '*.html'
+ '[' -e SandBox.html.old ']'
+ '[' SandBox.html -nt SandBox.html.old ']'
+ do_iconv SandBox.html
+ mv SandBox.html SandBox.html.old
+ /usr/bin/iconv -f euc-jp -t utf-8
+ touch SandBox.html.old
+ for i in '*.html'
+ '[' -e Travel.html.old ']'
+ '[' Travel.html -nt Travel.html.old ']'
+ for i in '*.html'
573:名無しさん@お腹いっぱい。
08/04/02 19:12:56
>>554の言うように、
"$i".oldの方を編集しない限り、
必ず"$i"の方が新しいのに、(iconvの結果)
> if [ "$i" -nt "$i".old ]
してる。逆に"$i".oldを編集したら何も行われない。
仕様を日本語で書いたらどうか?
たぶん.iconvedを作って、
"$i"と時間比較して新しいものだけiconv、
最後に必ずtouch .iconved、
これでやりたいことに合うんじゃないか?
574:名無しさん@お腹いっぱい。
08/04/02 19:43:56
>>573
その問題は、
>>557
>touch ${i}.old をiconvの後にしてみましたが
↑
で解決済。
というか、>>571 で、「実行したら意図どおりに動いてます。」
ですべて解決済なんだから、これ以上言うことはない。
575:名無しさん@お腹いっぱい。
08/04/02 20:00:06
カレントディレクトリが
/abc/def/ghi/jkl/mno/pqr/stu/
とフルパスであったときに一番最後の部分(stu)を取り出したいのですが
どのように書けばよいのですか
576:名無しさん@お腹いっぱい。
08/04/02 20:18:40
basename /abc/def/ghi/jkl/mno/pqr/stu/
577:名無しさん@お腹いっぱい。
08/04/02 20:19:16
basename `pwd`
578:名無しさん@お腹いっぱい。
08/04/02 21:33:15
>>551
はいはい、それがお前が出した唯一の根拠ね。
で、それが何かの標準になってるのか?
ところで、>>516ので試みた捏造に関しての弁明はどうした?
579:名無しさん@お腹いっぱい。
08/04/02 21:49:00
まだやってんのかw
580:sage
08/04/05 16:40:16
リナックス等の研究やってます。
URLリンク(www.ine.sie.dendai.ac.jp)
URLリンク(www.ine.sie.dendai.ac.jp)
581:名無しさん@お腹いっぱい。
08/04/10 07:37:45
シェルスクリプトから以下のようなテキストを呼びだして、
環境変数を展開した上で、位置変数に set したいのですが、
お知恵を拝借したく、どうかよろしくお願いします。
$ cat test.txt
$HOME/doc/
いまは、シェルスクリプト内部で、 sed -e 's/\$HOME/$HOME/g' のようにしています。
582:名無しさん@お腹いっぱい。
08/04/10 07:40:42
>>581
eval set `cat < test.txt`
583:581
08/04/10 08:20:51
>>582
どうもありがとうございます!
eval を使ってもう一度、$HOMEを変数展開をするのですね。
独力では全く思いつきませんでした。
本当にありがとうございました。
584:名無しさん@お腹いっぱい。
08/04/10 08:25:30
>>582
catが無駄です。
585:名無しさん@お腹いっぱい。
08/04/10 08:28:30
>>584
catなしでどう書くの?
586:名無しさん@お腹いっぱい。
08/04/10 08:29:07
eval set `< test.txt`
587:名無しさん@お腹いっぱい。
08/04/10 09:30:12
はいはい。bash依存。
588:名無しさん@お腹いっぱい。
08/04/11 08:28:49
質問です!
timeコマンドの結果をファイルに出力したいのですが、
どうやっても0バイトで出力されます。
以下、やってみたことを記載します。
$ time sleep 1
real 0m1.004s
user 0m0.000s
sys 0m0.001s
$ time sleep 1 > hoge.dat
real 0m1.439s
user 0m0.000s
sys 0m0.001s
$ cat hoge.dat
$ time sleep 1 > hoge.dat 2>&1
real 0m1.009s
user 0m0.000s
sys 0m0.001s
$ cat hoge.dat
やってみたこと以上です。
なぜ出力されないのでしょうか?どのようにすれば出力されますでしょうか?
589:名無しさん@お腹いっぱい。
08/04/11 08:32:44
>>588
bash使ってるだろ。
timeはbashの特殊な内部コマンドで、リダイレクトできない。
解決するには一旦サブシェルを通す。
$ (time sleep 1) 2> hoge.dat
590:名無しさん@お腹いっぱい。
08/04/11 11:19:02
>>588
/usr/bin/timeならファイルに出力できるよ。
591:名無しさん@お腹いっぱい。
08/04/11 11:37:22
>>590
>>589
/usr/bin/time は表示書式が違う
592:名無しさん@お腹いっぱい。
08/04/11 14:39:52
\time
593:名無しさん@お腹いっぱい。
08/04/11 14:40:30
bashってtimeが内部コマンドなのかw
594:名無しさん@お腹いっぱい。
08/04/11 14:44:15
正確には shell keyword
595:名無しさん@お腹いっぱい。
08/04/11 14:50:22
あれ?
マニュアルではtimeじゃなくて、timesになっているけど?
596:名無しさん@お腹いっぱい。
08/04/11 14:51:30
>>595
ぉぃぉぃ、timesとtimeは全く別のコマンド
597:名無しさん@お腹いっぱい。
08/04/11 14:58:21
times Print the accumulated user and system times for the shell and
for processes run from the shell. The return status is 0.
ごめん。マニュアル読んだだけでは何が違うのか分からん。
それに、timeの項目自体が見つからんし。
598:名無しさん@お腹いっぱい。
08/04/11 15:05:56
bash なら help time
599:名無しさん@お腹いっぱい。
08/04/11 15:06:37
man bash なら Pipelines の節。
600:名無しさん@お腹いっぱい。
08/04/12 00:11:45
しぇるすぷりくとでHTML書いて
ボタン押したらhoge.shを実行したい
ヒントください><;
601:名無しさん@お腹いっぱい。
08/04/12 01:02:36
>>600
実行環境を限定しなさい。
OSは? httpサーバは? 使用可能なCGIは? CGI実行時のセキュリティ要件は?
602:名無しさん@お腹いっぱい。
08/04/12 01:29:51
OS: FreeBSD 6.3-RELEASE-p1
http: Apache HTTP Server 2.2.8
CGI: This is perl, v5.8.8 built for i386-freebsd-64int
セキュリティ要件: 無し
603:名無しさん@お腹いっぱい。
08/04/12 01:40:48
>>600
すみません、日本語でお願いします。
604:名無しさん@お腹いっぱい。
08/04/12 02:00:52
日本語で書いたつもりなのに文字化けしてるんですか?><
605:>>588
08/04/12 06:09:32
>>589
ありがとうございます。
606:名無しさん@お腹いっぱい。
08/04/12 06:21:07
これシェルスクリプトの話か・・・?
607:名無しさん@お腹いっぱい。
08/04/12 07:16:24
>>601
答えられないくせに実行環境だけ聞くなよ。
実行環境あまり関係ないだろ。
608:名無しさん@お腹いっぱい。
08/04/12 07:24:57
>>600
エスパーすると、Webのフォーム入力でシェルスクリプトを入力して
[送信]ボタンを押すと、そのシェルスクリプトが実行されて、
実行結果がWeb上に表示される、って感じのものを作りたいのかな?
609:名無しさん@お腹いっぱい。
08/04/12 09:21:01
エスパーじゃなくてもシェルスクリプトでCGIプログラム作りたいという事はわかる、>>601が無能なだけ。
>使用可能なCGIは?
この質問に至っては噴飯ものだ。 CGI/1.1と答えればいいのだろうか?
>>600
CGIというサーバー上でプログラムを動かす仕組みがあるから、検索してわからない事があったらまた来なさい。