5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :ミスターシェル:2006/09/07(木) 13:00:11
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

708 :名無しさん@お腹いっぱい。:2007/01/12(金) 00:58:20
sedでhoge.datというファイルを編集するときに

sed 's/aaa/bbb/' hoge.dat > tmp.dat
mv tmp.dat hoge.dat

のようにして、一時的なファイルとしてtmp.datというファイルを用意するのが無駄だと
思うのですが、このような一時的なファイルを使わないで
直接、hoge.datをsedで編集する方法はありませんでしょうか?

m(_ _)m

709 :名無しさん@お腹いっぱい。:2007/01/12(金) 01:08:30
>>708
・-i オプションをつかう
・-i オプションがないsedをつかっているなら in-place editing 対応の sed の導入を検討する
・ed をつかう
・perl を使う
・一時ファイルを必要としないファイル命名法を検討する

お好みで


710 :名無しさん@お腹いっぱい。:2007/01/12(金) 01:10:26
GNU sedには-iオプションがある。BSDのもある。

あとinplaceというあらゆるフィルタをin-place editに使うコマンド
もある。(これはぐぐって)


711 :名無しさん@お腹いっぱい。:2007/01/12(金) 01:20:43
FreeBSD の標準 sed に -i オプションが取り入れられたのは 4.7R でそれ以前には無い。
NetBSD の標準 sed には -i オプションは無い。 
OpenBSDの(ry
以前のGNU sed には in-place editing 機能はない (Changelog によると 2001-09-25 )

712 :名無しさん@お腹いっぱい。:2007/01/12(金) 01:29:18
MacOSXのBSD由来のsedにはあるみたいだな。いつのだろ。


713 :名無しさん@お腹いっぱい。:2007/01/12(金) 01:33:43
>>710
http://www.idaemons.org/projects/inplace/
へー、これか。
これは知らなかった。

714 :名無しさん@お腹いっぱい。:2007/01/12(金) 01:35:17
>>712
MacOSXのFreeBSDなユーザーランドは 最初は FreeBSD 3.xR由来で
そのうちに 5.x由来とかのになってそれから先はシラネ。
でも5.x以降だろうなと推測。

715 :名無しさん@お腹いっぱい。:2007/01/12(金) 01:45:52
>>714
/usr/share/misc/bsd-family-tree あたりにちゃっかり書いてあったりする。

716 :名無しさん@お腹いっぱい。:2007/01/12(金) 01:52:33
そのディレクトリの中はじめて見た。
flowers(花言葉)とかbirthtoken(誕生石)とか、妙なファイルもあるんだな。


717 :名無しさん@お腹いっぱい。:2007/01/12(金) 01:55:54
>>716
お、ほんとだ
なんでもあるな

718 :名無しさん@お腹いっぱい。:2007/01/12(金) 01:57:43
>>715
なるほど
でもそのファイルにNeXTの話がないのが微妙

719 :名無しさん@お腹いっぱい。:2007/01/12(金) 17:59:42
>>708
UNIXのファイルシステム上だと
(rm hoge.dat; sed 's/aaa/bbb/' > hoge.dat) < hoge.dat
でOK

720 :名無しさん@お腹いっぱい。:2007/01/12(金) 18:11:02
>>719
なるほど

721 :名無しさん@お腹いっぱい。:2007/01/12(金) 18:31:57
ああ、なるほど。


722 :名無しさん@お腹いっぱい。:2007/01/12(金) 19:50:06
あ、アナルほど

723 :名無しさん@お腹いっぱい。:2007/01/12(金) 20:44:54
手順をトレースしてみました。こんな理解でよろしいでしょうか。

1. < hoge.dat
ファイルディスクリプタを確保する。(&標準入力にする)
このディスクリプタが開いている限り、ファイル名がなくなっても
ファイルの実体は消えない。
2. (...)
サブシェルを起動する。ファイルディスクリプタは継承される。
3. rm hoge.dat
hoge.datというディレクトリエントリ(ファイル名)を消す。
しかし、それが指していた実体は1.のディスクリプタからまだ参照
されているため、消えない。
4. >hoge.dat
別途hoge.dat という名前でファイルを開く。(&標準出力にする)
これは、もとのhoge.datが指していた実体とは別のディスク領域に書かれる。
5. 全体が終了すると、ファイルディスクリプタが閉じ、もとのファイル実体
が使っていたディスク領域が未使用状態とみなされる。


724 :名無しさん@お腹いっぱい。:2007/01/13(土) 01:27:34
>>719
(...)じゃなくて{...;}じゃダメ?


725 :名無しさん@お腹いっぱい。:2007/01/13(土) 02:33:57
>>724
自分でまずやってみろよ

726 :名無しさん@お腹いっぱい。:2007/01/14(日) 01:54:35
最近のシェルは`test`や`[`が組み込みコマンドになってるとのことで
確かにpowerpc-apple-darwin8.0のbash 2.05b.0(1)-releaseでは`builtin`で呼び出せることも確認しました
一方で/bin/[や/bin/testも存在し、当然実行可能でした
また、若干の差異はありますが、複合コマンド(compound command)の`[[ expression ]]`もほぼ同じ用途に利用できます

そこで質問なんですが、少し上で話されていたような処理の重さ(無駄なプロセスの生成等)を考えた場合、
どれを使うのがベストなんでしょう?


727 :名無しさん@お腹いっぱい。:2007/01/14(日) 02:03:12
当然内部コマンドでしょう。
つーか、パフォーマンス重視な場合は
シェルスクリプトなんか使うな。

243 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)