12/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。
URLリンク(src.opensolaris.org)
URLリンク(heirloom.sourceforge.net)
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ
シェルスクリプト総合 その19
スレリンク(unix板)
2:名無しさん@お腹いっぱい。
12/06/08 01:03:54.93
太古の昔に
レイヤードシェル
もしくは
シェルレイヤー
という物が存在していたらしいのですが、
どんな物だったのでしょうか?
ジョブコントロールできるらしいのですが。
3:名無しさん@お腹いっぱい。
12/06/08 02:06:15.15
おつ
4:名無しさん@お腹いっぱい。
12/06/08 02:15:08.82
UNIXとかいう糞PCwwwwwww京とかいう存在しても価値ないただただ無意味に速度早くしただけのコンピューターとかもあるしww
何のための板だよここwww
5:名無しさん@お腹いっぱい。
12/06/08 06:17:43.38
ようこそ、その糞みたいな板にワザワザご苦労様。
6:名無しさん@お腹いっぱい。
12/06/08 06:33:16.03
Q. シェルは UNIX の勉強に使えますか?
A. シェルは UNIX に慣れた人間がスクリプトを書いて楽するのには向いていますが、
UNIX の勉強には向いていません。
7:名無しさん@お腹いっぱい。
12/06/08 07:20:45.00
>>6
頭大丈夫か?
シェルを全く使用せずにUNIXの勉強とか、どんなアクロバットだよw
8:名無しさん@お腹いっぱい。
12/06/08 07:44:41.28
>>2
GNUScreenから画面管理を引いたようなもの。
9:名無しさん@お腹いっぱい。
12/06/08 07:58:45.93
>>6
つまり座学で基礎理論を学んでから出直せってこと?
10:名無しさん@お腹いっぱい。
12/06/08 09:38:32.41
>>2
衣服(shell)の重ね着(layered)のことだろ。
登山なんかでは速乾性の下着から防水防風透湿のジャケットまで
機能の異なる薄手のシェルを何枚も重ねて着るのが常識。
11:名無しさん@お腹いっぱい。
12/06/08 09:49:49.84
>>2 shl BSDのジョブコントロールのSysV版
URLリンク(docstore.mik.ua)
URLリンク(www.unix.com)
URLリンク(cai.cs.shinshu-u.ac.jp)
12:名無しさん@お腹いっぱい。
12/06/08 09:55:28.15
>>8が端的に説明できてる。ただscreen知らないとわからない。
13:名無しさん@お腹いっぱい。
12/06/08 16:51:20.05
シェルといえば、ガソスタだろ?または、>>10だな。常識。
... なる程、shlか。知らなかった。sh -kといい、まさにトリビア級。すごい。
14: 忍法帖【Lv=40,xxxPT】
12/06/09 13:44:28.09
grepで取り出した10行のうちの2行目を取り出したいのですが、
何か簡便な方法はありませんか?
15:名無しさん@お腹いっぱい。
12/06/09 13:48:39.99
sed -n 2p
16:名無しさん@お腹いっぱい。
12/06/09 13:48:53.77
>>14
素人は grep ~ | head -n 2 | tail -n 1 なんてするところだろうな
Cで2行目取り出すツールを書くのが最速
fgetc()とかで何とかなる
17:名無しさん@お腹いっぱい。
12/06/09 13:53:34.23
>>14
grep -A1
でいいじゃん。
一致した行自体も出るけど、エスパーするとむしろその方がいいと出てる。
18:名無しさん@お腹いっぱい。
12/06/09 13:57:44.31
>>17
それは一致した行の次の行を取り出したい場合だろw 欲嫁
19:名無しさん@お腹いっぱい。
12/06/09 14:01:37.89
なぜにfgetsじゃなくてfgetc?
20:名無しさん@お腹いっぱい。
12/06/09 14:07:19.90
…などとデバッグしてるぐらいなら head -n 2 | tail -n 1 の方がずっと早いな。
まあ、ふつーはそれすらせずに>>15だが。
21:名無しさん@お腹いっぱい。
12/06/09 14:18:33.49
「grepで引っかかる行が10行あります。これら10行それぞれの次の行(2行目)を
取り出したいのですが、何か簡便な方法はありませんか?」
という質問だったとしたら?
22:名無しさん@お腹いっぱい。
12/06/09 14:18:49.34
効率的には grep -m2 ~ | tail -n1 とかの方がいいのかね
23:名無しさん@お腹いっぱい。
12/06/09 17:31:36.34
>>16
あんまり釣れないね。
24:名無しさん@お腹いっぱい。
12/06/09 21:38:41.95
質問がわかりにくくて済みません。実は >>21 さんの意味で質問しました。
何か簡便な方法がありましたらお願いします。
25:名無しさん@お腹いっぱい。
12/06/09 21:46:40.88
>>24
次の行も欲しいってのなら>>17の言うとおり-Aオプション使うのが簡単じゃないかな
次の行だけ欲しいってのならgrep ~ | sed -n '/pattern/{n;p}' とか。まあこれは2行連続でパターンマッチする可能性がある場合は使えないんだけど。
あとはawkかperlあたりで適当なスクリプト組むくらいかねえ
26:25
12/06/09 21:49:49.12
しまった >>25 は grep 必要なかった
27:名無しさん@お腹いっぱい。
12/06/10 05:16:55.25
環境変数IFSってforとread以外に使い道あるのかしら
28:名無しさん@お腹いっぱい。
12/06/10 14:21:25.03
コマンドを実行した複数行の結果を変数に格納した後、その各行に処理を行いたいのですが、
たとえば
hoge=`ls -l`
とやると、改行が格納されません。
改行を含めた結果を格納するのはどのようにしたら良いのでしょうか?
29:名無しさん@お腹いっぱい。
12/06/10 14:32:53.34
>>28
hoge=`ls -l` で改行は格納される。
echo $hoge ではなく、
echo "$hoge"
で変数の値を取り出すこと。
30:名無しさん@お腹いっぱい。
12/06/10 14:43:07.38
早速の回答、誠にありがとうございまする
31:名無しさん@お腹いっぱい。
12/06/12 18:12:34.43
ls -1 | nohup xargs -L1 -P20 -I@ sh -c "./a.out @ < @.txt > @.log 2> err.log" > progress.log &
このコマンドどこに問題がありますか?
最初の20行分しか処理されずに止まっちゃうんだけど・・・泣
32:名無しさん@お腹いっぱい。
12/06/12 18:19:37.78
expectコマンドを使わずにシェルスクリプトでパスワードを自動入力させるにはどのようにすればよいでしょうか?
#!/bin/bash
ssh user@hostname
パスワードを入力するコマンド
上記のようなスクリプトが作りたいです。
どなたか教えて頂けないでしょうか。よろしくお願いします。
33:名無しさん@お腹いっぱい。
12/06/12 18:34:26.09
>>32
echo unko | ssh user@hostname
34:名無しさん@お腹いっぱい。
12/06/12 18:46:46.29
>>32
公開鍵認証じゃだめなん?
35:名無しさん@お腹いっぱい。
12/06/12 18:49:57.90
>>33
それじゃだめじゃね。
36:名無しさん@お腹いっぱい。
12/06/12 18:59:21.99
質問者ですが、
>>31
はスレチでした?
37:名無しさん@お腹いっぱい。
12/06/12 19:06:40.96
>>33
試してみたのですが、パスワード入力を求められました。。
>>34
パスワード入力したいです。
38:名無しさん@お腹いっぱい。
12/06/12 19:16:56.47
>>31
20行毎に別々に sh -c "...." が起動されるから、
> @.log 2> err.log とかが全部上書きされて
最後に書いた20行分しか残らない。
39:名無しさん@お腹いっぱい。
12/06/12 20:08:55.76
>>38
すみませんが詳しい方のみ回答をお願いします
40:名無しさん@お腹いっぱい。
12/06/12 20:17:55.37
>>31
> progress.log じゃなくて
>> progress.log じゃないの?
41:名無しさん@お腹いっぱい。
12/06/12 20:20:23.43
>>40
すみませんが詳しい方のみ回答をお願いします
42:名無しさん@お腹いっぱい。
12/06/12 20:26:15.13
パイプ出力なのに ls -1 とかやるのは素人
43:名無しさん@お腹いっぱい。
12/06/12 20:29:12.04
すみませんが詳しい方のみ質問をお願いしますw
44:名無しさん@お腹いっぱい。
12/06/12 20:29:30.99
>>42
すみませんが詳しい方のみ回答をお願いします
45:名無しさん@お腹いっぱい。
12/06/12 20:31:12.33
すみませんが詳しい方のご健闘をお祈りします
46:名無しさん@お腹いっぱい。
12/06/12 20:33:43.17
>>42
findってこと?
結局どうすれば正解なの?
入力(ls -1):
a
b
c
d
e
f
実行されたいコマンド(xargs -L1 -P2)
./a.out a
./a.out b
====終わってから
./a.out c
./a.out d
====終わってから
./a.out e
./a.out f
って感じにしたいわけだけど。
47:名無しさん@お腹いっぱい。
12/06/12 20:35:02.58
ちなみに39とかは質問者(31+46)じゃないから。
お願いだから邪魔しないで。
48:名無しさん@お腹いっぱい。
12/06/12 20:44:15.91
出力はまああまり気にしてなくて、
むしろ
./a.out a
./a.out b
====ここで止まっちゃう
のが大問題。
49:名無しさん@お腹いっぱい。
12/06/12 21:29:01.48
>>46
>>42
が言ってるのは出力が端末でないなら ls -1 しなくても ls でいいって話.
xargs -L1 -P2の挙動があくまで2プロセス同時にやるって話だから
./a.out aが先に終われば ./a.out bが終わる前に ./a.out cを先に実行する
望みの挙動にするのは一行スクリプトだと割と面倒だから素直にmakeで依存関係書いてmake -j 20とかした方がいいかも
ちなみに俺の環境で >>31 を試してみたけどちゃんと20行以降も実行される.
可能性として気になったのはnohupの位置なんだけど
もしかして実行開始してから端末閉じたりしてる?
50:名無しさん@お腹いっぱい。
12/06/12 22:31:56.89
>>49
丁寧にありがとう。
しばらく使わないと忘れるんだけど、
> ./a.out aが先に終われば ./a.out bが終わる前に ./a.out cを先に実行する
これはまったく問題ない。説明不足ですまんかった。
> もしかして実行開始してから端末閉じたりしてる?
たぶん、それが原因だと思う。
ただ、xargの中に入れるのも混乱してしまうんだ。
どうすればうまく生き残るの?
51:名無しさん@お腹いっぱい。
12/06/12 22:39:01.73
>>50
俺はnohupの挙動がちょっと曖昧だから確信持てないけど
nohupを先頭に持ってくるか
#!/bin/sh
ls -1 | xargs ...
っていうのを書いたファイル用意してnohup付けて実行するとか
あとはnohupじゃなくてCtrl-Zで一時停止 -> bg -> disown したり screen で代用してみるとか
52:名無しさん@お腹いっぱい。
12/06/12 23:12:10.37
>>51
めっちゃ参考になる。ありがとう。
なんかパイプで色々つなぐのはいいけど、結局クォーテーションマークで躓くんだよね。
もうちょっと真面目に考えて設計してほしいわ。
53:名無しさん@お腹いっぱい。
12/06/13 00:35:25.15
少なくともバッチ処理なんだから nohup とか使うんじゃなくて batch とか
at コマンド使うほうが素直な気がする。
もっともバッチ処理システム入れて管理すれば batch コマンド以上に
いろいろかゆいところに手が届いていいと思うが。
54:名無しさん@お腹いっぱい。
12/06/14 14:17:28.57
echo *.csv | cat
だとファイル名が表示されるだけで、
echo *.csv | xargs cat
だとファイルの中身が表示されるのはなぜでしょうか?
xargsを付けなくてもファイルの中身が表示されると思ってました。。
55:名無しさん@お腹いっぱい。
12/06/14 14:20:16.35
cat がそういう作りだから。
man cat 読め。
56:名無しさん@お腹いっぱい。
12/06/14 14:23:59.09
>>54の挙動だと、
$ echo 54nobaka | cat
54nobaka
は間違いで、
$ echo 54nobaka | cat
cat: 54nobaka: No such file or directory
が正しいと言うことになるな。
あり得ん。
57:名無しさん@お腹いっぱい。
12/06/14 14:28:27.78
cat *.csv
だとファイルの中身が表示されるのに、
echo *.csv | xargs cat
だとそのようなファイルやディレクトリはありませんになることがあります。
man cat 読んでもわかりません。
58:名無しさん@お腹いっぱい。
12/06/14 14:30:22.51
>>56
cat: 54nobaka: No such file or directory
の意味は分からなかったけど、標準入力に渡してもダメ、引数に渡せってこと?
59:名無しさん@お腹いっぱい。
12/06/14 14:41:19.14
>>57
*.csv にマッチするファイルがないから
*.csv がそのまま渡った、とかじゃないの。
>>58
そう。
引数なしの cat は
標準入力から受け取ったものをそのまま標準出力に渡す。
60:名無しさん@お腹いっぱい。
12/06/14 14:44:47.08
>>59
なるほど。ありがとうございます!
cat *.csvとすれば良いから、わざわざ|とexec使う必要もなかったですね。
61:名無しさん@お腹いっぱい。
12/06/14 14:49:06.50
>>59
>*.csv にマッチするファイルがないから
*.csv にマッチするファイルはあります。
62:名無しさん@お腹いっぱい。
12/06/14 14:51:34.83
>>61
んじゃファイル名にスペースが入ってるとか。
63:名無しさん@お腹いっぱい。
12/06/14 15:02:46.51
ファイル名にスペースは入ってません。
64:名無しさん@お腹いっぱい。
12/06/14 15:12:33.68
>>63
んじゃ具体的にどういうファイルがあるの?
65:名無しさん@お腹いっぱい。
12/06/14 15:21:51.24
年金記録-'06~'10.csv
66:名無しさん@お腹いっぱい。
12/06/14 15:27:40.76
' ' が解釈されちゃってるな。
67:名無しさん@お腹いっぱい。
12/06/14 15:43:59.51
>>65
これは非道い。
オレには、ファイル名にクオテーションやダブルクオテーションを含める勇気はないわ
68:名無しさん@お腹いっぱい。
12/06/14 18:24:41.60
>>65
んじゃこれは
*\'*\'*.csv
でいけるのかな?
69:名無しさん@お腹いっぱい。
12/06/14 18:28:50.78
>>68
そんなことしても xargsの段階で解釈されるから無理だろ
70:名無しさん@お腹いっぱい。
12/06/14 18:45:30.67
どうしてもecho使いたいって条件だとキツいね
Linuxのlsなら-Qオプション使えるから
ls -Q *.csv | xargs cat
するかfind の -print0 と xargs の -0 組み合わせるぐらいだろうか。
まあfind使うならxargsじゃなくて-exec使えって話なんだろうが。
71:名無しさん@お腹いっぱい。
12/06/14 18:51:16.77
あとは普通にfor文使うとか
ファイル名に空白がある場合は使えないけど
$ echo -n *.csv | xargs -d ' ' cat
という説もある
72:名無しさん@お腹いっぱい。
12/06/15 07:48:47.63
すんません、ディレクトリツリー内で作成日時が最古のファイルを取得できるコマンドを教えてくださいませんか
73:名無しさん@お腹いっぱい。
12/06/15 08:16:08.73
>>72
一般的な方法はない。
74:名無しさん@お腹いっぱい。
12/06/15 08:23:01.23
>>73
すみませんが詳しい方のみ回答をお願いします
75:名無しさん@お腹いっぱい。
12/06/15 08:28:15.12
>>72
lsで日付順で取得してheadまたはtailじゃオーバーヘッド大きすぎ?
うちはめんどくさいからそれで済ませてるんだが
76:名無しさん@お腹いっぱい。
12/06/15 08:33:32.64
>>75
ディレクトリ「ツリー」だから、そもそもlsで日付順で取得できないだろw
77:名無しさん@お腹いっぱい。
12/06/15 08:44:08.87
>>75
それ作成日時じゃないよ。
78:名無しさん@お腹いっぱい。
12/06/15 08:48:48.06
あんまり巨大なツリーじゃなければ、zsh あたりで
ls -dtr **/* | head -1
とかか。
お題としては、ls -D か stat あたり使って、
巨大なツリーで日付ソートしろっていう方が楽しいけど。
ただし、「作成日時」には目をつぶる。
79:名無しさん@お腹いっぱい。
12/06/15 08:52:37.74
そこ目をつぶっちゃだめだろw
80:名無しさん@お腹いっぱい。
12/06/15 08:55:56.64
lsって最終変更日時とか状態変更日時とかアクセス日時は取れるのに、作成日時だけ取れないのな。
知らんかった。すまん。
81:名無しさん@お腹いっぱい。
12/06/15 09:03:13.70
取れるかどうかの問題じゃなくて、その情報があるかどうかだ
82:名無しさん@お腹いっぱい。
12/06/15 09:10:31.17
>>72
find /dir -printf '%T+ %p\n' | sort | head -1
83:名無しさん@お腹いっぱい。
12/06/15 09:35:24.92
>>82
それ作成日時じゃないよ。
84:名無しさん@お腹いっぱい。
12/06/15 09:40:26.32
>>83
そういうのはいいです。エスパーなら最終更新日時と詠み換えるべき。
85:名無しさん@お腹いっぱい。
12/06/15 09:42:24.84
エスパーじゃないもの。
書いてあることしか読み取れんよ。
86:名無しさん@お腹いっぱい。
12/06/15 10:07:26.75
>>72は聞いたっきり現れないな。
こりゃ釣られたか。
87:名無しさん@お腹いっぱい。
12/06/15 10:13:35.22
ツリーだけに…
88:名無しさん@お腹いっぱい。
12/06/15 10:44:32.41
ぷぷ
89:名無しさん@お腹いっぱい。
12/06/15 20:59:46.79
作成時刻を保持してるUNIX系OSってあるの?
90:名無しさん@お腹いっぱい。
12/06/15 21:05:44.38
UFS2にbirthtimeってのがあるらしい。
91:名無しさん@お腹いっぱい。
12/06/15 21:10:03.64
Linuxのext4にもbirth timeあるね
92:名無しさん@お腹いっぱい。
12/06/16 09:05:43.92
>>82
GNU依存乙
93:名無しさん@お腹いっぱい。
12/06/17 08:29:54.78
GNU dateが無いともう生きていけません
完全に陥落しました
94:名無しさん@お腹いっぱい。
12/06/17 14:58:07.56
>>93
どんな時に便利っすか
95:名無しさん@お腹いっぱい。
12/06/17 15:13:21.09
前日の日付を取得するときとか。
96:名無しさん@お腹いっぱい。
12/06/17 17:40:13.73
それは定番の手法があるだろう。
97:名無しさん@お腹いっぱい。
12/06/17 17:51:43.63
GNU date使うと楽すぎて。
98:名無しさん@お腹いっぱい。
12/06/17 17:52:22.83
あと変数でn日前とかも楽。
99:名無しさん@お腹いっぱい。
12/06/18 09:39:45.83
こんな感じっすか。
env TZ=JST+15 date
n=5
date -v -${n}d
100:名無しさん@お腹いっぱい。
12/06/18 12:19:00.38
n=20
101: 忍法帖【Lv=40,xxxPT】
12/06/18 14:36:30.11
タイムゾーンを取得する方法を教えな
102:名無しさん@お腹いっぱい。
12/06/19 00:23:33.59
ターイムゾーンと叫べ!
103:名無しさん@お腹いっぱい。
12/06/19 01:23:21.92
>>99
世界にはタイムゾーンがいくつもある、という事をよく分かっていない人が
そういう手法を取る結果、スクリプトがおかしな動作をする
…というところから、GNU版dateの拡張は始まっている
NetNewsがまだ生きてた時代の話
104:名無しさん@お腹いっぱい。
12/06/19 09:28:29.09
世界にはタイムゾーンはいくもあるけど、
サーバは1ヶ所にあって世界中を旅するわけではないので。
105:名無しさん@お腹いっぱい。
12/06/19 11:04:50.48
クライアントじゃなくてサーバかよw
106:名無しさん@お腹いっぱい。
12/06/19 11:28:22.18
>>105
何かおかしいか?
107:名無しさん@お腹いっぱい。
12/06/19 11:43:09.74
>>105
笑い事じゃあないぞ
108:名無しさん@お腹いっぱい。
12/06/19 11:51:13.75
WebAppフレームワーク系は複数のタイムゾーン扱う仕組み持ってるよ。
django1.4もmultiple time zoneが入ったばかり。
default time zoneもcurrent time zoneも取得できる。
夏時間と遠隔地絡んだ特殊な処理も標準的にできるようになった。
またWebAppサーバのdefault time zoneはサーバの物理的な位置に合わせていると限らない。
まあシェルスクリプトの領分ではないが。
109:名無しさん@お腹いっぱい。
12/06/19 12:02:54.39
date +%Z でいいんじゃね?
sshした時にTZはクライアントのがいいか、サーバのがいいかなんて一意には決められないね。
環境変数TZは、最小限の手間でその辺のことうまく扱ってるね。
110:名無しさん@お腹いっぱい。
12/06/19 19:27:08.84
世界のどこか、例えばエスポレル共和国から日本のサーバにsshでアクセスし、
エスポレル共和国時間で12時間前の時刻を計算したいときって、どうすればいいの?
111:名無しさん@お腹いっぱい。
12/06/19 19:33:35.80
>>110
エスポレル共和国ってどこだか知らないけど、
タイムゾーンはどうなってるの?
112:名無しさん@お腹いっぱい。
12/06/19 19:34:09.40
それってsshで日本のサーバーにアクセスしてることと何か関係あるの?
いったんログアウトしてエスポレル共和国のマシンで好きにやったらいいじゃんw
113:名無しさん@お腹いっぱい。
12/06/19 20:07:19.80
>>110
$ env TZ='エスポレル共和国のタイムゾーン' date --date='12 hours age'
でいいんじゃない?
GNU date依存嫌ならepoch time計算して。
114:ワラ
12/06/19 20:11:25.70
age→ago
115:名無しさん@お腹いっぱい。
12/06/19 21:34:29.04
>>113
でもそのスクリプトだと、別のタイムゾーンのどこかの国からアクセスした場合でも
アクセス元ではなく、常にエスポレル共和国の計算結果が出てしまうのでは
116:名無しさん@お腹いっぱい。
12/06/19 22:00:52.43
つまり「ログイン元のサーバのタイムゾーンをログイン先にも反映させたい」ってこと?
それはsshのサーバ/クライアントの設定で環境変数TZを引き渡せるように
AcceptEnv/SendEnvやPermitUserEnviromentするぐらいしかないんじゃなかろうか。
117:名無しさん@お腹いっぱい。
12/06/19 22:13:50.40
>>115
でも最初にそういう条件なかったよね。
118:名無しさん@お腹いっぱい。
12/06/20 11:35:27.52
>>115
その先の創意工夫は自分でやるんだよ
なんでもおんぶにだっこじゃ教育によくない
119:名無しさん@お腹いっぱい。
12/06/20 14:14:27.58
>>117
最初の一行目に世界のどこか、例えばって書いてあるのになにいってんの?
120:名無しさん@お腹いっぱい。
12/06/20 14:28:46.20
なんか、途中から入ってきた人が意味取り間違えて会話してるね。
お題を整理しよう。
環境変数TZがすでに設定されている(日本時間とは限らない)場合も含めて、
GNU dateを使わずに、dateで1日前の日付(時刻)を取得する方法は?
というのが元のお題。
121:名無しさん@お腹いっぱい。
12/06/20 14:37:08.98
>>119
ん?
どういうこと?
122:名無しさん@お腹いっぱい。
12/06/20 14:40:02.24
>>120
GNU date ない環境では perl でワンライナー書いてたな。
perl すらない環境には当たったことがなかった。
123:名無しさん@お腹いっぱい。
12/06/20 14:40:54.15
BSD dateはいいのか?
124:名無しさん@お腹いっぱい。
12/06/20 14:43:50.35
>>123
なるべく汎用性が高い方法で、ってことじゃないなあ。
125:名無しさん@お腹いっぱい。
12/06/20 14:45:03.99
×じゃないなあ
○じゃないかな
126:名無しさん@お腹いっぱい。
12/06/20 14:56:47.76
>>123
>>99で出てるな。
127:名無しさん@お腹いっぱい。
12/06/20 15:04:20.81
JSTとかPDTとかってどうやって取得すんの?
128:名無しさん@お腹いっぱい。
12/06/20 15:06:30.87
>>122
perlといってもうちの環境じゃコアモジュールすら無いけどな
何をやるにも車輪作り直しだから楽しいといえば楽しい
129:名無しさん@お腹いっぱい。
12/06/20 15:11:35.40
>>128
そういう環境では>>120はどうやるの?
130:名無しさん@お腹いっぱい。
12/06/20 15:22:57.02
>>129
諦めてた
131:名無しさん@お腹いっぱい。
12/06/20 15:24:14.50
コアモジュールなくても、timeとlocaltimeとprintくらいないの?
132:名無しさん@お腹いっぱい。
12/06/20 16:40:08.45
>>131
標準関数はだいたいある
昨日の日付くらいなら自力でなんとかなるよ
133:名無しさん@お腹いっぱい。
12/06/24 21:01:25.05
expectを使用してlsコマンドを発行、
その結果をスクリプト内の変数に入れるにはどうすればいいのん?
コマンド発行まではググってすぐにわかったんだけど結果取得がよくわかんない(´・ω・`)
134:名無しさん@お腹いっぱい。
12/06/24 21:07:37.57
普通に ` ` じゃだめなん?
135:名無しさん@お腹いっぱい。
12/06/24 21:54:23.75
expect内でtelnet接続
その接続先でコマンドを発行して結果を取得したいのです…
136:名無しさん@お腹いっぱい。
12/06/24 22:09:29.98
それは大変高度な要求なので答える事が出来るのは日本に1人しかいない。
137:名無しさん@お腹いっぱい。
12/06/24 22:10:23.28
>>135
そういうことなら ssh 使う方が楽じゃない?
138:名無しさん@お腹いっぱい。
12/06/24 22:12:20.95
expect+telnetなんて使わずに普通にssh使え。
139:名無しさん@お腹いっぱい。
12/06/24 23:24:18.51
>>135
前回の expect から今回の expect までの文字列すべてが $expect_out(buffer) に
格納されるから、それを処理すればよい。
以下は /var/log/wtmp のファイルサイズを取得する例。
send -- "ls -al /var/log | egrep -e \"\[ \]wtmp$\"\r"
set bprompt 0
while { $bprompt < 1 } {
expect {
# わざと "\r\n" で expect 掛けて、1行1行ぶつ切りにしてプロンプト手前の1行だけ回収。
-re "\r\n" { set last_line $expect_out(buffer) }
-re ".*\[\$\] " { set bprompt 1 }
}
}
# 正規表現で ls の5カラム目だけ $fsize に切り出し。
if { [ regexp {^\S+\s+\S+\s+\S+\s+\S+\s+(\S+)\s} $last_line i_all fsize ] } {
send -- "export WTMPSIZE=$fsize\r"
}
140:名無しさん@お腹いっぱい。
12/06/24 23:44:45.76
自分で書いててなんですが、ls /var/log/wtmp でいいですよね。
出力行数をコマンド側で極力減らしておく、ということを言いたかったのですが
例としては不適切でした。
141:ワラ
12/06/25 23:34:27.36
>>133>>135
シェルスクリプトはどちらで動くのですか?
142:名無しさん@お腹いっぱい。
12/06/26 09:23:23.94
回答が全て難しすぎてワロタ
expect -c "
spawn telnet 127.0.0.1
expect \"$ \"
send \"ls\r\"
expect eof
"
こんな風に書いてて
「よーしとりあえずexpectの外でecho $expect_out(buffer)を入れてlsの結果を表示するぞー」
とか思ってたらなんかどこに入れるかわからんかった
というより、expectの使い方がわかってない気がした…
143:名無しさん@お腹いっぱい。
12/06/26 11:39:01.09
回答が難しいってより質問がわけわからんくて。
鍵設定して
OUT=`ssh hoge@127.0.0.1 ls`
とかでいいじゃん。
144:名無しさん@お腹いっぱい。
12/06/26 12:03:19.34
ふむ。
端からexpectありき、で考えること自体が間違っているわな。
145:名無しさん@お腹いっぱい。
12/06/26 15:29:34.23
telnet接続限定なのでどうしてもexpectを使用してlogin passwordを自動化しないといけないんですよね…
146:ワラ
12/06/26 15:57:31.38
>>141はどうなんだよ。
シェルスクリプトは全部こっちで動かすとして、
#! /usr/bin/expect -f
spawn telnet ホスト名
expect "login:\ "
send "ログイン名\r"
expect "assword:"
send "パスワード\r"
expect "^ホゲ$ "
send "ls¥r"
expect "^ホゲ$ "
send "exit\r"
を下請けコマンドにしてやってみれ。(プロンプトは"ホゲ$ "と仮定)
147:名無しさん@お腹いっぱい。
12/06/26 16:08:59.94
質問者は名前書いとくれ。
148:133
12/06/26 16:18:50.38
>>146
動かす方は全てクライアント側です
早速そのスクリプトをe.shで保存
expect e.shとして接続を確認
呼び出し側のスクリプトclient.shで
#!/usr/bin/env bash
OUT=`expect e.sh`
echo $OUT
とするとConnection closed by foreign host.oel Chiappa.c. Reserved.というエラーが…
むむむ…
149:名無しさん@お腹いっぱい。
12/06/26 16:21:53.21
ルータか?
ならそれを先に言えよ。
そもそもls使えんのか?
150:133
12/06/26 16:25:27.80
Yes
シリアル接続のルータです
lsは仮で使用出来るコマンドを発行してます
でもexpect -f e.sh や expect e.shだとOKなんですが
シェルスクリプト内でやると駄目だよーと怒られるんです(´・ω・`)
151:名無しさん@お腹いっぱい。
12/06/26 16:27:25.92
「駄目だよー」じゃわからん。
152:名無しさん@お腹いっぱい。
12/06/26 16:27:40.89
×シリアル接続のルータ
○シリアル接続が出来るルータ
153:名無しさん@お腹いっぱい。
12/06/26 16:28:08.54
ウソついたり隠し事したりするやつはめんどう見きれん。
154:133
12/06/26 16:28:19.13
>>151
エラー内容は>>148です
155:名無しさん@お腹いっぱい。
12/06/26 16:29:27.55
たぶんそれ出来ないよ。
だからperl何かをみんな使う。
156:名無しさん@お腹いっぱい。
12/06/26 16:29:29.22
>>154
それエラーじゃないでしょ。
向こう側が接続を切った、って言ってるだけ。
157:133
12/06/26 16:33:03.55
>>155
そうなんだ…
>>156
expect e.shだと出来るんですよね
でもシェルスクリプト内で呼び出すと先ほどのエラーがでちゃう
うーむ…
158:名無しさん@お腹いっぱい。
12/06/26 16:40:34.41
>>157
標準出力が端末以外の状態だとダメなんだろ。
expect e.sh だとOKでも、
expect e.sh | cat ではNGとか。
だったら OUT=`expect e.sh` も NGになる。
159:133
12/06/26 16:44:09.27
>>158
いえ、expect e.sh | catと打ち込んでも出来ました
でもシェルスクリプト内で>>148のようにするとエラーが返って来ちゃうんです
160:名無しさん@お腹いっぱい。
12/06/26 16:48:13.20
>>159
シェルスクリプトの「外」で、
OUT=`expect e.sh`
echo "$OUT"
って打ち込むとどうなる?
161:ワラ
12/06/26 16:49:51.33
J. Noel Chiappaさん、久しぶりだなあ。
162:133
12/06/26 16:50:03.46
>>160
>>148のエラーが$OUTにはいってました
163:名無しさん@お腹いっぱい。
12/06/26 16:53:23.12
>>162
じゃあ、
expect e.sh > OUT
cat OUT
で妥協。
164:133
12/06/26 16:57:30.29
>>163
ばっちり出来ますた!
ちなみに別ファイルを用意せずにシェルスクリプト内でexpect -c ""みたいにする事は出来ないのかな?
出来ないから別ファイル用意してexpectやperlを使用するようにと言われてるような気もするけど…
165:ワラ
12/06/26 17:02:26.40
出来るよ。
たぶんあんたが色々勘違いしてるだけ。
ルータの連続ログイン禁止に抵触してたり。
エラー処理がない>>146もどうかと思うけど。
166:名無しさん@お腹いっぱい。
12/06/26 17:04:50.56
>>165
連続ログイン?
そういったルールによるアクセス制御はありませんよ
ちなみにexpect -cだと具体的に>>146はどう書くんです?
167:名無しさん@お腹いっぱい。
12/06/26 17:09:57.50
全出力を他のファイルに落としてゴニョゴニョするよりperlのNet::Telnetでも使った方がいい気がする。
168:名無しさん@お腹いっぱい。
12/06/26 17:26:29.45
>>166
シングルクオートでくくって、¥等をエスケープするだけ。
169:名無しさん@お腹いっぱい。
12/06/26 18:57:55.22
>>166
expect -c "
spawn telnet ${HOST}
expect \"login: \"
send \"${USER}\r\"
expect \"assword: \"
send \"${PASS}\r\"
expect \"$\"
" > OUT
cat OUT
でもこうやって全出力を他のファイルに落としてゴニョゴニョするより(ry
170:名無しさん@お腹いっぱい。
12/06/26 19:08:18.81
一般論として考えよう。
コマンド > OUT
cat OUT
なら動作するのに、
OUT=`コマンド`
echo "$OUT"
では動作しないのって、どういうケースが考えられる?
171:名無しさん@お腹いっぱい。
12/06/26 19:32:35.02
どっちにしてもtelnetがconnction closedになる事はないです。
172:名無しさん@お腹いっぱい。
12/06/26 19:39:47.98
>>171
そういう話はしてないだろ
173:名無しさん@お腹いっぱい。
12/06/27 20:34:48.42
bashで、32bitや64bit等の固定幅整数の論理演算がやりたい時って、
普通はどうやるものなのでしょうか?
例えば左シフトする演算をやるとすると、固定幅でない場合は面倒です。
計算後に一々固定幅に除算するのは速度的にどうかと思うし、
皆さんがどのような手段をとっているのか、おすすめの方法を教えて下さい。
174:名無しさん@お腹いっぱい。
12/06/27 20:35:48.09
bashでやろうってのがどうかと思う。
175:名無しさん@お腹いっぱい。
12/06/27 20:56:11.44
>>173
bashなら64bit(符号付)で固定幅だよ。
左シフトしてオーバーフローしたビットは自動的にカットされる。
$ echo $((0x7fffffffffffffff))
9223372036854775807
$ echo $((0x7fffffffffffffff<<1))
-2
$ echo $((0x7fffffffffffffff<<2))
-4
176:名無しさん@お腹いっぱい。
12/06/27 21:28:12.13
>>175
1.
bashが64bit幅(符号付)というのは、bashの仕様でしょうか?
それとも、事実上、それが基本になっている事が多いということでしょうか?
2.
32bit幅の固定幅bit演算、符号なしの論理演算をする時は、
やはり %0xFFFFFFFF 等と、演算を行った後に
適宜修正して計算するのが普通なのでしょうか?
177:名無しさん@お腹いっぱい。
12/06/27 23:10:24.88
ループバックってなんですか?
178:名無しさん@お腹いっぱい。
12/06/27 23:11:20.59
くるっと自分のところに戻る
179:名無しさん@お腹いっぱい。
12/06/28 07:54:55.06
で、結局ループバックってなんですか?
180:名無しさん@お腹いっぱい。
12/06/28 10:56:16.20
くるっと自分のところに戻る
181:名無しさん@お腹いっぱい。
12/06/28 10:59:29.13
だから、結局ループバックってなんなんですか?
182:名無しさん@お腹いっぱい。
12/06/28 11:03:12.48
くるっと自分のところに戻る
183:名無しさん@お腹いっぱい。
12/06/28 11:27:39.66
ルーフバッグってなんですか?
184:名無しさん@お腹いっぱい。
12/06/28 11:28:26.83
屋根袋
185:名無しさん@お腹いっぱい。
12/06/28 13:34:47.48
>>177
流れを読んでいないけど、
男なら黙ってmanだろ。
$ man -k loopback
lo(4) - software loopback network interface
186:名無しさん@お腹いっぱい。
12/06/28 13:37:43.27
$ man -k loopback
loopback: nothing appropriate.
$ man loopback
No manual entry for loopback
187:名無しさん@お腹いっぱい。
12/06/28 13:55:49.47
そもそもどのループバックのことなのか。
シェルスクリプトとは別の話じゃないのか。
188:名無しさん@お腹いっぱい。
12/06/28 14:17:25.20
超エスパーすると、エコーバックのことを聞いてるとか
189:名無しさん@お腹いっぱい。
12/06/28 18:04:41.35
俺はレジ袋もらう派だ
190:名無しさん@お腹いっぱい。
12/06/28 18:07:40.50
それはエコバッグ
191:名無しさん@お腹いっぱい。
12/06/29 17:10:34.14
パラメータに空白で区切って複数のオプション入れて、
それをコマンド引数に渡すってことをやってたんだけど
$ options="+profile '*'"
$ convert $options image1.jpg image2.jpg
bash 4.2でパラメータ中に*や'があると展開時にエスケープされるようになった
$ set -x
$ convert $options image1.jpg image2.jpg
+ convert +profile ''\''*'\''' image1.jpg image2.jpg
結局Arrayを使うことにしたんだけど
$ options=(+profile '*')
$ convert "${options[@]}" image1.jpg image2.jpg
これってbashのバグなんだろうか?それともANSIの仕様?
bashに特殊文字のエスケープやめさせる方法無いんだろうか?
こんなふうに複数のパラメーターを一気に渡そうって発想が横着なのかもしれないけど
だったらArray使わない移植性あって手軽な方法って無いのかな?
$ convert $(echo $options)
は思いついたけどなんか嫌だし、副作用もあるので
192:名無しさん@お腹いっぱい。
12/06/30 03:45:58.31
そんな事にはならないけど?
$ ls
1.jpg 2.jpg
$ o="+p *"
$ echo $o
+p 1.jpg 2.jpg
$ echo "$o"
+p *
$ o="+p '*'"
$ echo $o
+p '*'
$ echo "$o"
+p '*'
$ bash --version
GNU bash, バージョン 4.2.10(1)-release (i686-pc-linux-gnu)
...
193:191
12/06/30 16:40:38.69
>>192
bash --version
GNU bash, バージョン 4.2.28(1)-release (x86_64-redhat-linux-gnu)
4.2.10では起きてなかったと思う
194:名無しさん@お腹いっぱい。
12/06/30 16:43:18.58
ふつー、ポジションパラメータ
195:名無しさん@お腹いっぱい。
12/06/30 16:54:47.17
4.2.10でも再現した
$ bash --version
GNU bash, バージョン 4.2.10(1)-release (x86_64-redhat-linux-gnu)
$ set -x
$ options="+profile '*'"
$ convert $options image1.jpg image2.jpg
+ convert +profile ''\''*'\''' image1.jpg image2.jpg
196:名無しさん@お腹いっぱい。
12/06/30 17:02:02.66
4.2.29でも同じだった
>>192
echo が引用符が除去するからそれをやってもわからない
set -xで見ないと
197:名無しさん@お腹いっぱい。
12/06/30 17:10:30.74
4.1でも3.2でも同じだから俺がエスケープされる仕様に気付いてなかっただけっぽ
198:名無しさん@お腹いっぱい。
12/06/30 17:11:54.01
>>196
set -xで見て付いてるクォートは実際には除去されるから問題ない
199:名無しさん@お腹いっぱい。
12/06/30 17:49:22.14
>>194
setでポジショナルパラメータに代入しても
結局ポジショナルパラメータの展開時にエスケープされちゃう
$*でも$@でも"$@"でも同じ
逆に*をあらかじめクォートしなければうまくいくようにも思えるが
クォートされていない*をそのままsetでポジショナルパラメータに代入する方法が無い
>>198
set -xでやたら'が増えるのはわかってるけど、そういう問題じゃないから
コマンド引数として「*」記号を渡したい
あらかじめ文字列中に裸の「*」を入れておくとglob展開される
「'*'」や「\*」を入れておくとパラメータ展開時に'や\までエスケープされてしまうって話
>>192の例でoが「'*'」の時
echo $oとecho "$o"、つまりecho '*'とecho "'*'"の結果が同じになるのは変だろ
記号「*」だけを表示して欲しいわけ
そのためにはoを「*」をにしてecho "$o"とやるしか方法がない
そういう仕様だからしかたないと納得した
つまり俺の
> パラメータに空白で区切って複数のオプション入れて、
> それをコマンド引数に渡すってことをやってたんだけど
がそもそも間違ってた。特殊記号が入る時はそういう事やっちゃいけないんだろう
200:名無しさん@お腹いっぱい。
12/07/02 13:20:07.03
>>191 やりたい事がこれで出来るならば、
options=(+profile '*')
convert "${options[@]}" image1.jpg image2.jpg
これでも出来のではないですか?パス名展開させたければ、ダブルクォートを外す。
options='+profile *'
convert "${options}" image1.jpg image2.jpg
>>199 のこの辺がとても気になりますが、長くなるので省略。
> クォートされていない*をそのままsetでポジショナルパラメータに代入する方法が無い
> >>192の例でoが「'*'」の時
> echo $oとecho "$o"、つまりecho '*'とecho "'*'"の結果が同じになるのは変だろ
201:200
12/07/02 13:38:21.36
ああ、オプションだから、区切られないといけませんね。
後ほど
202:200
12/07/02 13:57:02.19
$ cat convert.sh
#!/bin/sh
for i; do echo "$i"; done
$ sample.sh
#!/bin/sh -x
options='"-a" "*" "-b" "file name"'
eval ./convert.sh "${options}" '"other file"'
eval set -- "+profile '*' 'file name'"
./convert.sh "$@" image1.jpg image2.jpg
これでまだ勘違いしていたら、夜にでも考えます
203:名無しさん@お腹いっぱい。
12/07/02 14:46:36.09
個人的にはbashとkshの両方で動くならArrayでいいかって気になってます
特にデータが外部から来る場合は"${array[@]}"がセキュリティ面を考えると安心だし
204:200
12/07/02 19:47:27.73
変数を区切るのでもなければ、eval set は不要で単に set で充分ですね。
変な点はまだ有るかもしれませんが、まあ Array で動いていてそれで良いなら、
不要な様なのでこれ以上訂正しません。
205:名無しさん@お腹いっぱい。
12/07/07 04:32:03.14
>>200
不要です。
以上。
↓はい次の方。
206:名無しさん@お腹いっぱい。
12/07/07 07:45:06.26
↑リフレクト
207:名無しさん@お腹いっぱい。
12/07/07 21:04:25.66
戻り値がゼロのとき真 ってのやめてほしい
208:名無しさん@お腹いっぱい。
12/07/07 21:24:19.25
算術式展開では 真で1
↓
$ echo $((123==123))
1
算術式評価では 真で0
↓
$ ((123==123)); echo $?
0
・・・そういうものです
209:名無しさん@お腹いっぱい。
12/07/08 00:05:05.40
かき回すなよバカ。
echo false; echo $?
意味ねーだろ。
210:名無しさん@お腹いっぱい。
12/07/08 08:43:03.23
>>209 が 「echo false」で例えてるのが的外れ。
>>209 は >>208 の意味を理解してない。たぶん、算術式評価を知らないと見た。
echo $((123==123)); echo $? じゃなくて、
((123==123)); echo $? を実行してるんだから。
211:名無しさん@お腹いっぱい。
12/07/08 08:58:09.05
それを踏まえたうえで、>>207が「戻り値のゼロ」を問題にしているのに、
標準出力の1/0を持ち出すのは「echo false」と同じくらい意味ねーといっているのだ。
わかるか? バカ。
212:名無しさん@お腹いっぱい。
12/07/08 09:00:39.71
罵倒はいらんよ。
213:名無しさん@お腹いっぱい。
12/07/08 09:04:04.78
>>211
>>208 が指摘してるのは、
戻り値では0が真だが、展開値を出力とする算術式展開では1が真だよという点。
で、その算術式展開と算術式評価もまた違うという点。
やっぱり >>209 は算術式理解してなかったんだね。
214:名無しさん@お腹いっぱい。
12/07/08 09:08:53.37
>>211 は多分↓みたいなコマンド理解できないだろう。
$ ((0)); echo $?
1
↑結果は偽ね。
215:名無しさん@お腹いっぱい。
12/07/08 09:40:18.88
>>213
コマンドの戻り値が0で真が気持ち悪いというのが>>207が言っている事。
それに対して、算術展開とか持ち出した>>208の間抜けさを指摘しているのだ。 バカには難しすぎかい?
>>214
バカすぎる。つーか意味不明。当たり前のように理解不能。
行頭の$は何だよプロンプトか? w
216:名無しさん@お腹いっぱい。
12/07/08 09:45:04.93
>>215
>当たり前のように理解不能。
↑敗北宣言乙w
217:名無しさん@お腹いっぱい。
12/07/08 10:04:40.89
>>215
> >>214
> 行頭の$は何だよプロンプトか? w
その通りだよw
218:名無しさん@お腹いっぱい。
12/07/08 10:12:49.26
なんだbashの記法か。マジで知らんかったわ。w
で、それが「戻り値が0で真は気持ち悪い」となんの関係があるんだ? マヌケ
219:名無しさん@お腹いっぱい。
12/07/08 13:35:39.83
ここはシェルスクリプトのスレなんだから、bashはbashスレでやれ。
220:名無しさん@お腹いっぱい。
12/07/08 15:01:13.59
分かってねえやつは黙ってろマヌケw
221:名無しさん@お腹いっぱい。
12/07/08 19:16:09.74
戻り値がゼロのとき菊地真
222:名無しさん@お腹いっぱい。
12/07/08 19:58:11.85
シェルから使う外部コマンドは正常終了するとき exit(EXIT_SUCCESS) するわけで
/usr/include/stdlib.h:#define EXIT_SUCCESS 0 /* Successful exit status. */
になっているのだからしょうがないでしょうよ。
223:名無しさん@お腹いっぱい。
12/07/08 21:08:41.46
本当、ここはマヌケばかりだw
色々と勉強しなおせ
224:名無しさん@お腹いっぱい。
12/07/08 21:14:25.84
ん? 何スレか前の /dev/tcpで大恥かいた奴が暴れてるのか?w
225:名無しさん@お腹いっぱい。
12/07/08 21:18:14.89
>>222
しょうがないのはいいんだけど、こういうときに頭がこんがらがる
test -f hoge.txt が成功したら「真」だから
test -f hoge.txt && echo unko
のときにちゃんとunkoが出るんだけどさ、ここまでいいんだけど
test -f hoge.txt の結果、$?ってゼロじゃん? だからさっきのも
ゼロ && echo unko
みたいな感じで unko出ねぇ って一瞬思っちゃうんだよ
226:名無しさん@お腹いっぱい。
12/07/08 21:23:20.80
アゼンブラで、演算結果が0の時に Zフラグが1になる(0なのに1になる)
という感覚に慣れていればどうってことない。
227:名無しさん@お腹いっぱい。
12/07/09 09:44:10.37
>>226
Zフラグでもなんでもどういうたとえを使ってもいいけど、
そのたとえを当てはめるまでにタイムラグがおこる
228:名無しさん@お腹いっぱい。
12/07/09 10:56:32.71
lua だと 0 でも 1 でも "" でも真だからどうってことない。
229:名無しさん@お腹いっぱい
12/07/10 21:53:14.00
VMCPU="cotex-a8"
QEMUOPTS="${VMCPU:+-cpu $VMCPU}"
この文の
VMCPU:+ ってのは何のためにあるんでしょうか?
230:名無しさん@お腹いっぱい。
12/07/10 21:56:15.24
>>229
>>229
$VMCPU に値が設定されている時のみ -cpu $VMCPU に展開する。
$VMCPU が設定されていない時に -cpu のオプションだけが QEMUOPTS に代入されるのを防ぐ。
231:名無しさん@お腹いっぱい。
12/07/10 22:04:39.97
>>230
だから、VMCPUには常に値を代入してるんですが、、
232:229
12/07/10 22:34:35.51
>230
:-
:+
:=
こんな使い方があったんですね。ありがとうございました
233:名無しさん@お腹いっぱい。
12/07/12 17:37:48.08
##### evalの危険性について #####
シェルスクリプト学習中の初心者です。
evalを使うとセキュリティー上どのような事が、問題となるのでしょうか?
変数を展開する際に意図せぬ結果となり、エラーでスクリプトが止まったり、コマンドが起動される事はなんとなく分かります。
初心者の考える危険な例
: ; from_net_1='apple'; from_net_2='banana'; from_net_3='; uname -a'
: ; OPT="$from_net_1 $from_net_2 $from_net_3"
: ; eval echo "$OPT"
また、この点に気を付ければ良い等、機械的に安全を得るやり方は有りますか?
もしくは、皆さんが使用時に、気を付ける点などあればご教示下さい。
234:名無しさん@お腹いっぱい。
12/07/12 21:28:20.42
> 機械的に安全を得るやり方は有りますか?
無い。信頼できるソース以外からの文字列をevalしてはいけない。
235:名無しさん@お腹いっぱい。
12/07/12 21:57:05.58
そもそもevalなんて滅多に使わないしなー。
evalを頻繁に使うようなトリッキーなコードは読みにくくなりがちだしね。
236:名無しさん@お腹いっぱい。
12/07/12 22:14:43.03
configure発明したやつに言ってやってくれ
237:名無しさん@お腹いっぱい。
12/07/12 22:18:43.10
発明w
238:名無しさん@お腹いっぱい。
12/07/12 22:20:16.41
configureは人間が読み書きするものじゃなくてautoconfに作らせるものだから
239:名無しさん@お腹いっぱい
12/07/13 22:22:49.32
公開鍵を使わず、パスワード認証でsshdを使ってます。
アクセスを集計しようと
cat /var/log/auth.log | grep "Failed password" | awk '{if($9 == "invalid")print $1,$2,$3,$11,$13,$15; else print $1,$2$3,$9,$11,$13}' | uniq -f5 -w12 -c
と書いてみたんですが、思うようにuniqされませ。
どこがマズイでしょうか?
240:名無しさん@お腹いっぱい。
12/07/13 22:36:54.90
カンマが一つ抜けてるんじゃねーの
241:239
12/07/13 22:57:53.20
>240
カンマ抜けてました
でも、カンマいれると全てが1行表示になりました。
242:名無しさん@お腹いっぱい。
12/07/13 23:10:09.05
cat /var/log/auth.log | grep "Failed password"
ここが環境依存だから答えられん。
awkに対してどんな入力を期待してるの?
243:名無しさん@お腹いっぱい。
12/07/13 23:40:29.47
関係ないけど、grep|awk っていうパイプラインよく見る気がする。
ついついやりたくなるのは分かるがawkがかわいそうに思えてくる。
244:名無しさん@お腹いっぱい。
12/07/13 23:45:38.52
awkはちょっと強力なcutという用途にしか使われてないことは多そうだな。
かと言って全部awkでしちゃうとgrepとかsedの立場がなくなる。
245:名無しさん@お腹いっぱい。
12/07/13 23:49:01.38
最初のcatが無駄だろっていう人は最近来なくなったのねw
246:名無しさん@お腹いっぱい。
12/07/14 00:33:02.57
cat使ったほうが分かりやすい
247:名無しさん@お腹いっぱい。
12/07/14 00:45:52.23
catを使わなかったら、ファイルを対象にするコマンドと、パイプで入ってくるものを
対象にするコマンドが混在することになるからな
出力はcat、処理はパイプ、と分けた方が、保守性は高まるんじゃないかな
248:名無しさん@お腹いっぱい。
12/07/14 01:19:38.10
cat議論は一スレで二回ぐらい発生するのが恒例行事。
249:名無しさん@お腹いっぱい。
12/07/14 06:53:20.81
議論され尽くしてるものの議論は、やはり面白いですな
250:名無しさん@お腹いっぱい。
12/07/14 07:15:53.03
>>243,244
わかるわww
ただawkを使いこなせるようになるには時間がかかるし、若い奴にこんな時代遅れなものを今から全部学べとは言えないからな。
必要最小限な使い方だけ教えると、grepやsedやuniqなんかと組み合わせた使い方をしてくるんだよね。
251:239
12/07/14 07:55:25.81
寝てしまった
Failed password が
Jul 13 13:56:36 xxxxx sshd[17819]: Failed password for root from 59.175.218.166 port 49148 ssh2
Jul 13 13:56:40 xxxxx sshd[17821]: Failed password for invalid user oracle from 59.175.218.166 port 51025 ssh2
の2種類があるので、必要部分だけにして、form のアドレスでまとめたいだけなんです。
連続したアドレスをまとめて、カウントできれば
252:名無しさん@お腹いっぱい。
12/07/14 07:56:18.63
テンプレやいろいろな場所でcshがヤバめというのは自覚してるんですが教えてください。
あのcsh使わされてるんですけど標準入力のアスタリスクを文字として扱えないんですけどどうしたらいいんですか。
標準入力からsetした変数でいろいろ分岐したいんですけど*を入れた場合だけ構文エラーとかワイルドカード展開になってしまいます。
ちなみにUNIX環境は全くわかりません。
マジでお願いします。
253:名無しさん@お腹いっぱい。
12/07/14 08:37:53.40
>251
なら前半は
awk '/failure/{print $1,$2,$3,$(NF-5),$(NF-3),$(NF-1)}' /var/log/messages
で済みそう。時間的な連続性を気にしなければ数え上げもawk内でやりたいが。
254:251
12/07/14 09:00:52.31
>253
failureの行をつかうたんですね
思うように集計されないのは、uniqの使い方に問題があったみたいです。
sortが前提みたいですね。
ただ、時間的に連続したfailureのアドレスをまとめたい、できればカウントつきで
255:名無しさん@お腹いっぱい。
12/07/14 09:15:24.77
数え上げはawkじゃなくてuniq -cあたりに任せたいところ。
256:名無しさん@お腹いっぱい。
12/07/14 10:46:53.42
アドレスだけでいいならuniq -c -f 4じゃないの?
257:名無しさん@お腹いっぱい。
12/07/14 15:21:41.03
>>252
こういう事か?
set hoge = "$<"
echo "$hoge"
258:名無しさん@お腹いっぱい。
12/07/14 15:28:23.55
今月はじめ、職場に新しいPC(Core i7の結構ハイエンド構成)が入りました。
多分私が運用保守をまかされそうな雰囲気です。業務的にとある構造分析や
シミュレーションなど行う必要があり、制御コマンドとしてシェルスクリプトを
使用するのは聞いていたのですが、そのファイルを開いて1行目に書かれていたのは
#!/bin/tcshという文字列でした。
「うへぇ~、よりによってtcshかよ」
ファイル記述子のリダイレクト不可、クオートのネスティング等に無理あり、
今の奴でさえシェル関数は使えないし、パイプラインの終了ステータスもおかしいし、
今時の担当者が扱ってセキュリティは大丈夫なのか不安はつきませんし、
スクリプトとしてのcshは嫌われるのでネット上の情報も少なく調べるのも大変です。
おそらく導入に際して、大学など教育機関で最初にcshに触れて刷りこまれた人間が
強気の知ったかぶりをして発言権を得て「俺流」をつらぬき紛れ込ませたのでしょう。
昔、当時、シェルで唯一aliasやhistoryやジョブコントロールの機能が使えた
cshは大学など教育機関に浸透していて、日本のシェル界に多くのバカが輩出しました。
これから私は、おそらくそういうバカが、$*でスペース入りファイル名が扱えないとか
$<でファイルから読めないのかとか、変数に*を入れた場合だけ構文エラーになって
実行できないなどと、シェル通気取りの偏ったどうでもいい我侭を言い出し
(だからcshスクリプト書くんじゃねーよ)それと戦わなければならないのでしょう。
そして時代によって決着している、過去25年のシェル界隈のくだらないそれらの議論が
再現され、それに巻き込まれるのでしょう。もう今からうんざりです。
だからお願いです。教育現場ではbashでもzshでもkshでもashでも
Bourne shでもなんでもいいですがBシェル系のシェルにしてください。
教育機関で懐古趣味のバカを量産されると現場が非常に苦労するのです。
259:名無しさん@お腹いっぱい。
12/07/14 15:32:28.73
どうでもいいけど日本のシェル界なんてものの存在を初めて知った。
260:名無しさん@お腹いっぱい。
12/07/14 16:52:49.19
Solaris編もあったね
261:名無しさん@お腹いっぱい。
12/07/14 16:56:34.37
シェル王が住んでる。
262:名無しさん@お腹いっぱい。
12/07/14 18:01:11.45
なんでこんなコピペ気にいったんだこいつ。
263:名無しさん@お腹いっぱい。
12/07/14 19:39:52.83
>>262
サルにマスかき覚えさせると血が出るまでやめないのと同じだよ
覚えたてで嬉しいんだろう
264:名無しさん@お腹いっぱい。
12/07/14 19:52:41.06
多分、覚えたてのコピペを貼るように>>252が釣った。
今時csh使ってるところなんかあるわけねーだろ。
265:名無しさん@お腹いっぱい。
12/07/14 20:00:46.43
コピペだったのか。マジレスしそうになったよw
266:名無しさん@お腹いっぱい。
12/07/14 22:00:42.21
コピペはさておき、カーソルキーでヒストリ機能を使おうと思うと
tcshが一番手っ取り早い時期があった
bashでの、カーソルキーによるヒストリ機能の正式サポートと実装は、
netnewsでは結構祭レベルで好評だったのに対し、fj界隈では
カーソルキーなんて使わないじゃんSVR4とかwwwみたいに
ガラパゴスってた事が、tcshユーザが大量生産したことと
因果関係は有ると思うね
267:名無しさん@お腹いっぱい。
12/07/14 23:13:13.33
ガラガラ話にしても仕方なかろう
BSD界隈では csh 系にそれなりの人気があり
FreeBSD なんかデフォルトのshellは未だにcshだ(実体はtcsh)
268:名無しさん@お腹いっぱい。
12/07/14 23:16:17.42
WITHOUT_TCSHで問題なく動くけどな。
269:名無しさん@お腹いっぱい。
12/07/15 03:26:56.35
>>267
ashじゃなかったっけ
270:名無しさん@お腹いっぱい。
12/07/15 04:05:13.03
>>269
URLリンク(svnweb.freebsd.org)
root::0:0::0:0:Charlie &:/root:/bin/csh
271:名無しさん@お腹いっぱい。
12/07/15 07:21:31.45
FreeBSDはなんで今でもcshがデフォルトなの?何か理由あるの?
272:名無しさん@お腹いっぱい。
12/07/15 12:20:29.92
BSD だから,に尽きるんじゃないかな
273:名無しさん@お腹いっぱい。
12/07/15 13:30:12.88
そもそもcsh自体がBSD発祥なんだっけ
274:名無しさん@お腹いっぱい。
12/07/15 17:10:34.35
宗教上の理由でbashが使えないから
275:名無しさん@お腹いっぱい。
12/07/15 20:13:13.73
bashはGNUライセンスだからなんじゃないの?
276:名無しさん@お腹いっぱい。
12/07/15 20:53:59.04
パブリック
277:名無しさん@お腹いっぱい。
12/07/16 02:01:54.23
>>273
Bill Joy先生の作品ですよ。
ジョブコントロール関係のカーネル拡張も。
他にはviとか、page単位の仮想記憶とか。
近代的なUNIXカーネルの創始者の一人。
cshスクリプトの是非については、
csh programming considered harmful.を読めばいい。
278:名無しさん@お腹いっぱい。
12/07/16 16:33:07.10
Linux、bashを使用しています
シェルスクリプトを書いたのですが、
そのスクリプト(***.sh)が入っているディレクトリと入っていないディレクトリで
挙動が変わってしまいます
これはもともとそういう仕様?なのでしょうか
それとも書いたスクリプトに間違いがあってこうなっているのでしょうか
すみませんがアドバイス宜しくお願いします
279:名無しさん@お腹いっぱい。
12/07/16 16:57:50.70
相対パスつこうてるんやろ
280:名無しさん@お腹いっぱい。
12/07/16 17:05:30.38
カレントディレクトリという概念を理解してない。
カレントディレクトリはスクリプトの属性ではなくプロセスの属性。
281:名無しさん@お腹いっぱい。
12/07/16 17:14:22.95
>>279
パスはその都度引数で指定する仕様で
絶対パスで指定しているのでそんなことはない、と思うのですが…
>>280
カレントディレクトリで、なおかつそのスクリプトが入ってるときにしか
動作しない、ということでしょうか…?
すみません、浅学でしてLinuxに関しては学び始めたばかりなのです
282:名無しさん@お腹いっぱい。
12/07/16 17:17:14.41
pastebinか何かにそのスクリプトを晒しなさい
URLリンク(pastebin.com)
283:名無しさん@お腹いっぱい。
12/07/16 17:23:10.76
別にLinuxだけの話じゃ無さそうだな
284:名無しさん@お腹いっぱい。
12/07/16 17:24:30.42
>>282
これであってますでしょうか…?
URLリンク(pastebin.com)
285:名無しさん@お腹いっぱい。
12/07/16 17:27:48.35
付け足しですが、こちら「for FILE in _______________」となっていて
inの後ろを穴埋めしろ、という課題なのです
拡張子はtexやdviに限る必要はありません
ただし何かしらの文字列を含まないファイルを
一括で削除するスクリプトを作りましょう、ということなのですが…
286:名無しさん@お腹いっぱい。
12/07/16 17:30:36.51
ls "$DIR"の間違いだろ。
grepのところもegrep -v ".tex$|.dvi$"くらいの意図か?
287:名無しさん@お腹いっぱい。
12/07/16 17:33:28.31
>>286
それも試したんですが削除しますか?と聞かれるファイルがひとつしかないのです>"$DIR"
実際にはもっとたくさんあるんですが…
grepのは特定の文字列を含まないファイルをリストしたいという意図です
".tex$|.dvi$"←これのように「|」を入れないと2つの文字列を除外することはできないのでしょうか?
288:名無しさん@お腹いっぱい。
12/07/16 18:39:06.72
grep -v".txt .dvi" は
何か1文字、t、x、t、スペース、何か1文字、d、v、i
というひとつながりの文字列がある行を除外する。
289:名無しさん@お腹いっぱい。
12/07/16 18:40:30.30
texだたハズカシー
290:名無しさん@お腹いっぱい。
12/07/16 18:52:03.84
>>285
>「for FILE in _______________」となっていて
>inの後ろを穴埋めしろ、という課題なのです
変な課題w
課題関係なしなら
↓で、grep使わずにできる。(lsも使わずに内部コマンドだけで)
cd "$DIR"
for FILE in *
do
case $FILE in
*.tex|*.dvi);;
*) rm -i "$FILE";;
esac
done
291:名無しさん@お腹いっぱい。
12/07/16 19:39:40.80
無理矢理「for FILE in _______________」の中に別のfor文入れちゃえ。
正常に動くよ。
for FILE in `for f in *; do case $f in *.tex|*.dvi)echo "$f";;esac;done`
do
以下略
292:名無しさん@お腹いっぱい。
12/07/16 22:01:42.45
>>288
なるほど…ありがとうございます
検索条件に.○○はダメだったんですね
>>290
正直別なところもいじらせてほしいですorz
スクリプト例もありがとうございます、参考にさせて頂きます
>>291
その手がありましたね…!>for文入れる
有り難うございます、これで行けると思います
長々とどうもすみませんでした
アドバイスしてくれた皆様ありがとうございました
293:名無しさん@お腹いっぱい。
12/07/16 22:05:25.55
あのさぁ…ま いっか
294:名無しさん@お腹いっぱい。
12/07/16 22:27:57.35
ls に絶対パス出力するオプションあるんじゃねーのと思ったらそんなことはなかった
find 使えばいくね?
find "$DIR" -maxdepth 1 -type f
ていうかHOME以下のファイル消すスクリプトとかこえーな
295:名無しさん@お腹いっぱい。
12/07/17 00:37:58.25
>>291 面白w
find -E "$DIR" -type f -regex '.*\.(conf|wrapper)$' -delete
でいいのに
制約があるので>>291よりおふざけ感が低減される
for FILE in `find -E . -type f -regex '.*\.(conf|wrapper)$'`
do
以下略
296:名無しさん@お腹いっぱい。
12/07/17 00:41:30.49
>>295
find -E "$DIR" -type f -regex '.*\.(tex|div)$' -delete
for FILE in `find -E "${DIR}" -type f -regex '.*\.(tex|div)$'`
297:名無しさん@お腹いっぱい。
12/07/17 03:06:32.79
>>292
grep -v -e .tex -e .dvi
egrep -v ".tex|.dvi"
12行目あたりに echo $FILE いれるとか、内容をチェックしてみる癖はつけたほうがいいぞ。
298:名無しさん@お腹いっぱい。
12/07/17 07:26:54.87
>>293
何よ。
299:名無しさん@お腹いっぱい。
12/07/17 15:54:04.83
検索語がまずいのか調べても分からないので、教えてください。
デスクトップ環境(X Window上)のターミナルエミュレータか、
sshログインしたときなどのコンソール上かで、シェルスクリプトの挙動を変えたいのですが、
どのような工夫をすればよいか、何で条件分岐すればよいのか思いつきません。
お願いします。
300:名無しさん@お腹いっぱい。
12/07/17 16:02:19.68
ターミナルエミュレータからsshログインしたときは?
301:名無しさん@お腹いっぱい。
12/07/17 16:03:00.94
>>299
> デスクトップ環境(X Window上)のターミナルエミュレータか、
DISPLAY環境変数が設定されていれば。
> sshログインしたときなどの
SSH_CLIENT環境変数が設定されていれば。
> コンソール上かで、
ttyコマンド使えばこれも判別できる。
302:名無しさん@お腹いっぱい。
12/07/17 16:13:55.08
すみませんが詳しい方のみ回答をお願いします
303:名無しさん@お腹いっぱい。
12/07/17 16:22:19.33
>>301
ありがとう。DISPLAYはsshログインしたときでもたまに設定するので使えません、
ttyコマンドの出力を使う方法は、仮想コンソールだと区別が付きそうですが、
sshログインした場合は区別が付きませんでした。
SSH_CLIENTを見てみました。
SSH_CLIENT, SSH_TTY, SSH_CONNECTIONはsshログインしたときのみに設定されるようなので、
これを使って条件分岐することにします。
ご教示感謝します。>>300さんもありがとうございました。
304:名無しさん@お腹いっぱい。
12/07/17 16:49:06.86
余談だが、
コンソールってのは本体に物理的に接続されてるキーボード/ディスプレーのことな。
パイプオルガンの鍵盤の付いた演奏台由来の名前。
パイプオルガンの本体はパイプだから。
305:名無しさん@お腹いっぱい。
12/07/17 18:45:11.74
先生!ターミナルとコンソールってどう違うんですか?!
306:名無しさん@お腹いっぱい。
12/07/17 18:51:03.45
コンソールはホスト本体の画面とキーボード。
ターミナルはあくまでも別の機械からのリモートログイン。
xtermなどのことをターミナルと呼んでしまうこともあるが、
正しくはターミナルエミュレータなので、純粋なターミナルとは異なる。
307:名無しさん@お腹いっぱい。
12/07/17 19:32:14.58
>>306
本体に接続されたディスプレイとキーボードを使うのに「ターミナル(遠隔操作端末)エミュレータ」だから直感的に混乱するよね。
308:名無しさん@お腹いっぱい。
12/07/17 23:13:42.44
/dev/pts (/dev/pty), /dev/tty, /dev/console
とかのデバイスによって、コンソール、端末(ターミナル、物理端末、制御端末、広義のコンソール等)、
疑似端末(仮想端末、仮想ターミナル、シュードターミナル等)が分かれる。(はずです。多分。)
カーネルをロードしてinit起動してるやつがコンソール
LinuxとかでAlt+2とかで切り替えられる奴がターミナル
他が疑似端末
でOK。(だと思う。多分。)
コンソールだけちょっと特別で、Ctrl+CとかCtrl+Zみたいな制御ができず、あとデーモン類とか
端末持たないプロセス(ps -efとかで見たとき端末のカラムが?になってるプロセス)が標準出力の代わりに/dev/consoleにメッセージ出してきたりする。
まぁ組み込み系の人以外、端末、ターミナル、コンソールをあまり区別せずに使う場合のが多いし、
大抵はそれであまり実害は出ないのでちゃんと覚えなくても良いと思う。
309:名無しさん@お腹いっぱい。
12/07/18 00:05:24.12
>>308
> コンソールだけちょっと特別で、Ctrl+CとかCtrl+Zみたいな制御ができず
スレ違いな上に出鱈目。最低だ。
310:名無しさん@お腹いっぱい。
12/07/18 09:45:01.28
うん、ムチャクチャにもほどがある。
>大抵はそれであまり実害は出ないのでちゃんと覚えなくても良いと思う。
自分がちゃんと覚えていないなら、それをわきまえて黙ってろ。
311:名無しさん@お腹いっぱい。
12/07/18 10:01:19.01
端末のことを英語でターミナルって言うのも知らないんだろな。
端末とターミナルを別物のように説明してるしw
312:名無しさん@お腹いっぱい。
12/07/18 11:07:30.77
>>308がフルボッコにされてるから読んでみたけど
たしかにこれはひどいな
313:名無しさん@お腹いっぱい。
12/07/18 11:13:48.49
>>309
古典/bin/shなrootログインでしかコンソールを触ったことがなかった爺と思われ。
SunOS辺りか?
314:名無しさん@お腹いっぱい。
12/07/18 13:07:04.12
cp file1 /mnt/file2 &
みたいにやっておいて、
mv file2 file3
した場合、最初のコピーにmvが追いついた時ってどうなるの?
315:名無しさん@お腹いっぱい。
12/07/18 13:13:20.91
>>314
この場合のmvは同一ファイルシステムだから、
実際にはrename(2)が呼ばれるだけで、
cpでコピー途中かどうかに関係なくファイル名だけがリネームされる。
また、リネーム後もcpはオープン済みのファイル記述子でコピーを続けるので
コピーも無事file3に対して行なわれる。
よって無問題。
316:名無しさん@お腹いっぱい。
12/07/18 13:18:37.48
>>315
あ、ごめんなさい、
mv /mnt/file2 file3
でした。この場合も問題なしですか?
317:名無しさん@お腹いっぱい。
12/07/18 13:24:13.19
>>316
異なるファイルシステムの場合は
mvが追い付いてしまったらそこでEOFとみなされるので
file3は後半が切れた短いファイルになる。
mvによるコピー後、mvはfile2をunlink(2)する。
cpはファイル記述子でコピー中なので、unlink(2)に気づかずにfile2にコピーするが、
file2はそのまま消滅する。
よって問題あり。
318:名無しさん@お腹いっぱい。
12/07/18 13:33:12.07
>>317
ありがとうございます!
319:名無しさん@お腹いっぱい。
12/07/18 15:15:13.34
最近はこういう自演が流行ってんの?
320:名無しさん@お腹いっぱい。
12/07/18 15:16:56.45
自演じゃないよ。
321:名無しさん@お腹いっぱい。
12/07/18 22:31:50.13
unlink相当の事をした時にどうなるかは、使ってるファイルシステムに依るんじゃないかなぁ
322:名無しさん@お腹いっぱい。
12/07/19 00:40:03.43
UNIX由来のファイルシステムで判例ある?
323:名無しさん@お腹いっぱい。
12/07/19 08:23:00.94
>>321
いや。
OSがUNIXなら、たとえFATファイルシステムであっても
unlinkの挙動は同じになってるよ。
(unlink後もfile descriptorで書き込み等可能、プロセス終了で実体削除)
324:名無しさん@お腹いっぱい。
12/07/19 09:34:12.27
ふーん、どうやってるんだろう。UNIXのファイルシステムと違ってunlink
して(ディレクトリエントリから削除)実体を解放しない(FATには残ってい
る)状態は、ファイルシステムとして壊れた状態なんだけど。
325:名無しさん@お腹いっぱい。
12/07/19 10:50:31.77
どうやってるんだろうとか言ってないで自分で試せよ。
326:名無しさん@お腹いっぱい。
12/07/19 11:54:23.00
>>323
NFSだと違うくね?
327:名無しさん@お腹いっぱい。
12/07/19 11:55:45.52
>>324
全員closeするまでunlinkされないよ
328:名無しさん@お腹いっぱい。
12/07/19 12:10:15.79
>>327
ディレクトリからunlinkはされるけど
closeするまで実体は隠れたところに残ってる、が正しい
329:名無しさん@お腹いっぱい。
12/07/19 12:13:46.17
それunlinkじゃなくてrenameじゃね?
330:名無しさん@お腹いっぱい。
12/07/19 12:14:14.27
ねぇ、この照れ隠しっていつまで続くの?
331:名無しさん@お腹いっぱい。
12/07/19 12:24:14.27
>>329
いや、renameじゃなくてunlink。ディレクトリ上にはどこにも存在しない。
332:名無しさん@お腹いっぱい。
12/07/19 13:47:29.51
>>326
NFSだとサーバ実装にもよるんだけど、
オープンされてるファイルをunlinkすると.nfsXXXというパス名にして、
ls -aなら見えるタイプの実装があるね。
本家のSunOSがそうだった。
今時の商用NASは見えないのが多い。
333:名無しさん@お腹いっぱい。
12/07/19 17:24:45.23
>>324
ファイルシステムとして壊れた状態かどうかはOS側の解釈に過ぎない。
unlinkして実体を解放しないまま何らかの原因で強制ummountされたら、
fsck_msdosfs(FreeBSD)またはfsck.msdos(Linux)で修復できる。
通常のUNIXのファイルシステムのfsckの場合ととくに変わらない。
334:名無しさん@お腹いっぱい。
12/07/19 18:18:26.99
>>332
最近のLinuxのNFSサーバも同じ挙動をする
NFSv3かv4の仕様なんだと思ってた
335:名無しさん@お腹いっぱい。
12/07/19 18:28:40.79
いや.nfsXXXは仕様じゃない。(NFS3以降はRFCになっているので仕様が読める)
NFSは仕様上、ファイルサーバがクラッシュした後、再起動すれば、
クライアントがオープンしていたファイルについて問題なく処理を続行できる必要がある。
そのため、回収されてしまわないようピン止めしているだけ。
商用NASでは.nfsXXXではなく不揮発メモリ上の内部DBに格納して保存している。
336:名無しさん@お腹いっぱい。
12/07/19 20:42:29.05
>>331
ディレクトリから消えるだけっしょ
337:名無しさん@お腹いっぱい。
12/07/19 20:57:26.28
>>336
お前は何を言ってるんだ?
338:名無しさん@お腹いっぱい。
12/07/19 21:11:53.31
以上、知ったかの >>324 君の照れ隠し&自爆をお送りしました。
十分お楽しみいただけましたか?
それでは次の方どうぞ
↓
339:名無しさん@お腹いっぱい。
12/07/19 21:46:23.95
↑リフレクト!
340:名無しさん@お腹いっぱい。
12/07/20 23:28:32.13
cat file1 file2 ってやると file1 のあとに file2 がつながり以下の様になりますが
a
b
c
1
2
3
下のようになるコマンドってありますか
a1
b2
c3
341:名無しさん@お腹いっぱい。
12/07/20 23:31:16.63
>>340
paste
342:名無しさん@お腹いっぱい。
12/07/20 23:31:53.26
つ join
343:名無しさん@お腹いっぱい。
12/07/21 08:02:00.38
>>341 の正解の後で 間違いを書き込む >>342
しかも「つ」とか恥ずかしい文字使ってwww
344:名無しさん@お腹いっぱい。
12/07/21 08:09:55.50
>>340
補足すると、デリミタを空文字にするようにオプション付けてね。
paste -d '' file1 file2
345:名無しさん@お腹いっぱい。
12/07/21 15:59:34.92
>>341>>344
ありがとうございました、望み通りのものです
346:名無しさん@お腹いっぱい。
12/07/21 16:48:21.35
cpuの使用量を確認するのにtop/psを利用しているのですが、
ppid指定で子プロセスの累積値を出すオプション等ありますか?
軽いプロセスをループで呼び続けてるものがcpu%でソートした場合
浮かんで来ないというのを解決するのが目的です
psを利用してppid指定で自前っていうのをやってみようかと思いましたが
それだと、目的の物がpsに出てくる間隔で呼び続ける必要になりそうなので
「軽いプロセスを呼び続ける」ものを監視したいっていう目的に反してるなと・・
347:名無しさん@お腹いっぱい。
12/07/21 21:03:14.45
>>346
Linuxなら、psに S オプションを付けると子プロセスのCPU時間が親に加算されるけど。
348:名無しさん@お腹いっぱい。
12/07/21 21:28:04.70
xinitを打つと左上に白のシェルが出てプロンプトは実行できるようですが、
マウスが反応しません。あ、マウス自体は動いてるんですがクリックしても
何もなりません。タスクバーとかはどうやって出すんですか?
349:名無しさん@お腹いっぱい。
12/07/21 21:36:58.32
xinitじゃなくてstartxでどうよ?
というかシェルスクリプトか?
350:名無しさん@お腹いっぱい。
12/07/21 23:15:22.59
dwm入ってる?
351:名無しさん@お腹いっぱい。
12/07/22 03:02:09.25
>>348
gnomeとかcdeとかのウインドウマネージャやデスクトップ環境を起動しないと使えないよ。
352:名無しさん@お腹いっぱい。
12/07/23 21:56:01.86
すみませんが詳しい方のみ解答をお願いします。
353:名無しさん@お腹いっぱい。
12/07/23 22:11:18.53
スレちがいの戯言は放置するスルーカを習得しよう。
354:名無しさん@お腹いっぱい。
12/07/23 22:21:56.21
つ URLリンク(blogimg.goo.ne.jp)
355:名無しさん@お腹いっぱい。
12/07/24 00:34:24.03
もしかして:ヤリイカ
356:名無しさん@お腹いっぱい。
12/07/24 00:36:18.47
いや、モンゴウイカじゃね?
357:名無しさん@お腹いっぱい。
12/07/24 23:56:17.62
>>353
xinitrcを書きたい。それってシェルスクリプトみたいなもんだろ?
ってのがいいたいんじゃないの?352は。
ちがうのかなあ。
358:名無しさん@お腹いっぱい。
12/07/25 03:21:11.56
>>357
352 はよく有るコピペだろ。
「質問者のくせに偉そうに!」を引き出す為の、第三者によるあおりだからスルー推奨。
359:名無しさん@お腹いっぱい。
12/07/25 21:35:30.31
>>358
おう、そうか。スルーしよう。ありがとう。
360:名無しさん@お腹いっぱい。
12/07/27 20:48:33.81
標準出力はそのままに、標準エラー出力だけgrepかけたいとか
思うんだけど、どうしたらいいでしょか
361:名無しさん@お腹いっぱい。
12/07/27 20:52:17.05
>>360
((コマンド 2>&1 1>&3) | grep hoge) 3>&1
362:名無しさん@お腹いっぱい。
12/07/28 03:58:28.71
>>361
なるほど
いろいろできるもんだな
363:名無しさん@お腹いっぱい。
12/07/28 07:49:40.42
興味本位で聞いただけかよ。無礼な奴だ。
364:名無しさん@お腹いっぱい。
12/07/28 07:56:32.30
アスペさんちっす
365:名無しさん@お腹いっぱい。
12/07/28 09:41:50.79
>>361
サブシェルが1個無駄です。
(コマンド 2>&1 1>&3 | grep hoge) 3>&1
---
サブシェルなしにもできます。
exec 3>&1
コマンド 2>&1 1>&3 | grep hoge
366:名無しさん@お腹いっぱい。
12/07/28 10:07:31.29
>>365
なるほど
いろいろできるもんだな
367:名無しさん@お腹いっぱい。
12/07/28 10:11:09.01
>>366
若ハゲチッス
368:名無しさん@お腹いっぱい。
12/07/28 11:36:30.41
すみませんが詳しい方のみ解答をお願いします。
369:名無しさん@お腹いっぱい。
12/07/28 11:45:46.68
>>366
興味本位で聞いただけかよ。無礼な奴だ。
370:名無しさん@お腹いっぱい。
12/07/28 12:12:34.03
学校の技術の時間、コンピュータについての授業があった。
「コンピュータにはいろんなシェルがある。みんなの知ってるシェルを1つずつ
挙げていこう。誰かわかる人?」と先生が言った。
エクスプローラは真っ先に答えられた。
誰かがGNOMEと答えたが、先生はNautilusと修正して黒板に書いた。
command.comという声も挙がった。
そのあと隣の奴がDOS窓と答えた。
すると先生は黒板のcommand.comの文字の上をチョークでコンコンと叩いた。
キミの答えはここに既に含まれているという、ちょっと屈辱的な対応だ。
満を持してボクは手を挙げて答えた。「bash」
すると先生は黒板のcommand.comの文字の上をチョークでコンコンと叩いた。
371:名無しさん@お腹いっぱい。
12/07/28 12:26:54.24
>>370
オチが分からん。解説よろ
372:名無しさん@お腹いっぱい。
12/07/28 12:32:16.23
FreeBSDがLinuxに含まれるってやつのコピペだよ
373:名無しさん@お腹いっぱい。
12/07/28 15:36:27.50
360じゃないんですが
if ! ERROR=$(command 2>&1);then
exit 1
fi
で、commandが正常終了しても、successedなどのメッセージが返されて
全て、if中に入ってしまいます。
ERRORにディスクリプト1番を入れようにするには、どうすれば良いですか?
374:名無しさん@お腹いっぱい。
12/07/28 15:38:36.28
手作りと言ってお店のおにぎりを差し入れしてやったわ! フハハ!
375:名無しさん@お腹いっぱい。
12/07/28 15:50:27.43
>>373
こっちの環境で試したら、commandが正常終了の時はif文の中に入らず、
メッセージはすべて $ERRORに代入されてたけど。
376:名無しさん@お腹いっぱい。
12/07/28 15:57:24.14
ばかもん、commandの正体が何かを推察するエスパー検定じゃ。やり直し!
377:373
12/07/28 16:33:01.71
>374
if ! ERROR=$(genext2fs -b $IMAGESIZE -i $BYTEINODE -d $ROOTFS $IMAGENAME 2>&1);then
error "E: $ERROR"
cleanup
fi
E:successed で、cleanup 終了してるみたいで
本当にここか確かめては無いんですが、
378:名無しさん@お腹いっぱい。
12/07/28 16:47:30.02
再現テスト
$ if ! ERROR=$(echo test; true); then echo "$ERROR"; fi
$ if ! ERROR=$(echo test; false); then echo "$ERROR"; fi
test
$
379:名無しさん@お腹いっぱい。
12/07/28 17:09:30.14
$()はash依存だから禁止。 はいロンパー
380:名無しさん@お腹いっぱい。
12/07/28 17:26:15.70
再現テスト
$ ERROR=`echo test; true` || echo "$ERROR"
$ ERROR=`echo test; false` || echo "$ERROR"
test
$
381:名無しさん@お腹いっぱい。
12/07/28 17:59:00.49
$()が使えないシェルなんて無視していい。
382:名無しさん@お腹いっぱい。
12/07/28 20:55:59.07
ロンパー、ロンパー、ロンパー
383:名無しさん@お腹いっぱい。
12/07/28 21:59:11.38
大手SIerでは$( )は使わないのが常識です。
384:名無しさん@お腹いっぱい。
12/07/28 22:06:33.76
じゃあ、bashでもzshでもkshでも使える
(( )) とか [[ ]] とか <<< とかもどんどん使うべきだな。
使えないのはashだけだし。
385:名無しさん@お腹いっぱい。
12/07/28 22:13:28.29
使えるならどんどん使っちゃえばいいと思うよ。
せっかく作者が用意してくれた機能なんだし。
386:名無しさん@お腹いっぱい。
12/07/28 22:18:09.18
>( ) や <( ) は使っていいですか? posixでは使えませんが。
387:名無しさん@お腹いっぱい。
12/07/28 22:36:30.01
>>384
そいつらはPOSIXで定義されてるの?
388:名無しさん@お腹いっぱい。
12/07/28 22:39:14.34
(( )) は定義されてる
389:名無しさん@お腹いっぱい。
12/07/29 03:16:10.95
されてねーよ。
URLリンク(pubs.opengroup.org)
390:名無しさん@お腹いっぱい。
12/07/29 08:10:37.46
・bash/zsh/kshの共通項に合わせる
か、
・純shに合わせる
かの2択。(posix(笑)は現実的じゃないから判断基準にならない)
ashはどっち付かずの中途半端。ashに合わせるくらいなら純shに合わせとけ。
あと、ashで仕様の違う「let」コマンドを廃止しろ。
391:名無しさん@お腹いっぱい。
12/07/29 08:18:36.31
>>390
・好きなシェルで単に動くものを作る
ってのもあるだろ。ポータビリティが全く必要ない場合とか。
392:名無しさん@お腹いっぱい。
12/07/29 08:36:22.88
>>386
>( ) とか <( ) って、Bash方言かと思ってたが
zshでもkshでも使えることに今気づいたよ。
こりゃ堂々と使っていいな。
393:377
12/07/29 09:15:42.62
やはり、エラーの判定になってますが、genext2fsは成功しているな
E: genext2fs: output filesystem image: Success
この場合、結果を標準エラーのみにするには、どうすれば良いですか?
394:名無しさん@お腹いっぱい。
12/07/29 09:19:54.80
>>393
もしかして genext2fsって正しいexit statusを返さないんじゃないの?
標準エラーのみにするには、
if ! ERROR=$(genext2fs ..略.. 2>&1 1>/dev/null); then
..略..
2>&1 と 1>/dev/null の順序を逆にしないこと。(逆で覚えやすいので)
395:名無しさん@お腹いっぱい。
12/07/29 09:27:49.34
ashを否定したせいでposixまで否定する羽目になっちまって大変だな。ロンパー爺さん。
396:名無しさん@お腹いっぱい。
12/07/29 09:29:52.83
俺はash関係なくPOSIXには否定的だけど、何の話?
397:名無しさん@お腹いっぱい。
12/07/29 09:44:58.55
>>393
終了ステータスでの判定を一切やめて、標準エラーの文字列でのみ判定すれば?
ERROR=$(genext2fs ..略.. 2>&1 1>/dev/null)
if [ -n "$ERROR" ]; then
echo "$ERROR"
fi
398:名無しさん@お腹いっぱい。
12/07/29 10:21:14.14
>>396
じゃあさ。
> bash/zsh/kshの共通項に合わせる
これどこにあるんだよ。無いならそれは現実的じゃないって事だよな。
399:名無しさん@お腹いっぱい。
12/07/29 10:37:10.90
>>398
bash/zsh/kshの「現物」があるじゃん。
実際に実行させてチェックできる。
一方、POSIXはPOSIX通りに実装した現物がない。
実際に実行させてチェックできない。
400:名無しさん@お腹いっぱい。
12/07/29 10:56:34.72
ポータビリティが必要ならシェルスクリプトは使わないで下さい。
401:名無しさん@お腹いっぱい。
12/07/29 11:02:57.05
POSIXには現物がない。ハイ、ロンパー
402:名無しさん@お腹いっぱい。
12/07/29 11:14:50.01
>>399
> bash/zsh/kshの「現物」があるじゃん。
> 実際に実行させてチェックできる。
ぷぷぷ、作るときは3つのマニュアル全部読みながら共通項を
拾い出して、作って動いて、おーけい、おーけい。
403:名無しさん@お腹いっぱい。
12/07/29 11:35:07.43
POSIXには現物シェルがない。だから机上の空論って言われるんだよ。
404:名無しさん@お腹いっぱい。
12/07/29 11:38:14.68
マニュアル3冊のAND取る作業は楽しいかい?
405:名無しさん@お腹いっぱい。
12/07/29 11:46:03.68
当然のごとく複数のシェルのマニュアル参照しながらやってるけど、
煽るようなことか? あ、初心者だからマニュアル読むこと自体苦痛な人?
他にも、grepとか、findとか、OSによってオプションが違うコマンドは結構あるので
複数のOSのマニュアルをすぐに見られるようにしてある。
プロなら当然だよな。
406:名無しさん@お腹いっぱい。
12/07/29 12:15:51.33
末端のプロ(笑い)が家内制手工業でANDとってる姿があわれ。
POSIXがAND取ってくれてるんだからそれを使えばいいのに。
407:名無しさん@お腹いっぱい。
12/07/29 12:19:09.97
>>406
POSIXがAND取ってくれてた机上の空論では
実際のシェルは動かないんだよ、素人さん。
408:名無しさん@お腹いっぱい。
12/07/29 12:19:25.10
また通信系SEプロさんですか
409:名無しさん@お腹いっぱい。
12/07/29 12:21:49.12
posix崇拝してる割にposix外のletコマンドを平気で使ってるFreeBSDのashスクリプトの件に付いて。
410:名無しさん@お腹いっぱい。
12/07/29 12:24:48.99
>>407
動くよ。動かないというなら実例を挙げる事。
411:名無しさん@お腹いっぱい。
12/07/29 12:26:37.54
bash/ksh/zshのバージョンはどうするんだろう?
どれも最新のバージョンを使うこと前提?
412:名無しさん@お腹いっぱい。
12/07/29 12:27:00.63
>>410
>>403
413:名無しさん@お腹いっぱい。
12/07/29 12:32:10.32
夏、だなぁ
通信業界さんも夏休みですか?
414:名無しさん@お腹いっぱい。
12/07/29 12:43:31.16
>>412
降参ですか?
415:名無しさん@お腹いっぱい。
12/07/29 12:49:36.17
なんでやねん。欲嫁。
416:名無しさん@お腹いっぱい。
12/07/29 12:51:26.75
>>409
見たことないので、/usr/srcにgrepかけてみたが、cddl/contrib/opensolarisの
下の.kshスクリプトに多数、contrib/amd/scriptsに一つ。
どこでこれを見たんだい?
> posix崇拝してる割にposix外のletコマンドを平気で使ってるFreeBSDのashスクリプトの件に付いて。
417:名無しさん@お腹いっぱい。
12/07/29 12:51:49.11
POSIXには現物がない。ハイ、ロンパー
覆すにはPOSIX通りに実装したシェルを作って持って来い。
(上位互換とかじゃダメだぞ。POSIX以外の文法も一切動いてはイカン)
418:名無しさん@お腹いっぱい。
12/07/29 12:53:59.46
ふーむ、3つのシェルのANDとった規格(笑)と合同なシェルは存在するのか?
(上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
419:名無しさん@お腹いっぱい。
12/07/29 12:56:27.23
>>418
直接存在しなくても現物シェルのANDで表せるんだからOK。
POSIXの場合は現物シェルのANDでも表せない。
420:名無しさん@お腹いっぱい。
12/07/29 13:16:53.94
その現物シェル達はお前が言い出した条件満たしてないじゃん。
> (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
それともAND規格でのみ動作するとかいうスイッチでもあるのか?
421:名無しさん@お腹いっぱい。
12/07/29 13:22:40.49
むかーし見た流れだな
自称プロ(夏休み中)はスルーでよくねえか
422:名無しさん@お腹いっぱい。
12/07/29 13:25:05.75
>>420
POSIXの場合は現物シェルのANDでも表せないので、
持ってくるとしたら上位互換しかなくなる。それじゃダメと言ってるだけ。
bash/zsh/kshは現物シェルのANDで表せる。
実践的には、scriptを書いた後に
$ bash script
$ zsh script
$ ksh script
でチェックできる。これが実際にANDを取ると言うことだ。
POSIXではそれができない。
423:名無しさん@お腹いっぱい。
12/07/29 13:28:30.18
posixか、bash/zsh/kshのand?かで議論されてますが、
/bin/sh主義の私はどうすればいいでしょうか??
/bin/sh主義的にもposixは糞であることに同意ですが。
424:名無しさん@お腹いっぱい。
12/07/29 13:33:07.06
自分から言い出した条件をあっさり撤回して意味不明の言い訳繰り返す
家内制手工業のプロさん。
> (上位互換とかじゃダメだぞ。AND取った規格以外の文法も一切動いてはイカン)
425:名無しさん@お腹いっぱい。
12/07/29 13:35:51.04
>>423
v7シェルでいいんじゃないかな。シェル関数すらない孤高の頂で頑張ってください。
ところで、posixシェルのどこが糞なんだい?
426:名無しさん@お腹いっぱい。
12/07/29 13:38:15.67
POSIXには現物がない。ハイ、ロンパー
427:名無しさん@お腹いっぱい。
12/07/29 13:39:10.75
>>424
撤回してないぞ。よくよめ。
428:名無しさん@お腹いっぱい。
12/07/29 13:39:29.54
AND規格には現物がない。はい、ロンパー
429:名無しさん@お腹いっぱい。
12/07/29 13:41:58.86
>>427
bashもzshもkshも全部AND規格(笑)の上位互換
430:名無しさん@お腹いっぱい。
12/07/29 13:43:45.90
>>428
それ以前にPOSIXには現物がないんだから >>428 では論破になってない。
A,Bという二つのものに対して、Bのみ満たす条件を示された時、
A信者が A,Bとも満たさない条件を持ってきて だから Bもダメだといってるようなもの。
それで A が良いことにはならない。
431:名無しさん@お腹いっぱい。
12/07/29 13:52:44.60
>>439
> それ以前にPOSIXには現物がないんだから >>428 では論破になってない。
それ以前にAND規格には現物がないんだから >>426 では論破になってない。
> A,Bという二つのものに対して、Bのみ満たす条件を示された時、
違うよ、Aが満たしていないという(現物がない)と言っているのが>>426
> A信者が A,Bとも満たさない条件を持ってきて だから Bもダメだといってるようなもの。
> それで A が良いことにはならない。
現物がないという条件なら両方同じと言っているだけだ。
432:名無しさん@お腹いっぱい。
12/07/29 14:15:04.40
POSIXは現物シェルのANDでも表せない。ハイ、ロンパー
433:名無しさん@お腹いっぱい。
12/07/29 14:43:09.24
>>413
これか、「夏だなぁ厨」ってのは
434:名無しさん@お腹いっぱい。
12/07/29 14:48:40.91
夏はまだ、始まったばかり。
435:名無しさん@お腹いっぱい。
12/07/29 14:50:44.43
>>423
VMwareの上でSolaris2.5を動かして確認してる。
436:名無しさん@お腹いっぱい。
12/07/29 17:01:06.41
AND規格の現物シェルは存在しない。はい、ロンパー
437:名無しさん@お腹いっぱい。
12/07/29 17:07:14.87
POSIXは現物シェルのANDでも表せない。ハイ、ロンパー
bash/zsh/kshのANDは、現物シェルのANDで表せる。ハイ、ロンパー
438:名無しさん@お腹いっぱい。
12/07/29 17:10:50.82
スーパーセットなシェルじゃダメだという主張は引っ込めるのか?
> (上位互換とかじゃダメだぞ。POSIX以外の文法も一切動いてはイカン)
439:名無しさん@お腹いっぱい。
12/07/29 17:15:25.23
bash/zsh/kshのANDは、現物シェルのANDのスーパーセットじゃなくてイコール。
ハイ、ロンパー
440:名無しさん@お腹いっぱい。
12/07/29 17:25:31.70
>>439
↓この各々のシェルは、AND規格のスーパーセットだよなあ。w
家内制手工業の自称プロには難しすぎるかな。?
$ bash script
$ zsh script
$ ksh script
441:名無しさん@お腹いっぱい。
12/07/29 17:36:32.38
ルイージ理論的には違う。はい論破www
442:名無しさん@お腹いっぱい。
12/07/29 17:51:38.94
飽きない?
443:名無しさん@お腹いっぱい。
12/07/29 17:56:40.12
どうでもいいが、$ zsh -y script にするべきだな。
SH_WORD_SPLITを有効にしないと互換性ないよ。
444:名無しさん@お腹いっぱい。
12/07/29 18:10:03.73
うつみみどり
445:名無しさん@お腹いっぱい。
12/07/29 18:31:38.08
ハイハイロンパールームロンパールーム
446:名無しさん@お腹いっぱい。
12/07/29 21:35:16.58
家内制手工業の自称プロはANDとる作業に戻ったらしい。
447:名無しさん@お腹いっぱい。
12/07/29 21:45:10.93
久しぶりに来たら変なの湧いてるな。
ash, bash あたりは POSIXシェルの現物じゃん。
zshは >>443 の言う通り微妙に違うけど。
POSIXに現物がないとか言ってる奴は、CやC++でも
言語規格も知らずにプログラム書くのか?ありえん。
(単に英語が苦手だから最新の規格書が読めなくてこだわってるだけだったりしてw)
基本、POSIXを参照して調べて、ashあたりで動作確認すれば
いいと思うけどな。(POSIX外の拡張が少ないという意味で)
とは言うものの、俺はまだ古いSolarisの保守とかもしてるので、
POSIX範囲内でも使えない機能とかあって鬱なのだが。orz
幸い、Solaris 5.8でもシェル関数は使える。
これがなきゃ死んでるところだ。
448:名無しさん@お腹いっぱい。
12/07/29 21:47:07.40
bashで書いておいてbashがない環境ならbashをインストールする。
って手段すら取れないような環境にいるやつってどれだけいるんだろ。
449:名無しさん@お腹いっぱい。
12/07/29 21:58:53.44
まあそれで良ければbashでもいいと思うよ。
でも、ちゃんと言語仕様を勉強してれば、POSIX範囲内で書くのも苦じゃ
ないので、bash入れる手間はたいしたことないけど、それも省くために
POSIX範囲内で書くってのもアリでしょ。
もっと多いのはオープンソースでソフトウェアを配布する場合で、
*BSDとかDebianとかはbashが入ってる保証はないから(入れるのは簡単だけどね)、
POSIX範囲内におさまるように(時にはv7 シェル程度でも動くように)書くのが普通。