シェルスクリプト総合 その14
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2009/01/29(木) 06:54:48スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ落ちたみたいなのでリンク省略。
0020名無しさん@お腹いっぱい。
2009/01/29(木) 19:16:00/bin/busybox というのはbash依存、またはOS依存だと思います。
どのOSにもあるコマンドだけを組み合わせてfree相当のシェルを作って下さい。
0021名無しさん@お腹いっぱい。
2009/01/29(木) 19:17:55busyboxはbash依存でもなければOS依存でもありません。
freeが組み込まれたシェルです。
0022名無しさん@お腹いっぱい。
2009/01/29(木) 19:21:59busybox内部の freeコマンドは、引数に対応してない。
あと、引数を渡すにしても $* で渡してはいけない。
(シェルスクリプトのコーディングルールとして)
よって失格。
0023名無しさん@お腹いっぱい。
2009/01/29(木) 19:24:23そうなのか。フォローthx
0024名無しさん@お腹いっぱい。
2009/01/29(木) 19:25:16無理
0025名無しさん@お腹いっぱい。
2009/01/30(金) 07:27:08一緒だったら次のAというコマンドを、違ったらBというコマンドを実行するには
どう書いたらいいですか?
0026名無しさん@お腹いっぱい。
2009/01/30(金) 07:35:41if diff hoge.txt boke.txt > /dev/null
then
commandA
else
commandB
fi
0027名無しさん@お腹いっぱい。
2009/01/30(金) 07:42:040028名無しさん@お腹いっぱい。
2009/01/30(金) 07:45:05>>25 「diffコマンドで」
0029名無しさん@お腹いっぱい。
2009/01/30(金) 07:50:34diff文が使えるようなシェルってあるんですか?
うちのシェルはif文は if [ ... ] みたいに書く普通のシェルです。
普通のシェルでお願いします。
0030名無しさん@お腹いっぱい。
2009/01/30(金) 07:53:550031名無しさん@お腹いっぱい。
2009/01/30(金) 07:58:05comA
else
comB
fi
だろ?
0032名無しさん@お腹いっぱい。
2009/01/30(金) 10:12:430033名無しさん@お腹いっぱい。
2009/01/30(金) 10:58:24その [ ... ] が何を示すのか勉強しなおしてこい
0034名無しさん@お腹いっぱい。
2009/01/30(金) 16:59:25条件文を表してるのは知ってますよ
0035名無しさん@お腹いっぱい。
2009/01/30(金) 19:21:23[ ... ]っつー見かけに惑わされちゃいかん
0036名無しさん@お腹いっぱい。
2009/01/30(金) 22:19:18[: shell built-in command
/bin/[
0037名無しさん@お腹いっぱい。
2009/01/30(金) 22:32:562つのコマンド、commandA と commandB の標準出力同士を、
テンポラリファイルを作らずに diffコマンドで比較したい時、
bashなら、
diff <(commandA) <(commandB)
でできますが、
これを標準シェルでやるにはどうすればいいですか?
0038名無しさん@お腹いっぱい。
2009/01/30(金) 22:41:36commandA | (commandB | diff /dev/fd/3 -) 3<&0
0039名無しさん@お腹いっぱい。
2009/01/30(金) 22:42:34無理。
bash使うか、一旦ファイルに落せ。
0040名無しさん@お腹いっぱい。
2009/01/30(金) 22:47:410041名無しさん@お腹いっぱい。
2009/01/30(金) 22:57:08おおでけた。THX!
0042名無しさん@お腹いっぱい。
2009/01/30(金) 23:32:55その昔は、 /bin/[ なんてのが有ったんだがなぁ。
0043名無しさん@お腹いっぱい。
2009/01/30(金) 23:34:28今でもあるだろ
0044名無しさん@お腹いっぱい。
2009/01/30(金) 23:38:21今でもあるだろw
$ which '['
/usr/bin/[
0045名無しさん@お腹いっぱい。
2009/01/30(金) 23:50:580046名無しさん@お腹いっぱい。
2009/01/30(金) 23:52:10すまん、BSD育ちなんだw
0047名無しさん@お腹いっぱい。
2009/01/30(金) 23:59:24cshはaliasとかがあるせいでwhichを内部コマンドに持った。
0048名無しさん@お腹いっぱい。
2009/01/31(土) 07:29:55/dev/fd/3 って純正シェルでも使えるの??
0049名無しさん@お腹いっぱい。
2009/01/31(土) 13:15:290050名無しさん@お腹いっぱい。
2009/01/31(土) 13:41:51なんでもいいから、結局使えるの??
0051名無しさん@お腹いっぱい。
2009/01/31(土) 13:58:320052名無しさん@お腹いっぱい。
2009/01/31(土) 19:54:54いくらなんでもそんな質問しないもんね?
0053名無しさん@お腹いっぱい。
2009/01/31(土) 20:15:42あり得る。
例えば、bashだと、/dev/stdout とかは、実際の /dev/stdoutを読まずに
シェルが /dev/stdoutという文字列を特別扱いして動作する。
そのことを考慮すれば、/dev/fd/n がシェルに依存しているかも知れないと
考えることにも一定の合理性が認められる。
0054名無しさん@お腹いっぱい。
2009/01/31(土) 20:59:540055名無しさん@お腹いっぱい。
2009/02/01(日) 00:46:460056名無しさん@お腹いっぱい。
2009/02/01(日) 02:18:13面白い人が増えたなw
0057名無しさん@お腹いっぱい。
2009/02/01(日) 08:04:35/dev/fd/3 がシェルに依存してるのは本当だよ。
0058名無しさん@お腹いっぱい。
2009/02/01(日) 08:23:14man bash | less -p /dev/fd/fd
man zshmisc | less -p /dev/fd/n
if file is of the form `/dev/fd/n',
where n is an integer, then the test applied to the open file whose
descriptor number is n, even if the underlying system does not support
the /dev/fd directory.
> even if the underlying system does not support the /dev/fd directory
> even if the underlying system does not support the /dev/fd directory
> even if the underlying system does not support the /dev/fd directory
> even if the underlying system does not support the /dev/fd directory
0059名無しさん@お腹いっぱい。
2009/02/01(日) 22:53:380060名無しさん@お腹いっぱい。
2009/02/02(月) 04:47:50させるにはどのようにしたらいいですか?
0061名無しさん@お腹いっぱい。
2009/02/02(月) 06:25:59read
0062名無しさん@お腹いっぱい。
2009/02/02(月) 10:24:22bashの場合は read -n 1 の方がよりpauseの動作に近いかと
0063名無しさん@お腹いっぱい。
2009/02/02(月) 22:25:23質問欲嫁。それはpauseの動作。>>60 の質問はpuaseの動作。
0064名無しさん@お腹いっぱい。
2009/02/03(火) 00:09:20どう処理すればよいのでしょうか?
応答に対して入力する値(番号など)決まっているという前提でお願いします
0065名無しさん@お腹いっぱい。
2009/02/03(火) 00:12:580066名無しさん@お腹いっぱい。
2009/02/03(火) 00:25:53$ app
〜
$ exit
$ ttyplay x
006760
2009/02/03(火) 02:44:31>>61-62
read -n 1が良さそうなのでこれを使ってみます
>>63
すみません。タイプミスですorz
正しくは「pause」です
0068名無しさん@お腹いっぱい。
2009/02/03(火) 09:03:27expect
0069名無しさん@お腹いっぱい。
2009/02/03(火) 15:36:110070名無しさん@お腹いっぱい。
2009/02/05(木) 00:30:200071名無しさん@お腹いっぱい。
2009/02/05(木) 00:35:26conquerer -bj --creeping-deth
0072名無しさん@お腹いっぱい。
2009/02/05(木) 06:38:09多次元配列という意味なら、使えない。
0073名無しさん@お腹いっぱい。
2009/02/05(木) 18:40:06起動コストは抜きにして
とりあえずディレクトリーをたぐりながら正規表現での文字列探索みたいなジャンルで
好みでもかまわないので意見がききたいです。
0074名無しさん@お腹いっぱい。
2009/02/05(木) 18:52:19実際にやってみればいいじゃん。
まあシェルスクリプトは速度を求めるものじゃないけどね。
0075名無しさん@お腹いっぱい。
2009/02/05(木) 18:53:41速い順に、
sh > perl > bash > python
で、大体合ってる
0076名無しさん@お腹いっぱい。
2009/02/05(木) 19:03:08perl, python > sh, bash だろ。JK
0077名無しさん@お腹いっぱい。
2009/02/05(木) 20:23:440078名無しさん@お腹いっぱい。
2009/02/06(金) 12:09:09http://www.commandlinefu.com/commands/browse
0079名無しさん@お腹いっぱい。
2009/02/06(金) 12:18:340080名無しさん@お腹いっぱい。
2009/02/06(金) 12:19:50護符とかの。
0081名無しさん@お腹いっぱい。
2009/02/06(金) 12:51:06なお、Script-Fuの名はカンフー(Kung-fu)からきている。
0082名無しさん@お腹いっぱい。
2009/02/06(金) 15:28:51偉丈夫、気丈夫、大丈夫
0083名無しさん@お腹いっぱい。
2009/02/06(金) 15:34:190084名無しさん@お腹いっぱい。
2009/02/06(金) 15:57:59起動コスト安くなりませんか?めんどいけど
Tclってきるつもりだったけれどある程度の機能がセットになっているのならば
選択肢なのかなぁ。
でも要するにざっくりとみたら対さないんだったら素直にperl使うのが楽なんですかね、
0085名無しさん@お腹いっぱい。
2009/02/06(金) 16:11:31いつの人ですか?
ここ3年くらい使ったことないよ!
0086名無しさん@お腹いっぱい。
2009/02/06(金) 17:36:190087名無しさん@お腹いっぱい。
2009/02/06(金) 23:17:30これってhogeの内容がechoに渡されると思うんだけど、
なんで何も表示されないんですか?
0088名無しさん@お腹いっぱい。
2009/02/06(金) 23:30:300089名無しさん@お腹いっぱい。
2009/02/06(金) 23:45:25了解しました
[ana@coppola ~]$ echo <(ls)
/proc/self/fd/63
ではこうなるのはいったいなぜですか?
というか、
/proc/self/fd/63
って?
0090名無しさん@お腹いっぱい。
2009/02/07(土) 00:16:57<(command)はprocess substitutionというbashの特殊な記法でファイルディスクリプタ
ファイル(/dev/fd/#)名に置換されます。
0091名無しさん@お腹いっぱい。
2009/02/07(土) 00:43:49曖昧さがあるので|記法に変った。
0092ミジンコ未満
2009/02/07(土) 01:17:25コマンドを実行する。なんてことをするにはどうすればいいですか
0093名無しさん@お腹いっぱい。
2009/02/07(土) 01:32:22http://www.linux.or.jp/JF/JFdocs/SCSI-2.4-HOWTO/sr.html
0094名無しさん@お腹いっぱい。
2009/02/07(土) 11:06:58head -c 1 /dev/cdrom > /dev/null 2>&1 && command
>>93
そのリンク見ても、メディアが挿入されてるかどうかの判定はできないよ。
0095名無しさん@お腹いっぱい。
2009/02/08(日) 00:47:14暗号化zipを別のフォルダに分けるっていう事、どうやればいいでしょうか
0096名無しさん@お腹いっぱい。
2009/02/08(日) 00:49:330098名無しさん@お腹いっぱい。
2009/02/08(日) 02:15:27現状では、2つのディレクトリ内のファイルは同期が取れていますが、たまに異なる更新日時のファイルが出来ます。
その同期の取れていないファイルはできれば抜き出したいです。
ファイルは全部で5000件くらいあります。
1.ls -ltでディレクトリ内一覧情報を出してファイルに出力
2.出したファイルから不要な情報を削除(ユーザー名とか)して時間とファイル名だけにしぼる
3.上の1と2を両ディレクトリで行う
4.diffでファイル同士比較
5.偏った情報を出力
これをシェルでやらせようと思ってますが、どうも効率を悪い気がします。
0099名無しさん@お腹いっぱい。
2009/02/08(日) 03:18:26ところどころ日本語も意味不明
更新日時の比較なら、ls -lt の結果を比較すればいいし
ファイル内容の比較をしたいのなら、diff や dircmp で
ディレクトリを指定すればいい
0101名無しさん@お腹いっぱい。
2009/02/08(日) 07:23:22なぜ同期ツールを始めから使わないのか?
e.g. rsync等
0102名無しさん@お腹いっぱい。
2009/02/08(日) 16:13:21readlink相当のことをシェルでやるには、
どうやるのが定番ですか?
シンボリックリンクの中にはスペースや特殊記号等、
すべてアリの状態でお願いします。
0103名無しさん@お腹いっぱい。
2009/02/08(日) 16:17:180104名無しさん@お腹いっぱい。
2009/02/08(日) 16:26:430105名無しさん@お腹いっぱい。
2009/02/08(日) 16:57:46> シンボリックリンクの中にはスペースや特殊記号等、
> すべてアリの状態でお願いします。
0106名無しさん@お腹いっぱい。
2009/02/08(日) 17:05:41$ ln -s 'hoge -> hage' 'boke -> kasu'
$ ls -l
lrwxrwxrwx 1 guest guest 12 Feb 8 17:05 boke -> kasu -> hoge -> hage
こういう状態で、どうやって判定するのかね?
0107名無しさん@お腹いっぱい。
2009/02/08(日) 18:26:11perl -e "print readlink ファイル名;"
でどう?
perl はたいてい入ってるし
0108名無しさん@お腹いっぱい。
2009/02/08(日) 22:41:27lrwxrwxrwx
一文字目の l はどういう意味?
0109名無しさん@お腹いっぱい。
2009/02/08(日) 22:45:41お前、>>105 が言わんとしてることをわかってない
boke -> kasu -> hoge -> hage
↑
この部分を見て、どこがシンボリックリンクの中身か判読できないだろw
0110名無しさん@お腹いっぱい。
2009/02/08(日) 22:50:11>>106 を良く読め、
ls -lの結果が、 boke -> kasu -> hoge -> hage となった場合、
「hage」を指している 「boke -> kasu -> hoge」と言うsymlinkかも知れないし、
「hoge -> hage」と言うファイルを指している 「boke -> kasu」と言うsymlinkかも知れないし、
「kasu -> hoge -> hage」と言うファイルを指している 「boke」と言うsymlinkかも知れない、
ということだな。
0111名無しさん@お腹いっぱい。
2009/02/08(日) 23:26:170112名無しさん@お腹いっぱい。
2009/02/09(月) 00:30:15(
echo a
echo b
)
これと
#!/bin/sh
{
echo a
echo b
}
これってなんか違いあります?
0113名無しさん@お腹いっぱい。
2009/02/09(月) 04:42:060114名無しさん@お腹いっぱい。
2009/02/09(月) 06:32:24実際にはシェル内部で最適化されるから、
( ) を使ってもプロセスは起動されない。
>>112
これだけだと違いは起きない。
( ) や { } 以外の他の部分の記述によっては違いが出ることもあるというだけ。
0115名無しさん@お腹いっぱい。
2009/02/09(月) 23:28:32ls -l と ls -lF の結果を比較すればできそうだから、あとはまかせた。
0116名無しさん@お腹いっぱい。
2009/02/10(火) 04:06:300117名無しさん@お腹いっぱい。
2009/02/10(火) 06:44:56>>102
「readlinkコマンドがないOSで、」
最近、質問をちゃんと読まない人多いね
0118名無しさん@お腹いっぱい。
2009/02/10(火) 09:48:36>>102はreadlink相当のことをビルトインコマンドとして持っているシェルを
探しているんだぞ。
>>102
> readlink相当のことをシェルでやるには、
0119名無しさん@お腹いっぱい。
2009/02/10(火) 09:58:01■ このスレッドは過去ログ倉庫に格納されています