11/12/10 20:06:40.38
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
□お約束
・特記なき場合は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 でトレースしましょう。
前スレ
シェルスクリプト総合 その18
スレリンク(unix板)
次スレは >>970 で。
2:名無しさん@お腹いっぱい。
11/12/10 22:26:58.70
シェラーの皆さんこんにちは。
今日も元気にワンタイマーしてますか?
3:名無しさん@お腹いっぱい。
11/12/10 23:02:37.12
>>2
マジ質問ですいません。ワンタイマーって何ですか?
4:名無しさん@お腹いっぱい。
11/12/10 23:18:47.00
ワンライナーかな、とも思ったがシェルでワンライナーはそれほど重視されないしな…
5:名無しさん@お腹いっぱい。
11/12/11 00:11:26.91
相手すんなよ。
6:名無しさん@お腹いっぱい。
11/12/11 16:42:39.40
1000 :名無しさん@お腹いっぱい。 :sage :2011/12/11(日) 16:41:38.19
-z って変数が空か入ってるかぢゃ無いのかよ
7:名無しさん@お腹いっぱい。
11/12/11 16:51:14.38
>>6
変数が未設定か設定済みかをテストしたい時は、
test -z "${var+X}"
を使う。varに空文字列がセットされていても「設定済み」と判定する。
8:名無しさん@お腹いっぱい。
11/12/11 16:59:56.87
なるほどぉ。ためになるなぁ。
でもさ、スクリプトの場合あらかじめunsetで初期化しない?
unsetを初期化と呼ぶのかどうかさえ知らんのだけど……。
9:名無しさん@お腹いっぱい。
11/12/13 15:30:20.06
冷やすとリングはワンタイマーだよね?
10:名無しさん@お腹いっぱい。
11/12/13 17:16:35.40
here string は PowerShell用語だったという記憶。
11:名無しさん@お腹いっぱい。
11/12/13 18:30:59.09
bashのmanにも記載はあるが、何処のどいつが言い出したのかは分からんね
辿っていけば時期は分かるだろうが、PowerShellに関しては全く知らん
12:名無しさん@お腹いっぱい。
11/12/13 20:54:11.16
bashのhere string...
へー << じゃなくて <<< を使うんだな。
$ cat <<<XXX
XXX
13:名無しさん@お腹いっぱい。
11/12/16 10:58:47.04
つまりドザか
14:名無しさん@お腹いっぱい。
11/12/17 12:28:51.47
Powershellより昔の用語じゃないか?
ヒアストリングっていまいち使いどころがわからんけど。
15:名無しさん@お腹いっぱい。
11/12/19 00:03:04.76
ブロックコメントアウトには常用するよ
#!bash
:<<'#COMMENT'
echo $PATH
#COMMENT
16:名無しさん@お腹いっぱい。
11/12/19 00:05:06.81
それはhere stringじゃなくてhere documentじゃねーの?
17:名無しさん@お腹いっぱい。
11/12/19 00:10:56.53
ごめん、ヒアストか。たしかに使いどころがないというか、これくらいしか用例知らない。
awk <<< "$*" '{
for (i = 1; i <= NF; i++) {
print $i
}
}'
18:名無しさん@お腹いっぱい。
11/12/19 06:48:52.85
>>15
それはシェル内部で添付ファイル作られるから動作が無駄だな
19:名無しさん@お腹いっぱい。
11/12/19 08:25:18.78
grep -q 'pattern' <<< 'string'
とか使えると思うけど
20:名無しさん@お腹いっぱい。
11/12/19 08:36:39.21
>>18
その添付ファイル名を知る方法ってない?
終了時に自動で美しく消されるなら使い捨てのawkやsedを埋め込むのに使いたい。
mktempとか面倒だし本題からずれて見難いしさ。
21:名無しさん@お腹いっぱい。
11/12/19 09:20:27.18
>>20
exec 3<< EOF
hoge
EOF
cat /dev/fd/3
とか?
22:名無しさん@お腹いっぱい。
11/12/19 10:14:15.89
「無駄だな」マンw
23:名無しさん@お腹いっぱい。
11/12/19 15:54:24.34
シェルスクリプトライターなら、ソースで語れよ
無駄無駄だけじゃ、何も進まないぜ(キリッ
24:名無しさん@お腹いっぱい。
11/12/19 16:09:37.29
>>15 については、コメントアウトのつもりでも
実際には内部でtmpファイルが作られるという動作が実行され、
コメントになっていない、ということを >>18 が言ってるんだろ?
単に書き方が無駄だということじゃなくて、
根本的にコメントになっていないということ。
25:名無しさん@お腹いっぱい。
11/12/19 17:25:20.99
csh, commdnd.comでさえgotoがあるのにね。
cshの非実行部は構文解析されるんだっけ?
26:名無しさん@お腹いっぱい。
11/12/22 23:31:09.41
eucのサーバにおいて、sjisのファイルをcatすると文字化けするのですが、
対処方法としてはどうすればいいでしょうか?
27:名無しさん@お腹いっぱい。
11/12/22 23:37:38.88
nkf -e
28:名無しさん@お腹いっぱい。
11/12/23 01:09:38.83
>>27
iconv使えよ・・・
29:名無しさん@お腹いっぱい。
11/12/23 09:09:05.64
iconvはエラーで中途終了しちゃうからnkfの方が推奨。
(まあ、-sもあるとは言え)
30:名無しさん@お腹いっぱい。
11/12/23 10:17:10.53
>>29
つiconv -c オプション
31:名無しさん@お腹いっぱい。
11/12/23 11:13:30.90
半角文字とか記号とかが混じったデータだと、iconvじゃ変換できないってことがあった
日本語ならnkfの方がまだ分があるって気がする
32:名無しさん@お腹いっぱい。
11/12/23 11:32:03.95
sjisじゃなくてcp932でもそうなるならiconvのバグ臭いが
33:名無しさん@お腹いっぱい。
11/12/23 12:23:33.56
>>30
-c オプションでも解決はしないので nkfお勧め
34:名無しさん@お腹いっぱい。
11/12/23 18:10:27.10
-cのないiconvもあるよな…cygwinだっけか…(死亡フラグ
35:名無しさん@お腹いっぱい。
11/12/24 02:09:13.88
そもそもcygwinじゃデフォルトで入らないしnkfのパッケージもないから
入れてたpythonでフィルタ書いて使ってる
36:名無しさん@お腹いっぱい。
11/12/24 02:52:14.20
初歩的な質問なのですが、>>26の「eucのサーバ」ってどういう意味ですか?
サーバーの設定で文字コードって指定できるんですか?
37:名無しさん@お腹いっぱい。
11/12/24 03:18:19.75
サーバーのロケール設定が euc ってことじゃね?
38:名無しさん@お腹いっぱい。
11/12/24 03:33:21.59
別に i18n で euc を指定していようと、Terminal で sjis を指定してれば
文字化けだけは防げると思うよ。
文字化けだけは。
39:名無しさん@お腹いっぱい。
11/12/24 08:59:26.03
>>35
make一発でコンパイルできるやん
# Makefileにinstall targetがないけどw
40:名無しさん@お腹いっぱい。
11/12/24 09:07:08.00
iconvは自動判別してくれないよね?
41:名無しさん@お腹いっぱい。
11/12/25 00:54:50.02
>>38 が正解
間違っています >>39
42:名無しさん@お腹いっぱい。
11/12/25 01:07:20.68
>>41
えっ!?
43:名無しさん@お腹いっぱい。
11/12/26 01:28:47.74
ちょっとスクリプトを初めてちゃんと書いてみたので評価して欲しい。特にループ部分は他のやり方があると思う。
内容は天気表示スクリプトで使いかたは第1引数に、
URLリンク(weather.yahoo.co.jp)
などのYahooのかなり限定されたURLを打ち込んで使う。
[Bash] weather_yahoo - Pastebin.com
URLリンク(pastebin.com)
curlじゃなくてaria2cは好みで使ってみた。
一部文字もユニコードで絵文字部分を使っているのでフォントや文字コードによっては文字化けが発生多発する思います。
最初のHTMLからの行の抜き出しはハードコーディングしないほうがいいと思うけど、構造自体変わったら元も子もないし、面倒でやめてしまった。
44:名無しさん@お腹いっぱい。
11/12/26 07:58:45.68
後で使うなら別だけど、
いちいち変数に入れずに、そのままアウトプットしちゃえばいいんじゃないの?
45:名無しさん@お腹いっぱい。
11/12/26 08:52:51.00
>>43
> #! /bin/bash
出直しな。
46:名無しさん@お腹いっぱい。
11/12/26 09:05:07.67
そういえばむかし圧縮形式ごとのオプションが面倒で全部kaitoってスクリプトにしてカレントにディレクトリつくって解凍するようにしたらいいんじゃないかと思ったけど、結局オプションを覚えてしまった
47:名無しさん@お腹いっぱい。
11/12/26 09:48:59.59
>>43
#! /bin/sh
wget -O - --quiet "$1" \
| sed -n '149,163p' \
| sed -r '0~2d
s/.*>([^<]+)<.*/\1/
s/晴れ/ /
s/曇り/ /
s/弱雨/ /
s/湿雪|乾雪|みぞれ/ /' \
| tr '\n' ' ' \
| awk '{ if ($7 == $8) $8 = "〃"
if ($7 == $8) $8 = "〃"
if ($6 == $7) $7 = "〃"
if ($5 == $6) $6 = "〃"
if ($4 == $5) $5 = "〃"
if ($3 == $4) $4 = "〃"
if ($2 == $3) $3 = "〃"
if ($1 == $2) $2 = "〃"
printf "|--+--+--+--+--+--+--+--|\n\
|00|03|06|09|12|15|18|21|\n\
|--+--+--+--+--+--+--+--|\n\
|%s|%s|%s|%s|%s|%s|%s|%s|\n\
|--+--+--+--+--+--+--+--|\n", $1, $2, $3, $4, $5, $6, $7, $8}'
48:名無しさん@お腹いっぱい。
11/12/26 10:29:15.47
>>46
7zがそんな感じになってるね。
49:名無しさん@お腹いっぱい。
11/12/26 11:44:34.94
そしてlibarchive化された FreeBSD の tar もそんな感じになんでもツールに
50:名無しさん@お腹いっぱい。
11/12/26 11:52:54.12
最近のlinuxのtarもzやjやJなしで解凍してくれるよな。
まあ圧縮するときにどうせ付けないといけないから結局覚えてしまうんだけど。
51:名無しさん@お腹いっぱい。
11/12/26 23:59:53.81
>>47
前時刻と同じかどうかのチェックと出力はまとめて
|awk '{for (i=1;i<9;i++){printf "|%s",$i==tmp?"〃":$i;tmp=$i};print "|"}'
としたい気分、スレ違い失礼
52:名無しさん@お腹いっぱい。
11/12/27 02:06:11.94
あれこれ覚えられない俺的には、tarが自動で何でも伸長して展開してくれる方がありがたい
53:ss
11/12/27 06:20:47.96
URLリンク(www.nicovideo.jp)
54:名無しさん@お腹いっぱい。
11/12/30 18:26:14.20
引数のうち、-で始まるものを除いた個数を数えるにはどうすればいいでしょうか?
a.sh -a -b c d e
=> 3
55:名無しさん@お腹いっぱい。
11/12/30 18:39:18.15
>>54
#! /bin/sh
manko=0
for chinko in $@
do
if [ `echo $chinko | grep -v ^-` ] ; then
manko=`expr $manko + 1`
fi
done
echo $manko
56:名無しさん@お腹いっぱい。
11/12/30 18:52:22.91
>>55
"$@" の中に特殊記号とかスペースとか入ってたら駄目。
forとかでループしたりせずに一発でできる方法を想定してます。
57:名無しさん@お腹いっぱい。
11/12/30 18:57:38.49
n=0
for a in "$@";do
case "$a" in
-*)
;;
*)
n=`expr $n + 1`
;;
esac
done
echo $n
58:名無しさん@お腹いっぱい。
11/12/30 18:58:18.36
> forとかでループしたりせずに一発でできる方法を想定してます。
ねーよ。
59:名無しさん@お腹いっぱい。
11/12/30 18:59:04.62
何でfor文周りたらいかんのかその理由を詳しく。
sedで一文でできたとしても下のレイヤではいくらでもfor文回ってるだろうに。
60:名無しさん@お腹いっぱい。
11/12/30 20:54:28.27
>>56
そういうのはUNIX系OSとは非常に相性が悪いので、至れり尽くせりのMFCとかを使うほうが捗るよ
61:54
11/12/30 21:07:19.02
>>57さんのを使わせてもらいます。ありがとうございます。
ちなみに>>56は別人なので。
62:名無しさん@お腹いっぱい。
11/12/30 21:09:20.57
むう。ID表示しない板ってのはややこしいな。
63:名無しさん@お腹いっぱい。
11/12/30 21:14:09.51
ていうかウンコとかチンコとかマンコとかオッパイとか、やらないか
64:名無しさん@お腹いっぱい。
11/12/30 23:59:08.23
>>56 を上司に提出したら殴られました。
なんで…
65:名無しさん@お腹いっぱい。
11/12/31 00:09:53.64
それは暴力事件かパワハラだから警察に通報したらいいと思うぞ。
66:名無しさん@お腹いっぱい。
11/12/31 06:39:40.52
なぜgetoptsを誰も利用せんの?
67:名無しさん@お腹いっぱい。
11/12/31 08:53:32.92
>>66
俺は単純なものとか、拡張する予定が無いときはつかわないなぁ
それに複雑な処理をするならば、RubyなりPerl使った方が簡単とかさ
68:名無しさん@お腹いっぱい。
11/12/31 09:07:33.56
>>67
>>66 は >>54 の場合について言ってるんだろ?
69:名無しさん@お腹いっぱい。
11/12/31 15:02:13.88
>>66
こんな便利なものが!
getoptsを利用すれば、そもそも -で始まるものを除いた個数を数える必要もない
ことがわかりました。これで行きます。
まさに、forとかでループしたりせずに一発でできる方法ですね。
70:名無しさん@お腹いっぱい。
11/12/31 15:39:18.97
>69
71:名無しさん@お腹いっぱい。
11/12/31 15:44:42.43
チンコもマンコも使わなくていいって事ですね。
でもちょっと寂しいです。
72:名無しさん@お腹いっぱい。
11/12/31 16:46:43.68
>>68
おおッ。気付いてませんでした
73:名無しさん@お腹いっぱい。
11/12/31 16:54:05.71
getopts使ってもループは要ると思うが…
74:名無しさん@お腹いっぱい。
12/01/06 01:39:38.05
あるプロセスを起動して、その標準出力から100行分の入力をもらったら、
そのプロセスを自動的に殺すようなスクリプトは書けますでしょうか?
または、あるプロセスを100秒だけ起動して、その後自動的に強制的に殺すこと
は可能でしょうか。
75:名無しさん@お腹いっぱい。
12/01/06 02:49:26.47
>>74
>あるプロセスを起動して、その標準出力から100行分の入力をもらったら、
>そのプロセスを自動的に殺すようなスクリプトは書けますでしょうか?
あるプロセス | head -n 100
でいいんでねえの?
>または、あるプロセスを100秒だけ起動して、その後自動的に強制的に殺すこと
>は可能でしょうか。
あるプロセス &
sleep 100
kill -9 あるプロセスのプロセスID
でいいんでねえの?
76:名無しさん@お腹いっぱい。
12/01/06 07:22:26.85
>>75
$! 使えよ
77:名無しさん@お腹いっぱい。
12/01/06 13:58:48.37
>>75
上の方法はあるプロセスが101行目を出力しようとするまで生きてないか?
78:名無しさん@お腹いっぱい。
12/01/06 15:00:15.02
困るの?
79:名無しさん@お腹いっぱい。
12/01/06 15:01:39.72
もともとの仕様は満たしてないな。
困るかどうかは>>74に聞かないとわからん。
80:名無しさん@お腹いっぱい。
12/01/06 19:01:28.82
$!って、拡張機能だったかと
81:名無しさん@お腹いっぱい。
12/01/06 19:36:33.32
ボケるならもうちょっと面白いの頼む
82:名無しさん@お腹いっぱい。
12/01/06 23:10:50.34
どうせ学校の宿題だろ
そんなもん、動きゃいいんだよ
83:名無しさん@お腹いっぱい。
12/01/06 23:23:54.66
ボケてないよ。
84:名無しさん@お腹いっぱい。
12/01/07 09:35:59.68
ボケがウケなかったからって開き直らなくていいよ
85:名無しさん@お腹いっぱい。
12/01/07 10:56:05.85
>>75
ありがとうございます。
最初の問題については、たとえ延々と最初のプロセスが出力をたれ流していても、
パイプがなくなれば自動的に殺されるんですね。
後者の問題の場合、事前にプロセスIDが分からないのが問題なのですが、
シェルで、起動した命令のプロセスIDを取得する方法があるのでしょうか?
86:名無しさん@お腹いっぱい。
12/01/07 11:44:27.31
>>85
だから $! だって >>76 が回答してるだろ
87:名無しさん@お腹いっぱい。
12/01/07 15:13:56.59
>>76 も >>86 も、なぜこんな簡単なサンプルスクリプトさえ提示していただけないのでしょうか。
あるプロセス &
hoge=$!; sleep 100; kill -9 $hoge
88:名無しさん@お腹いっぱい。
12/01/07 15:30:29.18
>>87
変数が無駄だな
sleep 100; kill -9 $!
だけで桶。
あと、>>76 の回答でわからない人間にはサンプルを示しても無駄。
89:名無しさん@お腹いっぱい。
12/01/07 15:41:35.40
その $! に入ってるプロセスIDは、Sleep のものだとわかった上で言ってるのでしょうか…
90:名無しさん@お腹いっぱい。
12/01/07 15:43:03.63
>>89
わかってないのはオマエ sleepのプロセスIDは $! に入らない。
91:名無しさん@お腹いっぱい。
12/01/07 15:45:16.77
確かに、>>89 みたいなこと言ってる奴にサンプル示しても無駄だな。
正解者に間違った指摘する >>89 とかは書き込み自粛してくれ
92:名無しさん@お腹いっぱい。
12/01/07 15:49:41.76
「バッググランドで実行された」 直前のプロセスID…だろw
>>88 で桶。
93:89
12/01/07 15:55:44.03
自粛はしない。
すっげぇ数の訂正レスがついて嬉しい。ありがとう。
94:名無しさん@お腹いっぱい。
12/01/07 19:01:59.74
>>87-93
自作自演(・A・)イクナイ!!
95:名無しさん@お腹いっぱい。
12/01/07 19:02:53.77
ばーれたか
96:名無しさん@お腹いっぱい。
12/01/07 19:42:18.58
普段シェルbashとか使用しませんが
ファイルにある特定の文字でファイルを分割したいと考えています
何とか調べて
例えばkiritoriと言う文字の箇所からsample.txtを2つに分割するのに
grep -n kiritori sample.txtで行番号がわかりますので
split -ln sampl.txtによりxaa,xabの二つのファイルに分割することがわかりました
ここでお尋ねしたいのですが
grepとsplitをまとめて処理するためにはnをsplitに引き渡す方法がわかりません
どうかよろしくお願いいたします
又他の方法が有りましたらお教えください
97:名無しさん@お腹いっぱい。
12/01/07 20:12:54.18
sed '1,/kiritori/{ w xaa
d
}' sample.txt > xbb
98:名無しさん@お腹いっぱい。
12/01/07 21:06:49.01
>>97
早速のレス有難う御座いました。
おかげでファイルを分割できるようになりました
cutで行番号のみ抜き出したり
sedは文字変換のみの認識しかなかったりで
にわかもんはあなたのスクリプト見ただけで
すごいなと言う感想のみです
たまには勉強します
有難う御座いました
99:名無しさん@お腹いっぱい。
12/01/08 17:43:52.18
bashのことで質問させてください。
dateでYYYYMMを取得してきます。(例:201201)
1月から9月の場合には0を消去して、YYYYMで表示させたいのです。(例:20121)
自分でも一応下のようにして出来たのですが、もっと簡単に作る方法はないでしょうか?
lm=`date "+%Y%m"`
ll=`echo ${lm}|cut -c 1-4`
mm=`echo ${lm}|cut -c 5-6`
if [ ${mm} -lt 10 ];then
mm=`echo ${mm}|sed s/0//`
fi
lm=${ll}${mm}
echo ${lm}
100:名無しさん@お腹いっぱい。
12/01/08 17:47:39.30
>>99
date +%Y-%m | sed s/-0//
101:名無しさん@お腹いっぱい。
12/01/08 17:49:53.71
>>100
それ、10月以降が駄目だろw
date +%Y%m | sed 's/-0//; s/-//'
102:名無しさん@お腹いっぱい。
12/01/08 17:51:50.20
>>100-101
自演乙 おちつけ
date +%Y-%m | sed 's/-0//; s/-//'
103:名無しさん@お腹いっぱい。
12/01/08 17:58:24.55
>>100-102
おぉ、もう返答が。
そうか、消したい0の前に何か付け足すことで限定すれば良いんですね。
ありがとうございました。
104:名無しさん@お腹いっぱい。
12/01/08 18:03:08.42
>>99
せっかくbashならdateコマンド以外、内部コマンドだけでもできるよ。
a=($(date +'%Y %m'))
echo ${a[0]}${a[1]#0}
105:名無しさん@お腹いっぱい。
12/01/08 18:57:49.32
month=`date +%m`
case $month in
0?) month=${month##0} ;;
esac
lm=`date +%Y$month`
or if you are using GNU date
date +%Y%-m
106:名無しさん@お腹いっぱい。
12/01/08 19:15:43.51
bash環境ならGNU dateだろうし、
>>105 最終行の
date +%Y%-m
が最適解だな。
ところで、>>105 前半のcase文は意味ない。場合分けせずに ${month#0}だけでよい。
107:名無しさん@お腹いっぱい。
12/01/08 19:52:34.83
>>99です。
man dateで>>105さんのやり方がしっかり書いてありました…
お恥ずかしい。
皆様ありがとうございます。
108:名無しさん@お腹いっぱい。
12/01/08 22:51:02.00
いいね、これ。
今まで expr で 0 を消してた。
109:名無しさん@お腹いっぱい。
12/01/09 08:29:51.48
exprで0消しならこうか
echo $(date +%Y)$(expr $(date +%m) + 0)
110:名無しさん@お腹いっぱい。
12/01/09 08:53:59.96
あるいは
expr `date +%m` : "0\?\(.\+\)"
111:名無しさん@お腹いっぱい。
12/01/09 09:00:41.79
先頭に0が付いてると数値演算でハマることがあるよね
$ echo $((08+0))
-bash: 08: value too great for base (error token is "08")
112:名無しさん@お腹いっぱい。
12/01/09 09:08:48.76
>>111
シェルの算術式とかでは頭の0は8進数扱いだからな。
exprなら8進数とはみなさないので、expr 08 + 0 とかやって0を消すのは常識テクニック。
113:名無しさん@お腹いっぱい。
12/01/13 10:37:37.37
質問させてください。
sed -e "s/ //g" temp.txt
↑ここに/(スラッシュ)を含む文字列を入れたいときはどうしたらいんですか?
114:名無しさん@お腹いっぱい。
12/01/13 10:46:55.51
sed -e "s/ /\//g" temp.txt
115:名無しさん@お腹いっぱい。
12/01/13 11:12:47.98
sed -e "s@ @/@g" temp.txt
>>114のようにするか、区切り文字を"/"から"@"とかの他の文字に変える
純粋なsedの話しなのでスレち
スレリンク(unix板)
116:名無しさん@お腹いっぱい。
12/01/19 17:43:20.44
solarisのfindで、yyyymmddHHMMSS形式のディレクトリ一覧から、任意の日付以降のディレクトリを対象としてtarファイル化処理を実行したいと考えています
中間ファイルを作ってディレクトリ名と日付の比較を行なっての処理は一応出来たのですが、出来ればfind xargsで一発で出来る形にしたいです
中間ファイル無しで上記のような処理は実現できるでしょうか?
117:名無しさん@お腹いっぱい。
12/01/19 17:54:34.58
>>116
yyyymmddHHMMSS形式なら単純な数値と考えて大小比較すればいいね。
比較するのに中間ファイルは要らない。
118:名無しさん@お腹いっぱい。
12/01/19 18:05:56.97
>>117
エスパーカが足りないなw
中間ファイルは条件にマッチしたディレクトリリストのファイルかと
tarじゃなくてcpioなら Solaris findの -cpioオプションで一発かな
119:名無しさん@お腹いっぱい。
12/01/19 18:35:22.45
該当するディレクトリのタイムスタンプがディレクトリ名と同じになっていれば -newer のたぐいが使えるのでは?
120:名無しさん@お腹いっぱい。
12/01/19 18:52:00.33
>>119
-newer のたぐいはまさに中間ファイルが必要ですが
121:名無しさん@お腹いっぱい。
12/01/19 18:56:59.65
一番古い対象ディレクトリを指定すればOKじゃないかな。
122:名無しさん@お腹いっぱい。
12/01/19 19:01:28.69
最初の質問の中間ファイルを使う処理をスクリプトのまま書き込んだ方が話が早いと思うが…
どんな内容の中間ファイルをどのような目的で作成しているのか
それがわかれば回答する側もエスパーにならなくていいからね
123:名無しさん@お腹いっぱい。
12/01/19 19:02:52.93
皆さんの書き込みをヒントに自己解決しました。ありがとう。
124:名無しさん@お腹いっぱい。
12/01/19 19:04:30.79
>>123
どうやって?
125:名無しさん@お腹いっぱい。
12/01/19 23:32:23.93
このファイルからランダムで1行だけ選択して
/home/my/st/1.txt
1 暑い
2 寒い
3 少し暑い
4 少し寒い
5 すごく暑い
6 すごく寒い
/home/my/st/2.txtに書き込ませたいですのですがどう書けば良いでしょうか?
126:名無しさん@お腹いっぱい。
12/01/19 23:50:32.46
cat 1.txt | shuf | head -1 > 2.txt
127:名無しさん@お腹いっぱい。
12/01/19 23:57:33.44
>>126
わお
そんなに短く出来るんですね
感謝です!!
128:名無しさん@お腹いっぱい。
12/01/20 00:02:25.13
shuf なんてコマンドあるんだ… ひとつ知識がふえた。ありがとう。
調べたらこんな感じにもできそうだった。
shuf --rndom-source=1.txt -o 2.txt
129:名無しさん@お腹いっぱい。
12/01/20 00:34:25.58
こう使う。
--random-source=/dev/random
--random-source=/dev/zeroで試してみて
130:名無しさん@お腹いっぱい。
12/01/20 01:03:57.15
Perlの本に、1行ずつ入力を読んで、ランダムな1行を残す方法が載ってたな。
全行シャッフルとかしなくていいのがメリットだとか。
perl -ne '$result = $_ if rand($.)<1; END{print $result}'
131:名無しさん@お腹いっぱい。
12/01/20 01:24:54.34
負担が軽いのが一番良いしそれが一番難しい
132:名無しさん@お腹いっぱい。
12/01/20 06:30:44.02
>>126
catもパイプも無駄だな。
shuf -n 1 < 1.txt > 2.txt
133:名無しさん@お腹いっぱい。
12/01/20 08:44:30.17
最初のリダイレクトも不要であろう…
134:名無しさん@お腹いっぱい。
12/01/20 11:04:53.93
shuf って GNU だけだよね?
135:名無しさん@お腹いっぱい。
12/01/20 13:37:16.04
グニュー特選隊
136:名無しさん@お腹いっぱい。
12/01/20 13:55:53.73
>>134
POSIXにはない
137:名無しさん@お腹いっぱい。
12/01/20 19:02:11.53
比較的最近のcoreutilsから
へどらとかならあるんじゃね?
138:名無しさん@お腹いっぱい。
12/01/20 19:09:47.87
いやいや、5年くらい前からあるよ。
139:名無しさん@お腹いっぱい。
12/01/20 19:11:08.12
5年が最近なんだろう。
140:名無しさん@お腹いっぱい。
12/01/20 19:58:46.80
バグ出し終わるまで3年は寝かせるよな
141:名無しさん@お腹いっぱい。
12/01/20 22:33:57.03
ファイルからランダムに1行取り出すのにshufを使うのは
大手SIerじゃ5年前から常識だな
142:名無しさん@お腹いっぱい。
12/01/20 23:18:45.09
shufはcoreutils 6.0(2006-08-15)からみたいだね。
143:名無しさん@お腹いっぱい。
12/01/20 23:39:27.25
改行区切りのテキストを、コマンドの引数で渡すために、コンマ区切りにしようとこう書いた
A="`cat list.txt |tr -s \\n , |head -c -1`"
でもこれだとnが,に置換される。\\nを'\n'にすればいけたけど、バッククオートの中のエスケープって何回評価されるの?
144:名無しさん@お腹いっぱい。
12/01/21 00:28:29.06
つ echo "\\n"
\n
145:名無しさん@お腹いっぱい。
12/01/21 01:02:25.99
ログインするシェルってどうかいたらいいんでしょうか?
ユーザーアカウント名とパスワードを自動で入れてログインしたいのですが
146:名無しさん@お腹いっぱい。
12/01/21 02:12:35.16
>>143
URLリンク(linuxjm.sourceforge.jp)
A="$(cat list.txt |tr -s \\n , |head -c -1)"
147:名無しさん@お腹いっぱい。
12/01/21 07:43:37.27
>>143
とりあえずcatが無駄。
バッククオートの中のバックスラッシュは特殊な意味を持つので、
2回評価されると考えとけばいい。
この例ではバックスラッシュ3回で回避できる。
>>146
$( )使っちゃ駄目よ。
148:名無しさん@お腹いっぱい。
12/01/21 08:02:20.86
俺も cat でファイル読む人なんだが、
なぜ cat をわざわざ付けるかと言うと、
自分が作る全てのスクリプトや打ち込むコマンドで
ファイルを読む際には必ず cat で読む
と統一する事で、ミスる可能性を減らしてるつもり。
客に納品するスクリプトでは仕方なく削るけど。
元々のきっかけは 20 年程前に tar でファイル消してしまったことだった。
149:名無しさん@お腹いっぱい。
12/01/21 08:09:55.16
無駄なcatを入れないのは大手SIerじゃ常識だね。
150:名無しさん@お腹いっぱい。
12/01/21 08:51:51.18
コンピュータ的には無駄だが人間的には無駄ではない。
コメントの様な物だ。
151:名無しさん@お腹いっぱい。
12/01/21 08:55:23.20
cat file | コマンド
の順に書きたいというだけの理由なら、
< file コマンド
と書けば良い。
152:143
12/01/21 09:25:54.14
>>146
凄く参考になった。ありがとう
> バッククォートを使う古い形式の置換を用いたとき、バックスラッシュは文字通りの意味を保ちます
> が、 $, `, \ の前にある場合は例外となります。バックスラッシュが前置されていないバッククォートが
> あると、そこでコマンド置換は閉じられます。 $(command) という形式を用いたときは、括弧の間にある
> 全ての文字がコマンドとなります。特別扱いされる文字はありません。
`cmd`と$(cmd)の2つの形式で意味(処理?)が違うなんて知らなかった
> コマンド置換は入れ子にできます。バッククォート形式の時に入れ子を行うには、
> 内側のバッククォートをバックスラッシュでエスケープします。
入れ子にするときは2つの形式を組み合わせて書いてたから、これも気が付かなかった
特殊扱いの文字が$(cmd)形式ではないなら、cmdの中に)がある場合\でエスケープはできないってことか
>>147
評価回数について、ありがとう。最小3つ並べる必要があるのか
cat使っているのは、前処理があってパイプを使っているという意思表示
ときどきシーク可能か否かで挙動が変わるプログラムもありますし
153:名無しさん@お腹いっぱい。
12/01/21 10:01:25.74
>>147
> $( )使っちゃ駄目よ。
爺さんや、Solarisでも/bin/shはkshになりましたよ。
というわけでもういいんじゃないか。テンプレもそろそろ修正どき。
154:名無しさん@お腹いっぱい。
12/01/21 10:17:31.18
>>151
正直、その書き方は知らなかった。
155:名無しさん@お腹いっぱい。
12/01/21 10:26:19.10
>>148
同じ様な経験から自分と似たような対処している全然知らない人の存在を知ると、何か和むなぁ
156:名無しさん@お腹いっぱい。
12/01/21 10:28:50.43
$( )を使わないのは大手SIerじゃ常識だね。
157:名無しさん@お腹いっぱい。
12/01/21 11:57:08.26
>>148
なんかずれてる気がする
158:名無しさん@お腹いっぱい。
12/01/21 12:16:06.97
>>148
tar xvf と tar cvf を間違えたって話か?
ふつーあらかじめ chmod -w hoge.tar やっておくから消すことはありえない。
159:名無しさん@お腹いっぱい。
12/01/21 12:33:47.90
sudo tar cvf ~ なんてしちゃったり
160:名無しさん@お腹いっぱい。
12/01/21 13:25:25.15
ftpmailで取得してた20年前じゃあるまいし、tarなんか消しちゃっても全然問題ないだろ。
161:名無しさん@お腹いっぱい。
12/01/21 13:29:30.84
tar cvf aaa.tar bbb ccc
とやろうとして
tar cvf bbb ccc
とかやって、bbbを消しちゃったってことかな
162:名無しさん@お腹いっぱい。
12/01/21 13:32:21.94
あぁ、もともとのきっかけは20年前か… ftpmailあり得るな。
163:名無しさん@お腹いっぱい。
12/01/21 14:11:25.85
>>161
>>146 では「ファイルを読む際には必ずcatで読む」て言ってるから、
tar xvf の時の話かと。
164:148
12/01/21 23:40:04.95
>>158
> tar xvf と tar cvf を間違えたって話か?
それそれ。
165:名無しさん@お腹いっぱい。
12/01/22 00:51:01.40
俺も先頭にcat付ける派。
cat foo | cmd1
で、cmd1の前に前処理やりたくなった時、
cat foo | cmd0 | cmd1
と書き換え簡単。
cmd1 fooをcmd0 foo | cmd1にするのは語順置き換えがある。
transpose-wordするのは空白入り"文字列やオプション指定があるとちょっと面倒。
ファイル名をひとつしか指定できないバカコマンドで、
2つ指定したくなった時にイラっとくるから、などの理由。
166:名無しさん@お腹いっぱい。
12/01/22 01:25:14.86
俺はcatつけないな。後段のコマンドにもよるけど、
ファイルがないなどのエラーを捕捉し損ねる可能性があるから。
167:名無しさん@お腹いっぱい。
12/01/22 06:46:04.29
むかし、cat foo | sed をここで書いて叩かれた思い出。
168:名無しさん@お腹いっぱい。
12/01/22 08:04:14.62
>>165 は >>151 読んでないだろw
cat foo | cmd1 ではなく、
< foo cmd1 とする。(いつもこう書く癖を付けておく)
で、cmd1の前に前処理やりたくなった時、
< foo cmd1 | cmd2
と書き換え簡単。
以上で、catを無駄に使う理由がなくなる。
169:名無しさん@お腹いっぱい。
12/01/22 09:05:11.75
scshっていうシェル思い出しわ
(| (< foo cmd1) cmd2)
とかって書くやつ
170:名無しさん@お腹いっぱい。
12/01/22 10:15:08.87
>>168
流れが一方向ではないので理解しづらい。
そもそも<禁止ルールがある場合もある。
171:名無しさん@お腹いっぱい。
12/01/22 10:19:18.34
> <禁止ルール
俺ルールでは禁止って後だしで言われてもなあ。 w
172:名無しさん@お腹いっぱい。
12/01/22 10:30:20.87
>>170
良く見ろ。流れは一方向だぞ。
流れを一方向にするために、
com1 < file | com2
を
< file com1 | com2
と並べ変えたんだが。>>170 は良く読んでなさそうだなw
173:名無しさん@お腹いっぱい。
12/01/22 11:00:43.73
知識の浅い上司に、直されることはある。
初心者でも読めるように cat から始めろ。
実績がないから cat から始めろ。
俺流を通す無能な上司を説得する方法も教えろください。
174:名無しさん@お腹いっぱい。
12/01/22 11:05:03.14
>>168
> で、cmd1の前に前処理やりたくなった時、
> < foo cmd1 | cmd2
逆じゃね?
175:名無しさん@お腹いっぱい。
12/01/22 11:16:14.22
後付けで無能な上司という制約条件だされてもなあ。そんなとこ辞めれば? w
176:名無しさん@お腹いっぱい。
12/01/22 11:16:49.44
>>174
で、cmd1の前に前処理やりたくなった時、
< foo cmd0 | cmd1
かな
177:名無しさん@お腹いっぱい。
12/01/22 11:22:49.70
いや、後付けじゃなくて便乗なんだけどね…
178:名無しさん@お腹いっぱい。
12/01/22 11:30:36.38
catなんてあんたのような無能かつ無用な上司。そんなプロセスは必要ないでしょ。
179:名無しさん@お腹いっぱい。
12/01/22 11:38:12.78
kill -9 >>178 > /dev/null 2>&1
180:名無しさん@お腹いっぱい。
12/01/22 11:43:57.77
何でもいいけど
引用レスの最初に入力リダイレクト書くと顔文字みたい > <
181:名無しさん@お腹いっぱい。
12/01/22 12:11:08.98
>>179
2>&1とか使うくらいならcshでやれよ頭固いなあ
182:名無しさん@お腹いっぱい。
12/01/22 12:15:52.47
>>181
だって、無能上司の部下だもの。
183:名無しさん@お腹いっぱい。
12/01/22 12:19:51.88
cat >>181 | tee -a 2ch.net 2> /dev/null
184:名無しさん@お腹いっぱい。
12/01/22 12:29:22.98
じゃあ俺はcatじゃなくてdog使うわ
185:名無しさん@お腹いっぱい。
12/01/22 13:05:48.18
cshを使わないのは大手SIerじゃ常識だね。
186:名無しさん@お腹いっぱい。
12/01/22 13:16:17.54
>>168
< foo cmd1は使えない。
!<でも
!cmd1
でもhistoryを呼び出せない。
187:名無しさん@お腹いっぱい。
12/01/22 13:21:03.72
>>186
シェルスクリプトでhistoryを使う馬鹿?
188:名無しさん@お腹いっぱい。
12/01/22 13:41:56.10
>>186
全力で己の無能を告白するなよ。ドMの新しいプレーか? www
!?cmd1
で呼び出せるだろ。
189:名無しさん@お腹いっぱい。
12/01/22 14:22:29.46
cat使うと複数でも処理対象がハッキリするから好きな書き方ではある。冗長だけどね
リダイレクトじゃ複数は無理だし、多く引数を取るコマンド、特に入出力のファイル名を
どちらも引数に取れるコマンドだと、入力だけ区別して分けられる
190:名無しさん@お腹いっぱい。
12/01/22 14:45:03.84
テキストファイルだけ扱うならいいけどバイナリファイルだとcat通すと0x1dが消えたりしてファイル壊すから危険。
191:名無しさん@お腹いっぱい。
12/01/22 14:47:00.85
読み取る側から見た場合、リダイレクトならシーク可能だけど
パイプはそうではないという違いもあるよね
つまりcatが単に冗長で資源の無駄、というだけでなく
単純にcatではダメなケース(あるいは非常に非効率になるケース)が
厳然としてあるわけで、>>173の上司にはその点を訴えてみたらどうだろうか
stdout/stderrを何かに保存する目的でいずれにせよリダイレクトは使うだろうし
パイプのほうがリダイレクトより「初心者でも読める」というのは意味不明だ
なんかほんの少しでも合理的な理由があるのだろうか?
192:名無しさん@お腹いっぱい。
12/01/22 14:51:57.61
>>189
バカな習慣を必死に言い訳すんなよ。羞恥プレー続行中か? w
複数ファイルを引数に取るのはどうすんだよ。
for f in $files ; cat $f |file -;done
こうか? スゲーぜ。 www
193:名無しさん@お腹いっぱい。
12/01/22 15:31:48.18
>>192
fileは普通標準入力から読み込ませることはしないだろ?シェルスクリプトで使うこと前提だぞ、スレ的に
194:名無しさん@お腹いっぱい。
12/01/22 15:36:47.44
>>190
何それ?
分割したバイナリを合体させるのに普通にcat使えるでしょ
catってfile結合コマンドだよ
195:名無しさん@お腹いっぱい。
12/01/22 16:05:46.12
>>191
ありがとう。
機会ができたら、訴えてみる。
「初心者でも」っていうのは、ちょっとニュアンスが伝えにくいんだけど…気にしないで大丈夫です。
展開の順序とか考えず、コマンドを並べるならなんでもかんでもパイプを通せばいいじゃんって
新人とかへ教えるのが楽だから、そういう(ローカルな)文化になってるのかも。
196:名無しさん@お腹いっぱい。
12/01/22 16:13:11.56
>>193
「ヒストリー使えないからダメ」とか言い出したのはやっぱり羞恥プレーか?
まあ、それは置いとくとして、「入力ファイルを区別できるからからcatして
パイプから流し込む」と言い出したバカをからかってるだけだよ。
入力ファイルは引数から渡した方が、
1 名前を渡せる。
2 シークも可能。
と、明らかに有利。
catはその名の通りファイルを結合する場合に使用する。
恥さらしな習慣の見苦しい言い訳まだ続ける?
197:名無しさん@お腹いっぱい。
12/01/22 16:59:14.69
世の中には、cat = catalog の略といわれて、からかわれてるのに気付かず信じるような
僕みたいなのもいるのですよ。 concatenate なんて…
198:名無しさん@お腹いっぱい。
12/01/22 17:13:08.18
>>191
リダイレクトってシーク可能だったのか、知らなかった。
でもシークできるかできないかで挙動を変えるのはプログラム側だよね?
プログラムの実装でわざわざstdinがシークできるかどうかチェックするロジックって普通実装してある?
シーク前提のプログラムはそもそも標準入力から読み込もうとしないんじゃないかな。
199:名無しさん@お腹いっぱい。
12/01/22 17:37:41.83
見苦しい言い訳をまだ続けるのか。
> プログラムの実装でわざわざstdinがシークできるかどうかチェックするロジックって普通実装してある?
お前のようなボンクラは知らないだろうが、必要ならばしている。
200:名無しさん@お腹いっぱい。
12/01/22 17:52:16.93
>>198
fstat()で簡単に判断できるから、まともなプログラムならシーク可能かどうかは
「標準入力かどうか」ではなく、stat情報で判断する
ロジック的に1パス、シークエンシャルアクセスで行ける場合でも、
wavみたいなある程度でかいバイナリストリームを処理するソフトウエアでは
不要なチャンクをシークで飛ばせるかread()が必要かでは大違いなので
特にマルチメディア系ではシークが使える場合には使うのが普通
(そうしたプログラムがパイプで標準入力を利用可能なのも普通)
201:名無しさん@お腹いっぱい。
12/01/22 18:45:46.67
>>198
ざっとbinutils、grep、awk、sedのソース漁ってみてが、無いな
202:名無しさん@お腹いっぱい。
12/01/22 18:50:17.20
>>201
ボンクラがメクラ撃ちしたって当たらないって事の証明だな。
オレは一発でtailを見つけたが。w
lessもおそらくやってる。
203:名無しさん@お腹いっぱい。
12/01/22 19:00:26.75
wc -c 1GB_file # 一瞬
< 1GB_file wc -c # 一瞬
cat 1GB_file | wc -c # 時間かかる
204:名無しさん@お腹いっぱい。
12/01/22 19:51:25.77
>>203
これは俺にとって cat やめる理由になるな。
逆に言えばここまで出てきた書き込み程度ではあまり cat やめる気がしない。
でも何故だろうな。wc はソースしっかり読んだのに気が付かなかったなあ。
205:名無しさん@お腹いっぱい。
12/01/22 20:02:12.51
色んなシステムの様々なシェルスクリプトで共通的に関数を使いたいときって、どういう方法が
効率がよいだろう
・.profileとかで共通関数を定義する
・共通関数だけのスクリプトを作ってセットで使う
・がんばってシェルスクリプトに埋め込んでいく
他にある?
206:名無しさん@お腹いっぱい。
12/01/22 20:10:17.98
>>190
> バイナリファイルだとcat通すと0x1dが消えたりしてファイル壊すから危険。
どこのcat?
207:名無しさん@お腹いっぱい。
12/01/22 20:11:46.67
>>205
ふつうはファイル別にしてsourceする。
208:名無しさん@お腹いっぱい。
12/01/22 20:12:38.04
>>205
その 2 番目は source で読み込むという意味でOK?
. functions.sh
209:名無しさん@お腹いっぱい。
12/01/22 22:52:35.96
>>200
なるほどね。確かにfstatだと区別できる。とても参考になった
特に前に戻るシークしか考えてなかったから、後半はその通りだわ。酷いレベルで気付かなかった
210:名無しさん@お腹いっぱい。
12/01/22 23:23:48.64
システムコールのマニュアルは全部読んどくといい。
全部読んでも大した量じゃないから。
211:名無しさん@お腹いっぱい。
12/01/23 00:18:56.40
>>203
wcに似たプログラムを自分で作ったことがあるんだけど、wcの方が処理が速いわけ
んでなぜwcの方が速いのかソースを調べたことがある。すげえ勉強になったよ
212:名無しさん@お腹いっぱい。
12/01/23 01:08:55.19
>>207
>>208
そうさね
現状は、sourceで読み込ませてる
で、今は共通関数をfunctions.shとしてマージして使ってるんだが、対象システムで
使われてない関数も一緒になってるんで、サイズが無駄に大きくなってる
しゃあねえのかなぁ
213:名無しさん@お腹いっぱい。
12/01/23 01:33:25.92
適切に分割して必要な分だけ読み込ませりゃいいじゃないか。
214:名無しさん@お腹いっぱい。
12/01/24 00:19:15.61
シェルスクリプトの中で一行でpsql発行したいんだけどどう書けばいいかな
postgresユーザに切り替えてからpsqlでselect文(time列から現在時刻の一ヶ月前からのデータだけをとる)
叩きたいんだけど
TIME=1
sudo su - postgres -c 'psql -d データベース名 -c "select time from データベース名 where time > current_timestamp + '-${TIME} months';"'
どうにもうまくいかない…ファイルとかにsql書いてやるのじゃなくて1行でやりたいんだけど。。
215:名無しさん@お腹いっぱい。
12/01/24 01:28:32.12
sudo su - postgres -c 'psql -d データベース名 -c "select time from データベース名 where time > current_timestamp + '"'-${TIME} months';\""
かなぁ
216:名無しさん@お腹いっぱい。
12/01/24 07:25:52.83
postgresユーザーで実行するコマンドをスクリプトにしておいて、そのスクリプトをsuで実行すればいいだけ
>>ファイルとかにsql書いてやるのじゃなくて1行でやりたいんだけど。。
意味不明。
217:名無しさん@お腹いっぱい。
12/01/24 08:10:02.57
>>215
ありがとうやってみる。
>>216
別ファイル?にして呼び出すということでしょうか。すみません初心者なので
218:名無しさん@お腹いっぱい。
12/01/24 09:34:29.11
PGUSER=postgres
PGPASSWORD=xxxx
export PGUSER PGPASSWORD
pgsql -d foo -A -q -c "SELECT * FROM hoge";
こんな感じでいけるんじゃないの?
219:名無しさん@お腹いっぱい。
12/01/24 10:45:42.00
select文の中で不等号と変数を使いたいんだ
そこがわからない
220:名無しさん@お腹いっぱい。
12/01/24 11:04:18.96
zshの話?どこに使いたいの?
221:名無しさん@お腹いっぱい。
12/01/24 11:09:52.37
>>214
postgresのselect文の構文は知らないので、↓
select time from データベース名 where time > current_timestamp + '-1 months';
このselect文が正しい結果を返すと仮定して、
>どうにもうまくいかない…ファイルとかにsql書いてやるのじゃなくて1行でやりたいんだけど。。
この「どうにもうまくいかない」ときに、sudo su ... コマンドから
どのようなエラーメッセージが出されているのかを具体的に教えください。
222:名無しさん@お腹いっぱい。
12/01/24 11:12:29.95
ああごめん219は218へのレスです。
bashです。
223:218
12/01/24 11:18:56.48
>>222
例えばMovableTypeへのアクセスだけど、これでいけたけど
psql -d foo -A -q -c "SELECT log_id,log_created_on FROM mt_log where log_created_on > current_timestamp + '-${TIME} month';"
224:名無しさん@お腹いっぱい。
12/01/24 12:06:10.33
su: option requires an argument -- c
Try `su --help' for more information.
months > chg_date;': -c: line 0: unexpected EOF while looking for matching
`''months > chg_date;': -c: line 1: syntax error: unexpected end of file
225:名無しさん@お腹いっぱい。
12/01/24 12:11:56.62
上記のような感じです
TIME=1
sudo su - postgres -c "psql -d データベース名 -c 'select time from テーブル
名 where current_timestamp + "-$TIME months" < time;'"
実行したのはこれです
226:名無しさん@お腹いっぱい。
12/01/24 12:17:14.76
>>225
ダブルクォートの中で素のダブルクォート使っちゃ駄目。
そこでクォートが終了して別引数とみなされて su 側でエラーになってる。
227:名無しさん@お腹いっぱい。
12/01/24 12:17:51.07
>>223
ユーザーを切り替えてからやるにはうしたらよいのでしょうかと
228:218
12/01/24 12:52:46.68
>>227
postgres(root)でデータベースの実行をしたいだけだよね?
それを >>218で書いているわけだけど、それとも私が勘違いしているのかな
229:名無しさん@お腹いっぱい。
12/01/24 13:03:41.37
/path/to/doit
------------------
#/bin/sh
TIME=1
psql -d データベース名 -c "select time from テーブル名 where current_timestamp + '-$TIME months' < time;"
------------------
# sudo su - postgres -c /path/to/doit
230:名無しさん@お腹いっぱい。
12/01/24 13:12:38.92
228さんごめんなさい
僕が勘違いしているのだと思います
教えていただいた方法でやってみます
231:名無しさん@お腹いっぱい。
12/01/24 14:36:27.74
教えていただいた方々ありがとうございました
228さんの方法で問題なくできました!
232:名無しさん@お腹いっぱい。
12/01/25 22:21:21.41
total_size=`fdisk -l $device | grep Disk | awk '{print $5}'`
$deviceには/dev/sdbとか
このスクリプトをsudoで動かすと、total_sizeが空
rootになって実行すると、容量の数字が入ります。
どうして?
233:名無しさん@お腹いっぱい。
12/01/25 23:47:33.70
PATHが通ってない。
234:232
12/01/26 12:25:23.62
>>233
PATHなの?
235:名無しさん@お腹いっぱい。
12/01/26 12:35:38.39
sudoってその辺の環境変数再設定しなかったっけ
236:名無しさん@お腹いっぱい。
12/01/26 20:01:15.66
>>232
sudoの中で変数に代入しても、sudoを抜けたら元のシェルの変数には入ってないよw
と、ボケておこう。
237:名無しさん@お腹いっぱい。
12/01/26 20:31:33.86
それボケなん?
238:232
12/01/27 12:23:26.54
>>236
sudoを抜けてないんですが
239:名無しさん@お腹いっぱい。
12/01/27 13:27:36.89
やったことをもうちょい詳しく。
240:名無しさん@お腹いっぱい。
12/01/27 15:10:58.95
つ total_size=`sudo fdisk -l $device | grep Disk | awk '{print $5}'`
241:名無しさん@お腹いっぱい。
12/01/27 19:32:43.61
>>232
$ cat ./test.sh
#!/bin/sh
device=/dev/sda
total_size=`fdisk -l $device | grep "Disk $device" | awk '{print $5}'`
echo $total_size
$ sudo ./test.sh 2> /dev/null
21474836480
242:232
12/01/28 21:12:44.61
すいません、遅くなりました
~$ cat mksd.sh
#! /bin/sh
device=$1
echo $device
total_size=`fdisk -l $device | grep Disk | awk '{print $5}'`
echo "total_size = $total_size"
~$ sudo ./mksd.sh /dev/sdb
/dev/sdb
total_size =
~$ su
パスワード:
# ./mksd.sh /dev/sdb
/dev/sdb
total_size = 3904897024
です
243:232
12/01/29 08:51:14.17
>>241
あれ、すいません見てませんでした
~$ cat mksd.sh
#! /bin/bash
device=$1
echo $device
total_size=`fdisk -l $device | grep Disk | awk '{print $5}'`
echo "total_size = $total_size"
size=$[$total_size / 2]
echo $size
saito@ubuntu:~$ mksd.sh /dev/sdb
mksd.sh: command not found
saito@ubuntu:~$ ./mksd.sh /dev/sdb
./mksd.sh: line 9: /2: syntax error: operand expected (error token is "/2")
~$ su
パスワード:
# ./mksd.sh /dev/sdb
/dev/sdb
total_size = 3904897024
1952448512
なぜ、こうなるんでしょうか?
244:名無しさん@お腹いっぱい。
12/01/29 09:09:10.62
>>243
面倒だから /proc/partitions の方使えよ。こっちならroot権限要らん。
1kバイトのブロック単位だから、1024倍な。
引数は /dev/sdaじゃなく、sdaだけで指定する。
grep/awkとか使わずに内部コマンドだけで組んでみた。
$ cat hoge.sh
device=$1
while read x x blocks name && [ "$name" != "$device" ]
do :; done < /proc/partitions
total_size=$((blocks*1024))
$ ./hoge.sh sda
1000204886016
245:243
12/01/29 11:28:34.42
>>244
ありがとう、ございます。
246:名無しさん@お腹いっぱい。
12/01/29 12:12:34.09
>>243
まだやってたんだ。
envやsetの出力差分とか見ないのか?
247:名無しさん@お腹いっぱい。
12/01/30 08:01:56.00
>>242
↓の結果を比べてみる、とか。
#! /bin/sh
result=`fdisk -l /dev/sda`
echo "$result"
248:名無しさん@お腹いっぱい。
12/01/30 20:31:06.87
標準入力からデータを読み込むようなbashスクリプトを書いています。
スクリプトの途中でread -s -n 1などとして画面をポーズしたいのですが、
標準入力にデータが渡されているため画面ポーズのためのreadにもそれが読み込まれてしまい、思ったように動作しません。
一旦ファイルディスクリプタの0番をクリアすれば良いのかと思うんですが、どのようにすれば実現できるでしょうか?
念のため、画面の一時停止はsleepなどでも可能なのは分かっていますが、
今回はreadで実現したいということでよろしくお願いします。
249:名無しさん@お腹いっぱい。
12/01/30 20:35:24.72
>>248
read -s -n 1 < /dev/tty
250:名無しさん@お腹いっぱい。
12/01/30 20:51:23.68
>>249
出来ました!こんな簡単な事だったんですね。
ついでに聞きたいんですが、一旦読み込まれた標準入力のクリアとかって無理なんでしょうか?
それと/dev/ttyは移植性のある?書き方なんでしょうか。
質問ばかりですみません。
251:名無しさん@お腹いっぱい。
12/01/30 20:56:36.52
>>250
exec < /dev/tty
を実行すると、以降の行は標準入力が端末に戻るので
read -s -n 1
だけで行けるようになる。
/dev/ttyはどのOSでも移植性がある。
252:名無しさん@お腹いっぱい。
12/01/30 21:24:08.05
>>251
なるほど、そういうテクニックがあるんですね。
勉強になりました。
どうもありがとうございました。
253:名無しさん@お腹いっぱい。
12/01/31 01:12:06.63
>>251
流石に「どのOSでも」は言い過ぎではw
まあsh動く環境ならまず大丈夫だとは思うから実害はないが
254:名無しさん@お腹いっぱい。
12/01/31 06:11:03.04
>>253
いいや、「どのOSでも」OK。
反論するなら反例を挙げろや、カス。
255:名無しさん@お腹いっぱい。
12/01/31 08:01:25.65
縛りはOSだけでいいの?
じゃ MS-DOS を挙げよう。
UNIX系OS特有なんだし、少なくともPOSIXに準拠してなきゃ持ってないよ。
256:名無しさん@お腹いっぱい。
12/01/31 08:27:24.42
>>255
お前ほんとにアホだなw
MS-DOS ではシェル(スクリプト)は使えない。
257:名無しさん@お腹いっぱい。
12/01/31 08:32:02.94
>>253
もとの質問の >>249 read -s -n 1 < /dev/tty の readの -s -n オプションは
bash依存だが、/dev/ttyがOS依存なんて話は聞いたことがない。
テストスクリプトとして
----
#!/bin/sh
echo hoge > /dev/tty
----
があるとして、このスクリプトが「/dev/tty」が無いのが原因で動かないようなOSを
挙げてくれるかな。>>253 よ。まあ、無理だろうけどw
258:名無しさん@お腹いっぱい。
12/01/31 08:36:03.03
>>255
>POSIXに準拠してなきゃ持ってないよ
/dev/ttyはPOSIX以前からあるよ
259:名無しさん@お腹いっぱい。
12/01/31 08:48:05.58
>>256-258
もうほっとけ。
質問者の質問に自分では答えずに、
正しく回答した回答者に後から間違ったつっこみを入れる >>253 のようなアホは
いつの時代にも居るから。
260:名無しさん@お腹いっぱい。
12/01/31 09:28:37.54
FreeBSDでは/dev/ttyに直接アクセスしようとするまで存在しないのか。
261:名無しさん@お腹いっぱい。
12/01/31 09:39:19.39
アスペだらけのスレで「posixな」とか「シェルスクリプトが動く」などの制約を付けずに
> /dev/ttyはどのOSでも移植性がある。
と言っちゃった>>253の負け。
262:名無しさん@お腹いっぱい。
12/01/31 10:03:34.61
確かにそこだけ切り取ればWindowsも無いわな
263:名無しさん@お腹いっぱい。
12/01/31 10:05:33.60
負けは>>253じゃなくて>>251だった。
264:名無しさん@お腹いっぱい。
12/01/31 10:09:49.20
>>255
MS-DOS版の sh.exeでは /dev/tty動くぞ。sh.exe内部で解釈してるらしい。
265:名無しさん@お腹いっぱい。
12/01/31 12:57:13.51
URLリンク(cl.ly)
写真の同じやつ整理したくてこんなん書いたんだけど,
いかんせん遅い・・・
どうやったらもうちょっと早くなるかな?
266:名無しさん@お腹いっぱい。
12/01/31 13:33:07.43
>>265
遅い原因は毎回md5sumを呼んでいるから
md5sum "$@"で求めておいて、その結果に対しての処理ならそれほど遅くない
アルゴリズムもcut -d' ' -f1してsortしてuniq -dして重複ファイルのMD5だけ列挙
そのMD5でgrepすればファイル名も分かるだろ
267:名無しさん@お腹いっぱい。
12/01/31 13:39:35.46
一気にmd5取る、md5でソート、ユニークなものだけ移動。残りは重複したファイル。
ユニークなファイルのリスト
md5sum "$@" |sort -k 1 | uniq -w 32 |cut -d' ' -f 2
268:名無しさん@お腹いっぱい。
12/01/31 13:39:36.12
rsyncを--dry-runで走らせるくらいで十分、かつ速いんじゃないかと
何の検証もせず言ってみる
269:名無しさん@お腹いっぱい。
12/01/31 16:00:18.26
>>266-267
md5sumコマンド起動のオーバーヘッドより、
MD5計算時間の方がはるかに長いから、
毎回md5sumを呼んでも、ファイル名引数まとめてmd5sumを呼んでも
ほとんど改善しないよw
それより、まずはファイルサイズだけ見て、
同じファイルサイズのファイルが他にない場合は無条件でユニークなファイルとして
md5sum計算対象から除外した方がよい。
270:名無しさん@お腹いっぱい。
12/01/31 16:06:28.42
写真ファイルの同一検出ならファイル全体のmd5計算しなくても、
適当な位置で4KBくらい抜き出すのでもよさそうな
271:名無しさん@お腹いっぱい。
12/01/31 17:27:47.76
>>269
そんなところで高速化図ったんじゃねーよ。
見当はずれの言いがかり付けるって惨めだぞ。w
272:名無しさん@お腹いっぱい。
12/01/31 17:43:31.60
>>269
ソース読んでないだろwどのみちMac何だからそういう機能持ったアプリありそうだと思う。それ使った方がいい
273:名無しさん@お腹いっぱい。
12/01/31 18:01:40.88
読んだけどわからなかっただけだろ。
274:名無しさん@お腹いっぱい。
12/01/31 19:11:12.35
openって何だろうと思ったらMacにはそういうコマンドがあるのか。
275:名無しさん@お腹いっぱい。
12/01/31 19:29:02.96
で、openってなに?
276:名無しさん@お腹いっぱい。
12/01/31 20:30:08.94
$ open foo.txt
$ open -a /Application/TextEdit.app foo.txt
$ open -a /Application/Emacs.app/Contents/MacOS/Emacs foo.txt
こんなコマンド。
277:名無しさん@お腹いっぱい。
12/01/31 21:06:38.95
適当なアプリ探して、バックグラウンドでそいつを渡すわけね
278:名無しさん@お腹いっぱい。
12/01/31 21:16:36.01
openはNEXTSTEP由来でファイルやディレクトリを開くコマンド
279:名無しさん@お腹いっぱい。
12/02/01 11:43:16.32
OSXのopenコマンドは
open .
でカレントディレクトリをGUIで開かせるってのが一番使うかな
280:名無しさん@お腹いっぱい。
12/02/01 12:05:32.98
blogに書いてろ
281:名無しさん@お腹いっぱい。
12/02/01 12:58:13.47
>>269は理解できたのかな? w
282:名無しさん@お腹いっぱい。
12/02/01 16:07:29.43
md5 でなんとかなる程度なら
さいしょから samefile なり samesame でよいのでは
283:265
12/02/01 17:06:16.13
URLリンク(cl.ly)
みんなありがとう!
こうかな?
284:265
12/02/01 17:09:15.95
あ,最初で移動してたら次のmd5sumの$@がないて言われるね\(^o^)/
285:名無しさん@お腹いっぱい。
12/02/01 18:13:12.63
>>283
>>269は全然わかってないマヌケな素人だから、奴の指摘は全部無視していい。
サイズなんて調べる必要ない。
286:名無しさん@お腹いっぱい。
12/02/01 23:15:24.01
testコマンドで質問です。
man testを見てみると、以下の2つのオプションの説明があります。
1.-nオプションのところ
True if the length of string is nonzero.
2.stringオプションのところ
True if string is not the null string.
これらの違いは、何があるのでしょうか?それとも同じなのでしょうか?
出来ればサンプルスクリプトで説明していただけると助かります。
287:名無しさん@お腹いっぱい。
12/02/02 00:06:01.32
stringオプション?
288:名無しさん@お腹いっぱい。
12/02/02 00:19:26.32
>>286
直接引用しろ。うちでは等価って書いてある
289:名無しさん@お腹いっぱい。
12/02/02 01:32:54.28
シェルスクリプトの勉強をしたいのですが、
何シェルがいいですか。
290:名無しさん@お腹いっぱい。
12/02/02 01:40:36.62
これの事だな。
URLリンク(www.freebsd.org)
-n string True if the length of string is nonzero.
string True if string is not the null string.
違い
test -n $nonexistent; $? <= バグ? test -z $nonexistent; $?と矛盾する
test $nonexistent; $?
291:名無しさん@お腹いっぱい。
12/02/02 03:44:03.15
>>289
>>1
特記ない限り bourne shell ということは、それを選択すれば無難ということ。
Linux オンリーなら bash だろうけど。
292:名無しさん@お腹いっぱい。
12/02/02 06:26:43.33
>>289
そんな貴方に、Windows Power Shell。
293:名無しさん@お腹いっぱい。
12/02/02 08:40:58.52
>>290
なんだよ、矛盾するって。
294:名無しさん@お腹いっぱい。
12/02/02 08:59:55.63
自分が何調べてるかを理解してないだけに見える
295:名無しさん@お腹いっぱい。
12/02/02 09:17:20.91
オペレータだけ与えるとstringと解釈するのか。エラーにしろよお。
296: 忍法帖【Lv=4,xxxP】
12/02/02 23:56:58.70
>>292
なんかUNIXのシェルより強力って書いてあるのが多いけどマジ?
297:名無しさん@お腹いっぱい。
12/02/03 10:31:06.58
「協力」の基準をどう考えるか次第でどうとでも
298:名無しさん@お腹いっぱい。
12/02/03 20:58:42.50
いま流行のステマとか
299:名無しさん@お腹いっぱい。
12/02/04 08:30:04.97
>>296
シェルそのものの機能は確かに強力だけど
肝心のコマンド資産がなさ過ぎて実用シェルとしてはなあ…
300:名無しさん@お腹いっぱい。
12/02/04 08:42:10.79
パワシェルはインタラクティブに使うとしょぼい。
301:265
12/02/04 22:16:58.57
>>284
最終的にこれで出来ました!
みなさんありがとうお(^ω^)
URLリンク(cl.ly)
302:名無しさん@お腹いっぱい。
12/02/09 07:27:17.71
遅レスだけど、PowerShellは.Netのライブラリも呼べるしWin32APIも呼べるから、Windowsのシェルとしては強力だわ
それを参考にシステムコールや動的ライブラリをロード・実行する機能を持ったシェルが作られたとしても
自分はあんまり使いたいと思わんな。そういう機能の需要と言うか必要性はあるのかどうか
303:名無しさん@お腹いっぱい。
12/02/09 14:49:30.97
PowerShellはいい加減スレ違いな気がするけれども……
その手の機能が欲しいときはぶっちゃけLL使えばよくね、と俺は思ってしまう
それよりもシェルとしては以下の点がネックで、cmd.exeに比べてすら劣る
・デフォルトでスクリプトの実行が禁止されているので配布物でのスクリプト利用は
事実上不可能
・入力リダイレクトが使えない
・オブジェクトパイプラインという一見高機能なものを備えているが、代償として
バイナリデータをパイプやリダイレクトで扱えない
最後の問題が困る。外部コマンドをパイプでチェインする場合もPowerShellが
間に割って入って無駄にテキストに変換するので、データを壊すだけでなく
多分無駄に非効率でもある
XPではそれに加えて我慢がならないほど起動が遅かった(ngen使っても)ので
遊んでみようという気にすらならなかったけど
Windows7では起動時間は我慢できる範疇になったな
304:名無しさん@お腹いっぱい。
12/02/09 16:28:39.02
>PowerShellはいい加減スレ違いな気がするけれども……
だったらgdgd書かなきゃいい
305: 忍法帖【Lv=3,xxxP】
12/02/09 16:51:38.01
>>303
>・デフォルトでスクリプトの実行が禁止されているので配布物でのスクリプト利用は
> 事実上不可能
うんこやん
306:名無しさん@お腹いっぱい。
12/02/09 22:51:58.68
質問です。
$ cat hoge
$GLOBALS['hoge']['huga']
$GLOBALShogehuga
とします。
$ grep $GLOBALS\[\'hoge\'\]\[\'huga\'\] hoge
とすると、どちらの行も引っかかってしまいます。
$GLOBALS['hoge']['huga']
だけ引っかけたいのですが、どうすればよいでしょうか、ご教示ください。
307:名無しさん@お腹いっぱい。
12/02/09 23:03:56.62
$ grep "\$GLOBALS\['hoge'\]\['huga'\]" hoge
308:名無しさん@お腹いっぱい。
12/02/09 23:05:25.02
grepに食わせるべきパターンが $ [ ] をエスケープした
¥$GLOBALS¥['hoge'¥]¥['huga'¥]
なので、これをシェル的にクォートする必要がある。
シングルクォートでがんばるなら
'¥$GLOBALS¥['¥''hoge'¥''¥]¥['¥''huga'¥''¥]'
正規表現として解釈されることを意図していないならfgrep使えば?
とか思ったりもする。
309:名無しさん@お腹いっぱい。
12/02/09 23:42:52.43
>>306
$ grep -F "\$GLOBALS['hoge']['huga']" hoge
310:名無しさん@お腹いっぱい。
12/02/10 08:45:25.71
>303
すれ違いかもしれんが参考になった
(unix shell 人視点の評価として)
311:名無しさん@お腹いっぱい。
12/02/10 12:45:56.45
>>310
すれ違いかもしれんが
> (unix shell 人視点の評価として)
こゆとき俺はこーかく
( unix shell 人視点の評価として )
312:名無しさん@お腹いっぱい。
12/02/10 13:15:55.88
>>311
そう書くとunixから定義しないといけない
313:名無しさん@お腹いっぱい。
12/02/10 13:41:46.96
ここはunix shell人のいるスレですね。
314:名無しさん@お腹いっぱい。
12/02/10 13:46:55.14
()は空白開けなくても大丈夫だろ。{}は必要だけど。
315:名無しさん@お腹いっぱい。
12/02/10 13:47:22.31
>>307-309
grep の件、man もロクに読まない私にお力添えいただき、ありがとうございました。
m(__)m
316:名無しさん@お腹いっぱい。
12/02/13 21:53:21.26
質問です。
あるスクリプトをホームディレクトリに作ったのですが、以下の条件があります。
・他の人もそのスクリプトを実行できるようにしたい
・でもファイルの中身は他の人は見れないようにしたい。
このような場合、一般的にはどのような手法がとられるのでしょうか?
317:名無しさん@お腹いっぱい。
12/02/13 22:07:38.54
そういう無茶なことは考えない方がいい。
318:名無しさん@お腹いっぱい。
12/02/13 22:09:09.60
(chmod 0711じゃ)いかんのか?
319:名無しさん@お腹いっぱい。
12/02/13 22:20:32.11
うちにあるsudoのパーミッションが -r-s--x--x で、実際実行はできるけど
中身はみられない。適当なシェルスクリプトを作って同じパーミッションにして
みたけど、実行したらPermission deniedsetuidになってしまった。 (OSXにて)
320:名無しさん@お腹いっぱい。
12/02/13 22:21:22.41
setuidというフレーズを消しわすれてしまった。
321:名無しさん@お腹いっぱい。
12/02/14 00:05:14.25
スクリプトはインタープリターに読んでもらわないと実行できない。
そして、インタープリターは実行する人の権限で動作する。
したがって、スクリプトは実行する人が読むことができる。できなければ実行できない。
322:名無しさん@お腹いっぱい。
12/02/14 00:21:01.04
つBATCOM
323:名無しさん@お腹いっぱい。
12/02/14 01:25:34.75
なるほどぉー
324:名無しさん@お腹いっぱい。
12/02/14 06:10:33.21
じゃあコンパイルできる言語で書き直すとか
325:名無しさん@お腹いっぱい。
12/02/14 06:50:57.33
UNIXサーバーの管理をしています。
ユーザーはスクリプトの実行は禁止ですが、
最近、ユーザーでも自分のホームフォルダーにスクリプトをコピーし、
X権限をすることによってスクリプトが実行できてしまうことが判明しました。
これはOSのセキュリティーボールではないのでしょうか?
ユーザーのフォルダーではたとえX権限がされていても
実行できないようにする方法はありますか?
必要ならカーネルにバッチを当てる方法も、やもうえません。
326:名無しさん@お腹いっぱい。
12/02/14 08:28:25.69
>>325
> ユーザーはスクリプトの実行は禁止ですが、
なんか御幣のある言い方をしているようにも思えるが、つまりのところ特定コマンド
以外は実行させたくないんだろ?
であればログインスクリプトを制限がきつい奴にすれば出来る。
bash の rbash の項目の man page かググって調べろ。
.bashrc や .bash_profile などを個人で書き換えられないようにしておかないと意味が無かったりと
環境整備には手間がかかるとは思うが。
> ユーザーのフォルダーではたとえX権限がされていても
> 実行できないようにする方法はありますか?
以下を実行して↑に何の意味も無いことを学べ。
chmod 644 sample.sh
/bin/sh ./sample.sh
これ以上はスレチなのでここでの質問をクローズした上で、以上の情報を元に自分で調べるか
適切なスレに行って再質問されたし。
327:名無しさん@お腹いっぱい。
12/02/14 08:30:28.16
ネタだろ。
かまっちゃいかんよ。
328:名無しさん@お腹いっぱい。
12/02/14 08:34:56.59
ここからのコピペ
スレリンク(unix板:775-番)
329:名無しさん@お腹いっぱい。
12/02/16 01:53:58.03
mountにnoexecってなかったっけ?nodevはあったよな。
330:名無しさん@お腹いっぱい。
12/02/16 02:11:23.48
コンパイルできるシェルはありませんか?
331:名無しさん@お腹いっぱい。
12/02/16 03:11:31.80
つ URLリンク(ftpmirror.gnu.org)
332:名無しさん@お腹いっぱい。
12/02/16 15:25:59.88
だから、コンパイルできるシェルはありませんか?
333:名無しさん@お腹いっぱい。
12/02/16 15:26:22.53
ありません。
334:名無しさん@お腹いっぱい。
12/02/16 15:38:01.31
>>330
int main(){return system("シェルスクリプト本文");}
って書けばコンパイルできるよ。
C言語上での文字列改行を行なえば複数行も記述できる。
335:名無しさん@お腹いっぱい。
12/02/16 19:45:29.07
shcの事か?
336:名無しさん@お腹いっぱい。
12/02/19 20:05:22.42
初心者なんですけど、16進数のテキストデータをシェルスクリプトでバイナリ化する事はできますかね?
337:名無しさん@お腹いっぱい。
12/02/19 20:23:44.75
printf '¥x68¥x6f¥x67¥x65?n'
338:名無しさん@お腹いっぱい。
12/02/19 21:15:12.00
>>337
これがヒントなんですか??
全然理解できへん(~_~;)
339:名無しさん@お腹いっぱい。
12/02/19 21:46:07.41
echo 686f 6765 0a | xxd -r -p
340:名無しさん@お腹いっぱい。
12/02/20 02:10:00.67
/etc/rcファイルを読んでるんですけど、
全く理解できません。
しょっぱなにこれが有るんですが、
stty status '^T'
なんのためにあるのでしょうか?
rcファイルが読まれ始めるときは、^Cや^Hが設定されていないという事?
ですか?
さらに、
if [ -f /etc/rc.first ]
then
. /etc/rc.first
fi
という一文は
/etc/rc.firstが存在するならば、/etc/rc.firstを実行するという意味だと思うんですが、
-fオプションはググると
「file が普通のファイルならば真となる。」
とありましたが、普通ではないファイルって有るんでしょうか?
341:名無しさん@お腹いっぱい。
12/02/20 06:22:24.92
普通ファイルをそういう意味で捕らえるのはフレッシュ過ぎて噴いたw懐かしさがこみ上げてくるレベル
342:名無しさん@お腹いっぱい。
12/02/20 07:02:39.19
CP/Mあたりだと、普通ではないファイルを使った階層化ができなかったなw
343:名無しさん@お腹いっぱい。
12/02/20 09:07:07.89
>>340
UNIXではデータを書いたり読んだりするいわゆるファイルの他にも
OSが管理している資源やその他の物に名前をつけてファイルとして
扱うことができる。
デバイスファイルやディレクトリ、ソケット、シンボリックリンク、その他。
344:名無しさん@お腹いっぱい。
12/02/20 19:39:24.99
「普通のファイル」って訳は最近では一般的なのかね?
「レギュラーファイル」でいいんじゃないかと思うが。
345:名無しさん@お腹いっぱい。
12/02/20 19:41:36.51
>>336
「16進数のテキストデータ」はどこにあって、どういう形式なのか?
「バイナリ化」するとは具体的にどういうことか?
元の「16進数のテキストデータ」はバイナリではないのか?
Unicode文字のエスケープ表現か何かなのか?
346:名無しさん@お腹いっぱい。
12/02/20 20:17:11.46
>>344
regular fileに対する確立された訳語は「通常ファイル」じゃないか。
347:名無しさん@お腹いっぱい。
12/02/20 20:39:01.78
test -f FILE
「FILEが通常、ファイルなら真になる」
通常はファイルならば真なんですね。通常じゃない時は真にならないんですか?
348:名無しさん@お腹いっぱい。
12/02/20 21:50:38.98
ディレクトリにテストしてみれば一発やん。
test -f /etc/passwd && echo file || echo 'not file'
test -f /etc && echo file || echo 'not file'
349:名無しさん@お腹いっぱい。
12/02/20 22:05:43.26
>>347 see man test
350:名無しさん@お腹いっぱい。
12/02/20 22:38:49.99
>>347
つまんねー。矢吹先生の方が数段上。
351:名無しさん@お腹いっぱい。
12/02/22 17:59:45.94
-fのfは普通のf
352:名無しさん@お腹いっぱい。
12/02/22 18:15:44.90
testコマンド(というかそれを内蔵しているシェル)のバージョンによっては、
デバイスファイルやソケット、FIFO等でも test -f は真になる。
よって、test -fをレギュラーファイルかどうかのテストに用いてはならない。
豆な。
353:名無しさん@お腹いっぱい。
12/02/22 18:24:10.83
そんなシェルあるんだ…
354:名無しさん@お腹いっぱい。
12/02/22 20:22:31.07
なんだそれ。-e の存在意義は。
355:名無しさん@お腹いっぱい。
12/02/22 21:02:05.15
>>352
たとえばどのシェル?
356:名無しさん@お腹いっぱい。
12/02/22 21:09:08.26
ほら、ツメキリとか。
357:名無しさん@お腹いっぱい。
12/02/22 21:16:49.10
>>354
-e が追加されたのは割と最近。純正/bin/shのtestには-eがない。
358:名無しさん@お腹いっぱい。
12/02/22 22:36:40.15
ねーねー,「純正/bin/shのtest」ってナニ?
/bin/testとは別に /bin/sh の built-in コマンドがあるという主張?
359:名無しさん@お腹いっぱい。
12/02/22 22:41:11.67
何か馬鹿が湧いてきたな。反応しちゃいかんよ。
360:名無しさん@お腹いっぱい。
12/02/22 23:01:26.59
>>358 釣られてあげよう
(ba|z)sh 辺りを /bin/sh として symlink/hardlink して使ってれば built-in だわな
ash ベースでもコンパイルの仕方によっては built-in になるし
361:名無しさん@お腹いっぱい。
12/02/22 23:40:20.00
>>358-360 実は自演
362:名無しさん@お腹いっぱい。
12/02/23 00:25:07.78
純正なのに bash/zsh なの?
363:340
12/02/23 00:58:08.13
普通のファイルの意味はわかりました。
ところで
/etc/rcの先頭に
>stty status '^T'
が有るというのは、
rcスクリプトが読まれ始めるときは、sttyの設定がされてないので
rcスクリプトから実行されるプログラムの
ステータス情報をキーボードから^Tと入力すれば表示できるようにするため
に設定していると言う理解で良いでしょうか?
364:名無しさん@お腹いっぱい。
12/02/23 01:22:49.78
$ (ba|z)sh
365:名無しさん@お腹いっぱい。
12/02/23 01:37:03.64
うちのsttyにはstatusって指定できないから意味自体分からんのよな。
366:名無しさん@お腹いっぱい。
12/02/23 08:28:33.61
>>363
デフォルトの設定がユーザを混乱させるからなんじゃないかな。
> ステータス情報をキーボードから^Tと入力すれば表示できるようにするため
多分違う、^Tを入力するとカーネルに対して、「何か」をしろという指令が非同期に飛んでいく。
カーネルはユーザーの端末に対してメッセージを出すことはしない。
「何か」が何なのかは、statusなんて機能は使ったことないから知らない。
367:名無しさん@お腹いっぱい。
12/02/23 10:49:16.92
"stty status" でググるといろいろ出てくるね。
368:名無しさん@お腹いっぱい。
12/02/23 11:56:49.03
screenコマンドのstatus lineみたいな奴。
表示する方法、される内容はカーネル、端末依存。
369:名無しさん@お腹いっぱい。
12/02/23 12:09:58.01
>>367
ああ、なるほど。googleでトップに来てる
URLリンク(freebsd.g.hatena.ne.jp)
で実験して納得した。
rcの中でハングったりした時に、すかさずC-tするとどのプロセスが刺さってるかわかるんだな。
これはいい事を憶えた。
370:名無しさん@お腹いっぱい。
12/02/24 23:41:20.22
大量のメールアドレスの一部分をマスクしたい。例えば
foo.bar@example.com → foo****@example.com
ドメイン部分はそのままで、先頭3文字程度残して、残りの部分はメールアドレスの文字数が変わらないように
任意の文字で埋めたい。今は下のように変数にメールアドレスを入れて処理しているけど、ちょっと不恰好
MADR=foo.bar@example.com
MASK='*'
RC=3
DOM="${MADR##*@}"
let MC="${#MADR}"-"$RC"-"${#DOM}"-1
echo "$MADR"
echo "${MADR:0:$RC}`yes "$MASK" |tr -d '\n' |head -c"$MC"`@$DOM"
もう少し楽に処理できないでしょうか?
371:名無しさん@お腹いっぱい。
12/02/25 03:53:15.28
素直にrubyで
echo foo.bar@example.com | ruby -pe '$_.sub!(/(?<=[^@]{3})[^@]*(?=@\w+)/){|s|"*"*s.size}'
perlならもっと短くできるんじゃないかなぁ。
372:名無しさん@お腹いっぱい。
12/02/25 04:08:45.24
>>370
sedを使うのはいかが?
echo "user@example.com" | sed -e 's/\(...\).*@\(.*\)/\1...@\2/g'
ユーザ名が必ず3文字以上ならこれで良いはず。
ユーザ名が2文字以下だとそのまま出力される。
(元のスクリプトでも2文字以下ならそのままっぽいが。)
373:名無しさん@お腹いっぱい。
12/02/25 05:22:15.23
長さ保存してないじゃんそれ
374:名無しさん@お腹いっぱい。
12/02/25 06:52:42.61
>>373
あ、長さが変わらないように、か。
「長さが分からないように」と読み違えてた。すまん。
375:名無しさん@お腹いっぱい。
12/02/25 08:28:46.14
>>370 をもとに、おもにyes|trの部分を改良してみた。
不要なクォートや不要な変数も削除した。
↓
MADR=foo.bar@example.com
MASK=*
RC=3
DOM=${MADR##*@}
echo "$MADR"
echo "${MADR:0:$RC}"`echo "${MADR:$RC:${#MADR}-RC-${#DOM}-1}" | sed "s/./$MASK/g"`@"$DOM"
376:名無しさん@お腹いっぱい。
12/02/25 09:18:35.26
つーか、見るからに遅そう。
> 大量のメールアドレスの一部分をマスクしたい。例えば
千通突っ込む気にならない。
377:名無しさん@お腹いっぱい。
12/02/25 09:27:28.61
awkでやってみたよ。
RC=3
MASK='*'
echo "$MADR" | awk -F@ -vn="$RC" -vm="$MASK" '{t=substr($1,n+1,length($1));gsub(".",m,t);print(substr($1,1,n) t "@" $2);}'
378:名無しさん@お腹いっぱい。
12/02/25 09:37:42.09
速度優先ならC言語一択だろ。
標準入力から1行ずつ複数のメールアドレスを読む仕様。
gets()使うなとか、エラーチェックなしとかの突っ込みはなしな
#include <stdio.h>
#define RC 3
#define MASK '*'
int
main()
{
int i;
char buf[1024];
while (gets(buf) != NULL) {
for (i = RC; buf[i] != '@'; i++) {
buf[i] = MASK;
}
puts(buf);
}
return 0;
}
379:名無しさん@お腹いっぱい。
12/02/25 11:10:48.60
シェルスクリプトスレでなんという暴論
380:名無しさん@お腹いっぱい。
12/02/25 11:17:36.53
速度がそんなに重要じゃないからここで聞いてんのにな。
381:名無しさん@お腹いっぱい。
12/02/25 11:19:51.26
>>380
>>370
>大量のメールアドレスの一部分をマスクしたい。
速度が重要という質問ですが・・
382:名無しさん@お腹いっぱい。
12/02/25 11:20:58.69
だが正論。これをシェルスクリプトでというのはコスト高くないかな
383:名無しさん@お腹いっぱい。
12/02/25 11:21:00.66
「大量」としか言ってないじゃん。
量は多いけど時間は多少かかってもかまわないんでしょ。
384:名無しさん@お腹いっぱい。
12/02/25 11:22:45.37
たとえば退社前に処理を開始して
次の日の出社までに終わってればいい、なんてケースだと
7時間が4時間に短縮されてもあんまり意味ない。
385:名無しさん@お腹いっぱい。
12/02/25 11:52:15.99
皆さん、レスありがとう御座います
初めは>>372のように考え、どうしても長さが保存できないので何かやり方は無いかと質問しました
>>371,377
もっとさくっと書けるコマンドがあるかなと思っていたけど、やはりスクリプト言語使うしかないですか
それにしてもrubyは短く書けるんですね。今のシステムには入れていませんが勉強になります
>>375
なるほど。任意の長さの文字列を作るのにsedで置換を使う方法は思いつかなかった
それを元にすると最終的にこんな感じでしょうか?
MADR=foo.bar@example.com
MASK=*
RC=3
DOM=${MADR##*@}
MINV=${MADR:$RC:${#MADR}-RC-${#DOM}-1}
echo "$MADR"
echo "${MADR:0:$RC}${MINV//?/*}@$DOM"
これなら、外部のプログラムを呼び出さないのでそこそこ速そう
ただ、bashで動くことは確認したけど、汎用性を考えるとawkを使う>>377?
速度についてですが、何度も変換するものではないし、
寝ている間に終わればいいなと思っていたのでシェルスクリプトで十分でした
386:名無しさん@お腹いっぱい。
12/02/25 11:54:23.14
訂正:echo "${MADR:0:$RC}${MINV//?/*}@$DOM" → echo "${MADR:0:$RC}${MINV//?/$MASK}@$DOM"
387:名無しさん@お腹いっぱい。
12/02/26 01:55:24.94
Å
ヽ('A`)ノ、スーパーちんぽマン参上!!
/ ( ) \
んヘヽヽ~'
388:名無しさん@お腹いっぱい。
12/02/26 10:43:00.23
# Set shell to ignore SIGINT (signal 2), but not children; shell catches
# SIGQUIT (signal 3) and returns to single user after fsck.
trap : 2
trap : 3 # shouldn't be needed
という一文が有るのですが、
SIGINITとSIGQUITを無視(ignore)するならば
trap ' ' 2
trap ' ' 3
と言う書き方になるような気がするんですが、
:はどういう意味が有るのでしょうか?
389:名無しさん@お腹いっぱい。
12/02/26 10:55:51.64
>>388
trap '' 2 は、
親(シェル自身)も子プロセス(外部コマンド)もSIGINTを無視する。
trap : 2 は、
親(シェル自身)はSIGINTを無視するが、子プロセス(外部コマンド)はデフォルト動作に戻
る。
あと、' ' じゃなくて '' (空文字列)な。
390:名無しさん@お腹いっぱい。
12/02/26 11:23:35.81
半二重なら trap : 2、全二重なら trap : 2と trap : 3が要るんじゃねーのー
391:名無しさん@お腹いっぱい。
12/02/26 22:34:59.64
>>389
>>390
:ってヌルコマンドって奴ですか?
そうすると、
親(シェル自身)はSIGINTを無視するが、子プロセス(外部コマンド)はデフォルト動作に戻る
という解釈どうして出てくるかさっぱりなので、教えてください
お願いします
392:名無しさん@お腹いっぱい。
12/02/27 01:17:55.06
trapがそういう仕様だから。man読め。
393:名無しさん@お腹いっぱい。
12/02/27 07:26:12.43
シェルのマニュアルのtrap項目だと、指定コマンドが空文字列だと
そのシグナルを無視し、子プロセスも無視するとは書かれているけど、
これだけだとわかりにくいかも。
trapで何らかのコマンドを指定すると、それはシグナルハンドラが設定されるので、
シグナルの一般仕様により、シグナルハンドラが設定されている場合の子プロセスでは
シグナル設定はデフォルトに戻る。
よって、ダミーのシグナルハンドラを設定するために、: コマンドを指定している。
394:名無しさん@お腹いっぱい。
12/02/27 13:56:39.45
awkで複数のファイルに対して一括処理するときに変数xを初期化したいのですがうまくいきません。
何が間違っているのでしょうか?
BEGIN{x = 0}
printf("%d\n",x++)
END{x=0 }
395:名無しさん@お腹いっぱい。
12/02/27 14:04:05.23
awkがそういう仕様だから。man読め。
396:名無しさん@お腹いっぱい。
12/02/27 14:11:30.36
>>394
BEGIN{}等は使わない
↓
#!/bin/awk -f
FNR==1{x=0}
{printf("%d?n",x++)}
397:名無しさん@お腹いっぱい。
12/02/27 15:17:34.24
>>391
":"がnull commandなのは先頭語に出てきた場合だけ。
trapが第一引数の":"をどう解釈しようと自由。
ただnull commandからの類推で「無視するが~」としただけ。
398:名無しさん@お腹いっぱい。
12/02/27 15:22:42.53
>>397
ちがうよ。
trapは、第1引数を改めてコマンドとして解釈する(2回解釈する)ので、
結局 : は先頭に出てきたのと同じで、null command として解釈される。
(eval : の場合と似てる)
trapが:を特別に解釈しているわけではない。
たとえば、trap true 2 って書いても trap : 2 と同じ。
399:名無しさん@お腹いっぱい。
12/02/27 15:54:02.25
むしろ特別に扱っているのは""の方。
これでSIG_IGNにすることになってる。
400:名無しさん@お腹いっぱい。
12/02/27 23:12:06.60
awkのフィールド分割的なことやるのに
while read hoge hage ; do
:
done <file
とかよくやるけど、1行の文字列を分割しようとして
echo "hoge hage" | read hoge hage
ってやってみても、$hoge にも $hage にも何も入らない
なんで?
401:名無しさん@お腹いっぱい。
12/02/27 23:28:41.94
そういう仕様じゃないから
402:名無しさん@お腹いっぱい。
12/02/27 23:29:53.91
kshだとできるよ。
403:名無しさん@お腹いっぱい。
12/02/27 23:31:57.84
echo "hoge hage" | {
read hoge hage
echo hoge=$hoge hage=$hage
}
404:名無しさん@お腹いっぱい。
12/02/27 23:36:20.13
>>403
おおー入った! \(@o@)/
どういう仕様になってるんだろう
サブシェル的な問題?
405:名無しさん@お腹いっぱい。
12/02/28 08:06:57.00
>>404
その通りだが、そうならないシェルもある。自分なら read hoge hage <<<"hoge hage" って書く
406:名無しさん@お腹いっぱい。
12/02/28 10:45:26.99
ヒアストリングってbash/zsh以外でも使えんの?
407:名無しさん@お腹いっぱい。
12/02/28 11:12:25.51
古典ヒアストリングならな。
408:名無しさん@お腹いっぱい。
12/02/28 18:54:44.50
ソラリスのkshは冷やすとリング使えないのに、
リナックスのkshは冷やすとリング使える不思議
409:400
12/02/28 22:39:16.48
ヒアストリングってスレの初めの方で出てたやつですか
オイラの読んだ入門書には載ってなかったんだよなぁ
と思いながら試してみたら
Syntax error: redirection unexpected
sh -> dash なうちのDebianじゃダメみたい (・ω・` )
ステキな機能だけに残念
やっぱこういう場合はset使うべきなんですかね…
410:名無しさん@お腹いっぱい。
12/02/28 22:52:20.02
>>403じゃまずいの?
一行で書きたいならセミコロン
echo hoge hage | { read hoge hage; echo hoge=$hoge hage=$hage; }
411:名無しさん@お腹いっぱい。
12/02/29 02:06:19.12
getoptsにて「-yx」のように複数文字のオプションを判定することは可能なのでしょうか?
xxx.sh -a test -yx
#!/bin/ksh
while getopts a:yx opt
do
case ${opt} in
a)
YY=${OPTARG}
echo "オプション[-a]の引数は${YY}だよ。"
;;
yx)
echo "オプション[-yx]があるよ。"
;;
esac
done
412:名無しさん@お腹いっぱい。
12/02/29 08:15:39.53
>>411
getoptsでは、-yx は -y -x と指定したのと同じに解釈されるから無理。
413:名無しさん@お腹いっぱい。
12/02/29 10:48:10.11
代わりに --xy を使うとよろし。
414:名無しさん@お腹いっぱい。
12/02/29 10:50:38.33
>>413
すみませんが詳しい方のみ回答をお願いします
415:名無しさん@お腹いっぱい。
12/02/29 10:54:40.48
ああ --yx か。とにかく>>412のいう通りってこった。
416:名無しさん@お腹いっぱい。
12/02/29 11:34:25.80
getopts y: として $OPTARG が x かどうか判定すればいいんじゃね?
-y x も受けつけちゃうけど。
417:名無しさん@お腹いっぱい。
12/02/29 14:08:24.59
どうもこんにちは~
list=`cat ./file | grep aaa`
って感じでlistにaaaを持つ行を全部放り込んでるのですが、
これらを別々の1行ずつに分割して
なおかつlistを配列にして格納する事はできますか。
具体的には、fileの中にはaaaの文字列を持つ行が5つあるのですが
それをlist[0]~list[4]に格納したいのです。
よろしくご指導お願いしますm(_ _)m
418:名無しさん@お腹いっぱい。
12/02/29 14:10:31.36
なんで cat 通すんだろ。
grep aaa file でよくね?
419:名無しさん@お腹いっぱい。
12/02/29 15:35:13.71
>>417
IFSに改行コードのみを代入した状態で、list配列に一括代入する文法を使う。
#!/bin/bash
IFS='
'
list=(`grep aaa file`)
420:名無しさん@お腹いっぱい。
12/02/29 16:42:01.73
>>419
ありがとうございます!
できました!
421:400
12/02/29 23:33:48.87
ロングオプションは getopt でいけるけど何か問題もあったんだっけ
>>410
パイプ通すとブレースもサブシェルで動作してるのか
外からは参照できないみたいなんですよね
いやもちろん最初の例もサブシェル作ってるんですが (;´Д`)
処理の内容にもよるけど、やっぱりグローバルで使いたいってなると
関数に括り出してバッククォートで呼んだりして結局同じようなことなのかなぁと
そんな感じの意味です
でも勉強になりましたみなさんありがとう
422:名無しさん@お腹いっぱい。
12/03/01 06:47:03.28
>>421
getopt(外部コマンド)はスペース入りファイル名などの引数を正常に扱えない
などの仕様バグの固まり。getoptsを使うべし。
423:名無しさん@お腹いっぱい。
12/03/05 08:04:37.31
とあるソースから
#define HOGE MAGE
HOGE の定義値を抽出したい。
grep HOGE header.h |grep define |awk print $NF
みたいな書き方(うろ覚え)すると
キャリッジリターンも拾うわ、
タブ(スペース)数でフィールド変わるわなんですが
うまい方法ないですか?
424:名無しさん@お腹いっぱい。
12/03/05 08:12:54.29
>>423
$ cat header.h
#define HOGE MAGE
$ (cat header.h; echo HOGE) | gcc -E -P -
MAGE
425:名無しさん@お腹いっぱい。
12/03/05 08:25:52.14
プリプロセッサに置き換えられるからプリプロセッサに置き換えさせるとかワロタw
426:名無しさん@お腹いっぱい。
12/03/05 09:38:08.86
でもうまい方法でしょ?
427:名無しさん@お腹いっぱい。
12/03/05 10:17:08.26
#ifとか考え出したらそれ一択。
428:名無しさん@お腹いっぱい。
12/03/05 12:00:16.07
複数行に渡るマクロもあるしな。
けどお題はもっと単純な話なんじゃないのかな。
マクロの展開を止めたいなら、
(#define MAGE ~があってもMAGEを出力したい場合)
awkスクリプトになってしまったが、こんな感じ。
awk '$0 ~ /^#define[ ]+HOGE/ { $1=""; $2=""; print $0 }'
[]の中はスペースとタブ
429:名無しさん@お腹いっぱい。
12/03/05 22:50:17.04
質問です。
あるディレクトリにある全部のファイルに対して
コンパイルをかけるスクリプトをつくりたいです。
TESTLISTには
ソース名 コンパイラオプション
が書いてあります(hoge.c 5みたいに)
---------------------------------------------
#!/bin/sh
# プログラム、コンパイルオプション一覧リストを指定
LIST=/home/shell/TESTLIST
# コンパイラのパスを設定
CCOM=/home/shell/cc.sh
# コンパイルをかける
while read ARG1 ARG2
do
${CCOM} ${ARG1} ${ARG2}
done < ${LIST}
--------------------------------------------
のような簡単な奴で良いんですが、
430:名無しさん@お腹いっぱい。
12/03/05 22:51:02.05
続き
cc.shの中に、
--------------------------------------------
if [ ${RETCD} -ne 0 ]
then
echo "コンパイルログを表示しますか?"
RCV=""
while [ `echo "${RCV}" | sed -ne '/^[ ]*[yYNn][ ]*$/p' | wc -l` -eq 0 ]
do
read RCV
done
if [ `echo "${RCV}" | sed -ne '/^[ ]*[yY][ ]*$/p' | wc -l` -ne 0 ]
then
more ${コンパイルログ}
fi
fi
-------------------------------------------
のように書いてあり、コンパイルに失敗した場合、
「コンパイルログを表示しますか?」が端末に表示されたままで、「N」や「Y」を
入力しても反応がなく、Ctr-Cで実行を打ち切っている状態です。
431:名無しさん@お腹いっぱい。
12/03/05 22:52:03.41
続き
コンパイルに失敗した場合、Ctr-Cを入力すると
次のファイルにコンパイルをかけるようにしたいのですが、
--------------------------------------------
#!/bin/sh
# プログラム、コンパイルオプション一覧リストを指定
LIST=/home/shell/TESTLIST
# コンパイラのパスを設定
CCOM=/home/shell/cc.sh
# Ctr-Cを無視するように設定(サブシェルには有効)
trap : 2
# コンパイルをかける
while read ARG1 ARG2
do
#サブシェル化
(${CCOM} ${ARG1} ${ARG2})
done < ${LIST}
---------------------------------------------
でオッケーでしょうか?
ちなみにMakeは使用不可です。また、cc.shはいじれません。