1 :
名無しさん@お腹いっぱい。 :
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 でトレースしましょう。
前スレ落ちたみたいなのでリンク省略。
□関連書籍と関連リンク:
FreeBSD Hypertext Man Pages
http://www.freebsd.org/cgi/man.cgi Linux JF (Japanese FAQ) Project.
http://www.linux.or.jp/JF/ Unix Programming Frequently Asked Questions 日本語訳
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html UNIXプログラミング環境
http://www.amazon.co.jp/exec/obidos/ASIN/4871483517/ □人間初心者へのお願い:
・このスレはシェルスクリプトについてのスレです。
シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
使い方の質問などはスレ違いなので無用に願います。
□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,test,expr,true,false,yes,getopts
テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join
ファイル検索系: find
(スペースなどを含むファイル名を正しく処理するため、
findは -exec command {} + を推奨。
他に -print0、xargsは -0オプションという方法もあるがSolaris非対応)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
freeコマンドのないOSでも実行できるような、 freeコマンド相当のシェルを作りたいと思っています。 具体的にはどう書けばいいですか? できれば、bashに依存せず、汎用シェルになるようにお願いします。
シェルってゆうな。クズ。
テンプレ終了。では質問どうぞ。
>>8 busyboxというシェルが組み込みのfreeコマンドを持っています。
>>11 そのbosyboxとかいうシェルを具体的に書いて下さい。
1行目は
#!/bin/shでお願いします。
2行目以降は?
exit 0
>>12 #!/bin/sh
busybox free
引数も渡すならこんな感じ #!/bin/sh busybox free $*
>>14 えっと、何か勘違いされてますか?
シェル名はなんでもいいんですが、bosyboxとして
$ cat bosybox
#!/bin/sh
この行をお願いします
この行をお願いします
この行をお願いします
:
$ ./bosybox
…実行結果…
ということですが、、
vmstatあたりを sed awkして船山に登れば医院じゃないの?
なないかかんちがいてまちぇんでちゅか?
>>16 $ cat busybox
#!/bin/sh
/bin/busybox $*
$./busybox free
...
>>19 /bin/busybox というのはbash依存、またはOS依存だと思います。
どのOSにもあるコマンドだけを組み合わせてfree相当のシェルを作って下さい。
>>20 busyboxはbash依存でもなければOS依存でもありません。
freeが組み込まれたシェルです。
>>15 busybox内部の freeコマンドは、引数に対応してない。
あと、引数を渡すにしても $* で渡してはいけない。
(シェルスクリプトのコーディングルールとして)
よって失格。
diffコマンドで2つのテキストファイルの中身を比較して、 一緒だったら次のAというコマンドを、違ったらBというコマンドを実行するには どう書いたらいいですか?
>>25 if diff hoge.txt boke.txt > /dev/null
then
commandA
else
commandB
fi
完全一致でいいなら、diff >/dev/null よりも、cmp -s
>>26 diff文が使えるようなシェルってあるんですか?
うちのシェルはif文は if [ ... ] みたいに書く普通のシェルです。
普通のシェルでお願いします。
20/100点
if [ `diff a.txt b.txt | wc -c` == 0 ]; then comA else comB fi だろ?
つまらんスレだな、ここは
>>29 その [ ... ] が何を示すのか勉強しなおしてこい
[ もdiffもコマンドってことじゃないかな [ ... ]っつー見かけに惑わされちゃいかん
% where '[' [: shell built-in command /bin/[
37 :
名無しさん@お腹いっぱい。 :2009/01/30(金) 22:32:56
質問です。 2つのコマンド、commandA と commandB の標準出力同士を、 テンポラリファイルを作らずに diffコマンドで比較したい時、 bashなら、 diff <(commandA) <(commandB) でできますが、 これを標準シェルでやるにはどうすればいいですか?
>>37 commandA | (commandB | diff /dev/fd/3 -) 3<&0
>>37 無理。
bash使うか、一旦ファイルに落せ。
答が出たあとで、無理とか言ってる奴ってなんなの?
>>34 その昔は、 /bin/[ なんてのが有ったんだがなぁ。
>>42 今でもあるだろw
$ which '['
/usr/bin/[
Bシェルなのに which使う奴ってなんなの?
昔はshにtypeなんてなく、whichは外部コマンドだった。 cshはaliasとかがあるせいでwhichを内部コマンドに持った。
>>38 /dev/fd/3 って純正シェルでも使えるの??
シェルじゃなくてOSだろ?
レスしたら負けだ。
これは釣りですよね? いくらなんでもそんな質問しないもんね?
一般論として、/dev以下のファイルはシェルによって特別扱いされることが あり得る。 例えば、bashだと、/dev/stdout とかは、実際の /dev/stdoutを読まずに シェルが /dev/stdoutという文字列を特別扱いして動作する。 そのことを考慮すれば、/dev/fd/n がシェルに依存しているかも知れないと 考えることにも一定の合理性が認められる。
無いからもう寝ろ
こうしてスレに平和が戻った。。。end
[ を条件文だと言ったり、/dev/fd/3 がシェルに依存していると言ったり、 面白い人が増えたなw
>>56 /dev/fd/3 がシェルに依存してるのは本当だよ。
>>56 man 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
日本語でおk
bash(Fedora10)のシェルスクリプトでMS-DOSのバッチファイルのpuaseみたいな動作を させるにはどのようにしたらいいですか?
>>60 bashの場合は read -n 1 の方がよりpauseの動作に近いかと
アプリケーションを実行した時に入力を求められるような場合 どう処理すればよいのでしょうか? 応答に対して入力する値(番号など)決まっているという前提でお願いします
echo 1 | app
$ ttyrec x $ app 〜 $ exit $ ttyplay x
67 :
60 :2009/02/03(火) 02:44:31
レスありがとうございます
>>61-62 read -n 1が良さそうなのでこれを使ってみます
>>63 すみません。タイプミスですorz
正しくは「pause」です
expect使うけどセキュリティ考えたら微妙
bashで多重配列って使えますか?
>>64 conquerer -bj --creeping-deth
速度という観点でsh、bashそれとperl、pythonを比較するとどうなんでしょう。 起動コストは抜きにして とりあえずディレクトリーをたぐりながら正規表現での文字列探索みたいなジャンルで 好みでもかまわないので意見がききたいです。
>>73 実際にやってみればいいじゃん。
まあシェルスクリプトは速度を求めるものじゃないけどね。
>>73 速い順に、
sh > perl > bash > python
で、大体合ってる
sh, bashは他のプログラムをfork, execしなきゃならないから perl, python > sh, bash だろ。JK
シェルにもなって正規表現爆速のTcl最強って話ですね、わかります
78 :
名無しさん@お腹いっぱい。 :2009/02/06(金) 12:09:09
-Fuってどういう由来の語なんだろうね
符じゃないか? 護符とかの。
夫は男らしいさまを表す字です。 偉丈夫、気丈夫、大丈夫
PC的にアレかもね
例えばfindやgrepをshが呼び出す場合別プロセスで使っていたら 起動コスト安くなりませんか?めんどいけど Tclってきるつもりだったけれどある程度の機能がセットになっているのならば 選択肢なのかなぁ。 でも要するにざっくりとみたら対さないんだったら素直にperl使うのが楽なんですかね、
tcl, perl いつの人ですか? ここ3年くらい使ったことないよ!
tcl なんぞより Bourne Shell の方がよっぽど古いぞと問い詰めたい
echo < hoge これってhogeの内容がechoに渡されると思うんだけど、 なんで何も表示されないんですか?
echoはコマンド引数を表示するように作られていて、標準入力は読まないからです。
>>88 了解しました
[ana@coppola ~]$ echo <(ls)
/proc/self/fd/63
ではこうなるのはいったいなぜですか?
というか、
/proc/self/fd/63
って?
/dev/fd/#は#に対応するファイルディスクリプタに名前が付いたものと思えばいいです。 <(command)はprocess substitutionというbashの特殊な記法でファイルディスクリプタ ファイル(/dev/fd/#)名に置換されます。
初期のシェルにもその記法はあったが、 曖昧さがあるので|記法に変った。
bashのスクリプトでDVD/CDドライブにメディアが挿入されている場合に コマンドを実行する。なんてことをするにはどうすればいいですか
>>92 head -c 1 /dev/cdrom > /dev/null 2>&1 && command
>>93 そのリンク見ても、メディアが挿入されてるかどうかの判定はできないよ。
95 :
名無しさん@お腹いっぱい。 :2009/02/08(日) 00:47:14
あるフォルダに複数のファイルが入っていて、その中から 暗号化zipを別のフォルダに分けるっていう事、どうやればいいでしょうか
お前、その質問を他人から受けてやりたい事が解るのか?
97 :
92 :2009/02/08(日) 01:19:09
2つのディレクトリ内のファイルの更新日時を比較するにはみなさんどうしていますか? 現状では、2つのディレクトリ内のファイルは同期が取れていますが、たまに異なる更新日時のファイルが出来ます。 その同期の取れていないファイルはできれば抜き出したいです。 ファイルは全部で5000件くらいあります。 1.ls -ltでディレクトリ内一覧情報を出してファイルに出力 2.出したファイルから不要な情報を削除(ユーザー名とか)して時間とファイル名だけにしぼる 3.上の1と2を両ディレクトリで行う 4.diffでファイル同士比較 5.偏った情報を出力 これをシェルでやらせようと思ってますが、どうも効率を悪い気がします。
結局何をしたいのか ところどころ日本語も意味不明 更新日時の比較なら、ls -lt の結果を比較すればいいし ファイル内容の比較をしたいのなら、diff や dircmp で ディレクトリを指定すればいい
100 :
98 :2009/02/08(日) 04:46:20
>>99 ありがとうございます。
おとなしく更新日時を取ってきてdiffで比較します。
>>98 なぜ同期ツールを始めから使わないのか?
e.g. rsync等
102 :
名無しさん@お腹いっぱい。 :2009/02/08(日) 16:13:21
readlinkコマンドがないOSで、 readlink相当のことをシェルでやるには、 どうやるのが定番ですか? シンボリックリンクの中にはスペースや特殊記号等、 すべてアリの状態でお願いします。
シェルってゆうな。クズ。
ls -l で行末を読むとか
>>104 > シンボリックリンクの中にはスペースや特殊記号等、
> すべてアリの状態でお願いします。
>>104 $ ln -s 'hoge -> hage' 'boke -> kasu'
$ ls -l
lrwxrwxrwx 1 guest guest 12 Feb 8 17:05 boke -> kasu -> hoge -> hage
こういう状態で、どうやって判定するのかね?
>>102 perl -e "print readlink ファイル名;"
でどう?
perl はたいてい入ってるし
>>104 lrwxrwxrwx
一文字目の l はどういう意味?
>>108 お前、
>>105 が言わんとしてることをわかってない
boke -> kasu -> hoge -> hage
↑
この部分を見て、どこがシンボリックリンクの中身か判読できないだろw
>>108 >>106 を良く読め、
ls -lの結果が、 boke -> kasu -> hoge -> hage となった場合、
「hage」を指している 「boke -> kasu -> hoge」と言うsymlinkかも知れないし、
「hoge -> hage」と言うファイルを指している 「boke -> kasu」と言うsymlinkかも知れないし、
「kasu -> hoge -> hage」と言うファイルを指している 「boke」と言うsymlinkかも知れない、
ということだな。
わかってない奴が湧いてるな
#!/bin/sh ( echo a echo b ) これと #!/bin/sh { echo a echo b } これってなんか違いあります?
プロセスを起動するかどうか
>>113 実際にはシェル内部で最適化されるから、
( ) を使ってもプロセスは起動されない。
>>112 これだけだと違いは起きない。
( ) や { } 以外の他の部分の記述によっては違いが出ることもあるというだけ。
>>106 ls -l と ls -lF の結果を比較すればできそうだから、あとはまかせた。
readlink(1)ってのもあるよ。
>>116 >>102 「readlinkコマンドがないOSで、」
最近、質問をちゃんと読まない人多いね
ほんと、問題を良く読まないのが沢山いるな。
>>102 はreadlink相当のことをビルトインコマンドとして持っているシェルを
探しているんだぞ。
>>102 > readlink相当のことをシェルでやるには、
readlink がなければ stat -f %Y を使えばいいじゃない
>>119 readlinkがないOSにはstatもないと考えるのが妥当。
あと、stat -f というオプションはFreeBSD方言だから気を付けろ。
stat --printfの"%N"はシェルスクリプトで使いづらいよな。 $ stat --printf "%n\n" /vmlinuz /vmlinuz $ stat --printf "%N\n" /vmlinuz `/vmlinuz' -> `boot/vmlinuz-2.6.27-11-generic' ->とかquoteとかいらねーよ
>>120 マリー アントワネットにマジレスする不粋
>>122 おれには
>>119 がマジで stat -f %Y が他のOSでも使えると思い込んでるように見えるが、
ビルトインコマンドとしてstat -fを持ってるシェルはどれだ?
>>125 言い訳見苦しい。本当に知らなかったんだねw
readlink って、ファイル名がわかっているときしか使えないんだろ。 ファイル名がわかってるなら、ls -l を解析できるんじゃないか? lrwxrwxrwx 1 guest guest 12 Feb 8 17:05 boke -> kasu -> hoge -> hage ファイル名が boke ならば 'kasu -> hoge -> hage' ファイル名が 'boke -> kasu' ならば、 'hoge -> hage' が取り出せればいいんじゃないの?
128 :
名無しさん@お腹いっぱい。 :2009/02/10(火) 21:01:33
シェルはリロードには対応してないんでしょうか? たとえば、lsって打ちますよね、 で、hoge1 hoge2 とか表示されます。 そのあと、rm hoge1 ってやっても、 上の ls のところのシェルには hoge1 が表示されたままになります。 もう一回 ls を売っても、下の画面に2重に出てきて、 上のシェルの ls が更新されません
ひねりが足りない要努力
シェルに表示されたままという意味がよくわかりませんが、 端末の画面上ということですね。 CUIの端末の元祖はテレタイプです。 これはキーボードとプリンタがくっついたものです。 プリンタで打ち出されたlsの結果がいつのまにか変化するようなことはありません。 画面に表示するようになった現在でも同じです。
>>130 プリンターは繋いでいません。
プリーンターを繋げばリロードが治るんでしょうか?
良くわかりませんが??
ダイヤルなつかしい
>>102 #!/bin/sh
echo 'b[9];main(int c,char**v){printf("%.*s?n",readlink(v[1],b,36),b);}'|gcc -xc - 2>/dev/null;./a.out "$1";rm a.out
あはははははは
>>134 ソースにじかに "$1" を入れ込めばもっと短くなるだろ
echo 'b[9];main(){printf("%.*s\n",readlink("'"$1"'",b,36),b);}'|gcc -xc - 2>/dev/null;./a.out;rm a.out
>>136 > 2>/dev/null
書き込めないcurrent directoryで、
/usr/bin/ld: cannot open output file a.out: Permission denied
すら見られませんが…
#!/usr/bin/tcc -run b[9];main(int c,char**v){printf("%.*s\n",readlink(v[1],b,36),b);}
cpu使用率を出力するコマンドが欲しいんですがtopの出力を加工する感じになりますか?
vmstatとかじゃだめ?
>>139 /proc/statのcpu行の最初の三つがCPUタイム
143 :
名無しさん@お腹いっぱい。 :2009/02/15(日) 09:42:44
ハードリンク先を求めるのに、findで探す以外に効率的なシェルって作れないんですか?
シェルってゆうな。クズ。
To find the hard links, is there some way to make an efficient shell without find ?
146 :
名無しさん@お腹いっぱい。 :2009/02/15(日) 10:30:18
ファイルから全文を読み込んで、別ファイルに(追記で)書き込むにはどんな記述を すればいいですか? phpで言えば $hen01 = $_POST["読み込んだ文字"]; $fp = fopen('書き込み先.txt', 'a+'); flock($fp, LOCK_EX); $return = fputs($fp,"$hen01\n"); flock($fp, LOCK_UN); fclose($fp); こんな感じで一旦あるテキストファイルの文字列を全部読み込んで、別のファイルに 追記書き込みの処理をしたいんです。
cat aaa >> bbb
148 :
名無しさん@お腹いっぱい。 :2009/02/15(日) 10:47:30
>>147 なるほどcatを使うんですね、即レスありがとうございました。
">>"がキモだとわかっているのだろうか。
ふむ、慣れない内はシェルに>の動作を制限させとった方がいいかも? でも制限させたらさせたで面倒なんだよな。 仕事で使うんならいざしらず、遊びで使うんなら 少々飛ばそうが関係ないし。
シェルの話はスレ違い
>>147 それだと、
>>146 のphpでやってる flock の処理が出来てないと思うが。
同時にプロセス起動されたら出力がぐちゃぐちゃに混ざる。
phpは知らんが146はロックできなかった場合の処理をしてないようなので 147でいいんじゃないの?
>>153 ロックできなかった場合はflockのところでロック解除になるまで待たされる。
だから、ロックの処理はちゃんと行なわれている。
よって
>>147 ではダメ。
>>153 >phpは知らんが
知らないのに突っ込むと恥をかくという典型例ですな
そもそも
>>146 の文章とコード例がずれてるのが原因のような
lockf bbb sh -c "cat aaa >>bbb" lockf(1)が無かったら作れ。
>>146 flock(1)が存在するOS (Linux)なら、
flock out.txt cat in.txt >> out.txt
凄く細かいことを言うと、
>>157 のスタイルの方が
>>158 のスタイルより、
ファイルロック以前に書き込まれる恐れがない。
おれも、それを指摘しようと思ったがアペンドだから問題ないので止めた。
>>158 が知っていたのかはわからない。
158 だが、知ってた上で無駄な sh -c を外したんだよ。
無駄ではなく、過剰仕様というのなら分かるが…
>>162 いや、仕様とか品質とか関係なく無駄。
アペンドで先にオープンされるだけであって、
実際の書き込みはロック取得後に行なわれるから、
sh -c なしで全く問題ない。
165 :
名無しさん@お腹いっぱい。 :2009/02/15(日) 17:50:43
146です。もう一つお尋ねしたいのですが次のような処理をシェルスクリプトで する事は可能でしょうか? 1、a.txtの中に文字列「/var/log/maillog」が記述されている 2、シェルスクリプトを使って「/var/log/maillog」を記憶(変数にセット?) 3、b.txtに記憶した「/var/log/maillog」の文字列を追記したい なおa.txtの内容は、 /var/log/maillogだったり/var/log/http_error_logだったりしますが、原則一行であり、 後ろの文字列は変わることはあっても先頭部分の/var/log/は不変です。
>>165 一旦変数に記憶させたいという要求なのかな?
だとすると、
file=`cat a.txt`
echo "$file" >> b.txt
なお、変数に記憶させる必要がなければもちろん、
cat a.txt >> b.txt でよい。
167 :
名無しさん@お腹いっぱい。 :2009/02/15(日) 19:20:20
>>166 ありがとうございました、少し形を変えましたが思っていた事ができました。
こういう場合は``でくくるのですね。また一つ勉強になりました。
168 :
143 :2009/02/15(日) 20:48:50
答えまだですか?
>>168 diagostini --autumn-leaves
>>168 >>143 ハードリンク先を求める
所詮、指してる先は i-node だから
ls -i 元ファイルのパス
じゃ、だめなのか
わかってない人は黙っているように。
自己解決しました。ありがとうございました。
174 :
名無しさん@お腹いっぱい。 :2009/02/16(月) 09:15:29
スレ違いな気もしますが、解る方が居たらお願いします。 ユーザー登録用にシェルスクリプトを書いて、手動で実行すると普通に通るんですが cronで実行すれば通らないんです。 ユーザー登録用のuseradd.shの内容は以下になります。 while read LINE do USER=`echo $LINE | sed -e 's/:.*$//'` useradd $USER echo $LINE | chpasswd done < /home/xxxx/public_html/user_add.txt exit 登録すべきユーザーの読み込み元のuser_add.txtはuser:passの形式でして、 手動でuseradd.shを走らせると普通に登録してくれるんですが、cron経由だと ウンともスンとも言わず・・・ ただ、試行錯誤の末に気づいたんですが、デーモン再読み込みをさせる.shのの書き方で service named reloadと書いて、手動で.shを実行すればOK、このスクリプトを cronから実行すればNGだったんですが、/etc/rc.d/init.d/named reloadに書き直して みたらcronから実行でも通りました。 rootで実行させて、かつパーミも権限あります。cronログはこのようになりました。 Feb 16 09:02:01 xxx crond[10113]: (root) CMD (/root/useradd.sh) 又、他の単純な.shは手動でもcronでも動きますので多分、cronは適正だと思います。 となると、やはりuseradd.shの記述がおかしい可能性が高いと思いますので、間違いなど あればご指導お願いします。
#! /bin/sh -x して何が起ってるか調べろ
たぶん$PATH
177 :
名無しさん@お腹いっぱい。 :2009/02/16(月) 10:42:27
>>175-176 ありがとうございます、
>>176 の仰るとおり$pathでした。
useraddを絶対パスに指定してやって/usr/sbin/useraddにすればOKでした。
確かにスレ違いなんだが、 cronに書いてなかったっけ、$PASSの事。
$PASSの事は書いてない。
cronよりも、at使った方が楽で確実だよ。 コマンドライン上での実行時のPATHその他の環境変数が 実行時と同じように引き継がれて実行されるし。
aaa,111 bbb,222 ccc,333 みたいな、1対1のデータ定義のテーブルを作って、 これを1行ずつ コマンド aaa 111 コマンド bbb 222 コマンド ccc 333 のように実行していきたいんですが、かっこよくかけなくてこんな感じになりました。 #!/bin/sh list=" aaa,111 \ bbb,222 \ ccc,333 " for n in $list do sono1=`echo $n | cut -d, -f1` sono2=`echo $n | cut -d, -f2` command $sono1 $sono2 done 特にcutがださいと思ってます。 美しい書き方教えてください
>>182 command `echo $n | sed 's/,/ /'`
for n in $list do IFS=, echo $n | { read sono1 sono2 ; command $sono1 $sono2; } done
途中送信しちゃた
>>184 {}これでくくっている意味がわからんのですけどなんででしょう?
>>186 { }で括らなかったら echoのパイプが左のreadだけにしかかからないだろ
( )でもいいけどさ。
>>184 わざわざreadしなくていいよ。
IFS=,
command $n
だけで桶。
list定義の部分はかっこよくできないすかね? hashとか構造体風な感じ
>>189 list= の部分も自分で自由に決めていいなら、
カンマにこだわらずに、↓ みたいにすればいいのでは。
#!/bin/sh
list='
aaa 111
bbb 222
ccc 333
'
set $list
while [ $# -ne 0 ]; do
command $1 $2
shift 2
done
一旦位置パラメータに setして、forじゃなくてwhileで、
shift 2で2つずつ回すのがポイント。
IFS=, cat <<EOF | while read x y; do echo $x $y; done aaa,111 bbb,222 ccc,333 EOF
IFSの仕様が良くわからん。
#!/bin/sh list='aaa bbb ccc' aaa=111 bbb=222 ccc=333 for arg in $list do eval command $arg \$$arg done
>>190 >>191 ありがとうございます。
ちなみに、
>>191 のような場合のwhileは
cat <<EOF | while read xy
do
echo $x $y
done
aaa,111
bbb,222
ccc,333
EOF
のようにインデント、改行つきでかけないもんでしょうか?
>>194 継続行使えばOK
cat <<EOF | while read xy \
do \
echo $x $y \
>>195 アフォか。\ などイラン。
あと、お前の解答の cat <<EOFは無駄。
無駄を省くと、
↓
IFS=,
while read x y
do
echo $x $y
done << EOF
aaa,111
bbb,222
ccc,333
EOF
それより、
>>190 方式がお勧め。
コードとデータが分離してるとかっこいいよね #!/bin/sh # aaa,111 # bbb,222 # ccc,333 IFS=, grep '^# ' $0 | sed 's/^# //' | while read a b do command $a $b done
元の質問
>>182 で、外部コマンドの cut がかっこ悪いって言ってるんだから、
>>197 はもっとカッコ悪い。grepもsedも使うなんて。
>>197 を添削してやるよ。
外部コマンドなしでできる。
#!/bin/sh
# aaa 111
# bbb 222
# ccc 333
while read a b c
do
if [ "$a" = '#' ]; then
echo $b $c
fi
done < $0
どっちにしても、うっかりコメント書いて、えらいことになりそうな
あははは
#define aaa 111 #define bbb 222 #define ccc 333 とかにする?
データをコードよりも後ろに持ってくれば、 コメントアウトする必要なくなるぞ。 ↓ #!/bin/sh exec < $0 while read a; [ "$a" != exit ]; do :; done while read a b do if [ "$a" != '' ]; then echo $a $b fi done exit aaa 111 bbb 222 ccc 333
>>197 これはかっこいいですね!
でも使いたいけど、仕事のだから気がひけるなぁ
205 :
名無しさん@お腹いっぱい。 :2009/02/18(水) 01:28:19
スクリプトの中からコマンドを抜き出す方法ってありますか? たとえば、以下のようなスクリプトがあるとします ---------------------------- #!/bin/sh echo hello echo hello | grep hello echo goodby | sed 's/goodby/hello/' ---------------------------- この中からコマンドをあらわす単語だけを抜き出したいんです。 (この場合だと、echoとgrepとsedがそれにあたりますが、これ以外のコマンドが存在する可能性もあります。
>>205 作ってみた
-----------------------
~$ cat test.sh
#!/bin/sh
echo hello
echo hello | grep hello
echo goodby | sed 's/goodby/hello/'
-----------------------
~$ cat hoge.sh
#!/bin/sh
for word in `cat test.sh`
do
type "$word" > /dev/null
if [ $? -eq 0 ]; then
echo "$word"
fi
done
-----------------------
~$ ./hoge.sh
#!/bin/sh
echo
echo
grep
echo
sed
's/goodby/hello/'
-----------------------
うーん、コマンドでないものまで出力されてる、、、
たとえば、 echo dog cat man という行があったらどうするとか、 eval ls という行があったらどうするとか、 l=l; s=s; $l$s という行があったらどうするとか。
yes, test, [, ummm,,,,
-xの出力を加工することを考えたけど、パイプ等で並列実行すると混じるので断念した。
210 :
名無しさん@お腹いっぱい。 :2009/02/20(金) 22:59:42
質問ですがシェルスクリプトを用いて、aaa.txtの2行目にbbb.txtの文字を追記で 書き込みをするにはどんな感じに書けばいいのですか? aaa.txt 1行目 名前はAAAです bbb.txt 1行目 名前は関口です 2行目 名前は川原です 3行目 名前は遠藤です これをシェルスクリプトを使用してbbb.txtを次のようにしたいのですが・・。 1行目 名前は関口です 2行目 名前はAAAです 3行目 名前は川原です 4行目 名前は遠藤です 説明が下手なのでわかりにくいですがよろしくお願いします。
>>205 一回実行してよいなら簡単に抜ける。
exec(2)をフックして、引数を調べれるか、OSによっては
/procみれば即判る。
実行結果で条件分岐してたら、実行させないとトレース出来ない。
>>210 text=`cat aaa.txt`
sed "2i$text" bbb.txt
あるいは
printf "2i\n$text\n.\nwq\n" | ed bbb.txt
>>211 それだと、if文とかcaseとかの分岐があった場合に
分岐しなかった方が抜き出せない。
内部コマンドが抜き出せない。
>>210 (head -1 bbb.txt; cat aaa.txt; tail -n +2 bbb.txt) > outfile.txt
>>213 sedのiの直後に改行がなくてもOKなのはGNU sed依存。
216 :
名無しさん@お腹いっぱい。 :2009/02/21(土) 12:03:48
いわゆる「指定文字列探索」をshで(findとかsedとか組み合わせて)ささっとやるのは どんな感じでやるのがよいのでしょう。 ループ組まないでやる方法があればベターです。 とりあえずそのディレクトリー内で得に拡張子はとわず 英文(例えばソース中の関数名とか#includeとか)程度でいいです。
grep ってファイル自体を探索できるんですか 勘違いしていた。orz。良くmanよみますたい
「ファイル自体」って考えを止めて、 stdioによるストリームデータとして捉えてください。 シェルスクリプト処理の主な対象は。
-rは純正grepには無いので使用禁止。
>>217 find . -type f -exec grep pattern {} +
ちっともシェルスクリプトじゃないな。find総合スレが必要? w
Solarisはいつになったら grep に -r を実装するんだろう。 あ、全員がopensolarisに移行すれば解決するのか。
SunOSもHP-UXも「どうせみんなGNUtools入れてんでしょウヒヒ」という姿勢だから
>>220 わかりやすい表現で書いただけなり
取り合えず同じディレクトリーないでいいので
grep -a 'キーワード' *.txt
みたいにしてみたんだけれど
これってshで書けば日本語通るけれどターミナルだと打てないのが不便
あとマッチしたファイル名を一回だけ表示したらファイル名だけ探索して次にいくようにするにはいかに書けば良いなり?
>>223 どこにキーワード入れていいのかわからん。orz
>>227 それそれ。ありやとうやんした。
日本語を探索する場合 いちいちshに書くの面倒なんだけど
どうやってんでしょう。各々方は
普通にコマンドラインから。 文字コードがアレな時はlgrep使ってる。
>>229 普通にコマンドラインに日本語入力してるけど。
逆に、なんでコマンドラインに日本語入力できないの?
>>231 x 入れてなきゃ出来ないだろ。
鯖なら普通いれてない。
まあ、鯖でコマンドラインから日本語をいれにゃならんのも想像しにくいが。
>>232 X 入れてなくても日本語入力できてるけど、、
あと、
>>229 で、「shに書く」なら出来てるんだよね?
どうやって shに書いてるの?
それと同じ方法でコマンドラインに日本語入力するだけだが、、
234 :
232 :2009/02/21(土) 19:24:51
>>233 >>229 がどうしてるのかは知らんが、
x の入っているマシンで書いて、scpだ。
これと同じ方法でコマンドライン入力するとなると、
ssh comannd args ってなことになるが、リモートでシェルの補完機能が
使えない状況ではその気になれない。
236 :
229 :2009/02/21(土) 19:49:28
普通にデスクトップ環境です。(xfce) これもfirefoxでカキコしてるし gnome-terminal,Terminal,xtermいずれも日本語は表示するので shの実行結果では日本語表示されます。 anthyでの変換画面はでるけれど変換終了すると日本語部分は表示されません。(ぴっとかはねられる) コピペでもセレクションコピーでも同様 ただしnano等起動すればターミナル内でも日本語変換できます。 ちょっとスレの趣旨と別枠だけれど世間とは違うのですか。
237 :
229 :2009/02/21(土) 19:50:59
むろんガチでダイアログ出すこともできるしperlを使う手もあるけれど grepにそれはないでしょうということで一応質問しているわけであります。
>>236 ロケール設定とshellの設定とターミナルの設定の問題だが、
スレ違いなんで、くだ質スレで、
「コマンドラインで日本語入力したい」ときいてみてくれ。
>>234 その、Xが入ってるというマシンで日本語入力できてるなら、
xtermとかktermとか開いて、その中からsshでログインして、
ログイン先のシェルのコマンドラインに、ローカルのXの
いつもの入力方法で日本語入力できるだろ。
241 :
232 :2009/02/21(土) 20:39:48
>>235 なら、どんくさくない方法を提示しろやカス。
canuumという単語を思い出したが意味は忘れた
>>236 > 変換終了すると日本語部分は表示されません。(ぴっとかはねられる)
↑
というのは、ログイン先でLANG(またはLC_ALLとかLC_CTYPE)が
ちゃんと設定されてないのが原因。
EUC環境なら LANG=ja_JP.eucJPに、
UTF-8環境なら LANG=ja_JP.UTF-8に設定しろ。
あと、これとは別件だが、canuumやuumがある環境なら、
Xが全くなくてもcanuumを起動すれば直接日本語入力できる。
>>243 環境変数LANGによらず、シェルが8ビットコードに対応してないと
はじかれる。Solarisだと/bin/tcshは8ビット入力できなかった。
>>236 は別のシェルを使ってみるといいと思う
ただ、
>>229 の「日本語を探索する場合」って漢字コードが混在していると
非常にやっかいなんだんだよね。昔 jgrep だか ngrep だかが fj.sources に
流れたような記憶があるけど、ああゆう漢字コードを変換する grep が欲しいかも
>>241 「なら」ってなんだよ。つながってねーぞ。クズ。
テラターム使って日本語入力すればぁ? どうせUNIXはサーバー専用なんだろ?
>236だす
>>243 環境変数は全部(LANGもLC_ALLもLC_CTYPEも)ja_JP.UTF-8なり
アプリだと入力できるのでターミナルソフトの問題ではなく
>>244 いうようにシェルの問題だと思ったのだけれど
ふと思いついてsudo xterm(sh)するとなぜかコピペはできて変換はできず
su(csh)だとコピペも入力もできた。
原因は解明できていないしファイラーからターミナル開いて探索ということはやりにくいけれど
オラ個人の設定の問題の様なのでこの件はもうきにしないでくれ
grepの基本がわかっただけでも充分に前進したよ。
>>246 UNIXはゲームしたり文章書いたりブラウジングしたりするパソコン用OS
UNIXはゲームサーバーになったり書いた文章保存するサンバサーバーだったり ブラウジング用ウェブサーバーだったりするサーバー用OS
ちなみにターミナルで日本語打ち込めない対策はさすがにsuとか使えないので perlで<STDIN>使うという最低の方法に逃げたです。これだとクリック起動で文字入力待ちしてPerlで組めばいいのに``でgrep呼んでしまいました。 単純な探索の場合処理的にはファイルをたぐるループ分perlで直接書くより速いと思います。
>>250 $ grep -f - -rl .
ってやれよ。すると、標準入力から読み込んだキーワードがgrepに使われる。
シェルのコマンド行じゃない標準入力なら日本語は通るはず。
日本語打った後は、改行直後に Ctrl-Dで終了。
シェルの中でexpectを使ってwinにtelnetしてbatを実行してるんですが、 当然文字コードが違う(EUCとSJIS)ので化けます。 LANGを途中変えても変わらないです。(ターミナルのせいだと思いますが) 化けないようにできますか?
>>253 ・標準出力にパイプで | nkf -Se をかます
・ktermをSJISモードで開く
好きな方選べ
| iconv -f EUC-JP -t Shift_JIS
シェルってゆうな。クズ。
>>251 ほとんどすれ違いネタになっていたのにありがとうございます
grep -f - -rl .
後の日本語入力→改行→ctrl+dで探索スタートできました。(xterm)
ディレクトリ内にひとつしかファイルorディレクトリがない場合に コマンドを実行しようと思い、 for dir in `find . -type d -maxdepth 1` do test $(ls -1 $dir | wc -l) -eq 1 && command done このように書いてみたのですが、ディレクトリ名が空白で区切られて しまいうまく動きません。 どのように対処したらいいでしょうか?
find . -type d -maxdepth 1 | while read dir do test $(ls -1 "$dir" | wc -l) -eq 1 && command done
>>259 find . -maxdepth 1 -type d \
-exec sh -c 'for d;do [ $(ls "$d"| wc -l) -eq 1 ] && command; done' dummy {} +
>>260 ありがとうございます。readを使うと良いんですね。
無事目的の動作をさせることができました。
>>261 ありがとうございます。
-execはあまり使ったことがないのですが、最後の
done' dummy {} +
の意味がいまいち理解できませんでした。
よろしければ教えていただけますか?
readを使うと、\ を含むディレクトリ名が読めないとか、
(途中じゃなく)頭にスペースが付いてるディレクトリ名が読めないとか
問題が残るんだな。
その点も含めて解決するとなると、
>>261 の解になる。
>readを使うと、\ を含むディレクトリ名が読めないとか、 >(途中じゃなく)頭にスペースが付いてるディレクトリ名が読めないとか IFS= read -r
>>264 read -r は bash依存。
で、それやっても「改行入り」ディレクトリ名が正しく処理されない。
結局
>>261 一択。
read -r は posix じゃね?
267 :
名無しさん@お腹いっぱい。 :2009/02/28(土) 18:54:04
基本的なことかも知れませんが、 キーボードを読んで分岐するバッチはどう書けば医院でしょうか?
バッチならset /pですね。でも板違いなので出てってください。
>>268 MSDOSのバッチスクリプトしか知らない人?
バッチって、バッチ処理等の普通名詞だろう
パスワードがかかってないzipファイルにパスワードをかけていきたいんですが、 そもそもパスワードがかかってないか判定するすべはありますか?
>>270 unzip -Zv *.zip | grep 'file security status'
272 :
名無しさん@お腹いっぱい。 :2009/03/01(日) 08:06:08
cronもatも使えない環境で、指定日時時刻にシェルを実行するバッチって書けますか?
>>269 普通名詞のバッチ処理はユーザーからの入力待ちは行えない。必要な入力データは
あらかじめ用意しておく処理。対話処理とは対極的なもの。
ユーザーからの入力によって処理を変えたい「バッチ」というならMSDOSのバッチに他ならない。
>>272 指定時刻までの時間を計算してsleepする。
>>274 それはわかってますよ。その具体的なシェルを質問してるんですが。
echo -n 'xx時xx分xx秒までの時間を入力してください ' read t sleep $t command
すみませんが、詳しくご存知の方のみ御回答をお願いします
こういうのがはやってるみたいよ
280 :
名無しさん@お腹いっぱい。 :2009/03/01(日) 13:14:31
>>277 は多分質問者じゃない。
こういう荒らしを楽しんでる奴が最近いる。
そらできるよ
bashとawkって書いてあるじゃん
bashはわかりますが、awkって何ですか? bashのプラグインみたいなものとは思いますが
その認識でおk
工エエェ(´д`)ェエエ工
bashとawkでGUIができるの?
久々に笑った。 まさかbashのプラグインと来るなんてねえ。
>>287 GUI とhttp通信は別コマンドじゃないかな
awkを書いたのはCSVのparseに使ってるからだろうね
すみませんが、まったくの素人の方のみ御回答をお願いします
291 :
名無しさん@お腹いっぱい。 :2009/03/03(火) 10:58:08
$ echo abcd def | read a $ echo $a echo の結果を read では変数にセットできない?
できるよ。 ただ、| のうしろはサブシェルになるので、 セットしてすぐサブシェルが終了して忘れるだけ。 echo abcd def | { read a; echo $a; } ksh だとサブシェルにならないので↑のようにしなくてもふつーに動く。
293 :
名無しさん@お腹いっぱい。 :2009/03/03(火) 11:43:30
なるほど、ありがと。 大人しくバッククォートで実行の結果使います。
cshのこと聞いてもいいですか?
>>1 を読んでて答える人がいればいいんじゃない?
俺はcshは分からんが。
296 :
名無しさん@お腹いっぱい。 :2009/03/05(木) 02:03:59
変数の最後入っている改行コードを取り除く方法ってありますか? Perl の chomp をシェルでやりたいのです。
b="`echo $a`"
b="$(printf "%s" "$a")"すると連続した空白も保存
>>297 だとスペースが保存されないし、* とかの特殊記号が展開される。
b=`echo "$a"`
で桶。
>>295 ではだめもとで。
配列の
array=( "a 1" "b 2" "b 3")
をforで1要素づつ使いたい場合
for d in ${array[@]}
do
echo $d
done
とかできますよね
これをcshでやること可能ですか?
間違えた for d in "${array[@]}" do echo $d done こうです。
foreach i ($array) echo $i end だろ。
>>300 cshなら配列使えばいいのでは?
#!/bin/csh -f
set a = ("a 1" "b 2" "c 3");
set i=1
while ( $i <= $#a )
echo $a[$i]
@ i = $i + 1
end
set name = value とかイコール前後にスペース付けられるあたりはcsh悪くないよね というかスペースを許さないbashの代入がちょっとどうかと思う。
なぜそこでbash
とつぜんbashがきたので・・・
>>306 算術式ならbashでもスペースを入れられるよ。
((i = 123))
echo $i
(())ってなんなの?
ま○こ
まi = 123こ echo $i
313 :
名無しさん@お腹いっぱい。 :2009/03/10(火) 07:44:38
sh, bashでシェル変数の値を変数名とするシェル変数を定義して 代入したいのですがどうすればよいでしょうか? eval "$A=B" や eval "$A"=B と書くと、意図通りに代入と判断されるシェル(最近のLinuxのbashやSolarisのsh)も 有ればコマンドと判断されてcommand not foundとなってしまう シェルもあって、困っています。
>>313 一般的には、代入する値のスペースや記号の解釈を避けるには、
eval $A=?''代入する値'?'
と書いておけば桶。evalを含めた2回の解釈を回避するために、
シングルクォートを2回ネスティングする。
$Aの方は、中身は単純な変数名が入っているため、
裸の $A のままクォートしなくても桶。
Solarisのshで動くならそれが標準と考えて良い。
これで動かないようなシェルは捨てるべき。
>>313 わ、なぜかこの環境から書き込むと、
半角の\が?に化ける。(なんで?)
>>313 の?はバックスラッシュに読み変えてね。
>>313 具体的にどのシェルか言えよ
そのときだけ"$A"にスペースが入ってんじゃないの?
317 :
名無しさん@お腹いっぱい。 :2009/03/10(火) 18:05:12
シェルスクリプトってOOじゃないんでしょ? ダサっ
>>313 困っています、じゃあ独り言にしかなってないぞ。
動かない場合の代わりの方法が欲しいのか、
ネタを流してるのかハッキリしろ。
319 :
名無しさん@お腹いっぱい。 :2009/03/10(火) 20:10:54
last(1)を去年の11月から今日まで出したいのですがどうすれば いいでしょうか。
cat /var/log/wtmp.3 /var/log/wtmp.2 /var/log/wtmp.1 /var/log/wtmp.0 /var/log/wtmp >/tmp/wtmp last -f /tmp/wtmp rm -f /tmp/wtmp 場所が違えば適宜探すこと。 圧縮されてたら適宜伸長すること。 11月の分が存在しなければ諦めること。
321 :
名無しさん@お腹いっぱい。 :2009/03/11(水) 02:00:46
>>314-315 ありがとうございます。
が、試してみたところエラーとなりました。
XX=YY形式の設定ファイルをIFS="="として、
while readで読み込んで、環境変数XX=値YYとしています。
whileブロックの外ではエラーがでないので、
IFS="="が悪さをしているのではないかとふと思いつきました。
明日試してみます。
>>316 ,318
bash3.2.25です。
>>321 エラーになってあたりまえだ。
IFS="=" にすれば、コマンド上では = が消えてしまう。
XX=YY は、実際には XX YY という風に実行され、エラーになる。
これは、「シェル変数の値を変数名とするシェル変数を定義して代入」
以前の問題。
「シェル変数の値を変数名とするシェル変数を定義して代入」の問題なら、
>>314-315 の回答で合ってる。
あと、bash-3.2.25かどうかは関係ないと思うぞ。
エラーが出るなら他のシェルでもエラーになるはず。
323 :
名無しさん@お腹いっぱい。 :2009/03/11(水) 09:45:54
Windows PowerShellはOOなのに シェルスクリプトはOOじゃないんだよね 時代遅れだね
>>323 PowerShell は最近生まれたものなんだから当然だろ。
比較するなら PowerShell と同時期に生まれたシェルと比較しろ。
jpgファイルのサイズを知りたいんですが、調べられますか?
はい
>>324 彼はLinux板のシェルスクリプトのところでも同じことを書いてたから。
>>325 imagemagickのidentifyコマンド
ls -lとかじゃないのか。
echo "jpgファイル" | wc -c
>>328 ありがとうございます。できました。
>>329 >>330 すいません。サイズという表現微妙でした。
解像度?1280x1024とかの値の話でした。
かなりてきとーだけど。 while read l; do for w in $l; do type $w > /dev/null 2>&1 && echo $w done done < (ファイル) | sort | uniq
>>325 >>331 X環境ならば
xfceのthunarだと画像ファイルを選ぶとステータスバーにサイズを表示する。
あとImageMagickいれるならば関連付けでdisplayにすれば良い
あとはperlなりcなりでperlmagickなりmagickwandなりでやりたい放題。
但しexifはdisplayでは対応しているけれどImageMagickのライブラリーは対応していないので
libexifとかexiftool入れると良いと思う
>>333 つまりこのスレ的にはexiftoolの返しをいかに削るかということだと思う
335 :
328 :2009/03/18(水) 20:35:04
つ identify -verbose
削るとかよりも素直に WIDTH=`identify -format '%w' image.jpg` HEIGHT=`identify -format '%h' image.ipg` じゃない?
>>336 元質問者の調べる楽しみを奪っちゃダメだよ。
>>335 くらいでとどめておくのが良い
exifに手を出せばいろいろおもしろいんだから、すぐにmanとかで分かるし。
ijgのおまけの返しから削る手だってある。
ノーヒントならともかく「わかった」という喜びを与えてあげよう
それにshell script的には削って置換した方がおもろい。
選択肢が多く汎用性のあるものはいかにおもろいかが重要。
shcでできたCソースからshに戻すというのは楽しいですか?
shcってechoはsystem("echo");とかに変えるんだろうか?
過去ログ見終わって今来た。ふぅ。 cshでさ、cshrcで set path = (${path} ${TOMCAT_HOME}/bin) setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/lib setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/ROOT/WEB-INF/classes setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${TOMCAT_HOME}/ctx/lib:${TOMCAT_HOME}/jdbc/lib って設定してて、気がつくと、 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin:/opt/app/tomcat/webapps/bin LD_LIBRARY_PATH=:/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib :/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib :/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib :/opt/app/tomcat/webapps/lib:/opt/app/tomcat/webapps/ROOT/WEB-INF/classes:/opt/app/tomcat/webapps/ctx/lib:/opt/app/tomcat/webapps/jdbc/lib みたいなことになってるけど、重複した同じパスの解消ってスクリプトで出来る? なんだか検索で遅くなりそうだが、気にしないが現実的?
csh って何回も打つからそうなるんじゃない? それならshでも同じことでしょ 存在しないコマンド打った場合はエラーが帰るのが多少遅くなりそうだけど・・ 気持ち悪ければ、「;」を改行に変えて、sort -u して「;」戻して新たにPATHに突っ込めばよいのかもしれんけどそうすると元の順番と変わるなぁ
>>343 >それならshでも同じことでしょ
↑
なんでやねん。アフォかw
shの .profile は「ログインシェル」しか読まない。
shって何回も打っても二重登録されない。
いや.shrcならさ
>>345 はぁ? .shrc なんてファイル何者?
少なくとも/bin/shはそんなファイルを読まない。
ash bash zsh ksh も .shrcなんてファイル読まないぞw
cshには .login ってファイルなかったっけ
>>341 普通に使ってたら、そんなことは起きない。
.shrcってないんだ・・ bashしか使わんから.bashrcみたいにあると思い込んでいたよ
マニュアル読まない奴は多いんだね
試してみない奴はもっと多い
353 :
名無しさん@お腹いっぱい。 :2009/03/27(金) 12:34:12
初心者質問すいません。 スクリプトの中で変数が空かどうか調べるにはどう書けばよいでしょうか? ご教示頂きたくm()m
>>353 変数名 HOGE が空かどうかを調べる
(1)空文字列は空とはみなさない場合:
echo ${HOGE-'空だよ'}
---
(2)空文字列がセットされていても空とみなしたい場合:
echo ${HOGE:-'空だよ'}
>>353 )空文字列も空と見做していいなら、
if [ -z "$HOGE" ]; then
: 空の場合の処理
fi
356 :
353 :2009/03/27(金) 12:51:54
ありがとうございます!m(_ _)m
>>353 空文字列は空ではないと考えるなら、
if [ "${HOGE+a}" ]; then
: 空の場合の処理
fi
>>357 条件逆になってるよw
if [ -z "${HOGE+a}" ]; then
: 空の場合の処理
fi
359 :
353 :2009/03/27(金) 15:36:18
ありがとうございます。 すいませんもう一個疑問が出来ました。 $1のような特殊変数には値の代入はできないのでしょうか??
つ set -- value1
>>359 × 特殊変数
○ 位置パラメータ
代入方法 ( $1 に HOGEを代入したいなら)
set -- HOGE
ただし、$2以降のすべての位置パラメータがリセットされる
他に、「特殊パラメータ」($0 $@ $# $? など)もあって、
特殊パラメータには値は代入できない。
>>357 「空文字列は空ではない」ってどういう意味??
HOGE+aってそんな変数できるの? 変数に足し算?
HOGE+bとかやるとなにか違い出るの?
全然わかりません><
unsetな状態を「空」って言うのか?
変数が無い 変数設定されてるが空。 変数に値が設定されている。
>>364 で、質問は何?
変数が必要なら設定すれば?
>>363 はいって何?
出来るの?
さっきから何度も。
はいって言葉の重みわかってる?
いま出来ますって断言したんだよ君。
その責任の重さわかってんの?
社会に出たらもっと自分の言葉に責任持てよ。
ん?
社会人の一言一言に掛かる責任の重さが分かってないだろ全然。
学生気分でやってんだったら帰ってもらうよ。
とにかく明日からもう来なくていいから。
説教の誤爆はいつ見ても滑稽だな。
誤爆つーかコピペ
今日から新人来るからな。 今までの下っ端が下っ端を抜け出せるかの試練の日。
370 :
名無しさん@お腹いっぱい。 :2009/04/01(水) 16:14:02
CRONで別サーバーにファイルを転送しようとしています。 対話式で ftp example.com username password cd ディレクトリ put ファイル quit とやると正常にファイルを送信することができます。 ftp -n example.com << __END__ user username password bin passive cd ディレクトリ put ファイル名 quit __END__ をシェルスクリプトで実行すると ファイル名: Permission denied. と権限がない旨が表示されます。 転送元ファイルの権限はroot、パーミッションは0644、転送するファイル一般ユーザー権限、ディレクトリに変えてみたのですが、 結果は変わらずです。 実行ユーザーはroot、シェルスクリプトのパーミッションは0700です。 対話式とは権限周りが違うのでしょうか?
>>370 cronを使わずに、そのシェルスクリプトを一般ユーザーで実行して正常動作するなら、
NFSでrootの権限がない問題と思われる。
シェルスクリプトのパーミッションを755とかにすれば?
よくNFSだってわかったな。
put ファイル名 でエラーしたんじゃないの?
>>373 それだったらメッセージが違う。ftpdからのメッセージになるから、
5XX cannot write hoge とか。
375 :
370 :2009/04/01(水) 17:06:33
一般ユーザーディレクトリにbackup.shを移し、一般ユーザー権限で /bin/sh /home/ユーザーdir/適当なフォルダ/backup.sh を実行しましたが、変わらずです。 backup.shのパーミッションは0755。 CRONでもコマンドライン上でも、シェルスクリプト経由でFTPを通すとエラーが出るようです。 一般ユーザー権限でも、対話式なら問題ありません。
CRONとか大文字で書いてるし、どうせ釣りだ
>>375 一般ユーザーで、
$ /bin/sh -x /home/ユーザーdir/適当なフォルダ/backup.sh
を実行した結果を省略せずに貼ると何かわかるかも。
>>377 そんなこと言って、「省略せずに貼」ったとたん、黙り込むんだよなぁ。
または、他の人が正解を回答して、結局、貼った内容は全く関係なかったり
するんだよなぁ。
>>370 その backup.sh の中の ftp -n を、ftp -nv に変えてメッセージを検証して。
382 :
370 :2009/04/01(水) 18:17:08
遅くなりましたが解決しました。 原因はシェルスクリプト自体の権限が、FTPで接続するユーザート違かったからだと思います。 SSHでログインしているサーバーのユーザーは「root」の他に「admin」「information」などのユーザー名を使用していたのですが、FTPで接続する先のユーザーは全く違う名前でした。 なので、FTPのユーザー名と同じユーザーを作成し、そのユーザー権限でシェルスクリプトを実行したら、無事成功しました。 けど、FTPのユーザー名と、実行するユーザー名が異なると権限のエラーがでるのですね。 不思議です。 皆様ありがとうございました。
そんなはずないと思うんだがなぁ。
384 :
名無しさん@お腹いっぱい。 :2009/04/01(水) 18:25:24
Cygwin(bash)を使っています。 for文の中で文字列の代入をさせようとするとエラーが返されます #!/bin/sh for i in * do $output = $i (・・処理・・) done どうしたらfor文の中で文字列の代入をさせることができるでしょうか?
for の外なら $output = $i はできてるのか?
>>385 for文の外でも
=: command not found
と言われてエラーを返されました(´・ω・`)
えっと、この空気的には output=$i ってマジレスしちゃダメなんだろなぁ
>>386 他の言語の常識持ち込まずに
ちゃんと構文調べてから書いた方がいいよ。
>>387 別にいいんじゃね。
>>387 それでも
output: command not found
とエラーが返されましたorz・・・
cshユーザーに隙はなかった
>>391 できました。ありがとうございました(;´∀`)
393 :
名無しさん@お腹いっぱい。 :2009/04/01(水) 21:22:43
どこかの鯖のシェルスクリプト見るとパスワード書いてあったりするのかwww なんだかなあ。
findでひっかけたファイル一覧をforで回したいんですけど、引っかけたファイルにスペースが入っている場合、単語単位でforで回ってしまいます。 この場合って、事前にIFSをイジるしか解決策は無いのでしょうか? findの-print0とかして、forのデリミタをNULLにしたりとかは出来ないのでしょうか?
>>395 find . -exec sh -c 'for arg in "$@"; do echo "$arg"; done' dummy {} +
>>396 ありがとうございます。
出来ました。
ただ何をやっているのか、理解していないと思われる部分があるので質問させて下さい。
dummyは何をやってるのでしょうか?
僕の理解としては、shの引数としてfindの1結果を渡しているんだと思うんですけど、shにとっての第1引数はdummyなので、
dummy ファイル名
が$@に入ってると思います。
ただ、
$ sh -c 'echo "$@"' arg1 arg2
とすると、arg22がechoされるので、dummyが必要なのは現象からわかるのですが、理由がわかりません。
それと、最後の+はどういう意味でしょう。findのmanでは\;で-execは終われと書いてあるように読めるのですが。
以上、すいませんが、解説お願い出来たらお願いします。
どっちもマニュアル嫁だな sh(1)より: -c string If the -c option is present, then commands are read from string. If there are arguments after the string, they are assigned to the positional parameters, starting with $0. find(1)より: -exec command {} + This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the total number of invocations of the command will be much less than the number of matched files. The command line is built in much the same way that xargs builds its command lines. Only one instance of `{}' is allowed within the command. The command is executed in the starting directory.
forで回したいという要求に合ってない気がするが 空気読んで黙っておくよ
ファイル名にシングルクォートが含まれていないと仮定するなら、
for files in `find . -printf "'%p' "`
do
echo "$files"
done
findに、「シェルで再利用可能なクォートを施した状態でprint」という
機能がない以上、完全な対応は無理。なので、
>>396 のように sh -c を -exec する
方法しかない。
401 :
366 :2009/04/04(土) 15:56:31 BE:526035762-2BP(0)
お礼遅れてすいません!ありがとうございましたm(_ _)m
LANGが日本語じゃなくてもshだと日本語が表示されるのと、 LANGが日本語じゃないとcshでは表示されない理由を教えてださい [root@yama ~]# csh -c "setenv LANG C ; echo '日本語'" ・ [root@yama ~]# sh -c "export LANG=C ; echo '日本語'" 日本語 [root@yama ~]#
% csh -c "setenv LANG C ; echo $LANG" % sh -c "export LANG=C ; echo $LANG"
>>403 は何がしたいんだ?
>>403 は $LANGがコマンドラインのシェルによって先に展開されてしまうから
shやcsh上での動作をテストしたことにはならない。
>>402 が聞いているのは
>>403 とは全く別の問題。
だが、cshはスレ違いなので、これで終了。
ハイ次
↓
↑うぜえよおっさん
406 :
名無しさん@お腹いっぱい。 :2009/04/06(月) 17:45:12
solaris10を使用しています。 ・やりたいこと # zlogin <対象ノード> $ df -h $ exit ※ログインパスは無し 対象ノードへログインし、ディスク構成をとってきたい。 シェルスクリプト中でのログイン処理はどのように書いたらいいですか?
>>406 ふつうに、
# zlogin 対象ノード df -h
でいいじゃん。
>>407 !!!!
出来ました。ありがとうございました。
てっきりヒアドキュメントやらを駆使するのかと....
409 :
名無しさん@お腹いっぱい。 :2009/04/09(木) 20:07:15
シェルの特別パラメータMAILに、/var/mail/ユーザー名、をセットして printenvもしましたが、メールを出して何分経ってもメッセージが出ません。 他に何か設定がいるのでしょうか?
おまえはなにをいっているんだ
済みませんが詳しくご存知の方のみ回答をお願いします
ちんこかゆい
>>409 質問の仕方が悪すぎるので出直してください。
iccをよりgcc互換に近づけるために引数の加工をしようと思っているんだが、うまくいかない。 $@に渡ってくる外からの引数をfor文でまわして一部の引数を取り去るということをやろうとしている。 ダブルクウォートを含んだ引数のクウォートがなくなってしまったり、 シングルクウォートもなくなってしまうので混じって呼び出されていると処理の仕方が分からない。 よりよい引数群の加工の仕方、サブプロセスへの引数の渡し方を教えてほしい。 #!/bin/bash #...(前略) OPTIONS="" # some options are needed to disregard for i in "$@" do case $i in -fmerge-all-constants) ;; -mpreferred-stack-boundary=*) ;; *) ii=`echo $i | sed -e 's/\"/\\\"/g'` OPTIONS="${OPTIONS} \"$ii\"" esac done
415 :
後半 :2009/04/10(金) 01:44:36
#(1)本来の渡し方 #exec -a "/opt/intel/Compiler/11.0/074/bin/intel64/icc" /opt/intel/Compiler/11.0/074/bin/intel64/iccbin "$@"; #(2)普通に実行して戻り値も処理する /opt/intel/Compiler/11.0/074/bin/intel64/iccbin "$@"; #(3)目的の実行法 #/opt/intel/Compiler/11.0/074/bin/intel64/iccbin $OPTIONS; #(4)だが引数がおかしくなるのでこう渡している #echo $OPTIONS | xargs /opt/intel/Compiler/11.0/074/bin/intel64/iccbin last=$? #iccbinがエラーだったときの処理 #...
bashを使っていいんなら、配列を使えばどう? ・0から始まるインデックス変数を用意 ・iccに渡したい引数なら、arg[インデックス]="$i" ・最後に、icc "${arg[@]}"
>>416 早速書き換えてみた。スゲー!
長い間悩まされてたMySQLやapacheなどの大物がまたビルドできるようになったよ。ありがとう。
>>414 bashで解決したみたいだけど、
このスレ的に /bin/sh での解決方法書いておくね。
$#を一旦セーブしておいて、
forで回しながら setで "$@" の後ろに必要な引数だけを追加し、
最後に shift 「セーブしてあった$#」で最初の引数を消す
というのがポイント。
#!/bin/sh
argc=$#
for i in "$@"
do
case $i in
-fmerge-all-constants)
;;
-mpreferred-stack-boundary=*)
;;
*)
set - "$@" "$i"
;;
esac
done
shift $argc
exec gcc "$@"
419 :
名無しさん@お腹いっぱい。 :2009/04/10(金) 07:53:01
>>418 >bashで解決したみたいだけど、
>このスレ的に /bin/sh での解決方法書いておくね。
どうでもいいです。
さらに、間違っているし。
酢布?
>>418 = 正解
>>419 が 「
>>418 = 正解」を見て、
何を「間違っている」と勘違いしたかに興味あるな。
$# 引数の個数を覚えておいて、
同じ "$@" を干渉しないように使い回して
あとで shift する、って結構高度な技が使われてるよ。
高度過ぎて
>>419 には「間違ってる」ように見えたかな(笑)
421 :
名無しさん@お腹いっぱい。 :2009/04/10(金) 08:23:55
>>420 >高度過ぎて
>>419 には「間違ってる」ように見えたかな(笑)
うざいなぁ
418 = 420なの? 顔真っ赤なんだよねw
>exec gcc "$@"
すごく低度な感じ。だれも、そんなこと聞いてない。
まずは、謝ってくれ
>>421 まさかそんなところに突っ込んだの?( )笑
icc に変えればいいだけじゃん。
多分
>>418 の環境には iccがないから、テスト的に gcc でテストしただけだろ。
本当は
>>419 は本気で
>>418 がどこか間違ってると勘違いしてて、
>>420 で指摘されてとっさに苦し紛れに 「exec gcc "$@"」とか言い訳したんだろな(笑)
<丶`∀´>ウリは謝罪と賠償を要求ニダ
>>419 for i in "$@" の ループ中に $@ をいじってるのを見て
反射的に間違っていると思った、に一票
(for の引数はループ前にしか評価されないから問題なし)
多分図星。
指摘するときにMD5を添えなかった
>>419 の負け
酢布って何?
シェルスクリプトの画面出力と併行して実行ログを残したいんですが どんなスクリプトの記述がありますか? teeやscriptを入れると実行が止まってしまう
全体を { } 2>&1 | tee hoge.log とか ( ) 2>&1 | tee hoge.log とかで囲ったら止まるの?
screen
もちろん、
>>428 でも screenでも実行が止まってしまいます
エスパーでも呼べ
画面出力を保存すればいいよ
デジカメで
DVとかHDMIで出力して録画でもいいと思う。
シリアルターミナルにしてシリアルプリンタ直結もいい
そもそもttyというのは(ry
やっぱりダム端末だなwww
viで全角文字を入力することはできますか?
>>438 もちろん、できません。というか、半角文字であってもできません。シェルスクリプトでは。
全角文字がそもそもキーボードから入力できない現実。
441 :
名無しさん@お腹いっぱい。 :2009/04/12(日) 03:29:13
>>422 >
>>421 >まさかそんなところに突っ込んだの?( )笑
全く話にならないねw
はらいてー ぷけら
>>422 もう、書き込まないで一生ろむってろっっwww
趣旨があってねーYO。ぷぷぷ
自分の発する笑い声をあえて手を動かして文字にするところにその人の必死さが滲み出るよね
数スレ前だったと思うが、ズレた指摘をする人がいたのを思い出した。
たしか、
for file in *
do
ある処理 "$file"
done
みたいな感じで、「ある処理」の部分を質問していた。
で、質問自体は解決していた。
解決後に、「それじゃダメ」みたいなことをいう人がいて、
何レスか続いたあと、結局「* じゃドットファイルが処理されない」ことを
言いたかったらしい。でも、質問者はforループ内の「ある処理」の部分について
質問したかっただけで、forの部分は質問のために参考に書いただけ
(実際のスクリプトではおそらく違うのだろう)
今回荒してる
>>419 = >> 441 と同じ匂いがする。
頭の病気だからスルーしる
PGはそんなものだよ。細かい所が取り柄。女にはモテないけど。orz
ドットファイルっていうのは、隠しファイル的な意味があって * に含まれないことが 利点なのだから、特別な処理をするわけでもない一般的なスクリプト中では 単純に * と書くことが良い。 などと、さらにズレてて無意味なレスをしてみる。
女にモテるためには細かい事気にしないのも大事。
女にモテるためには細かい事に気を配るのも大事
C言語マスターすればモテモテ
それはない
女にモテるためには細い方がイイ
はじめてのCぐらいは読んでヤリかたをマスターしておくのがマナー。 ガリが嫌いな女も居るぉ。
お願いです先達の皆様 ファイルの作成日付を取得する方法を教えてください。 sh使ってます。
↓これだけしか記録されていないので不可能。 st_atime: ファイルのデータが最後にアクセスされた時刻。 st_mtime: ファイルのデータが最後に修正された時刻。 st_ctime: ファイルステータスが最後に変更された時刻 (inode データの修正)。
じゃあ最終更新日付でいいので、取得出来るコマンドはありますか?
>>454 ctimeは「ファイルの作成日付」だと広く混同されているので、
「ファイルの作成日付を取得してくれ」と要求した人が
本当は「ctimeを取得してくれ」という意味で言ったのなら、
ctimeを取得すれば桶。
だから ls -lc (ls -lc --fu # for GNU) (ls -lcT # for *BSD)( ls -lce for solaris)
いけました。 lsだとフォーマットが一定しないのでlsでやりたく無かったんですが(年が入ったり入らなかったりする)、 ls -lc 等だとその問題もないみたいです。 ありがとうございました。
tcsh -fc 'filetest -C filename' ↑この方が環境依存性は小さくなる。
tcshよりperlの方が入ってる可能性高いんじゃね?
tcshは入ってないほうが多いだろうな。 perl入れてるなら何でも入れてもいいと思う。
462 :
名無しさん@お腹いっぱい。 :2009/04/18(土) 04:32:11
UNIXシェル入門を読んでいるけど、汎用的に書くって想像したよりかなり大変なんだね CUIで困らない程度に使えるレベルなんだけど、どういう順序でshスクリプトを学習するのがいいのでしょうか? 1 普段、使っているbashの仕様を理解する。例題をヒントにいくつか、書いてみる。 2 ちょっとした自動化できる作業は、意識的にshスクリプトを書いて、どんどん試してみる 3 別のOSを用意し、どちらの環境でも汎用的に使えるスクリプトを書く。普段、良く使うプログラムのいろいろな設定ファイルも極力同一のものにしてみる 4 5 3以降の先は、まったく想像つかないんだけど
bash捨ててdashで書く… bashにもBash POSIX Modeってのがあるか。 コマンド類はまぁ気合で。 #busyboxあたりにposix互換モードがあると便利なのになぁ。
>>462 shとbashの違い以前に、どこまで古いバージョンに対応するかという問題
もあるし、完全に汎用なシェルスクリプトを追求して、時間コストや労力
に見合う結果を得られるのだろうか。
結局、対応したいOSやバージョン、そこから限定されるシェルの種類とバ
ージョンを設定して、その範囲で動作するものを作るしかないし、動作確
認はその限定された環境で行えばよいのではないだろうか。
仕事なのか趣味なのかによっても違うだろうし。
>>463 bashのPOSIX Modeでbashismは防げない。
でも、dashもPOSIX互換を標榜しつつ、細かいところで
POSIXの機能がなかったりする。
困ったね。
そもそもposixに対応することと「汎用的に書く」ことは全然別の話。 Solarisの/bin/shのように、posix非対応のシェルが標準シェルになってるし、 posix準拠を基準にしてしまうと、「汎用的」ではなくなってしまう。 だから、posixは忘れるのが吉。
>>466 手間がかかるけど、posix規格(または、何かの規格)を意識して書く事は、いいことでしょ?
個人的には方向性も大きく違っていないと思っているんだけど
もちろん、どうしても例外的な事例が発生して、それをどうするんだというのは、あるんだろうけど
Solarisは目の前に現れたら考える
とりあえず、総合すると自分がよく使うOSに対応して、ある要請があったら、そのOSの対応を考えて、
随時対処していく感じが労力と時間を考慮すると現実的になんですかね
100行程度の高機能ではない簡易スクリプトをとりあえず自分の狭い世界観で汎用的に
書くことを想定としています
shスクリプトを学習したい理由は、
・shの機能を通じて、UNIXを理解したいこと
・頻出する作業は自動化して労力を軽減したいこと
例え、コーディングのほうが結果的には労力かかったとしても
自分はまだ学習レベルなので労力が結果的にトントンなら大成功
汎用的に書きたい理由は、
・本でそう奨励しているから(?)w
・「汎用的に」書くって響きがかっこいいじゃん
・プログラマなら、ケースバイケースで汎用的書けないと恥ずかしいでしょ
・まあ、多少なりとも汎用性を意識して書くことは、悪いことにはならないよな
馬鹿ってかっこいいなあw
前の案件で1000行くらいのbashのバッチ10本くらい作ったら 後任者が全く理解できずに大惨事になってると風の噂で聞いたので反省している 文字のエンコードするのにiconv何発もかましたうえに\\\\\\\\とかやってるからなぁ
>>468 やっつけ仕事ではなく、ちゃんと他人が読むためのわかりやすいコードを書いたんでしょ?
もちろん、ポイントポイントでコメントでの解説付きで
反省する必要ないよ。後任者が理解できないことで 前任者のすごさをアピールできる。 もちろん、コメントなど書いてはいけない。
Cでそれやったら無能かつ自分勝手な前任者ってことになるんだから、 bashだって同じだろ
3年前に己が書いた1000行くらいのbashのバッチがあったとして 一部修正することになって、ソースを読み込むことになったら、どのくらいの時間で 読めるものだろうか また、他人が一部修正を任されることになって、読み込むことになって、どのくらいの時間で 読めるものだろうか
>>469 コメントどころか基本設計詳細設計まである
要は複雑なshellの経験者って簡単に集められないから
なんでもshellでやるのもよくないねみたいな
うそーん
自分には解って他人には解りにくいコードをわざと用いること。 コメントもドキュメントも残さないこと。 リストラ時代の保身テクニックですな。
>>473 そこまでやっているなら、問題ないと思うけどなあ
bashのバッチで書かずに何でやるのよ?
学習するチャンスだし、峠を越えたら、あとあと楽になりそうなんだが
今ならPython?
その反省を踏まえて、1から再設計するなら、どういう比率でどの言語でやるんですか?
>>475 それで褒められるのはdjbみたいな教祖様だけだろ。
まあ、djb信者以外は誰も褒めないけどさ。
>>476 シェルスクリプトなんて(大幅に譲歩して)100行を越えたら
別のスクリプト言語で書き直すべきだと思う。
それこそ、PythonでもRubyでも良いからさ。
GNUのconfigureに言ってくれ
>>478 わかる気もするけど
Pythonをちょっとやったけど、クラス化、パッケージ化とか、ちゃんと理解していないんだよなあ
比較的に若い言語というのもあって、他の言語の良いところを取り入れて、すごく書きやすいし、保守しやすいしでいいんだけど、
Pythonで使える概念を全部使って書かれたものを、設計を理解して、他人が保守するとなると大変そうだよね
LL言語でもPerl派、Ruby派、Python派といるだろうし
使用する言語を感情論では決めるべきではないけど
Python派「Rubyを使うなら、コメントどころか基本設計詳細設計まであるbashのバッチでいいじゃん」という意見もあるだろうし
>>473 の選択でよかったんじゃないかと思う
もちろん、LL言語でいくのもありだと思うし、後任者の労力的には大差ないと思うけどさ
シェルスクリプトで書いてあって理解できないなら他のでも無理だとおもうヨ
単純な機能ごとに処理を区切って関数化し、相応の名前を付けて書けば どんな言語だろうと大枠で理解できるよね。過不足なくコメントも付けてさ。 んで、\\\\ みたいなトリッキーな処理は、ちょっと詳しく説明をコメントで 書いてあげればいいはず。 これで理解できなければ後任者が無能、逆に上記のように作られてなくて、 C言語でいうところの、全部がグローバル変数だったり、main関数だけの ような構造であれば前任者が無能。 ネット関連の超有名企業に勤めてるんだが、エラー処理もロクにない クソスクリプトばっかりで笑ってしまうorz
シェルスクリプトでは基本的に全部がグローバル変数なわけだが。 あと、「詳しく説明をコメントで書く」って言うけど、 書くなら当然英語で書くと言う意味で言ってるんだよね? エラー処理をちゃんとやらなくても済んでしまうのがシェルスクリプトのいいところ。
全部グローバル変数なのは仕様だから仕方ないけど、書き方ってもんがあるじゃん。 # 漏れは、局所化したいだけの理由でlocalが書けるbashスクリプトにしちゃうことあるけど。 英語でコメント書かないといけない理由は分からん。 エラー処理してなくてショボイ不具合が結構出るのも納得いかん。
>>483 , 484
昔は、loop 系は sub-shell 起こすから loop 内部で宣言した
変数は loop 外から参照できないってのがあったんだが
今でも、whle とかに | 使うとサブシェルになるね。 ならない高機能シェルもあるけどさ。 ループ外で変数が取得できないのは意外と不便w
shってシンプルだが癖は強いからなあ。 ベル研系の言語はどれもそうだな。 副作用禁止で退屈なコード書きましょうと教育された世代には 厳しいもんがあるよ
純正だしw
>>487 awkやRATFORは当時凄くシンプルで仕様の美しい言語。
>>484 > 英語でコメント書かないといけない理由は分からん。
当然社内に外国人担当者もいる。
書いたスクリプトが海外の支社に回ることもある。
コンソールなど日本語が通らない環境でもスクリプトを読みたい時がある。
シェルによってはコメントに日本語が入ったスクリプトをLANG=Cで実行すると発狂する
日本語だと、EUCかUTF-8かJISかSJIS(←これはないが)か悩む必要がある。
偽英語で意味不明のコメント書かれるよりは… コメント書くために時間かけられるよりは… 時間書けるのを避けるために嘘コメントが残るよりは… というわけで、母国語のコメント推奨。 必要な時に翻訳すれば良い。
ローマ字を使えば全て解決
>>482 \\\\の処理具体的にどういう話?
どんだけトリッキーなのか、簡単な処理でいいので解説してちょ
>>491 技術文書なんだから中学英語でいいじゃん
英語説明に不安なら同じ説明を違う言い方で二回書けばいいんじゃねえ?
それか、使い方の例を載せるとか
エロイ人は計詳細設計も英語onlyなのかな?
日本語でしっかり書いて、英語で簡単な説明を書くみたいな感じ?
>>491 母国語のコメント推奨とかいうヤツってマジで害悪だよ
母国語の説明に飢えているなら、readme_jp.txtで簡単な説明を書いてもらえいいんじゃない
bashみたいなshに変な機能が追加されてるシェルで悩むくらいなら cshで書いてしまったほうが圧倒的な汎用性を得られる。
>>495 釣りとしても面白くない。
最近のLinuxには (t)cshがデフォではインストールされていない。
>>495 さすがに論外なんじゃない?
それならLL言語で書いてもらったほうがいい。
Perlだとちょっとこわいけど。
>>494 1世紀ちょっと前にちょんまげを切ったんだから、そろそろ近代化しようぜ
ダクラス・マッカーサーが「アメリカがもう40代なのに対して日本は12歳の少女だ」 と表現したのを知らないの? 実際、そうだったわけだが。 今は、いくつなんだろうか。大学卒業したぐらい?
>>500 それは民主主義の成熟度に対して言ったものなので
全然話が違いますがな。
40のオッサンが12歳の少女をレイプしまくった訳ですね
国家としての成熟度じゃ、日欧にかないませんわな、アメリカは。どう足掻いても。 まぁその欧の中でも英国は大陸の神話とかに対し憧れとかあるらしいが。トールキンに 関する話によれば。
>>501 明治になって、至ってまともな民主主義だったと言われているよ。
朝日だって最初は反戦だったけど、反戦だと売れないから戦争に賛成になったわけで。
本だって発禁されても、出版社は発禁本と逆に名乗って、商売して儲けたらしいし。
改憲派の中でも明治憲法が理想の人は結構多いと思うよ。
そりゃあ、西欧の民主主義と比べたら歴史の年数が違うから成熟したとは、言い難いし。
宗教や人種で30世紀近くさんざん揉めている国々との外交力の差は明らかだよね。
なんというシェルスクリプトスレw
明治憲法みたいに真面目に設計すればいいものはできるという話かw
後任者の保守運用が・・・
2chは末期だな
>>500 奴隷制度現役だった国に言われたくはないわw
>>504 法学板にでも行きなされ。うざいよ。
ところで、読む相手が日本人しかいないと分かってるスクリプトに
無理して英語でコメントを書くのは時間の無駄じゃないかな。
UTF-8で書いてあれば問題は起こらないわけだし。
508 :
501 :2009/04/19(日) 21:01:45
本題に戻って、おまいらちょっくら教えてください。 ↓のような感じのPOPのLOGINログを抜き出したのが山のようにあります。 --- Apr 19 01:23:45 popsvr1 pop3d: [ID 232323 mail.info] LOGIN, user=hogehoge, ip=[192.168.1.2] (popsvr1はホスト名、232323は固定値(再起動しない限り不変)です) --- このログから「2009/04/19 01:23:45,hogehoge,192.168.1.2」のように 日時とユーザ名とIPアドレスを抜き出してCSVに変換したいのですが、 シェルスクリプトで高速に動かすうまい方法はないでしょうか? # 年は今年(date +'%Y'で得られる年)とします。 とりあえずcutコマンド等をひたすら使った稚拙なスクリプトは作っては みたものの、30万行ほどログを処理させると、Core2Duoのそこそこの CPU環境でも20分ぐらいかかってしまいまつ。(´・ω・`) 何かうまい方法があったら教えてください。おながいします。
>>508 とりあえず、kshで実行してみたら?
それでも遅いのなら、シェルスクリプトで実行すること自体が
問題なのだと思う。
510 :
501 :2009/04/19(日) 21:22:29
>>509 ありがとうございます。
/bin/shで実行させていたので、明日試してみます。
(手元に実行環境が無いもので…)
>>508 あえてシェルの内部コマンドだけで書いてみたよ。
↓
while IFS=' =,[]' read mon day time d1 d2 d3 d4 d5 d6 d7 user d8 ip
do
echo 2009/$mon/$day $time,$user,$ip
done
あと、Aprを 04に変換したりするのだけパイプで sed でやってね。
>>508 そのスクリプトでトータル何行(未来の行数も含めて)のログを処理させたいの?
>>511 そこまでできてるなら、echoの直前に
case $mon in Jan)mon=01;;Feb)mon=02;;Mar)mon=03;;Apr)mon=04;;..省略..;;esac
の行を入れれば sedも不要。全部シェルでできる。
514 :
501 :2009/04/19(日) 21:43:29
>>511 ,
>>513 ありがとうございますた。参考にさせていただきまつ。m(__)m
>>512 今のところ30万行ぐらいなんですが、もしかしたら最大で
500〜600万行ぐらい処理するかもしれません。
プログラミングで飯喰ってるPGならシェルスクリプトや何の言語でもさっと読んで理解するのを期待したい所では有るな。 コメントに頼るレベルで、プログラムで飯喰おうってのが甘い気がする。 もちろん母国語的、得意な言語が有って、それで前任者のプログラム置き換えていけばいいと思うけどね。 前任者がシェルスクリプトで組んでても、修正出来ないじゃ、作り直すしか無いし。 汎用的なシェルスクリプトよりは、いろいろな環境の癖を知って臨機応変に組めたほうが重宝すると思う。 いろんな環境を体験する事かな。SunOS, Solaris, Linux(rhel系,フリー系), Windows(cygwin, interix)ぐらいかなあ。SunOSはもう流石に無いと思いたいwww
>>515 うちのところにもこういう人います。
意外と仕事が雑なんですよね・・・
>>508 Apr 19 01:23:45 popsvr1 pop3d: [ID 232323 mail.info] LOGIN, user=hogehoge, ip=[192.168.1.2]をただ300万行コピペしたファイルをうちの並のマシンで1分38秒出た
メモリも喰わないし、シェルスクリプトってかなりいいタイム出すんだね
$ time ( cat pop-300.txt | ksh 2ch-shell-20090419a-foo.sh >> pop-300.cvs ) &
[7] 27015
$
real 1m38.872s
user 0m26.174s
sys 1m12.485s
[7] Done time ( cat pop-300.txt | ksh 2ch-shell-20090419a-foo.sh >> pop-300.cvs )
$ wc pop-300.cvs
300000 600000 12900000 pop-300.cvs
$ tail pop-300.cvs
2009/04/19 01:23:45,hogehoge,[192.168.1.2]
2009/04/19 01:23:45,hogehoge,[192.168.1.2]
2009/04/19 01:23:45,hogehoge,[192.168.1.2]
2009/04/19 01:23:45,hogehoge,[192.168.1.2]
2009/04/19 01:23:45,hogehoge,[192.168.1.2]
2009/04/19 01:23:45,hogehoge,[192.168.1.2]
2009/04/19 01:23:45,hogehoge,[192.168.1.2]
2009/04/19 01:23:45,hogehoge,[192.168.1.2]
2009/04/19 01:23:45,hogehoge,[192.168.1.2]
2009/04/19 01:23:45,hogehoge,[192.168.1.2]
519 :
518 :2009/04/20(月) 02:23:18
bashよりkshは3.5倍速った こんなに違うのか $ time ( cat pop-300.txt | sh 2ch-shell-20090419a-foo.sh >> pop-300.cv2 ) & real 5m45.010s user 4m31.791s sys 1m11.200s $ time ( cat pop-300.txt | bash 2ch-shell-20090419a-foo.sh >> pop-300.cv3 ) & real 5m47.776s user 4m34.900s sys 1m12.200s
520 :
名無しさん@お腹いっぱい。 :2009/04/20(月) 02:31:55
空行を五行文だすときに ------------------------ echo aaa echo "" echo "" echo "" echo "" echo "" echo bbb ------------------------ 以上のようにしているのですが、もっとエレガントな方法ってないですか? イメージ的には echo "" * 5 ってやると空行が五行文出力されるようなものです。
echo "aaaa" for i in `seq -w 5`; do echo ""; done echo "bbbb" for i in "" "" "" "" ""; do echo $i; done echo "cccc" printf "\n"; printf "\n"; printf "\n"; printf "\n"; printf "\n"; echo "dddd" echo; echo; echo; echo; echo; echo "eeee" # どれか? # というか、普通にecho ""を縦に並べたほうがみやすいんじゃないの?
>>521 自己レスだけど;(セミコロン)は、C言語としての文の終わりとしての意味合いの記号じゃないから、;は入れないほうが望ましいって本に書いてあったな
なにかあるってわけじゃないんだろうけど
printf "\n"; printf "\n"; printf "\n"; printf "\n"; printf "\n"
echo "dddd"
echo; echo; echo; echo; echo
echo "eeee"
>>520 1個のechoで、改行含めて見たままシングルクォートにするのがエレガント。
echo 'aaa
bbb'
以上
そういやこういうのもあるね
echo -e "aaaaa\n\n\n\n\nbbbbb"
>>523 シングルクォートの意味はあるんですか?
あとでダブルクォートを入れやすくするため?
>>524 不用意な展開を防ぐため。
基本はすべてシングルクォート。
$HOGE とか `com` とか、展開が必要な時のみダブルクォート、というのがルール。
>>525 さんくす
もっといっぱい本を読んで、写経します
>>519 kshの速さを実感して貰えて何より。
いまいちマイナーなのが不思議だったりする。
kshは商用SystemV系ってイメージあるし
>>527 昔はこぞってみんな使ってたんだぜ。
bashがなかった時代だけど。
>>525 自分ルールを標準のごとく言ったりエレガントとか言うのはどうかと思う
520〜523までなら後から見たときや他人が書いたものを見たとき520が一番見やすい
echo の内容を | を通して渡す為に
>>523 にしたというならともかく(この場合でも他に方法はいくらでもあるけど)
仕事で使うのは最近はkshばかりだなー マイナーという
マイナーというのはどうかな
>>527 なぜかOpenBSDで使われているShellって感じですね
2000年まで、Korn shell は AT&T の権利保有するソフトウェアであった。その後AT&T独自
のライセンスの下でオープンソースとなり、2005年から Common Public License での配布
となった。Korn shell は AT&T Software Technology (AST) Open Source Software
Collection の一部として入手可能である。
と書いてあるけど、2000年以前は無料で使えなかったんでしょうか?
10年前ぐらい訳本には商用うんぬんと書いていないから15年前ぐらいからは入手的には困らなかったんだろうか
OpenBSD誕生が1996年みたいだけど、標準Shellは、なんだったのだろうか
最初からksh?
あとなんちゃってUNIXユーザーとしては、知名度だと
bash >>> sh >= zsh >= tcsh >> csh > ksh ぐらい違う
それ以外のマイナーなShellは、自分の中に存在しません
>>529 bash誕生が1987年、Linux誕生が1991年なんですけど、簡単にbashは入手しづらかったんでしょうか?
>>531 Linuxだと標準では入っていないけど、kshは入れるものなんでしょうか?
ビジネスでの普及度はどんな感じなんですか?
対話シェルはbashとか、他のなにかでshスクリプトの実行はkshって感じなんでしょうか?
それともshに対応しないkshスクリプトを書くの?
>>532 今でもひそかなファンが多いし、重宝されていると言えばいいのかな
>>533 >それともshに対応しないkshスクリプトを書くの?
普通書かない。
shに対応しないkshスクリプトの代表例と言えば [[ ]] の記述。
sh的には if [ "$hoge" = fuga ]; then と書くところを、
kshでは if [[ "$hoge" == fuga ]]; then と書く。
でも、こんなの滅多に見ないだろ。それほど kshはマイナー。
客先とかだと勝手に入れられない。
もちろん設計段階で盛り込むんだよーん
自分が一生面倒見ますくらいじゃないとそんなの入れられない 特に自社システムじゃなく受託開発なら トラブル時に責任問題にもなる
なんか、どうでもいい話だな。
サポートのあるものを入れれば大丈夫だよん
redhatとかsuseとか それぞれのベンダが提供しているやつ
OpenBSDのkshはpdkshじゃなかったっけ?
たいていpbksh
$ ksh プログラム 'ksh' は以下のパッケージで見つかりました: * ksh * mksh * zsh * pdksh 次の操作を試してください: sudo apt-get install <選択したパッケージ> やはりここはpdksh?
OSが起動した日時を取得する、いい方法は無いでしょうか? 起動からの経過時間でなく、起動日時です。 出来ればシリアル値(1970からの経過秒)で取得できれば嬉しいです。 uptimeの結果から計算するのは起動からの経過時間によってフォーマットが (daysやminが付いたり、付かなかったり)違うため出来れば避けたいです。 GNU、bash依存でもかまいません。
cat /proc/uptime
cat: /proc/uptime: No such file or directory
だからBSD*は駄目なんだよ
>>546 GNU 依存でいいなら、
date -r /
(ルートディレクトリのタイムスタンプは起動時に touchされて
その後書き込みは普通は発生しないことを利用)
$ date -r / 2009年 2月 6日 金曜日 21:12:47 JST ずれまくりワロタ
>>550 OpenBSD on VMware on WindowsXPでやったら、Thu Jan 1 09:00:00 JST 1970になった
まあ、OpenBSD on VMwareだからしゃないやな
554 :
553 :2009/04/20(月) 22:46:48
ubuntu8.04 LTS on VMwareだとVM作成時の年数日時 Scientific on VMware,Fedora11 on VMwareだとちゃんと出るんだな まあ、どうでもいい話でした
555 :
501 :2009/04/21(火) 00:03:03
>>508 の質問の件ですが、御陰様で無事に動きますた。
ただしおいらの環境だと、
>>511 さんのプログラムのままでは
2009/04/19 01:23:45,user,ip=[192.168.1.2]
のような結果になってしまうので、whileのダミー引数を増やしました。
最終的にこんな感じにしますた。
(※全角スペースでインデントしています)
----
#!/usr/local/bin/ksh
YEAR=`date +'%Y'`
while IFS=' =,[]' read mon day time d1 d2 d3 d4 d5 d6 d7 d8 user d9 d10 ip d11
do
case $mon in
Jan)mon=01;; Feb)mon=02;; Mar)mon=03;; Apr)mon=04;;
May)mon=05;; Jun)mon=06;; Jul)mon=07;; Aug)mon=08;;
Sep)mon=09;; Oct)mon=10;; Nov)mon=11;; Dec)mon=12;;
esac
echo $YEAR/$mon/$day $time,$user,$ip
done
----
556 :
501 :2009/04/21(火) 00:07:41
続きです。 スクリプトの実行速度なんですが、約10万行のログを処理したところ、 kshではなんと4秒で終わっちゃいました。 ちなみに/bin/shで動かしたら、27秒もかかっちゃいまして、 処理性能の違いに驚いた次第であります。 おまいら、ありがとうございますた。
>>555 報告おつ
比較をわかりやすく、30万行じゃないのねw
6.75倍はすごいね
559 :
501 :2009/04/21(火) 01:26:31
>>557 処理時間を計ったのはVMware上で動いているFreeBSD7.1ですが、
Solaris9(SPARC)でも動くのは確認しますた。
>>558 手元にあったのが10万行のログだったので、
とりあえずこれで試しますた。
深い意味はありませんw
>>546 こんなのどうかな。
GNU依存だし、動かないパターン多そうだけど。
$ last | grep '^reboot' | head -1 | awk '{print $5" "$6" "$7" "$8}' | date -f - '+%s'
今月起動したっていう場合しか無理っぽいな
>>561 wtmp って1月分しか残らないんだっけ?
そう言えば、/proc/uptime はサイズどれだけ有るんだっけ(溢れることはない?)?
563 :
名無しさん@お腹いっぱい。 :2009/04/21(火) 03:07:54
bashで、三項演算子を使いたいのですが、どのようにするのでしょうか?
shellはダイナミックライブラリのとスタティックのが有るから、ベンチ遣るならダイナミックのほうが有利だろうな。
>>563 たとえば、
echo $((x > 0 ? x: -x))
とか。
俺の解釈では A && (B; true) || C かと。
>>566 アフォか。
それは普通の「2項」の演算子の組み合わせ。
しかも、bash限定でもない。
>>565 が正解。
正解は
>>565 >>567 は>566に輪をかけたアフォ。
「bashで」というお題は「bash以外では動作しない == bash限定」事を要求していない。
頭のおかしい人はスルーで はりきるだけだから
するーされてるが
>>564 もあふぉだな。
ここでのベンチ(kshとbash)は、ライブラリが動的か静的かよりもはるかに大きい
差を生じているので、そんな点を指摘しても無意味。
さらにアフォな点は、バイナリは「スタティックリンク」の方が速い(有利)ということ。
>>564 は全く逆に覚えてるようだね。
なんでスタティックリンクの方が速いんだ?
>>571 素で質問してるならぐぐれ。
釣りなら面白くない。
ファイル名を通し番号に変えたいんですけど 以下のスクリプトでエラーが出ます。 num=1 for file in *.m4a; do mv $file $num.m4r num=`expr $num + 1` done エラーは mv: target `1.m4r' is not a directory というものです。 シェルというよりmvコマンドの使い方の問題なのかもしれませんが 自分には原因がわかりません 教えてください
>>573 スペース入りファイル名が分割されて、
mv hoge hage.m4a 123.m4r
みたいに実行されたのが原因。
シェル変数の展開時には原則すべてダブルクォートを付けること。
mv "$file" "$num.m4r"
>>573 ファイル名に空白(やタブ等)が含まれているのだろう。
mv "$file" $num.m4r
>>575 >>576 なるほど、そういうことだったんですか!
まさにその通りで、ファイル名にスペースが入っていました。
ありがとうございます!
>>546 すごく適当ですが・・・・こんな感じで OS ごとに書くしかないかと。
case `uname -s` in
'Linux')
grep btime /proc/stat | cut -d ' ' -f 2
;;
'FreeBSD')
cut -d ' ' -f 8 /proc/1/status | cut -d ',' -f 1
;;
*)
;;
esac
スタティクは全部読むから読み込みに時間がかかるし、ライブラリのキャッシュも効いてないぞ。 ダイナミックが遅いなら、みんなダイナミック使ってないwww perlとかも普通はダイナミック。
>>579 オマエ真性の勘違い野郎か。
スタティックリンクでも全部は読み込まない。
仮想記憶って知ってるか?
バイナリプログラムのうち、実際にCPUのプログラムカウンタが走った命令のアドレス
を含むメモリページのみが読み込まれる。実行されなかった部分は読み込まれない。
ダイナミックリンクのライブラリは、リロケーションの関係で、
PIC(ポジションインディペンデント)にコンパイルする必要があり、
PIC自体が通常のバイナリよりも数%遅い。
ライブラリのキャッシュについては確かにいうとおりだが、
これは他の要素に比べて影響は小さいので、
やはりダイナミックリンクの方が遅い。
ダイナミックリンクは遅いが、HDDの節約や、ライブラリのupdateの際に
リンクしてる個々のバイナリを再コンパイルしなくて良い便宜のために
使用されている。どうしても速度優先の場合は、
スタティックリンクを使うことがあるよ。
>>580 に補足。
ライブラリは複数の関数の集まりでできているが、
スタティックリンクの場合、それらの関数のうち、使用している関数だけが
コンパイル(ld)時にリンクされる。使っていない関数はそもそもリンクされない。
(使っていても条件によって呼び出されなかった関数は
仮想記憶によってメモリにはロードされないままになる可能性があるのは
>>580 がいう通り)
ダイナミックリンクの場合は、使っていない関数まで
実行時に塊で付いてきてしまう。
ダイナミックリンク/スタティックリンクの速度の違いなんて小さいからどうでもいい。 それよりもバイトコンパイルやらコマンド組み込みやらの方が効果でかいはず。
>>579 間違った知識ばらまいてないで、実験してみればいいのに。
$ cat hoge.c
#include <stdio.h>
int main(){printf("Hello¥n");return 0;}
$ gcc -o dynamic hoge.c
$ gcc -o static hoge.c -static
$ time ./dynamic
Hello
real 0m0.004s
user 0m0.000s
sys 0m0.001s
$ time ./static
Hello
real 0m0.002s
user 0m0.000s
sys 0m0.000s
スタティックリンクの方が速いね。
>>563 ミリ秒オーダでしか違わないんじゃほとんどの場合は
そんなこと気にするよりまともなプログラム書いたほうが
いいなw
>>584 dynamicもstaticも「ほとんど違わない」ので、それ以外の要素による違いの方が大きい
ということは元々
>>570 が指摘してる。(こっちが要点)
それ以外に、
>>564 は「ダイナミックの方が速い」と間違ってることを言ってるるので、
それをついでに指摘しただけ。
で、
>>579 で未だに「ダイナミックの方が速い」の主張を続けるから、
>>580 がそれを否定しているだけ。
別に
>>580 が、シェルスクリプトのシェルをスタティックにしろと主張している
わけではない。
元の質問に戻って、
>>508 の場合、外部コマンドの cutの呼び出しが多数ループ
されるので、それが遅かったのが原因と思われる。
>>511 はシェルの内部コマンドだけを使っているので、それで激劇に速くなったと。
いすれにしても、その話の流れを読まずに
>>564 で見当違いかつ間違った指摘をしている
>>564 はアフォ。
>>580 > ライブラリのキャッシュについては確かにいうとおりだが、
> これは他の要素に比べて影響は小さいので、
> やはりダイナミックリンクの方が遅い。
嘘八百のおバカさん
>>585 主張する内容自体に問題くても、必死すぎるとキモいものだな...
まあ落ち着け。
通常の実行バイナリがstaticかdynamicかという問題のほかに、
>>579 は perlの「ダイナミックロード」のライブラリ(モジュール)の話と
混同してるフシがあるな。(わざわざ的外れなperlを例に持ち出してきてるあたり)
>>579 にとって、「ダイナミック」とは、perlでしかイメージできてなくて、
普通にCをコンパイルする時のstatic linkとdynamic linkを違いを
全く理解できてない(存在自体知らない?)んだろう(笑)
>>584 問題です。
Ubuntuでは、dashをビルドする際に、libcを使わずdietlibcに変更した上で、
スタティックリンクしています。これはなぜでしょうか。
ヒント:Ubuntuでは/bin/shとしてdashを使っています。
ld.so関係で事故が起きても動くように。 スタティックリンクの方が速いからではない。 そもそも速くないし。
>>590 >そもそも速くないし。
↑
は間違い。実際速い。
それ以外にstatic linkにする利点と、さらにdietlibcに変更する理由を質問してる。
>>590 では答えになっていない。
ハイ、答え直し
>>590 >>584 ↓
それっぽく書くだけで人はこんなにもだまされるんだな。 ちゃんと自分の頭を使って自分の体を動かして自分の目で確認しろよ。
linux はスタティックリンクなバイナリのように見えても、 NSS まわりとかで必要があれば勝手にダイナミックでリンクしちゃうから わりとどーでもいい。
>>593 争点をぼかすことになるから、ここでは dlopen()系の話は持ち込まない方が
話が簡単になるかと。どうせあほは
>>579 1人だろうし。
staticリンクするとGPL汚染するからGPL信者には都合がいい。 しかもdietlibcはLGPLでなくGPLなのでダイナミックリンクでも汚染する。
>>584 このオーダーも特に速度が必要な場合は馬鹿に出来ないよ。
まぁ、dynamicかstaticかの違いより、根本的な設計の方がよっぽど大きいけど。
>>597 ミリ秒オーダーの起動オーバヘッドが問題になるほど実行時間の
短いプログラムを何度も起動するのはそもそも設計が悪いよね
>>598 オーバヘッドは「プログラム起動時」だけじゃないよ。
dynamicなライブラリ上の関数を呼び出すたびにオーバーヘッドがかかる。
さらに、関数自体がPICによって速度上不利なコードで書かれているから遅くなる。
staticライブラリなら、プログラム中に絶対アドレスを決めうちで持つから、
その分のオーバーヘッドがなく高速動作する。
ダイナミックリンクが遅い派の人って、なんか宗教じみてるよね 結論ありきというか そうでないと世界が崩壊しちゃうんだろうね
>>600 自己紹介乙。
そうか、今までdynamicの方が速いと信じこんでいて、それが間違いだと知って
キミの世界が崩壊しちゃったのか、、よしよし
これ、シェルスクリプトの話?
いんにゃ、全てのライブラリをスタティックリンクさせてメモリを圧迫させようとする秘密組織の陰謀。
すべてのプログラムをGPLに汚染するGNU組織の陰謀だろwww
>>605 ま、次から間違えないようにすれば良いじゃないか。
echo aaabbbccceee | sed 's/aaa//' | sed 's/ccc//' という場合のsedをひとつにできますか?
>>607 echo aaabbbccceee | sed 's/aaa//;s/ccc//'
>>607 $ alias ひとつ=sed
$ echo aaabbbccceee | ひとつ 's/aaa//' | ひとつ 's/ccc//'
echo aaabbbccceee | sed -e 's/aaa//' -e 's/ccc//'
sed | sed って書く香具師ホント多いよな。1つの sed で何個も書けるのにw 個人的には、見やすさも考えてこんな風に書くこと多いかな。 sed -e 's/afo/moe/g' \ -e 's/unko/umai/g' \ -e 's/ahya/uhyo/g' あと、文字列に / がいっぱい入るときは \/ じゃなくって、そもそも / を使わない。 s|/afo/desu/yo|/unko/tabe/tai/ne|
蛇の足まで描くな
あと、sedとgrepを | でつなぐ奴とか。もうあほかと。
でも少しずつ様子を見ながら作業してるときは、お尻に付け足すほうが カーソル戻さなくていい分楽なのでついやっちゃうんだよな...
>611 実行速度が大きく違う時がある -e よりは sed | sed | sedの方が速いときもある ケースバイケースでしょ
>>613 インターネットで俺の悪口を言うのは止めてくれないか ><
オレのことではないと分かってほっと一息
sedの件ありがとうございます ただひとつの場合-eはなくてもいいのに複数の場合は必須なんですね?
まあコマンドで出力しぼったりしてるときは grep | sed とか書いてもいいべ
sedが3つも起動されてるのはどうだか。
いまどきのマシンなら3つぐらい余裕で動く
>>615 sed 's/afo/moe/g;s/unko/umai/g;s/ahya/uhyo/g'
よりも、
sed | sed | sed の方が速いことはあり得ない。
×ケースバイケース
○
>>615 の負け惜しみ
615は -e って言ってるのに
シングルなのかクアッドなのかに寄っても違うとか? まあsed実行中もshellが居座ってるのもなんだかなあだけど。
shellが居座るってよくないの? そのshell分、ちょっぴりメモリを食うだけでしょ 他になんかデメリットってあるんでしょうか?
下流のsedにshellはいないんじゃないの?
あいや、なんか変な言い方になったな
コマンドがひとつだけなら、 exec command とやって、forkせずにシェルをコマンドに化けさせられる。 2つ以上のコマンドをパイプする場合は、execが使えない。 敢えて exec を付けても無意味。実験してみればわかる。
OSごと仮想化されてる時代に慎ましいスレですね
いつまでもシェルスクリプトは使われるだろうね
>>633 そりゃFortran・COBOL・Lispが未だに現役なわけだし。
特にコボルのバッチ処理がしぶとい。 今時オンデマンドでリアルタイムで処理しろよって感じだが。
>>635 まぁ世の中、夜間のバッチ処理に向いてる(リアルタイムに向かない)
処理もある訳で、ホストもバッチ処理もそう簡単には無くならんでしょうな。
海外のフォーラムをみていたけど、意外とksh派って多いんだね bash 3.5, ksh 3.5, zsh 2, csh(tcsh) 1って感じだった 他のマイナーなShellは出てこず kshの良い点としてvi-likeの編集機能を何名かがあげていたんですけど、そんなに便利なんでしょうか?
set -o vi となんか違う?
こういうのできるんだね vi `locate filename.sh` クドイほどtips and 例文満載の文書ってないのかな
>>637 弱い犬ほど良く吠えるから
発言が活発=利用者が多い
じゃないよ
cshやbash以外は普及してるかと言われればそうでもない
>>640 /bin/shの実体が何かによって利用者の数は決まる気がする。
>>639 vi +/PATTERN `egrep -l PATTERN *`
ってのは良くやるからシェルスクリプトにしてる。
サンクコストだったっけ?>無駄金を諦める
kshはWindowing Korn Shellに憧れたなぁ 結局公開されたkshにはその機能がなくて一度も見ることなく終わったのだが、 どんなもんだったか証言できる人はいますか? これが使えていたらTcl/Tkとかたぶんやってなかった。
Solarisには普通に入ってなかったっけ?>dtksh
すごいくだらない質問ですまない。 /tmp/old まであるディレクトリ構造で 単純に/tmpディレクトリにあるファイルリストをテキストで出したいのだけど ディレクトリや隠しファイルの表示は入れたくない どんなコマンドつかえばできる? lsやfindでいろんなオプションつけてやってみたけど無理だった たぶんすごく単純なところで引っ掛かってる気がするので、わかる方いたら教えてください
find /tmp -maxdepth 1 -type f
>>648 cd /tmp; for file in *; do [ -f "$file" ] && echo "$file"; done
find内で.*を排除するほうがいいだろう。 くだ質スレでほぼ解決してるからここ見に来るとは思わんけど。
>>652 find内で.*を排除するのは無駄だろ。
せっかく内部コマンドだけでできるのに。
>>652 あっちでやってるのは、find「内」じゃないだろ。
findの「外」のパイプに出してからあとからカットしてる。ノンエレガント。
外部コマンド | 外部コマンド よりも、 シェル内部コマンドのみ の方が速いわな。
>>652 find方式だと、「hoge<改行>.hoge」みたいなファイル名があった場合、誤動作する。
>>651 方式なら無問題。
[ が内部コマンドなシェルならいいけど、 外部コマンドなシェルだとパフォーマンス最悪
コストだとかケチくせぇことはいいんだよ。
>>651 はファイル名にシーケンス文字列とか含んでると一部のシェルでは誤爆すんよ
$ touch foo\\bar
$ for file in *; do [ -f "$file" ] && echo "$file"; done
foar
[ が外出しのシェルなんて現存しないから。あ、NGワードMINIXな。
>>659 for f in *; do [ -f "$f" ] && printf '%s¥n' "$f"; done
>>660 FreeBSD tcsh
% which [
/bin/[
cd /usr/ports/shells/v7sh; make install
>>665 やっぱり「現存」しないじゃん。
わざわざ作らなきゃいけないんだから。
この流れ、前も見た気がするけど、 「testやechoが外部コマンドの場合もある」って主張してる人、 実際そんな古いシェルを「ログインシェル」または「スクリプトシェル」として 現役で使ってるの? 使ってないのに机上の空論してもしょうがないよ。
そんなことはどうでもいい
testを使わない方法を考えてみた。 for f in *; do (cd "$f") 2> /dev/null || echo "$f"; done Permission deniedなディレクトリがあったら誤判定されるのは仕方ない。
> 誤判定されるのは仕方ない。 > 誤判定されるのは仕方ない。 > 誤判定されるのは仕方ない。 > 誤判定されるのは仕方ない。
>>669 誤判定されない方法を考えてみた。
for f in *;do case `(cd "$f") 2>&1` in *'Not a directory')echo "$f";;esac; done
>>647 > もしかしてOpenSolarisにも入っているのだろうか・・・
入ってない。TODOリストに入っているが、
ライセンス関係で新たに作らないといけない。
CDE/Motifべったりだから誰もやらないだろう。
>>666 わざわざエミュレータで動かしてます。
「現存」してないです。とあなたは言うでしょうけど。
648は満足したのかな。
testの内部コマンド化は実用の観点ではぜひ必要だが 美しくないな。 なんてこと言う奴はrcを使えってことか
>>664 > v7は「現存」しない。
うちでは fpga で作った pdp-11 互換 CPU 上で元気に動いてますけど
> cdも外出し。 寝言は寝てから言ってね
>>676 それを「現存しない」と言う。よく覚えとけ。
Solarisでは cdは外出しだよ。 /usr/bin/cd コマンドが存在するし。 多分、親プロセスを chdir()するようなシステムコール? を呼んでる??
>>679 それたしか、自分がcdするだけ、ってnopコマンドじゃなかった?
いや、ちゃんとcdでディレクトリ変わるし、which cd で /usr/bin/cdって出るんだ。
>>681 /usr/bin/cd fooとやると変わらないだろ。
/usr/bin/cd foo && cd fooでフェイルセイフなcdだ。
>>682 > /usr/bin/cd foo && cd fooでフェイルセイフなcdだ。
それ、フェイルな場合 /usr/bin/cd の段階でフェイルして、
エラーメッセージも出てしまうから、ちっともフェイルセーフじゃない。
単に cd foo とやったのと何ら変わりない。
684 :
名無しさん@お腹いっぱい。 :2009/04/29(水) 09:28:49
>>679 > 多分、親プロセスを chdir()するようなシステムコール? を呼んでる??
そんなシステムコールあるわけねーだろw
おれ、今OS自作してるけど、fork()の引数でSHARE_CWDをセットすると 子プロセスとカレントディレクトリを共有する仕様にしようと思ってる。 cdを外付けコマンドにしたシェルを実装するんだ。
フラグ乙
あと、SHARE_ENVとSHARE_FDもつければいい
>>685 それ、cdのときだけSHARE_CWDをセットするんなら、cdだけ特別扱い変わらず?
fork()じゃなくてclone()だろ
我が家のアイデア料理の話は要らないから 既存のシェルスクリプトの話をしろよ
シェルってコンピューター用語だよ。 貝料理のことじゃないよ。誰も料理の話はしていないよ。
つまんね
>>678 日本語が不自由な人か?
ちゃんと、未だにPDP-11互換CPU上でV7が動いているんだから
「現存しない」とは言わないと思うぞ
実際にV7が動いてるわけだから
そんなこと言ったら、博物館で復刻動作してる物でも「現存する」ことになってしまう。 testやechoが外部になってるシェルの議論なんてしても無駄。
V7はソース見るとあまりにスッキリしすぎ。 (shは伝説的変態だが) 実際使うとすぐ落ちるんじゃないか?
>>694 現実に動作してるじゃん
それを使う機械の有無は別として
シーラカンスは現存してないものって言ってるのに等しい
このスレは、実際にシェルスクリプトを使って仕事をしている人同士の 情報交換なので、個人的な趣味で過去の機械を動かして満足してる人は 無理に話題に入ってこないでいただけるかな?
なんで仕事している人に限定すんだよ
いいレスなら空想家も歓迎。
爺さんが使っているポンコツの話なんぞ、誰も聞きたくないんですよ。 いい加減にしてね(はーと)。
>>698 > このスレは、実際にシェルスクリプトを使って仕事をしている人同士の情報交換
ダウト。
>>1 には、お勉強・自慢・腕試しと明記されている。従って、趣味でシェルスクリプ
トを勉強している人もOKだろ。
getoptとgetoptsってどっち使ってる?
当然getopts getoptは外出しの別物
速度的にはビルトインのgetoptsのほうが速いのはわかるけど オプションの処理なんてたかが知れてるし その他の面でもgetoptsのほうがいいの?
getoptって、スペース入りファイル名とか、ちゃんと処理できたっけ? getoptsならもちろん無問題だけど。
708 :
名無しさん@お腹いっぱい。 :2009/05/02(土) 01:11:20
質問です。 以下のような形式のログ(MySQLのバイナリログみたいなもの)があるとします。 --------------------- 09/04/01 12:00 aaa 09/04/01 13:10 aaa bbb 09/04/01 13:20 ccc 09/04/01 14:40 aaa ddd eee ccc --------------------- このような形式のログから、例えば、13時台のログを抜き出すにはどうしたらいいでしょうか? 上記のログでいうと、以下のような結果がほしいです。 --------------------- 09/04/01 13:10 aaa bbb 09/04/01 13:20 ccc --------------------- awkとgrepを駆使すればできそうなのですが、いまいちわかりません。 よろしくご教示お願いします。
>>708 aaa や bbb がスペースやTABで分割された複数の単語(bbb = xxx xxx ...)になることが無いなら
awk 'NF>2{if($2~/^13:[0-5][0-9]$/)f=1;else f=0}f==1' "ログファイル"
複数の単語になるが bbb = xxx 00:00 xxx ... みたいに2番目の要素が時刻形式になることが絶対無いなら
awk '$2~/^[0-9][0-9]:[0-9][0-9]$/{if($2~/^13:[0-5][0-9]$/)f=1;else f=0}f==1' "ログファイル"
でいけそうな気がする。手元に環境ないんで試せてないけど
grepがいいんじゃない? cat 2ch-708-20090501.data | grep "[0-9]\{2\}/[0-9]\{2\}/[0-9]\{2\} 13:" 冗長的に書くとこんな感じ cat 2ch-708-20090501.data | grep "[0-9][0-9]/[0-9][0-9]/[0-9][0-9] 13:" man grepを読んで、cat data | grep うんたらで正規表現を試すといいと思うよ
それじゃ駄目
すみませんが、詳しい方、実際に試して確認した方のみ回答をお願いします
>>708 これはどう?
sed -n '/^[0-9]/h; x; /13:[0-5][0-9]/{x;p}' datafile
>>708 どうせならシェルでやれ。内部コマンドだけがいいぞ。
#!/bin/sh
f=0
while IFS= read line
do
case $line in *' 13:'??' '*) f=1;; 0*) f=0;; esac
case $f in 1) echo "$line";; esac
done
(´,_ゝ`)プッ
フラグ使うのはダサいと思うよ
>>717 元の質問読んでる?
この場合は処理が行内で完結せず、
状態をどこかに記憶しなければならないのでフラグは必須なんだが。
>>713 の sedでは、状態をホールドスペースに記憶して、
ホールドスペースある同じ文字列を毎回正規表現で比較し直すという、
フラグよりダサイことをやってる。
>>715 をフラグなしでやるとこうかな。
whileループが2重になってしまうし、
条件判断や echo が複数箇所で必要になって余計わかりにくい。
>>715 のフラグ方式の方がいいな。
#!/bin/sh
while IFS= read line
do
case $line in
*' 13:'??' '*)
echo "$line"
while IFS= read line
do
case $line in *' 13:'??' '*);; 0*) break;; esac
echo "$line"
done;;
esac
done
715=718=719 なのかね
>>718 はありえない。毎回正規表現で比較するコストなんてたいしたことない
>>715 質問者はawkとgrepを駆使するつもりだったようなので
>どうせならシェルでやれ。内部コマンドだけがいいぞ。
と強制する必要はないんじゃない?理由もイミフだし。
内部コマンドで済ます事に拘ることで
>>715 とワザワザ長ったらしくしながら
大きなアドバンテージがある訳でもなく、もし、aaa とかが "13:xx " や "xxx xxx xxx 13:xx xxx ..." とか有り得るなら
>>709 では問題にならないのに
>>715 (や
>>719 も) では上手くいかない事を説明してないし
722 :
721 :2009/05/03(日) 17:47:09
× もし、aaa とかが "13:xx " や "xxx xxx xxx 13:xx xxx ..." とか有り得るなら ○ もし、aaa とか bbb とかが、 "13:xx " や "xxx xxx xxx 13:xx xxx ..." という値を取りうるなら
723 :
名無しさん@お腹いっぱい。 :2009/05/03(日) 21:03:55
教えて下さい。レンタル鯖でCRONにて過去Logを削除するためにshellを組みました。 昨晩、実行されたのですが・・・エラーになりました。何が悪いのでしょうか? shell ----- ここから ----- #!/bin/sh find ./public_html/hoge/dat/ -type f -atime +1 -exec rm {} \; ----- ここまで ----- エラーメッセージ /virtual/hoge/public_html/hoge.sh: line 2: : command not found find: missing argument to `-exec'
>>723 ぱっと見、怖いスクリプト書いてるな…
一般的な助言しとくと
・カレントディレクトリは明示的に指定しる。
・cron実行時のPATH環境はどうなってる?
(要はfindとrmコマンドは、フルパスでなくても実行可能?)
・このスクリプトに実行権与えてる?
725 :
名無しさん@お腹いっぱい。 :2009/05/03(日) 21:57:18
>>724 ご指摘ありがとうございます。カレントは「具象化」します。
実行エラーの原因がわかりました。
改行コードが「CRLF」でした _| ̄|○ il||l
「LF」のみして正しく動作しました。
>>724 ← 大はずれ(笑)
おおげさな「助言」が全く関係ないオチだったね。
エスパー失格。
>>726 おまえ何様のつもり?
>>724 の指摘内容は、cronでスクリプトが動かないときに
真っ先に疑うべき内容で、別に大げさな助言でもなかろうに。
善意で答えている人に対して失礼すぎ。
>>727 指摘は当たらないと意味がない。
もっと
>>723 の質問をよく見ろよ。問題の鍵はここにあるんだよ。
>>723 の 「find: missing argument to `-exec'」のエラーメッセージ。
これが大きな鍵だ。
試しに、
find . -exec echo {} ?^M
って実行してみると良い。^Mは、Ctrl-[V] + [M] の CR な。
find: missing argument to `-exec'
って出るだろ。
あと、
>>723 の「: command not found」
これは、#!/bin/sh^M になってる時出るメッセージだ。
以上を知ってれば的確な答えはすぐに出せたはず。
729 :
名無しさん@お腹いっぱい。 :2009/05/04(月) 00:28:45
findコマンドで指定するオプションの順番って性能的に重要ですか? たとえば、 find . -type f -name \*php と find . -name \*php -type f は、実行速度に違いとかありますでしょうか?
>>729 選択性の高いものを先に書いたほうが早い。
例えば比率的に「ファイル数:ディレクトリ数=9:1」で「*phpの数:*php以外の数=1:9」なら -name \*php を先に書いたほうが、90%の確率で -type f を評価する必要がなくなるので、逆に書くよりは高速になる可能性が高くなる。
要は、対象になるディレクトリの中身がどうなる傾向にあるかに拠る。
ただ、-type f単体の評価のほうが-nameより高速であろうから、単純に比率だけからでは一概には言えない。実際に計測して統計とるのが最善。
ない
732 :
名無しさん@お腹いっぱい。 :2009/05/04(月) 06:14:41
オプションの並び変えただけで実行速度かわるわけねえだろ、ニャロメ!
>>730 は釣り。
エスパーすると、
>>730 はfind の内部処理がオプションで指定した順番で
処理するつくりになってると思い込んでいるんだろう
そういう仮定(本人は仮定とは思ってない)が書かれないから、他人には
全く理解不能になってしまう。
>>730 ではないが、実行前に実行順を最適化する事は不可能に思える。
従って指定順に処理されると考えるのが普通。
>>733 はエスパーしたいなら、エスパースレにいけ。放置された質問たまってるぞ。
なるほど、演算式として評価してるのか
勉強になってよかったな
なるほどね(´・ω・`)
えーと、結論としては、findのオプションの並びが変わっても、実行速度に変わりはないってことだよね? 違ったらごめんw
変わったら変わる。 (変わらないケースもまれにある)
741 :
名無しさん@お腹いっぱい。 :2009/05/05(火) 22:31:34
>>729 どちらの言ってることが正しいか自分の環境でテストしてみたんだけど、
1回目のfindでは7秒かかってたのが、2回目以降では、0.5秒で検索できた。
これって、OSがfindの結果をキャッシュしてるってことかなぁ、、、
テストするために、そのキャッシュをクリアする方法ってある?
ご存知の方は教えてくださいm(_ _)m
>>741 それ、find自体は関係なくて、OSのファイルシステム(またはブロックデバイス)の
キャッシュが効いてるのが原因。
キャッシュの影響をなくすひとつの方法は、
umountできるディレクトリなら、
findの直前に一旦umountして、mountして、その直後に1回だけfindを実行する。
次のfindの前にまたumount/mountする。ちょっと面倒だけど。
>>741 time sh first.sh; time sh second.sh;time sh first.sh; time sh second.sh;time sh first.sh; time sh second.sh;
おれは、こうしゃうけどね
でも、キャッシュはしていないと思うけどね
shutdown -r now
747 :
>>741 :2009/05/06(水) 23:56:33
テストの結果だ。 改行多すぎてはれないので、二回にわけてはるね。 ■前提条件 ~$ uname -r 5.4-RELEASE-p6 ~$ find . -type f | wc -l 30374 ~$ find . -type d | wc -l 1130 ~$ find . -type l | wc -l 445 ~$ find . -type f -name \*php | wc -l 137 ■テストの手順 (1) time find . -type f -name \*php (2) shutdown -p nowした後、マシン起動 (3) time find . -name \*php -type f (4) shutdown -p nowした後、マシン起動 (5) time find . -name \*php -type f (6) shutdown -p nowした後、マシン起動 (7) time find . -type f -name \*php
748 :
>>741 :2009/05/06(水) 23:57:41
残り。 ■結果 (1) real 0m7.697s user 0m0.181s sys 0m0.261s (3) real 0m7.205s user 0m0.207s sys 0m0.238s (5) real 0m7.229s user 0m0.187s sys 0m0.258s (7) real 0m8.164s user 0m0.199s sys 0m0.243s find . -type f -name \*phpより、find . -name \*php -type fのようがはやい。 ■結論 オプションの並びをかえると、実行速度はかわる
おいおい・・・
そりゃstat(2)が減るわけだから若干は速くなっておかしくないだろ
>>747 > /dev/nullしろよ。
それじゃreal timeが表示の時間測ってることになるだろ。
>>750 stat(2)は減らない。
1回のstat(2)で、ファイル名とファイルタイプは同時に得られるから。
シェルスクリプトに変更を加えずに alias を有効にする方法はありますか? GNU の ls や stat を使うように書かれたシェルスクリプトを実行するために、 alias ls='gls' alias stat='gstat' を設定した状態で実行したいんですが、シェルでセットしてもシェルスクリプト中では有効になりません。
>>752 stat(2)でファイル名得られるってどういうOSですかあ?
>>754 readdir()等でファイル名一覧が得られたあと、
-type f のオプションがあるかどうかにかかわらず、
findとしてはそのディレクトリのすべてのファイルについて
一旦 stat(2)を実行する。
(でないと、サブディレクトリかどうかとかの判断ができないから)
で、-type fオプションとかがあると、すでに実行済みの stat(2)の結果を
利用するから、stat(2)の実行回数は増えない。
>>753 PATHの一番優先順位のところに自作のディレクトリでもつくって、通して、ls,statというファイル名をつくって
$ cat ls
#/bin/sh
gls $@
$ cat stat
#/bin/sh
gstat $@
みたいなことするんじゃないの?
即席なんでこういうのは、ダサ過ぎなのかもしれないけど
>>755 > (でないと、サブディレクトリかどうかとかの判断ができないから)
ディレクトリの判定には、いきなりchdirしてみると言う方法も考えられるので却下。
>>757 実際のfindではいきなりchdirはしないから却下
>>753 bashがスクリプト中でalias使えるか知らないが、
#!/bin/bash
alias ls='gls'
alias stat='gstat'
. そのシェルスクリプト
>>758 そのような実装のfindが無いことを証明出来るなら採用。
>>760 いきなりchdirすると、それがディレクトリへのシンボリックリンクだった場合に困る。
(-followオプションを付けていないのにsymlinkをたどっては行けないから)
だからいきなりchdirする実装はあり得ない。
無いことを証明することを相手に求めるの男の人って…
証明された後で、無いことの証明は不可能と主張する男の人って…
背理法...?
はいーりはーいりふれ背理法ー
アルプスの少女ハイリ
豆知識: readdir()すると、 ファイル名とi-node番号だけじゃなくて、 struct direntの中でファイルタイプも返すUNIXがある。 e.g. FreeBSD
FS依存
>>768 お前ら、レベル高いな、、、
ぜんぜん、この話題ついていけねぇ、、、orz
どうやったら、そんな高いレベルになるのか教えてくれ。
何かお勧めの本とか。
>>768 その場合はreaddir()だけでファイル名もファイルタイプも得られるから、
findの-nameや-type fの有無にかかわらず、結局stat(2)の回数は増えない、でFA?
>>771 GNU findは#ifdefで、
ファイルタイプ返すreaddirに対応している。
>>770 OJTって知っている?
ひたすら仕事をすればいいんだよ。
ソースを使え、ルーク
ソースコードに埋め込んで計測すれば良いのにwww
do 〜 doneで、doはドゥーですよね。 doneは皆さん何と読んでいますでしょうか? 人によって、ダーン、ドーン、ドネ、ディーオーエヌイーなどと呼んでいるのですが、 専門家の方はどう読むのでしょうか?
do/did/done の done だろ?
やはりここでも意見が分かれますね。
だん、か、だーん、だろ上皇
ところで、Bourneはどう読んでる? ボーンじゃなくてブールネが正しいって聞いたことがあるんだが。
>>782 だーんって読んだら笑われるぞ
英語じゃないんだから
>>776 ドーンが正解です
ドンでもいいですよ
esacもスーケですよね
イーザック・アジモフ
>
>>782 i did it
done
アメリカ行って聞いて故意w
>>784 >ドーンが正解です
>ドンでもいいですよ
それなら
dawn
だなwぷけら
790 :
名無しさん@お腹いっぱい。 :2009/05/14(木) 02:26:34
unixのマニュアル(man)で英語の勉強をしているのですが、 これに関連して、全てのマニュアルの英単語の数を計算し、多い順にソートしたいのですが、 いい方法はありますでしょうか? (#使われている頻度が多い英単語から覚えれば、効率的かなと。。)
>>790 lsのマニュアルだけなら、これでできるよ。
--------------------------------
~$ man ls | col -b > words.txt
~$ for word in `cat words.txt`; do echo $word; done > words2.txt
~$ sort words2.txt | uniq -c | sort -n -k 1 -r | head
138 the
69 is
40 a
39 to
38 of
38 file
36 The
34 and
33 in
25 are
--------------------------------
全てのマニュアルってことになるとどうするんだろ。
>>791 zcat /usr/local/man/man{1..9}/*.gz | nroff | col -b > /tmp/manuals.txt
以下同じ。
そもそも英語の技術文書が英語の勉強に成るかどうかを検証したほうが。 ハリポタでもなんでもいいけど、興味の有る映画とかの本のほうが勉強に成ると思う。
>>793 > ハリポタでもなんでもいいけど、興味の有る映画とかの本のほうが勉強に成ると思う。
ノベライズ(小説)は、難しいと聞くなあ
あと読んで(input)、誰かに書いて(output)ってしにくそう
コンピュータ(例えば、Linux)分野寄りの話なら、最初は大変だけど、メーリングリストに投げるなり、フォーラムに投稿するなり
できるし、書いた英文が不適切でも、コマンドと標準出力、エラーログを添付すれば、意味は通じるからね
コンピュータ寄りだけど英語の勉強になるし、楽しいよ
リスニングに関しては、海外ドラマDVDを家にいるときは字幕なしで流しっぱなしにしているのがいい感じ
単語がわからなくても、表情や動作で意味が伝わってくるからね
映画は連続ドラマに比べて、映画の性質上、無駄なくシーンがポンポン変わるからちょっときつい感じ
>>790 聞いてみるもんだね、簡単にできるんだね
795 :
名無しさん@お腹いっぱい。 :2009/05/14(木) 06:32:55
>>793 シェルスクリプトのスレなんだからシェルスクリプトで答えればいいんだよ。
英語の勉強法なら別の板なりスレなりに誘導すればいいだけじゃないか。
>>791 中間ファイル作るの無駄過ぎ。一発でできる。
man ls | col -b | tr ' ' '¥n' | tr '¥t' '¥n' | sort| uniq -c | sort -nr
?
799 :
名無しさん@お腹いっぱい。 :2009/05/14(木) 11:08:30 BE:749750382-2BP(0)
質問です。 /var/wwwの、PHPの過去1日分の変更点だけのバックアップを取りたいのですが ------------------------------- #!/bin/sh dest=/var/www_bk/`date +%F` mkdir $dest chmod 777 $dest find /var/www -mtime -1 -name "*.php" -exec cp -arp {} $dest \; ------------------------------- これだと、フォルダの構造もなく、同一ファイルも重なってしまうためうまくありません。 (せいぜい-bつけるぐらい) ------------------------------- #!/bin/sh dest=/var/www_bk/`date +%F` mkdir $dest chmod 777 $dest find /var/www -mtime -1 -name "*.php" -exec cp -arp {} $dest{} \; ------------------------------- これだと「そんなフォルダねーよ」と蹴られてしまいます。 フォルダの階層ごとコピーがしたいですが、何か方法はありますでしょうか?
rsyncでも使えば?
801 :
名無しさん@お腹いっぱい。 :2009/05/14(木) 11:24:39 BE:1686938966-2BP(0)
rsyncは使ってますが Cron ------- rsync -auvz --delete /var/www /media/disk-1/www-backup ------- 世代バックアップってできましたっけ?
ああ
>>797 trを2個も重ねるの無駄過ぎ。一発でできる。
man ls | col -b | tr ' ¥t' '¥n¥n' | sort | uniq -c | sort -nr
>>799 tar cf - `find ... -print` | (cd $dest; tar xpf -)
みたいなのはどうだろうか?findの結果が多い場合は`...`やめて-Tで
ファイル渡しで。
>>799 ヒントだけ書くけど、
-exec cp -arp {} $dest{} ?
の前に、
mkdir -p `dirname $dest{}`
を実行すればいい。
find の -execに直接書くのはややこしいので、
ここだけ別のスクリプトにして、-execから呼び出した方がいいかも。
あと、cp -a オプションは、-pも-rも含んでるので、
cp -arp なんてやっても cp -a と同じだよ。
806 :
名無しさん@お腹いっぱい。 :2009/05/14(木) 12:48:54 BE:1312063474-2BP(0)
>>804 tarは考えましたけど
ソースを追う時に解凍作業を繰り返すのが大変そうでやめました
>>805 うお、クールだ!
早速やってみます
cpio使え find /var/www -mtime -1 -name "*.php" | cpio -pumd $dest
うるさいのがいるのを忘れてたぜ。 ファイル名が改行などの特殊文字含む可能性がある場合はGNU cpioで find /var/www -mtime -1 -name "*.php" -print0 | cpio -0 -pumd $dest
>>805 むう・・dirnameが走らない・・・
find /var/www -mtime -1 -name "*.php" -exec mkdir -p `dirname $dest{}` \;
なんか根本から間違ってる気がした
・・・でも
-----------
>>808 #!/bin/sh
dest=/var/www_bk/`date +%F`
mkdir $dest
#find /var/www -mtime -1 -name "*.php" -exec mkdir -p `dirname $dest{}` \;
#find /var/www -mtime -1 -name "*.php" -exec cp -a {} $dest{} \;
find /var/www -mtime -1 -name "*.php" -print0 | cpio -0 -pumd $dest
#tar cf - `find ... -print` | (cd $dest; tar xpf -)
chmod -R 777 $dest
-------
これで確かにいけました
なぜアーカイブが存在しないのにcpioが動くのか・・・
よ・・よくわからねーが、そのうち質問者は考えるのをやめた
ごめんね、そもそもcpioの存在を知らなかったんだ ありがとうございました!
813 :
名無しさん@お腹いっぱい。 :2009/05/15(金) 18:34:05
バッチのシェルを作りました。 このシェルをTELNeTに関連付けるにはどうしたらいいですか? 毎回シェルのKEYINが必要なのですか?
バッチのシェル? cmd.exeでも自作したのか? 宣伝したいならvectorにでも行って登録しなさい。
相手しちゃいかんよ。
せめて言葉が通じるぐらいのところまでは勉強してもらわないと どうにもならんな
I made a shell of batch. How can I associate this shell with TELNeT ? Do I need to KEYIN for shell every time ?
私はバッチのシェルをした。 このシェルはどうすればTelnetを関連付けることができますか? 私は毎回KEYINシェルのためには必要ですか?
ラテン語でおk
?κανα ?να κοχ?λι τη? batch. Π?? μπορ? να συνδ?σω αυτ? το κοχ?λι με Telnet; Χρει?ζομαι σε KEYIN για το κοχ?λι κ?θε φορ?
引っぱりすぎ。
そりゃギリシャ文字
正直どうでも良い。
word1="This is a pen" array=( word1 ) echo ${array[0]} これを実行すると、Thisって表示される。 array[0]にThis is a penを格納したいんだけど、どうすればいいですか?
罰腫胃損乙
>>825 できました!
ありがとうございました。
00 01 02 03 04 05 06 07 08 09 というような内容のファイルを 0 1 2 3 4 5 6 7 8 9 という内容に変換するにはどうやったらいい?
おれでも答えられそうな低級レベルの質問きたー $ cat hoge.txt 00 01 02 03 04 05 06 07 08 09 $ sed -e 's/0\([^0]\)/\1/g' hoge.txt 0 1 2 3 4 5 6 7 8 9
>>830 それだと、102 とかが 12 になってしまう。
0203 とか 0052 とかの対応も含めて ゼロサプレスをもう少しちゃんとやるとすると、こうか? sed 's/¥<0*¥([^0]¥)/¥1/g'
>>833 それ、今度は 00 が 00 のままになる。
>>830 も、単独の
00
だけの行があると
00
のままになるよ。
ハイ、やり直し。
00だけ別対応だな。 sed 's/¥<0*¥([^0]¥)/¥1/g;s/¥<00*¥>/0/g'
>>830 元ファイル:
04 03 02 01 00
結果:
4 3 2 1 00
フルボッコw
>>828 それを実行してるFreeBSDのバージョンは?
>>840 質問した本人は言い辛いと思うので(ていうかもう見てないか)言っておくが、
書いても君には答えられない。
そもそも書く意味がほとんど無いから書いてない。
3日ぶりの質問に群がるレスは煽りと否定ばかり 間違ってはいたけど建設的なのは一人だけ、まぁ全てが自演かもしれんけど こんなんでどうだろう? sed -e 's/0*\([0-9]*[0-9]\)/\1/g' hoge.txt
シェルスクリプトというよりsedスレ化してるな。
>>842 もとの質問の「仕様」が不明確だから何とも言えないけど、
A00B みたいなのが A0B に変換されてしまうのはいいんだよな??
sed 's/^/ /;s/ 0*\([0-9]\)/ \1/g;s/^ //'
いまどきのsedなら\bあるんじゃね? sed 's/\b0*\([0-9]\)/\1/g'
いまどきの sed とぼかさずに、はっきり GNU sed と言ったら?
sedだと改行が難しいんですよねー ところで、文章が書き込まれているテキストファイルを1行に1文字づつに変換するには どのコマンドを使用するべきだと思います?
>>850 ファイルに出力したくなかったので助かりました、ありがとうございます
質問です。 bash です。 ls コマンドが次のように定義されています。 ls () { /bin/ls ${1+"$@"} } わざわざ ${1+"$@"} にしている理由は何でしょうか? /bin/ls "$@" にした時との差異がわかりません。
古いshでは引数が与えられていない時の command "$@"はcommand ""と同じだった。それを避けるための記法。
bashで質問なのですがこういうタブ区切りのファイルがあります。 AAAA(タブ)BBBB(タブ)CCCC DDDD(タブ)EEEE(タブ)FFFF このファイルを1行ずつ読み込んでタブ区切りで分割し 配列に取り込みたいのですがどうやればいいんでしょうか? 自分が考えたのが次のようなやり方だったんですが どうもうまく行きません。 while read LINE;do DATA1=`echo $LINE | cut -f 1` DATA2=`echo $LINE | cut -f 2` done データにはスペースが入ることもあるのでどうしてもタブで分割させたいんですが、 いいやり方ってないでしょうか?
>>854 echo "$LINE"
というオチか
ダブルクォートが無いと、echoした時、せっかくのタブがスペースになってしまう。
856 :
852 :2009/05/26(火) 23:07:25
>>853 ありがとうございます。
納得しました。
857 :
854 :2009/05/26(火) 23:35:03
>>855 そんな簡単な理由だったとは・・・orz
ありがとうございます!明日早速試してみます
ファイルの3行目から10行目を表示というのをかっこよく書くとどうなりますか?
head foo | tail -n 8 かっこよくないなぁ
>>859 では、10行未満のときにうまくいかないことに気がついた。
head foo | tail -n +3
でも、かっこわるいなぁ
861 :
名無しさん@お腹いっぱい。 :2009/05/27(水) 06:48:34
そろそろ?
tar: 空の書庫作成はご容赦願います 日本語のエラーメッセージ見て久々に吹いたw こんな事になったのはいつからだ? 少し前は、どうしても空の書庫を作ろうとしませんとかだったような気がするが
LC_MESSAGES=C しとけ
おれは rm -f /usr/share/locale/ja/LC_MESSAGES/tar.mo 派。
ja_JPとかで使って便利と思った事が無い。
俺の場合、デフォルトは LC_CTYPE=ja_JP.UTF-8 にして、LANG が ja_JP.UTF-8 に なってたほうがいいアプリには個別対応してる。
.xinitrc で ja_JP.UTF-8 にしてる
>>845 もとの質問の「仕様」が不明確?どこが?
例として10個もデータ載せてて0-9とスペース(タブ?)しか使って無いんだから
1001 とかの考慮は必要だろうけど、A00B なんて何勝手に仕様追加してるの?
もしそういうのもあるなら質問者も10個のデータ内、1つ位はそんなデータを載せるだろうよ
汎用性を考えるのは重要だけど元々無い仕様を勝手に追加して、
それに対応する方法を自分で書くならまだしも、人が書いた事を否定するだけって、何の意味があるの?
一桁目だけ取り出す/余計な0を削除する。 実際のデータが例示されたものだけならどちらでも動くが、仕様は二通り考えられる。 今回の質問はそれほど不明確では無かったが、不明確な質問しといて後から 条件追加するアフォが多すぎるので防衛反応だろう。
aliasでパターンマッチのようなことが出来るシェルってありますか 例えば特定の環境変数を指定した引数の値にセットして makeを呼び出せるようなことが出来るとありがたい bash風なシェルだとすると、次のようなイメージ alias mak pattern='SOME_ENV_VARIABLE=$(pattern) make' あるいは、代替案があればご教示頂けると幸いです
bashなら関数定義すりゃいいんじゃねーの?
何言ってるかわからん
function mak () { local x="$1"; shift; HOGE="$x" make "$@" }
>>875 ありがとうございます。快適になりました。
バックグラウンドで実行したコマンドの終了ステータスを取得する方法はありませんか? 例えば、以下の様に実行した command の exit status を実行元のシェルで取得したいのです。 (sleep 3; command >/dev/null 2>&1) &
wait %1
>>880 シェル依存。
バックグラウンドコマンドがすでに終了していると、
wait %1 ではステータスが取れないシェルがある。
何も答えずに回答者の揚げ足とるだけよりマシかと
>>882 いや、一般論としては「できない」が正解。
「できない」とすでに答えてる。
環境書かないなら一般論で答えるしかないな。
885 :
名無しさん@お腹いっぱい。 :2009/06/03(水) 02:21:44
バックグラウンドコマンドの終了ステータスをファイルに保存して、参照すればいいんでないの?
実行してるシェルスクリプトが、自身のステータスコードって吐けるの?
この場合は欲しいのはcommandのステータスなんだから (sleep 3; command >/dev/null 2>&1; echo $? > status) & で保存できるだろ。
次に実行したコマンドの終了ステイタスで上書きされるから意味が無い。
>>888 そんなのを回避する方法は、お前以外の人間はいくらでも思いつく。
>>887 >>877 は、実行してしまったシェルスクリプトを後からどう
にかしたいらしいので、
>>887 みたいに、実行前にタイムマ
シンで戻ってシェルスクリプトを編集するのは不可じゃない
の?
>>887 みたいに$?を使っていいなら、
>>877 はそもそも質問し
ていないと思うけど。
>>890 質問を普通に読むことができれば、そういう考えには至らない。
>>890 なんだ単なるネタか。余りにつまらないんでレスしちまったぜ。
これほど、つまらないネタを見るのは始めてだ。
>>890 もしそういう問題ならシステムコールトレースでも仕掛けておけば
いいんじゃねーの?w
>>887 さんの方法で解決しました。
echoの直前にセミコロンが抜けていますね。
ほかの方の回答は興味がないので無視させていただきました。
では次の質問どうぞ。
抜けてないw
正規表現でアルファベット6文字というのはどう書けばいいでしょう?
903 :
名無しさん@お腹いっぱい。 :2009/06/06(土) 09:22:29
[を含むテキスト表示で困っています。 solari8 Cシェル環境において以下のシェルスクリプトでテキストに含まれる[]が表示できなくて困っています。 echo `cat fileA` fileAの中身は下記です。 1234[aa] このまま表示したいのですが、実行すると「echo:一致しません」と表示されます。 fileAの中身を"1234[aa]"でも1234\[aa\]にしても変わりません。 echo文は変えられないので何とかfileAの中身を工夫して1234[aa]と表示できる方法をどなたかご教示いただけないでしょうか?
> fileAの中身を工夫して1234[aa]と表示できる方法 そんな方法は無い。不可能。絶対に無理。
csh% echo "`cat fileA`" はどうなの?
echoのソースを八苦するしか無いなw
cshの話題だから敢えて無視してたけど、 マジレスするとechoより前に set noglob すればOK ただし、そのスクリプト自体変更できないと言うなら不可能。
911 :
名無しさん@お腹いっぱい。 :2009/06/06(土) 16:03:34
903です。 皆様ありがとうございます。 スクリプト自体を変更できないのです。^^; 残念ながらあきらめるしかないのですね。 お手数ですが、不可能な理由をご教示願えないでしょうか?
出来ないように作られているから。
#!/bin/csh とか -f を付け忘れてるスクリプトなら、.cshrc でなんとかなるかも
そこまでcshでがんばる理由も無いと思うけどね。乙。
abcdefg を a b c d e f g と表示する方法ありますか?
パスを変えてecho -> /bin/cat を優先させるという
内部コマンドじゃないの?
>>909 =
>>917 は根本的に勘違いしてる。
たとえechoが内部コマンドじゃなかったとして、
echoをcatにすり替えることができたとしても、
>>903 の
> echo `cat fileA`
は、
cat `cat fileA`
になるだけ。これでは何の解決にもなっていない。
何が目的で cat fileA じゃなくて echo `cat fileA` としてるのか問い詰めたい
cat fileAと echo `cat fileA` は明らかに異なるが。どうして同一だと考えられるのだろう。 問い詰めたい。問い詰めたい。問い詰めたい。問い詰めたい。
>>903 これってうちのtcsh 6.15.00だと再現しないんだけど純正csh限定なの?
debianのパッケージで入れたcshでも再現しないな。パッケージのバージョンは 20070713-2となっているが元がどういうのかはよくわからない。 どういう仕組みでそうなるんだろうか。solarisのcshに独自の何かがある?
次スレのテンプレに、 「cshの話題は厳禁」 明記よろ
csh限定のシェルスクリプトスレでも建てれば? そもそもシェルスクリプトにこだわる理由も無さそうだが。
'' の中に変数を書いたら、ダメですか? sed -e 's/$iどうたら/こうたら/' とか。
>>927 恥ずかしいほど基本。
''は変数置換しない。""はする。
>>925 ,926
なぜcshの話題はだめなのかを誘導しないと「どうしてcshの話題はだめなのですか?」ってのが繁殖するよ
どうしてcシェルスクリプトの話題には、ちゃんと答えられないのですか?
cshは専用のスレがあるからそっちで、で十分だと思うけど。
csh使ってないから。
シェルスクリプトでcshとか・・・おっそ
cshインストールしてあるマシンが手元に無い。
rootのシェルがデフォでcだな。
OS名すら書かずに。
ログインシェルのデフォルトが何かと シェルスクリプト書くのに何を使うかは まったく別の話。
エスパーしろよ。rootのデフォcが今でも残ってる時代遅れは*BSDのみ。
犬はbash以外無いからな。リーナスの趣味だっけか。
ログインシェルにはtcshがお薦めですって言って回っていいほど bashが肥大化しててワラタw
zshに比べたらまだまだだがな
そして毎日肥大化したbashでスクリプトが実行されてしまってる罠。
deb系はdashがデフォルトだよ。 リーナスはSystemV贔屓だが、GNUはあんまり良く思ってないだろう。 emacsとかGNOMEとかGPL3とか悪口言いまくりだし。
dashはリダイレクト処理がバグってる糞シェルだ Debian信者の俺が言うのもなんだけど
LANG=ja_JP.eucJP ならバグらないよ。
日本語のファイル名なんて使わないからどうでもいいが、 それを抜きにしても ja_JP.eucJP で使うのが基本。 UTF-8は問題が多い。
スクリプトにLANG=Cって書くのは…ダメ?
>>948 えっと、LANG=C ならもろバグります。(解決になりません)
LANG=ja_JP.eucJPの時はバグらないと。(ただしファイル名もEUC-JPで作られる)
どういうバグなん?
ああ、今ググったよありがとう
リダイレクトだけじゃなくて、 シェル変数に代入してもバグるね。 $ echo $LANG ja_JP.UTF-8 $ bash -c 'a="あいうえお"; echo "$a"' あいうえお $ dash -c 'a="あいうえお"; echo "$a"' ?????
$ dash -c 'a="あいうえお"; echo "$a"' あいうえお はて?
$ echo $LANG ja_JP.UTF-8 $ dash -c 'printf "????n"' あ $ dash -c 'a=`printf "????n"`; echo "$a"' ? $ bash -c 'a=`printf "????n"`; echo "$a"' あ
$ echo $LANG ja_JP.UTF-8 $ dash -c 'printf "¥343¥201¥202¥n"' あ $ dash -c 'a=`printf "¥343¥201¥202¥n"`; echo "$a"' ? $ bash -c 'a=`printf "¥343¥201¥202¥n"`; echo "$a"' あ
$ dash -c 'a=`printf "\343\201\202\n"`; echo "$a"' あ 無問題、てかおまいの書き込みはbackslashじゃなくてyenになってんぞ?
バッシュカスワラタw
バグってるのは dashの方で、bashは正常なんだが
ターミナルがUTFを表示してくれるか次第じゃないの? ホント犬廚ってレベル低いなwww
debianのバグはdebianスレでやれと
>>961 そういう問題じゃない。ちゃんと読み直せ。
変数中の %%:* と ##.* の意味を教えてください # cat test.sh TEST1=45:0:0:0 TEST2=aaa.bbb.ccc echo "TEST1%%:* = ${TEST1%%:*}" echo "TEST2##.* = ${TEST2##*.}" # sh test.sh TEST1%%:* = 45 TEST2##.* = ccc どうしてこうなるのかが、わからないんです orz キーワードが悪いのか、ググっても解決できない・・・
>>966 $ man sh
${parameter%word}
Remove Smallest Suffix Pattern. The word is expanded to produce
a pattern. The parameter expansion then results in parameter,
with the smallest portion of the suffix matched by the pattern
deleted.
${parameter%%word}
Remove Largest Suffix Pattern. The word is expanded to produce a
pattern. The parameter expansion then results in parameter, with
the largest portion of the suffix matched by the pattern deleted.
${parameter#word}
Remove Smallest Prefix Pattern. The word is expanded to produce
a pattern. The parameter expansion then results in parameter,
with the smallest portion of the prefix matched by the pattern
deleted.
${parameter##word}
Remove Largest Prefix Pattern. The word is expanded to produce a
pattern. The parameter expansion then results in parameter, with
the largest portion of the prefix matched by the pattern deleted.
>>967 ありがとう
自分の愚かさを理解しました
初心に戻ります・・・
ありがとう!
バラメータにディレクトリ名を渡すbashをつくってるんですが、パラメータなしの場合は/tmpにしたいです dir=${1=/tmp} こんな感じでスマートに書けるかと思ったらできなかったんですがどうなんでしょう?
ここはbash開発スレでは有りません。2chにはbash開発スレはないのでMLに行くと良いでしょう。
>>969 dir=${1-/tmp}
ちなみに、bash以外の開発でも↑の書き方で桶。
>>969 自分なら
dir=${1:-/tmp}
>>972 それだと、
shellscript ''
みたいに空文字列を敢えて引数にした時まで、
/tmp に変換されてしまう。
敢えて空文字列指定はしたいので。
テキストの置換で質問があります。 hoge0:0 = "TRUE" hoge0:1 = "TRUE" hoge0:2 = "TRUE" ・ ・ hoge0:9 = "TRUE" 上記の様な記述がされたテキストのhoge0:0以外の"TRUE"の 部分だけを"FALSE"へ置換したいのですが、sed等の置換で 置換可能でしょうか? 全ての"TRUE"を"FALSE"に変更するのであれば 簡単に出来ますが、「置換条件にあった複数行の数文字目以降だけを置換」 みたいな事って出来るんでしょうか?
>>975 sed '/hoge0:0/!s/TRUE/FALSE/'
>>976 ありがとうございます。
これで何とかなりそうです。
たまにEnterを押しても^Mと出るだけでEnterが渡らなくなるんだけど これって何?どうやったら直るの?
むしろsttyじゃね?
ttyは誰が制御してるのかと。 そろそろ産め。
OSごと落ちるaliasが設定されてる罠。
タンマツリセット
シャットダウンか。
resetコマンドはBSD依存。 Solarisにはない。
stty sane
stty saneは、NEWS-OS 4.xで使えない
stty -raw -nl -cbreak
>>988 /usr/ucb/resetってなかったっけ?
$ tput reset
すれば済むことだけど。
>>992 ダウト。
tput resetでは、画面のエスケープシーケンスがリセットされるだけで、
sttyの設定(^Mとか)はリセットされない。
>$ tput reset
>すれば済むことだけど。
済まない。
term知らない人多いね。
半分死にかけの技術だからかな
まだまだssh無くせないのに。 最近はvncが多いのか?
>>996 VNCは暗号化されないからSSHは捨てられないよな。
VNC+SSHだってるかうし。
tty や pty はテムズ川に沈めて 無い事にしてしまいたいニダ
よゆうの1000ゲット
1000だ!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。