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

このエントリーをはてなブックマークに追加
1名無しさん@お腹いっぱい。
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。

前スレ落ちたみたいなのでリンク省略。
2名無しさん@お腹いっぱい。:2009/01/29(木) 06:55:25
□関連スレ:
sed
http://pc11.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://pc11.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://pc11.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc11.2ch.net/test/read.cgi/unix/1102921590/

□初心者向けリンク
「誰にでも」シリーズ
ttp://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/dareUni/
/bin/shプログラミング入門
ttp://freebooks.info.nara-k.ac.jp/archive/ShellProgramming/
シェルを使おう - 導入からプログラミングまで -
ttp://www.netfort.gr.jp/~tomokuni/lms/shell/text/

□入門者向け書籍:
プロフェショナルシェルプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4756116329/
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
http://www.amazon.co.jp/exec/obidos/ASIN/4797321946/
UNIXシェルプログラミング徹底解説
http://www.amazon.co.jp/exec/obidos/ASIN/4822280489/
入門Kornシェル
http://www.amazon.co.jp/exec/obidos/ASIN/4873110149/
入門bash
http://www.amazon.co.jp/exec/obidos/ASIN/4900900788/
3名無しさん@お腹いっぱい。:2009/01/29(木) 06:56:21
□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
http://x68000.q-e-d.net/~68user/unix/
POSIX: Shell & Utilities (標準規格)
http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html

□最近のシェルスクリプト本(1)

(2004/03) UNIXシェルスクリプトハンドブック 関根 達夫 (著)
http://amazon.co.jp/o/ASIN/4797326522/
(2004/10) UNIXシェルスクリプト逆引き大全333の極意 中橋 一朗 (著)
http://amazon.co.jp/o/ASIN/4798008842/
(2004/11) 仕事に使えるLinuxシェルスクリプト 千葉 真人 (著)
http://amazon.co.jp/o/ASIN/4822282090/
(2004/12) UNIXシェルスクリプトサンプルブック デイブ・テイラー (著)
http://amazon.co.jp/o/ASIN/4797327286/
(2005/02) シェルスクリプト基本リファレンス 山森 丈範 (著)
http://amazon.co.jp/o/ASIN/4774122610/
(2005/04) LinuxWorldスクリプト 月刊リナックス・ワールド総集編 月刊LinuxWorld特別 (著)
http://amazon.co.jp/o/ASIN/4872802349/
(2005/05) UNIXシェルスクリプトコマンドブック 山下 哲典 (著)
http://amazon.co.jp/o/ASIN/4797330635/
(2005/05) わかる&使える UNIX基礎講座 シェルスクリプト編 中井 獏 (著)
http://amazon.co.jp/o/ASIN/4774123625/
4名無しさん@お腹いっぱい。:2009/01/29(木) 06:57:24
□最近のシェルスクリプト本(2)
(2005/07) UNIX シェルスクリプト辞典 川井 義治 (著)
http://amazon.co.jp/o/ASIN/4798109231/
(2005/08) シェルスクリプト ポケットリファレンス bash編 宮原 徹 (著), 川原 龍人 (著)
http://www.amazon.co.jp/o/ASIN/4774124818/
(2005/12) 図解でわかるLinuxシェルスクリプト・正規表現 小泉 修 (著)
http://www.amazon.co.jp/o/ASIN/4534040067/
(2006/01)詳解 シェルスクリプト アーノルド ロビンス (著), ネルソン・H.F. ベーブ(著), Arnold Robbins (原著), Nelson H.F. Beebe (原著), 日向 あおい (翻訳)
http://www.amazon.co.jp/o/ASIN/4873112672/
(2007/3) Linuxシェルスクリプトユーザー便利帳―bash2/bash3対応 伊藤 幸夫 (著), 寒川 陽美(著)
http://www.amazon.co.jp/o/ASIN/4798015954/
(2007/9) ゲームで極める シェルスクリプトスーパーテクニック 山森 丈範
http://www.amazon.co.jp/o/ASIN/4774132020/
(2007/10) UNIX/Linuxシェルスクリプトマスタリングハンドブック 野川 准子
http://www.amazon.co.jp/o/ASIN/4798017957/
5名無しさん@お腹いっぱい。:2009/01/29(木) 06:58:02
□関連書籍と関連リンク:
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
6名無しさん@お腹いっぱい。:2009/01/29(木) 07:56:09
>>1
7名無しさん@お腹いっぱい。:2009/01/29(木) 08:11:03
いちおう前スレ

シェルスクリプト総合 その13
http://pc11.2ch.net/test/read.cgi/unix/1224085718/
8名無しさん@お腹いっぱい。:2009/01/29(木) 12:03:55
freeコマンドのないOSでも実行できるような、
freeコマンド相当のシェルを作りたいと思っています。
具体的にはどう書けばいいですか?

できれば、bashに依存せず、汎用シェルになるようにお願いします。
9名無しさん@お腹いっぱい。:2009/01/29(木) 12:48:30
シェルってゆうな。クズ。
10名無しさん@お腹いっぱい。:2009/01/29(木) 12:53:43
テンプレ終了。では質問どうぞ。
11名無しさん@お腹いっぱい。:2009/01/29(木) 18:16:43
>>8
busyboxというシェルが組み込みのfreeコマンドを持っています。
12名無しさん@お腹いっぱい。:2009/01/29(木) 18:19:55
>>11
そのbosyboxとかいうシェルを具体的に書いて下さい。
1行目は
#!/bin/shでお願いします。

2行目以降は?
13名無しさん@お腹いっぱい。:2009/01/29(木) 18:43:09
exit 0
14名無しさん@お腹いっぱい。:2009/01/29(木) 18:44:53
>>12
#!/bin/sh
busybox free
15名無しさん@お腹いっぱい。:2009/01/29(木) 18:49:36
引数も渡すならこんな感じ
#!/bin/sh
busybox free $*
16名無しさん@お腹いっぱい。:2009/01/29(木) 18:52:52
>>14
えっと、何か勘違いされてますか?
シェル名はなんでもいいんですが、bosyboxとして

$ cat bosybox
#!/bin/sh
この行をお願いします
この行をお願いします
この行をお願いします
:


$ ./bosybox
…実行結果…


ということですが、、
17名無しさん@お腹いっぱい。:2009/01/29(木) 19:01:29
vmstatあたりを sed awkして船山に登れば医院じゃないの?
18名無しさん@お腹いっぱい。:2009/01/29(木) 19:08:49

なないかかんちがいてまちぇんでちゅか?
19名無しさん@お腹いっぱい。:2009/01/29(木) 19:08:49
>>16
$ cat busybox
#!/bin/sh
/bin/busybox $*

$./busybox free
...
20名無しさん@お腹いっぱい。:2009/01/29(木) 19:16:00
>>19
/bin/busybox というのはbash依存、またはOS依存だと思います。
どのOSにもあるコマンドだけを組み合わせてfree相当のシェルを作って下さい。
21名無しさん@お腹いっぱい。:2009/01/29(木) 19:17:55
>>20
busyboxはbash依存でもなければOS依存でもありません。
freeが組み込まれたシェルです。
22名無しさん@お腹いっぱい。:2009/01/29(木) 19:21:59
>>15
busybox内部の freeコマンドは、引数に対応してない。
あと、引数を渡すにしても $* で渡してはいけない。
(シェルスクリプトのコーディングルールとして)

よって失格。
23名無しさん@お腹いっぱい。:2009/01/29(木) 19:24:23
>>22
そうなのか。フォローthx
24名無しさん@お腹いっぱい。:2009/01/29(木) 19:25:16
>>20
無理
25名無しさん@お腹いっぱい。:2009/01/30(金) 07:27:08
diffコマンドで2つのテキストファイルの中身を比較して、
一緒だったら次のAというコマンドを、違ったらBというコマンドを実行するには
どう書いたらいいですか?
26名無しさん@お腹いっぱい。:2009/01/30(金) 07:35:41
>>25

if diff hoge.txt boke.txt > /dev/null
then
commandA
else
commandB
fi
27名無しさん@お腹いっぱい。:2009/01/30(金) 07:42:04
完全一致でいいなら、diff >/dev/null よりも、cmp -s
28名無しさん@お腹いっぱい。:2009/01/30(金) 07:45:05
>>27
>>25 「diffコマンドで」
29名無しさん@お腹いっぱい。:2009/01/30(金) 07:50:34
>>26
diff文が使えるようなシェルってあるんですか?

うちのシェルはif文は if [ ... ] みたいに書く普通のシェルです。
普通のシェルでお願いします。
30名無しさん@お腹いっぱい。:2009/01/30(金) 07:53:55
20/100点
31名無しさん@お腹いっぱい。:2009/01/30(金) 07:58:05
if [ `diff a.txt b.txt | wc -c` == 0 ]; then
comA
else
comB
fi

だろ?
32名無しさん@お腹いっぱい。:2009/01/30(金) 10:12:43
つまらんスレだな、ここは
33名無しさん@お腹いっぱい。:2009/01/30(金) 10:58:24
>>29
その [ ... ] が何を示すのか勉強しなおしてこい
34名無しさん@お腹いっぱい。:2009/01/30(金) 16:59:25
>>33
条件文を表してるのは知ってますよ
35名無しさん@お腹いっぱい。:2009/01/30(金) 19:21:23
[ もdiffもコマンドってことじゃないかな
[ ... ]っつー見かけに惑わされちゃいかん
36名無しさん@お腹いっぱい。:2009/01/30(金) 22:19:18
% where '['
[: shell built-in command
/bin/[
37名無しさん@お腹いっぱい。:2009/01/30(金) 22:32:56
質問です。
2つのコマンド、commandA と commandB の標準出力同士を、
テンポラリファイルを作らずに diffコマンドで比較したい時、
bashなら、

diff <(commandA) <(commandB)

でできますが、
これを標準シェルでやるにはどうすればいいですか?
38名無しさん@お腹いっぱい。:2009/01/30(金) 22:41:36
>>37
commandA | (commandB | diff /dev/fd/3 -) 3<&0
39名無しさん@お腹いっぱい。:2009/01/30(金) 22:42:34
>>37
無理。
bash使うか、一旦ファイルに落せ。
40名無しさん@お腹いっぱい。:2009/01/30(金) 22:47:41
答が出たあとで、無理とか言ってる奴ってなんなの?
41名無しさん@お腹いっぱい。:2009/01/30(金) 22:57:08
>>38
おおでけた。THX!
42名無しさん@お腹いっぱい。:2009/01/30(金) 23:32:55
>>34
その昔は、 /bin/[ なんてのが有ったんだがなぁ。
43名無しさん@お腹いっぱい。:2009/01/30(金) 23:34:28
>>42
今でもあるだろ

44名無しさん@お腹いっぱい。:2009/01/30(金) 23:38:21
>>42
今でもあるだろw

$ which '['
/usr/bin/[
45名無しさん@お腹いっぱい。:2009/01/30(金) 23:50:58
Bシェルなのに which使う奴ってなんなの?
46名無しさん@お腹いっぱい。:2009/01/30(金) 23:52:10
>>45
すまん、BSD育ちなんだw
47名無しさん@お腹いっぱい。:2009/01/30(金) 23:59:24
昔はshにtypeなんてなく、whichは外部コマンドだった。
cshはaliasとかがあるせいでwhichを内部コマンドに持った。
48名無しさん@お腹いっぱい。:2009/01/31(土) 07:29:55
>>38
/dev/fd/3 って純正シェルでも使えるの??
49名無しさん@お腹いっぱい。:2009/01/31(土) 13:15:29
シェルじゃなくてOSだろ?
50名無しさん@お腹いっぱい。:2009/01/31(土) 13:41:51
>>49
なんでもいいから、結局使えるの??
51名無しさん@お腹いっぱい。:2009/01/31(土) 13:58:32
レスしたら負けだ。
52名無しさん@お腹いっぱい。:2009/01/31(土) 19:54:54
これは釣りですよね?
いくらなんでもそんな質問しないもんね?
53名無しさん@お腹いっぱい。:2009/01/31(土) 20:15:42
一般論として、/dev以下のファイルはシェルによって特別扱いされることが
あり得る。

例えば、bashだと、/dev/stdout とかは、実際の /dev/stdoutを読まずに
シェルが /dev/stdoutという文字列を特別扱いして動作する。

そのことを考慮すれば、/dev/fd/n がシェルに依存しているかも知れないと
考えることにも一定の合理性が認められる。
54名無しさん@お腹いっぱい。:2009/01/31(土) 20:59:54
無いからもう寝ろ
55名無しさん@お腹いっぱい。:2009/02/01(日) 00:46:46
こうしてスレに平和が戻った。。。end
56名無しさん@お腹いっぱい。:2009/02/01(日) 02:18:13
[ を条件文だと言ったり、/dev/fd/3 がシェルに依存していると言ったり、
面白い人が増えたなw
57名無しさん@お腹いっぱい。:2009/02/01(日) 08:04:35
>>56
/dev/fd/3 がシェルに依存してるのは本当だよ。
58名無しさん@お腹いっぱい。:2009/02/01(日) 08:23:14
>>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
59名無しさん@お腹いっぱい。:2009/02/01(日) 22:53:38
日本語でおk
60名無しさん@お腹いっぱい。:2009/02/02(月) 04:47:50
bash(Fedora10)のシェルスクリプトでMS-DOSのバッチファイルのpuaseみたいな動作を
させるにはどのようにしたらいいですか?
61名無しさん@お腹いっぱい。:2009/02/02(月) 06:25:59
>>60
read
62名無しさん@お腹いっぱい。:2009/02/02(月) 10:24:22
>>60
bashの場合は read -n 1 の方がよりpauseの動作に近いかと
63名無しさん@お腹いっぱい。:2009/02/02(月) 22:25:23
>>61-62
質問欲嫁。それはpauseの動作。>>60 の質問はpuaseの動作。
64名無しさん@お腹いっぱい。:2009/02/03(火) 00:09:20
アプリケーションを実行した時に入力を求められるような場合
どう処理すればよいのでしょうか?
応答に対して入力する値(番号など)決まっているという前提でお願いします
65名無しさん@お腹いっぱい。:2009/02/03(火) 00:12:58
echo 1 | app
66名無しさん@お腹いっぱい。:2009/02/03(火) 00:25:53
$ ttyrec x
$ app

$ exit
$ ttyplay x
6760:2009/02/03(火) 02:44:31
レスありがとうございます

>>61-62
read -n 1が良さそうなのでこれを使ってみます

>>63
すみません。タイプミスですorz
正しくは「pause」です
68名無しさん@お腹いっぱい。:2009/02/03(火) 09:03:27
>>64
expect
69名無しさん@お腹いっぱい。:2009/02/03(火) 15:36:11
expect使うけどセキュリティ考えたら微妙
70名無しさん@お腹いっぱい。:2009/02/05(木) 00:30:20
bashで多重配列って使えますか?
71名無しさん@お腹いっぱい。:2009/02/05(木) 00:35:26
>>64
conquerer -bj --creeping-deth
72名無しさん@お腹いっぱい。:2009/02/05(木) 06:38:09
>>70
多次元配列という意味なら、使えない。
73名無しさん@お腹いっぱい。:2009/02/05(木) 18:40:06
速度という観点でsh、bashそれとperl、pythonを比較するとどうなんでしょう。
起動コストは抜きにして
とりあえずディレクトリーをたぐりながら正規表現での文字列探索みたいなジャンルで
好みでもかまわないので意見がききたいです。
74名無しさん@お腹いっぱい。:2009/02/05(木) 18:52:19
>>73
実際にやってみればいいじゃん。
まあシェルスクリプトは速度を求めるものじゃないけどね。
75名無しさん@お腹いっぱい。:2009/02/05(木) 18:53:41
>>73
速い順に、
sh > perl > bash > python
で、大体合ってる
76名無しさん@お腹いっぱい。:2009/02/05(木) 19:03:08
sh, bashは他のプログラムをfork, execしなきゃならないから
perl, python > sh, bash だろ。JK
77名無しさん@お腹いっぱい。:2009/02/05(木) 20:23:44
シェルにもなって正規表現爆速のTcl最強って話ですね、わかります
78名無しさん@お腹いっぱい。:2009/02/06(金) 12:09:09
Command-line Fu < The best UNIX commands on the web
http://www.commandlinefu.com/commands/browse
79名無しさん@お腹いっぱい。:2009/02/06(金) 12:18:34
-Fuってどういう由来の語なんだろうね
80名無しさん@お腹いっぱい。:2009/02/06(金) 12:19:50
符じゃないか?

護符とかの。
81名無しさん@お腹いっぱい。:2009/02/06(金) 12:51:06
http://ja.wikipedia.org/wiki/GIMP
なお、Script-Fuの名はカンフー(Kung-fu)からきている。
82名無しさん@お腹いっぱい。:2009/02/06(金) 15:28:51
夫は男らしいさまを表す字です。
偉丈夫、気丈夫、大丈夫
83名無しさん@お腹いっぱい。:2009/02/06(金) 15:34:19
PC的にアレかもね
84名無しさん@お腹いっぱい。:2009/02/06(金) 15:57:59
例えばfindやgrepをshが呼び出す場合別プロセスで使っていたら
起動コスト安くなりませんか?めんどいけど
Tclってきるつもりだったけれどある程度の機能がセットになっているのならば
選択肢なのかなぁ。
でも要するにざっくりとみたら対さないんだったら素直にperl使うのが楽なんですかね、
85名無しさん@お腹いっぱい。:2009/02/06(金) 16:11:31
tcl, perl
いつの人ですか?
ここ3年くらい使ったことないよ!
86名無しさん@お腹いっぱい。:2009/02/06(金) 17:36:19
tcl なんぞより Bourne Shell の方がよっぽど古いぞと問い詰めたい
87名無しさん@お腹いっぱい。:2009/02/06(金) 23:17:30
echo < hoge
これってhogeの内容がechoに渡されると思うんだけど、
なんで何も表示されないんですか?
88名無しさん@お腹いっぱい。:2009/02/06(金) 23:30:30
echoはコマンド引数を表示するように作られていて、標準入力は読まないからです。
89名無しさん@お腹いっぱい。:2009/02/06(金) 23:45:25
>>88
了解しました

[ana@coppola ~]$ echo <(ls)
/proc/self/fd/63

ではこうなるのはいったいなぜですか?
というか、
/proc/self/fd/63
って?
90名無しさん@お腹いっぱい。:2009/02/07(土) 00:16:57
/dev/fd/#は#に対応するファイルディスクリプタに名前が付いたものと思えばいいです。
<(command)はprocess substitutionというbashの特殊な記法でファイルディスクリプタ
ファイル(/dev/fd/#)名に置換されます。
91名無しさん@お腹いっぱい。:2009/02/07(土) 00:43:49
初期のシェルにもその記法はあったが、
曖昧さがあるので|記法に変った。
92ミジンコ未満:2009/02/07(土) 01:17:25
bashのスクリプトでDVD/CDドライブにメディアが挿入されている場合に
コマンドを実行する。なんてことをするにはどうすればいいですか
93名無しさん@お腹いっぱい。:2009/02/07(土) 01:32:22
94名無しさん@お腹いっぱい。:2009/02/07(土) 11:06:58
>>92

head -c 1 /dev/cdrom > /dev/null 2>&1 && command


>>93
そのリンク見ても、メディアが挿入されてるかどうかの判定はできないよ。
95名無しさん@お腹いっぱい。:2009/02/08(日) 00:47:14
あるフォルダに複数のファイルが入っていて、その中から
暗号化zipを別のフォルダに分けるっていう事、どうやればいいでしょうか
96名無しさん@お腹いっぱい。:2009/02/08(日) 00:49:33
お前、その質問を他人から受けてやりたい事が解るのか?
9792:2009/02/08(日) 01:19:09
>>93-94
ありがと
なんとかなりそうです
98名無しさん@お腹いっぱい。:2009/02/08(日) 02:15:27
2つのディレクトリ内のファイルの更新日時を比較するにはみなさんどうしていますか?
現状では、2つのディレクトリ内のファイルは同期が取れていますが、たまに異なる更新日時のファイルが出来ます。
その同期の取れていないファイルはできれば抜き出したいです。
ファイルは全部で5000件くらいあります。

1.ls -ltでディレクトリ内一覧情報を出してファイルに出力
2.出したファイルから不要な情報を削除(ユーザー名とか)して時間とファイル名だけにしぼる
3.上の1と2を両ディレクトリで行う
4.diffでファイル同士比較
5.偏った情報を出力

これをシェルでやらせようと思ってますが、どうも効率を悪い気がします。
99名無しさん@お腹いっぱい。:2009/02/08(日) 03:18:26
結局何をしたいのか
ところどころ日本語も意味不明

更新日時の比較なら、ls -lt の結果を比較すればいいし
ファイル内容の比較をしたいのなら、diff や dircmp で
ディレクトリを指定すればいい
10098:2009/02/08(日) 04:46:20
>>99
ありがとうございます。
おとなしく更新日時を取ってきてdiffで比較します。
101名無しさん@お腹いっぱい。:2009/02/08(日) 07:23:22
>>98
なぜ同期ツールを始めから使わないのか?
e.g. rsync等
102名無しさん@お腹いっぱい。:2009/02/08(日) 16:13:21
readlinkコマンドがないOSで、
readlink相当のことをシェルでやるには、
どうやるのが定番ですか?

シンボリックリンクの中にはスペースや特殊記号等、
すべてアリの状態でお願いします。
103名無しさん@お腹いっぱい。:2009/02/08(日) 16:17:18
シェルってゆうな。クズ。
104名無しさん@お腹いっぱい。:2009/02/08(日) 16:26:43
ls -l で行末を読むとか
105名無しさん@お腹いっぱい。:2009/02/08(日) 16:57:46
>>104
> シンボリックリンクの中にはスペースや特殊記号等、
> すべてアリの状態でお願いします。
106名無しさん@お腹いっぱい。:2009/02/08(日) 17:05:41
>>104

$ ln -s 'hoge -> hage' 'boke -> kasu'
$ ls -l
lrwxrwxrwx 1 guest guest 12 Feb 8 17:05 boke -> kasu -> hoge -> hage

こういう状態で、どうやって判定するのかね?
107名無しさん@お腹いっぱい。:2009/02/08(日) 18:26:11
>>102
perl -e "print readlink ファイル名;"
でどう?
perl はたいてい入ってるし
108名無しさん@お腹いっぱい。:2009/02/08(日) 22:41:27
>>104
lrwxrwxrwx
一文字目の l はどういう意味?
109名無しさん@お腹いっぱい。:2009/02/08(日) 22:45:41
>>108
お前、>>105 が言わんとしてることをわかってない

boke -> kasu -> hoge -> hage

この部分を見て、どこがシンボリックリンクの中身か判読できないだろw
110名無しさん@お腹いっぱい。:2009/02/08(日) 22:50:11
>>108
>>106 を良く読め、

ls -lの結果が、 boke -> kasu -> hoge -> hage となった場合、

「hage」を指している 「boke -> kasu -> hoge」と言うsymlinkかも知れないし、
「hoge -> hage」と言うファイルを指している 「boke -> kasu」と言うsymlinkかも知れないし、
「kasu -> hoge -> hage」と言うファイルを指している 「boke」と言うsymlinkかも知れない、
ということだな。
111名無しさん@お腹いっぱい。:2009/02/08(日) 23:26:17
わかってない奴が湧いてるな
112名無しさん@お腹いっぱい。:2009/02/09(月) 00:30:15
#!/bin/sh
(
echo a
echo b
)

これと

#!/bin/sh
{
echo a
echo b
}

これってなんか違いあります?
113名無しさん@お腹いっぱい。:2009/02/09(月) 04:42:06
プロセスを起動するかどうか
114名無しさん@お腹いっぱい。:2009/02/09(月) 06:32:24
>>113
実際にはシェル内部で最適化されるから、
( ) を使ってもプロセスは起動されない。

>>112
これだけだと違いは起きない。
( ) や { } 以外の他の部分の記述によっては違いが出ることもあるというだけ。
115名無しさん@お腹いっぱい。:2009/02/09(月) 23:28:32
>>106
ls -l と ls -lF の結果を比較すればできそうだから、あとはまかせた。
116名無しさん@お腹いっぱい。:2009/02/10(火) 04:06:30
readlink(1)ってのもあるよ。
117名無しさん@お腹いっぱい。:2009/02/10(火) 06:44:56
>>116
>>102
「readlinkコマンドがないOSで、」

最近、質問をちゃんと読まない人多いね
118名無しさん@お腹いっぱい。:2009/02/10(火) 09:48:36
ほんと、問題を良く読まないのが沢山いるな。
>>102はreadlink相当のことをビルトインコマンドとして持っているシェルを
探しているんだぞ。

>>102
> readlink相当のことをシェルでやるには、
119名無しさん@お腹いっぱい。:2009/02/10(火) 09:58:01
readlink がなければ stat -f %Y を使えばいいじゃない
120名無しさん@お腹いっぱい。:2009/02/10(火) 10:00:52
>>119
readlinkがないOSにはstatもないと考えるのが妥当。

あと、stat -f というオプションはFreeBSD方言だから気を付けろ。
121名無しさん@お腹いっぱい。:2009/02/10(火) 11:04:50
stat --printfの"%N"はシェルスクリプトで使いづらいよな。

$ stat --printf "%n\n" /vmlinuz
/vmlinuz
$ stat --printf "%N\n" /vmlinuz
`/vmlinuz' -> `boot/vmlinuz-2.6.27-11-generic'

->とかquoteとかいらねーよ
122名無しさん@お腹いっぱい。:2009/02/10(火) 13:20:19
>>120
マリー アントワネットにマジレスする不粋
123名無しさん@お腹いっぱい。:2009/02/10(火) 15:07:27
>>122
おれには>>119 がマジで stat -f %Y が他のOSでも使えると思い込んでるように見えるが、
124名無しさん@お腹いっぱい。:2009/02/10(火) 15:15:42
ビルトインコマンドとしてstat -fを持ってるシェルはどれだ?
125名無しさん@お腹いっぱい。:2009/02/10(火) 15:46:31
>>123
しゅぎょーが足らないな
126名無しさん@お腹いっぱい。:2009/02/10(火) 16:08:23
>>125
言い訳見苦しい。本当に知らなかったんだねw
127名無しさん@お腹いっぱい。:2009/02/10(火) 16:12:10
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 が更新されません
129名無しさん@お腹いっぱい。:2009/02/10(火) 21:17:20
ひねりが足りない要努力
130名無しさん@お腹いっぱい。:2009/02/10(火) 21:18:01
シェルに表示されたままという意味がよくわかりませんが、
端末の画面上ということですね。

CUIの端末の元祖はテレタイプです。
これはキーボードとプリンタがくっついたものです。
プリンタで打ち出されたlsの結果がいつのまにか変化するようなことはありません。
画面に表示するようになった現在でも同じです。
131名無しさん@お腹いっぱい。:2009/02/10(火) 21:30:20
>>130
プリンターは繋いでいません。
プリーンターを繋げばリロードが治るんでしょうか?
良くわかりませんが??
132名無しさん@お腹いっぱい。:2009/02/10(火) 21:37:26
ttp://homepage1.nifty.com/plusworld/TTY/TTYALL.GIF
こういうのを購入して接続するとリロードが治るはずです。
どこで売ってるかは知らないので、がんばって探してください。
なければあきらめましょう。
133名無しさん@お腹いっぱい。:2009/02/11(水) 00:05:14
ダイヤルなつかしい
134名無しさん@お腹いっぱい。:2009/02/11(水) 09:36:33
>>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
135名無しさん@お腹いっぱい。:2009/02/11(水) 09:37:18
あはははははは
136名無しさん@お腹いっぱい。:2009/02/11(水) 10:46:40
>>134
ソースにじかに "$1" を入れ込めばもっと短くなるだろ

echo 'b[9];main(){printf("%.*s\n",readlink("'"$1"'",b,36),b);}'|gcc -xc - 2>/dev/null;./a.out;rm a.out
137名無しさん@お腹いっぱい。:2009/02/11(水) 13:06:27
>>136
> 2>/dev/null

書き込めないcurrent directoryで、

/usr/bin/ld: cannot open output file a.out: Permission denied

すら見られませんが…
138名無しさん@お腹いっぱい。:2009/02/12(木) 16:45:07
#!/usr/bin/tcc -run
b[9];main(int c,char**v){printf("%.*s\n",readlink(v[1],b,36),b);}
139名無しさん@お腹いっぱい。:2009/02/14(土) 18:30:52
cpu使用率を出力するコマンドが欲しいんですがtopの出力を加工する感じになりますか?
140名無しさん@お腹いっぱい。:2009/02/14(土) 18:32:02
>>139
uptime
141名無しさん@お腹いっぱい。:2009/02/15(日) 01:04:50
vmstatとかじゃだめ?
142名無しさん@お腹いっぱい。:2009/02/15(日) 02:12:42
>>139
/proc/statのcpu行の最初の三つがCPUタイム
143名無しさん@お腹いっぱい。:2009/02/15(日) 09:42:44
ハードリンク先を求めるのに、findで探す以外に効率的なシェルって作れないんですか?
144名無しさん@お腹いっぱい。:2009/02/15(日) 09:44:20
シェルってゆうな。クズ。
145名無しさん@お腹いっぱい。:2009/02/15(日) 09:56:36
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);
こんな感じで一旦あるテキストファイルの文字列を全部読み込んで、別のファイルに
追記書き込みの処理をしたいんです。

147名無しさん@お腹いっぱい。:2009/02/15(日) 10:40:05
cat aaa >> bbb
148名無しさん@お腹いっぱい。:2009/02/15(日) 10:47:30
>>147

なるほどcatを使うんですね、即レスありがとうございました。
149名無しさん@お腹いっぱい。:2009/02/15(日) 11:00:11
">>"がキモだとわかっているのだろうか。
150名無しさん@お腹いっぱい。:2009/02/15(日) 11:12:06
ふむ、慣れない内はシェルに>の動作を制限させとった方がいいかも?
でも制限させたらさせたで面倒なんだよな。
仕事で使うんならいざしらず、遊びで使うんなら
少々飛ばそうが関係ないし。
151名無しさん@お腹いっぱい。:2009/02/15(日) 11:18:56
シェルの話はスレ違い
152名無しさん@お腹いっぱい。:2009/02/15(日) 11:23:28
>>147
それだと、>>146 のphpでやってる flock の処理が出来てないと思うが。
同時にプロセス起動されたら出力がぐちゃぐちゃに混ざる。
153名無しさん@お腹いっぱい。:2009/02/15(日) 11:30:38
phpは知らんが146はロックできなかった場合の処理をしてないようなので
147でいいんじゃないの?
154名無しさん@お腹いっぱい。:2009/02/15(日) 11:35:22
>>153
ロックできなかった場合はflockのところでロック解除になるまで待たされる。
だから、ロックの処理はちゃんと行なわれている。

よって >>147 ではダメ。
155名無しさん@お腹いっぱい。:2009/02/15(日) 11:43:02
>>153
>phpは知らんが

知らないのに突っ込むと恥をかくという典型例ですな
156名無しさん@お腹いっぱい。:2009/02/15(日) 11:50:00
そもそも >>146 の文章とコード例がずれてるのが原因のような
157名無しさん@お腹いっぱい。:2009/02/15(日) 12:01:31
lockf bbb sh -c "cat aaa >>bbb"

lockf(1)が無かったら作れ。
158名無しさん@お腹いっぱい。:2009/02/15(日) 12:04:49
>>146
flock(1)が存在するOS (Linux)なら、

flock out.txt cat in.txt >> out.txt
159名無しさん@お腹いっぱい。:2009/02/15(日) 12:18:35
凄く細かいことを言うと、
>>157のスタイルの方が>>158のスタイルより、
ファイルロック以前に書き込まれる恐れがない。
160名無しさん@お腹いっぱい。:2009/02/15(日) 12:21:59
おれも、それを指摘しようと思ったがアペンドだから問題ないので止めた。
>>158が知っていたのかはわからない。
161名無しさん@お腹いっぱい。:2009/02/15(日) 12:26:13
158 だが、知ってた上で無駄な sh -c を外したんだよ。
162名無しさん@お腹いっぱい。:2009/02/15(日) 12:28:31
無駄ではなく、過剰仕様というのなら分かるが…
163名無しさん@お腹いっぱい。:2009/02/15(日) 12:32:41
>>162
いや、仕様とか品質とか関係なく無駄。

アペンドで先にオープンされるだけであって、
実際の書き込みはロック取得後に行なわれるから、
sh -c なしで全く問題ない。
164名無しさん@お腹いっぱい。:2009/02/15(日) 12:35:16
>>157
それだと、実行後に bbbが削除されるだろ(笑)

>>158
こっちは合格。
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/は不変です。
166名無しさん@お腹いっぱい。:2009/02/15(日) 17:56:26
>>165
一旦変数に記憶させたいという要求なのかな?
だとすると、

file=`cat a.txt`
echo "$file" >> b.txt

なお、変数に記憶させる必要がなければもちろん、
cat a.txt >> b.txt でよい。
167名無しさん@お腹いっぱい。:2009/02/15(日) 19:20:20
>>166
ありがとうございました、少し形を変えましたが思っていた事ができました。
こういう場合は``でくくるのですね。また一つ勉強になりました。
168143:2009/02/15(日) 20:48:50
答えまだですか?
169名無しさん@お腹いっぱい。:2009/02/15(日) 21:44:12
170名無しさん@お腹いっぱい。:2009/02/15(日) 23:20:16
>>168
diagostini --autumn-leaves
171名無しさん@お腹いっぱい。:2009/02/15(日) 23:42:59
>>168 >>143 ハードリンク先を求める
所詮、指してる先は i-node だから
ls -i 元ファイルのパス
じゃ、だめなのか
172名無しさん@お腹いっぱい。:2009/02/15(日) 23:54:35
わかってない人は黙っているように。
173名無しさん@お腹いっぱい。:2009/02/16(月) 00:31:33
自己解決しました。ありがとうございました。
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の記述がおかしい可能性が高いと思いますので、間違いなど
あればご指導お願いします。
175名無しさん@お腹いっぱい。:2009/02/16(月) 09:35:31
#! /bin/sh -x
して何が起ってるか調べろ
176名無しさん@お腹いっぱい。:2009/02/16(月) 09:37:07
たぶん$PATH
177名無しさん@お腹いっぱい。:2009/02/16(月) 10:42:27
>>175-176
ありがとうございます、>>176の仰るとおり$pathでした。
useraddを絶対パスに指定してやって/usr/sbin/useraddにすればOKでした。
178名無しさん@お腹いっぱい。:2009/02/16(月) 16:28:19
確かにスレ違いなんだが、
cronに書いてなかったっけ、$PASSの事。
179名無しさん@お腹いっぱい。:2009/02/16(月) 16:37:59
$PASSの事は書いてない。
180名無しさん@お腹いっぱい。:2009/02/16(月) 16:43:40
cronよりも、at使った方が楽で確実だよ。
コマンドライン上での実行時のPATHその他の環境変数が
実行時と同じように引き継がれて実行されるし。
181名無しさん@お腹いっぱい。:2009/02/16(月) 16:51:37
>>179
確かに書いてなかった。
182名無しさん@お腹いっぱい。:2009/02/17(火) 01:20:42
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がださいと思ってます。
美しい書き方教えてください
183名無しさん@お腹いっぱい。:2009/02/17(火) 01:30:15
>>182
command `echo $n | sed 's/,/ /'`
184名無しさん@お腹いっぱい。:2009/02/17(火) 01:31:59
for n in $list
do
IFS=,
echo $n | { read sono1 sono2 ; command $sono1 $sono2; }
done
185名無しさん@お腹いっぱい。:2009/02/17(火) 02:15:31
>>184
すいません
186名無しさん@お腹いっぱい。:2009/02/17(火) 02:16:40
途中送信しちゃた
>>184
{}これでくくっている意味がわからんのですけどなんででしょう?
187名無しさん@お腹いっぱい。:2009/02/17(火) 06:29:27
>>186
{ }で括らなかったら echoのパイプが左のreadだけにしかかからないだろ
( )でもいいけどさ。
188名無しさん@お腹いっぱい。:2009/02/17(火) 06:31:27
>>184
わざわざreadしなくていいよ。

IFS=,
command $n

だけで桶。
189名無しさん@お腹いっぱい。:2009/02/17(火) 21:27:45
list定義の部分はかっこよくできないすかね?
hashとか構造体風な感じ
190名無しさん@お腹いっぱい。:2009/02/17(火) 22:08:31
>>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つずつ回すのがポイント。
191名無しさん@お腹いっぱい。:2009/02/17(火) 22:12:37
IFS=,
cat <<EOF | while read x y; do echo $x $y; done
aaa,111
bbb,222
ccc,333
EOF
192名無しさん@お腹いっぱい。:2009/02/17(火) 22:18:34
IFSの仕様が良くわからん。
193名無しさん@お腹いっぱい。:2009/02/17(火) 22:20:38
#!/bin/sh

list='aaa bbb ccc'
aaa=111
bbb=222
ccc=333

for arg in $list
do
eval command $arg \$$arg
done
194名無しさん@お腹いっぱい。:2009/02/17(火) 22:23:19
>>190
>>191
ありがとうございます。

ちなみに、
>>191のような場合のwhileは

cat <<EOF | while read xy
do
echo $x $y
done
aaa,111
bbb,222
ccc,333
EOF


のようにインデント、改行つきでかけないもんでしょうか?

195名無しさん@お腹いっぱい。:2009/02/17(火) 22:25:16
>>194
継続行使えばOK

cat <<EOF | while read xy \
do \
echo $x $y \
196名無しさん@お腹いっぱい。:2009/02/17(火) 22:28:51
>>195
アフォか。\ などイラン。

あと、お前の解答の cat <<EOFは無駄。
無駄を省くと、



IFS=,
while read x y
do
echo $x $y
done << EOF
aaa,111
bbb,222
ccc,333
EOF


それより、>>190 方式がお勧め。
197名無しさん@お腹いっぱい。:2009/02/17(火) 22:47:54
コードとデータが分離してるとかっこいいよね

#!/bin/sh

# aaa,111
# bbb,222
# ccc,333

IFS=,
grep '^# ' $0 | sed 's/^# //' | while read a b
do
command $a $b
done
198名無しさん@お腹いっぱい。:2009/02/17(火) 22:51:14
元の質問 >>182 で、外部コマンドの cut がかっこ悪いって言ってるんだから、
>>197 はもっとカッコ悪い。grepもsedも使うなんて。
199名無しさん@お腹いっぱい。:2009/02/17(火) 22:56:31
>>197 を添削してやるよ。
外部コマンドなしでできる。

#!/bin/sh

# aaa 111
# bbb 222
# ccc 333

while read a b c
do
if [ "$a" = '#' ]; then
echo $b $c
fi
done < $0
200名無しさん@お腹いっぱい。:2009/02/17(火) 23:00:28
どっちにしても、うっかりコメント書いて、えらいことになりそうな
201名無しさん@お腹いっぱい。:2009/02/17(火) 23:02:54
あははは
202名無しさん@お腹いっぱい。:2009/02/17(火) 23:04:31
#define aaa 111
#define bbb 222
#define ccc 333
とかにする?
203名無しさん@お腹いっぱい。:2009/02/17(火) 23:07:14
データをコードよりも後ろに持ってくれば、
コメントアウトする必要なくなるぞ。


#!/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
204名無しさん@お腹いっぱい。:2009/02/17(火) 23:16:47
>>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がそれにあたりますが、これ以外のコマンドが存在する可能性もあります。
206名無しさん@お腹いっぱい。:2009/02/18(水) 01:40:50
>>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/'
-----------------------
うーん、コマンドでないものまで出力されてる、、、
207名無しさん@お腹いっぱい。:2009/02/18(水) 02:17:05
たとえば、
echo dog cat man
という行があったらどうするとか、
eval ls
という行があったらどうするとか、
l=l; s=s; $l$s
という行があったらどうするとか。


208名無しさん@お腹いっぱい。:2009/02/18(水) 22:30:53
yes,
test,
[,
ummm,,,,
209名無しさん@お腹いっぱい。:2009/02/18(水) 23:02:58
-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行目 名前は遠藤です

説明が下手なのでわかりにくいですがよろしくお願いします。
211名無しさん@お腹いっぱい。:2009/02/20(金) 23:01:30
>>205
一回実行してよいなら簡単に抜ける。
exec(2)をフックして、引数を調べれるか、OSによっては
/procみれば即判る。
212名無しさん@お腹いっぱい。:2009/02/20(金) 23:05:35
実行結果で条件分岐してたら、実行させないとトレース出来ない。
213名無しさん@お腹いっぱい。:2009/02/20(金) 23:54:56
>>210
text=`cat aaa.txt`
sed "2i$text" bbb.txt

あるいは

printf "2i\n$text\n.\nwq\n" | ed bbb.txt
214名無しさん@お腹いっぱい。:2009/02/21(土) 07:17:26
>>211
それだと、if文とかcaseとかの分岐があった場合に
分岐しなかった方が抜き出せない。
内部コマンドが抜き出せない。
215名無しさん@お腹いっぱい。:2009/02/21(土) 07:21:51
>>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
>>213 >>215
ありがとー!出来ました。今後応用していろいろとがんばってみます。
217名無しさん@お腹いっぱい。:2009/02/21(土) 12:15:58
いわゆる「指定文字列探索」をshで(findとかsedとか組み合わせて)ささっとやるのは
どんな感じでやるのがよいのでしょう。
ループ組まないでやる方法があればベターです。
とりあえずそのディレクトリー内で得に拡張子はとわず
英文(例えばソース中の関数名とか#includeとか)程度でいいです。
218名無しさん@お腹いっぱい。:2009/02/21(土) 12:17:59
>>217
grep -r のことか?
219名無しさん@お腹いっぱい。:2009/02/21(土) 13:48:39
grep ってファイル自体を探索できるんですか
勘違いしていた。orz。良くmanよみますたい
220名無しさん@お腹いっぱい。:2009/02/21(土) 14:02:15
「ファイル自体」って考えを止めて、
stdioによるストリームデータとして捉えてください。
シェルスクリプト処理の主な対象は。
221名無しさん@お腹いっぱい。:2009/02/21(土) 14:06:18
>>220
意味がわからない
222名無しさん@お腹いっぱい。:2009/02/21(土) 14:07:05
-rは純正grepには無いので使用禁止。
223名無しさん@お腹いっぱい。:2009/02/21(土) 14:09:29
>>217
find . -type f -exec grep pattern {} +

ちっともシェルスクリプトじゃないな。find総合スレが必要? w
224名無しさん@お腹いっぱい。:2009/02/21(土) 14:44:09
Solarisはいつになったら grep に -r を実装するんだろう。
あ、全員がopensolarisに移行すれば解決するのか。
225名無しさん@お腹いっぱい。:2009/02/21(土) 15:07:19
SunOSもHP-UXも「どうせみんなGNUtools入れてんでしょウヒヒ」という姿勢だから
226名無しさん@お腹いっぱい。:2009/02/21(土) 18:20:07
>>220 わかりやすい表現で書いただけなり
取り合えず同じディレクトリーないでいいので

grep -a 'キーワード' *.txt
みたいにしてみたんだけれど
これってshで書けば日本語通るけれどターミナルだと打てないのが不便

あとマッチしたファイル名を一回だけ表示したらファイル名だけ探索して次にいくようにするにはいかに書けば良いなり?
227名無しさん@お腹いっぱい。:2009/02/21(土) 18:22:07
>>226
grep -rl 'キーワード' .
228名無しさん@お腹いっぱい。:2009/02/21(土) 18:24:32
>>223 どこにキーワード入れていいのかわからん。orz
229名無しさん@お腹いっぱい。:2009/02/21(土) 18:29:39
>>227 それそれ。ありやとうやんした。
日本語を探索する場合 いちいちshに書くの面倒なんだけど
どうやってんでしょう。各々方は
230名無しさん@お腹いっぱい。:2009/02/21(土) 18:31:06
普通にコマンドラインから。
文字コードがアレな時はlgrep使ってる。
231名無しさん@お腹いっぱい。:2009/02/21(土) 18:40:37
>>229
普通にコマンドラインに日本語入力してるけど。

逆に、なんでコマンドラインに日本語入力できないの?
232名無しさん@お腹いっぱい。:2009/02/21(土) 19:05:15
>>231

x 入れてなきゃ出来ないだろ。
鯖なら普通いれてない。

まあ、鯖でコマンドラインから日本語をいれにゃならんのも想像しにくいが。
233名無しさん@お腹いっぱい。:2009/02/21(土) 19:08:07
>>232
X 入れてなくても日本語入力できてるけど、、

あと、>>229 で、「shに書く」なら出来てるんだよね?
どうやって shに書いてるの?
それと同じ方法でコマンドラインに日本語入力するだけだが、、
234232:2009/02/21(土) 19:24:51
>>233

>>229 がどうしてるのかは知らんが、
x の入っているマシンで書いて、scpだ。

これと同じ方法でコマンドライン入力するとなると、
ssh comannd args ってなことになるが、リモートでシェルの補完機能が
使えない状況ではその気になれない。
235名無しさん@お腹いっぱい。:2009/02/21(土) 19:35:06
>>234
どんくさいね。
236229:2009/02/21(土) 19:49:28
普通にデスクトップ環境です。(xfce)
これもfirefoxでカキコしてるし
gnome-terminal,Terminal,xtermいずれも日本語は表示するので
shの実行結果では日本語表示されます。

anthyでの変換画面はでるけれど変換終了すると日本語部分は表示されません。(ぴっとかはねられる)
コピペでもセレクションコピーでも同様
ただしnano等起動すればターミナル内でも日本語変換できます。
ちょっとスレの趣旨と別枠だけれど世間とは違うのですか。
237229:2009/02/21(土) 19:50:59
むろんガチでダイアログ出すこともできるしperlを使う手もあるけれど
grepにそれはないでしょうということで一応質問しているわけであります。
238名無しさん@お腹いっぱい。:2009/02/21(土) 19:58:16
>>236
ロケール設定とshellの設定とターミナルの設定の問題だが、
スレ違いなんで、くだ質スレで、
「コマンドラインで日本語入力したい」ときいてみてくれ。
239名無しさん@お腹いっぱい。:2009/02/21(土) 20:09:13
>>234
その、Xが入ってるというマシンで日本語入力できてるなら、
xtermとかktermとか開いて、その中からsshでログインして、
ログイン先のシェルのコマンドラインに、ローカルのXの
いつもの入力方法で日本語入力できるだろ。
240名無しさん@お腹いっぱい。:2009/02/21(土) 20:15:44
>>226
shってゆうな。クズ。
241232:2009/02/21(土) 20:39:48
>>235

なら、どんくさくない方法を提示しろやカス。
242名無しさん@お腹いっぱい。:2009/02/21(土) 20:40:57
canuumという単語を思い出したが意味は忘れた
243名無しさん@お腹いっぱい。:2009/02/21(土) 20:48:37
>>236
> 変換終了すると日本語部分は表示されません。(ぴっとかはねられる)

というのは、ログイン先でLANG(またはLC_ALLとかLC_CTYPE)が
ちゃんと設定されてないのが原因。

EUC環境なら LANG=ja_JP.eucJPに、
UTF-8環境なら LANG=ja_JP.UTF-8に設定しろ。


あと、これとは別件だが、canuumやuumがある環境なら、
Xが全くなくてもcanuumを起動すれば直接日本語入力できる。
244名無しさん@お腹いっぱい。:2009/02/21(土) 21:29:42
>>243
環境変数LANGによらず、シェルが8ビットコードに対応してないと
はじかれる。Solarisだと/bin/tcshは8ビット入力できなかった。

>>236 は別のシェルを使ってみるといいと思う

ただ、>>229 の「日本語を探索する場合」って漢字コードが混在していると
非常にやっかいなんだんだよね。昔 jgrep だか ngrep だかが fj.sources に
流れたような記憶があるけど、ああゆう漢字コードを変換する grep が欲しいかも
245名無しさん@お腹いっぱい。:2009/02/21(土) 21:38:48
>>241
「なら」ってなんだよ。つながってねーぞ。クズ。
246名無しさん@お腹いっぱい。:2009/02/21(土) 22:03:10
テラターム使って日本語入力すればぁ?
どうせUNIXはサーバー専用なんだろ?
247名無しさん@お腹いっぱい。:2009/02/21(土) 22:04:20
>236だす
>>243 環境変数は全部(LANGもLC_ALLもLC_CTYPEも)ja_JP.UTF-8なり
アプリだと入力できるのでターミナルソフトの問題ではなく>>244
いうようにシェルの問題だと思ったのだけれど

ふと思いついてsudo xterm(sh)するとなぜかコピペはできて変換はできず
su(csh)だとコピペも入力もできた。
原因は解明できていないしファイラーからターミナル開いて探索ということはやりにくいけれど
オラ個人の設定の問題の様なのでこの件はもうきにしないでくれ
grepの基本がわかっただけでも充分に前進したよ。
248名無しさん@お腹いっぱい。:2009/02/21(土) 22:06:00
>>246 UNIXはゲームしたり文章書いたりブラウジングしたりするパソコン用OS
249名無しさん@お腹いっぱい。:2009/02/21(土) 22:09:04
UNIXはゲームサーバーになったり書いた文章保存するサンバサーバーだったり
ブラウジング用ウェブサーバーだったりするサーバー用OS
250名無しさん@お腹いっぱい。:2009/02/21(土) 22:52:42
ちなみにターミナルで日本語打ち込めない対策はさすがにsuとか使えないので
perlで<STDIN>使うという最低の方法に逃げたです。これだとクリック起動で文字入力待ちしてPerlで組めばいいのに``でgrep呼んでしまいました。
単純な探索の場合処理的にはファイルをたぐるループ分perlで直接書くより速いと思います。
251名無しさん@お腹いっぱい。:2009/02/21(土) 23:04:53
>>250
$ grep -f - -rl .

ってやれよ。すると、標準入力から読み込んだキーワードがgrepに使われる。
シェルのコマンド行じゃない標準入力なら日本語は通るはず。
日本語打った後は、改行直後に Ctrl-Dで終了。
252名無しさん@お腹いっぱい。:2009/02/22(日) 00:34:27
>>244
だからlgrepがあるつーの。
253名無しさん@お腹いっぱい。:2009/02/24(火) 23:14:27
シェルの中でexpectを使ってwinにtelnetしてbatを実行してるんですが、
当然文字コードが違う(EUCとSJIS)ので化けます。

LANGを途中変えても変わらないです。(ターミナルのせいだと思いますが)

化けないようにできますか?
254名無しさん@お腹いっぱい。:2009/02/24(火) 23:19:46
>>253
・標準出力にパイプで | nkf -Se をかます
・ktermをSJISモードで開く

好きな方選べ
255名無しさん@お腹いっぱい。:2009/02/24(火) 23:30:46
| iconv -f EUC-JP -t Shift_JIS
256名無しさん@お腹いっぱい。:2009/02/24(火) 23:42:35
シェルってゆうな。クズ。
257名無しさん@お腹いっぱい。:2009/02/25(水) 06:36:32
>>255
それ、-t と -f 逆だろ。
258名無しさん@お腹いっぱい。:2009/02/25(水) 10:09:23
>>251 ほとんどすれ違いネタになっていたのにありがとうございます
grep -f - -rl .
後の日本語入力→改行→ctrl+dで探索スタートできました。(xterm)
259名無しさん@お腹いっぱい。:2009/02/25(水) 15:12:52
ディレクトリ内にひとつしかファイルorディレクトリがない場合に
コマンドを実行しようと思い、

for dir in `find . -type d -maxdepth 1`
do
    test $(ls -1 $dir | wc -l) -eq 1 && command
done

このように書いてみたのですが、ディレクトリ名が空白で区切られて
しまいうまく動きません。
どのように対処したらいいでしょうか?
260名無しさん@お腹いっぱい。:2009/02/25(水) 15:17:13
find . -type d -maxdepth 1 | while read dir
do
test $(ls -1 "$dir" | wc -l) -eq 1 && command
done
261名無しさん@お腹いっぱい。:2009/02/25(水) 15:28:47
>>259

find . -maxdepth 1 -type d \
-exec sh -c 'for d;do [ $(ls "$d"| wc -l) -eq 1 ] && command; done' dummy {} +
262名無しさん@お腹いっぱい。:2009/02/25(水) 16:21:38
>>260
ありがとうございます。readを使うと良いんですね。
無事目的の動作をさせることができました。

>>261
ありがとうございます。
-execはあまり使ったことがないのですが、最後の
done' dummy {} +
の意味がいまいち理解できませんでした。
よろしければ教えていただけますか?
263名無しさん@お腹いっぱい。:2009/02/25(水) 16:26:36
readを使うと、\ を含むディレクトリ名が読めないとか、
(途中じゃなく)頭にスペースが付いてるディレクトリ名が読めないとか
問題が残るんだな。
その点も含めて解決するとなると、>>261 の解になる。
264名無しさん@お腹いっぱい。:2009/02/25(水) 17:34:24
>readを使うと、\ を含むディレクトリ名が読めないとか、
>(途中じゃなく)頭にスペースが付いてるディレクトリ名が読めないとか

IFS= read -r
265名無しさん@お腹いっぱい。:2009/02/25(水) 17:36:23
>>264
read -r は bash依存。

で、それやっても「改行入り」ディレクトリ名が正しく処理されない。
結局 >>261 一択。
266名無しさん@お腹いっぱい。:2009/02/25(水) 17:48:53
read -r は posix じゃね?
267名無しさん@お腹いっぱい。:2009/02/28(土) 18:54:04
基本的なことかも知れませんが、
キーボードを読んで分岐するバッチはどう書けば医院でしょうか?
268名無しさん@お腹いっぱい。:2009/02/28(土) 19:04:18
バッチならset /pですね。でも板違いなので出てってください。
269名無しさん@お腹いっぱい。:2009/03/01(日) 02:23:56
>>268
MSDOSのバッチスクリプトしか知らない人?
バッチって、バッチ処理等の普通名詞だろう
270名無しさん@お腹いっぱい。:2009/03/01(日) 03:26:52
パスワードがかかってないzipファイルにパスワードをかけていきたいんですが、
そもそもパスワードがかかってないか判定するすべはありますか?
271名無しさん@お腹いっぱい。:2009/03/01(日) 06:54:24
>>270
unzip -Zv *.zip | grep 'file security status'
272名無しさん@お腹いっぱい。:2009/03/01(日) 08:06:08
cronもatも使えない環境で、指定日時時刻にシェルを実行するバッチって書けますか?
273名無しさん@お腹いっぱい。:2009/03/01(日) 11:17:51
>>269
普通名詞のバッチ処理はユーザーからの入力待ちは行えない。必要な入力データは
あらかじめ用意しておく処理。対話処理とは対極的なもの。
ユーザーからの入力によって処理を変えたい「バッチ」というならMSDOSのバッチに他ならない。
274名無しさん@お腹いっぱい。:2009/03/01(日) 11:20:52
>>272
指定時刻までの時間を計算してsleepする。
275名無しさん@お腹いっぱい。:2009/03/01(日) 11:27:52
>>274
それはわかってますよ。その具体的なシェルを質問してるんですが。
276名無しさん@お腹いっぱい。:2009/03/01(日) 11:29:40
echo -n 'xx時xx分xx秒までの時間を入力してください '
read t
sleep $t
command
277名無しさん@お腹いっぱい。:2009/03/01(日) 11:32:04
すみませんが、詳しくご存知の方のみ御回答をお願いします
278名無しさん@お腹いっぱい。:2009/03/01(日) 12:34:37
>>277
お前、何様のつもり?
279名無しさん@お腹いっぱい。:2009/03/01(日) 12:42:54
こういうのがはやってるみたいよ
280名無しさん@お腹いっぱい。:2009/03/01(日) 13:14:31
ttp://pc11.2ch.net/test/read.cgi/db/1057136328/188

これってシェルスクリプトで出来るんですか?
281名無しさん@お腹いっぱい。:2009/03/01(日) 16:28:03
>>277 は多分質問者じゃない。
こういう荒らしを楽しんでる奴が最近いる。
282名無しさん@お腹いっぱい。:2009/03/01(日) 18:03:41
そらできるよ
283名無しさん@お腹いっぱい。:2009/03/01(日) 19:27:53
bashとawkって書いてあるじゃん
284名無しさん@お腹いっぱい。:2009/03/01(日) 20:10:39
bashはわかりますが、awkって何ですか? bashのプラグインみたいなものとは思いますが
285名無しさん@お腹いっぱい。:2009/03/01(日) 20:44:21
その認識でおk
286名無しさん@お腹いっぱい。:2009/03/01(日) 21:02:50
工エエェ(´д`)ェエエ工
287名無しさん@お腹いっぱい。:2009/03/01(日) 21:03:02
bashとawkでGUIができるの?
288名無しさん@お腹いっぱい。:2009/03/01(日) 23:21:15
久々に笑った。
まさかbashのプラグインと来るなんてねえ。
289名無しさん@お腹いっぱい。:2009/03/02(月) 09:25:51
>>287
GUI とhttp通信は別コマンドじゃないかな
awkを書いたのはCSVのparseに使ってるからだろうね
290名無しさん@お腹いっぱい。:2009/03/02(月) 15:07:18
すみませんが、まったくの素人の方のみ御回答をお願いします
291名無しさん@お腹いっぱい。:2009/03/03(火) 10:58:08
$ echo abcd def | read a
$ echo $a


echo の結果を read では変数にセットできない?
292名無しさん@お腹いっぱい。:2009/03/03(火) 11:05:13
できるよ。
ただ、| のうしろはサブシェルになるので、
セットしてすぐサブシェルが終了して忘れるだけ。

echo abcd def | { read a; echo $a; }

ksh だとサブシェルにならないので↑のようにしなくてもふつーに動く。
293名無しさん@お腹いっぱい。:2009/03/03(火) 11:43:30
なるほど、ありがと。
大人しくバッククォートで実行の結果使います。
294名無しさん@お腹いっぱい。:2009/03/04(水) 23:31:09
cshのこと聞いてもいいですか?
295名無しさん@お腹いっぱい。:2009/03/05(木) 00:18:50
>>1を読んでて答える人がいればいいんじゃない?
俺はcshは分からんが。
296名無しさん@お腹いっぱい。:2009/03/05(木) 02:03:59
変数の最後入っている改行コードを取り除く方法ってありますか?
Perl の chomp をシェルでやりたいのです。
297名無しさん@お腹いっぱい。:2009/03/05(木) 02:18:18
b="`echo $a`"
298名無しさん@お腹いっぱい。:2009/03/05(木) 02:21:31
b="$(printf "%s" "$a")"すると連続した空白も保存
299名無しさん@お腹いっぱい。:2009/03/05(木) 06:46:31
>>297 だとスペースが保存されないし、* とかの特殊記号が展開される。

b=`echo "$a"`
で桶。
300名無しさん@お腹いっぱい。:2009/03/06(金) 00:52:11
>>295
ではだめもとで。

配列の
array=( "a 1" "b 2" "b 3")
をforで1要素づつ使いたい場合

for d in ${array[@]}
do
echo $d
done

とかできますよね

これをcshでやること可能ですか?
301名無しさん@お腹いっぱい。:2009/03/06(金) 01:36:18
間違えた
for d in "${array[@]}"
do
echo $d
done

こうです。
302名無しさん@お腹いっぱい。:2009/03/06(金) 06:41:00
foreach i ($array)
echo $i
end
だろ。
303名無しさん@お腹いっぱい。:2009/03/06(金) 06:48:04
csh(笑)の質問はこっちでやれ
http://pc11.2ch.net/test/read.cgi/unix/1094041299/

>>302
それだと、要素の中のスペースで分割されてしまうからダメ。
例: "a 1" が a と 1 に別れてしまう。
304名無しさん@お腹いっぱい。:2009/03/06(金) 09:42:48
そんなこと言うならbash()笑の質問もこっちでやれってことになるぞw
http://pc11.2ch.net/test/read.cgi/linux/1210999497/
305名無しさん@お腹いっぱい。:2009/03/06(金) 22:26:43
>>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
306名無しさん@お腹いっぱい。:2009/03/07(土) 00:49:25
set name = value
とかイコール前後にスペース付けられるあたりはcsh悪くないよね

というかスペースを許さないbashの代入がちょっとどうかと思う。
307名無しさん@お腹いっぱい。:2009/03/07(土) 01:10:08
なぜそこでbash
308名無しさん@お腹いっぱい。:2009/03/07(土) 03:17:01
とつぜんbashがきたので・・・
309名無しさん@お腹いっぱい。:2009/03/07(土) 07:01:04
>>306
算術式ならbashでもスペースを入れられるよ。

((i = 123))
echo $i
310名無しさん@お腹いっぱい。:2009/03/08(日) 04:05:42
(())ってなんなの?
311名無しさん@お腹いっぱい。:2009/03/08(日) 05:48:05
ま○こ
312名無しさん@お腹いっぱい。:2009/03/09(月) 19:53:57
ま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となってしまう
シェルもあって、困っています。
314名無しさん@お腹いっぱい。:2009/03/10(火) 08:24:35
>>313
一般的には、代入する値のスペースや記号の解釈を避けるには、

eval $A=?''代入する値'?'

と書いておけば桶。evalを含めた2回の解釈を回避するために、
シングルクォートを2回ネスティングする。
$Aの方は、中身は単純な変数名が入っているため、
裸の $A のままクォートしなくても桶。

Solarisのshで動くならそれが標準と考えて良い。
これで動かないようなシェルは捨てるべき。
315名無しさん@お腹いっぱい。:2009/03/10(火) 08:27:12
>>313
わ、なぜかこの環境から書き込むと、
半角の\が?に化ける。(なんで?)
>>313 の?はバックスラッシュに読み変えてね。
316名無しさん@お腹いっぱい。:2009/03/10(火) 08:59:21
>>313
具体的にどのシェルか言えよ
そのときだけ"$A"にスペースが入ってんじゃないの?
317名無しさん@お腹いっぱい。:2009/03/10(火) 18:05:12
シェルスクリプトってOOじゃないんでしょ?
ダサっ
318名無しさん@お腹いっぱい。:2009/03/10(火) 18:37:45
>>313
困っています、じゃあ独り言にしかなってないぞ。
動かない場合の代わりの方法が欲しいのか、
ネタを流してるのかハッキリしろ。
319名無しさん@お腹いっぱい。:2009/03/10(火) 20:10:54
last(1)を去年の11月から今日まで出したいのですがどうすれば
いいでしょうか。
320名無しさん@お腹いっぱい。:2009/03/10(火) 20:30:06
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です。
322名無しさん@お腹いっぱい。:2009/03/11(水) 06:29:23
>>321
エラーになってあたりまえだ。

IFS="=" にすれば、コマンド上では = が消えてしまう。
XX=YY は、実際には XX YY という風に実行され、エラーになる。

これは、「シェル変数の値を変数名とするシェル変数を定義して代入」
以前の問題。

「シェル変数の値を変数名とするシェル変数を定義して代入」の問題なら、
>>314-315 の回答で合ってる。

あと、bash-3.2.25かどうかは関係ないと思うぞ。
エラーが出るなら他のシェルでもエラーになるはず。
323名無しさん@お腹いっぱい。:2009/03/11(水) 09:45:54
Windows PowerShellはOOなのに
シェルスクリプトはOOじゃないんだよね
時代遅れだね
324名無しさん@お腹いっぱい。:2009/03/12(木) 07:21:25
>>323
PowerShell は最近生まれたものなんだから当然だろ。
比較するなら PowerShell と同時期に生まれたシェルと比較しろ。
325名無しさん@お腹いっぱい。:2009/03/14(土) 01:53:46
jpgファイルのサイズを知りたいんですが、調べられますか?
326名無しさん@お腹いっぱい。:2009/03/14(土) 02:09:29
はい
327名無しさん@お腹いっぱい。:2009/03/14(土) 02:14:51
>>324
彼はLinux板のシェルスクリプトのところでも同じことを書いてたから。
328名無しさん@お腹いっぱい。:2009/03/14(土) 02:20:53
>>325
imagemagickのidentifyコマンド
329名無しさん@お腹いっぱい。:2009/03/14(土) 12:03:01
ls -lとかじゃないのか。
330名無しさん@お腹いっぱい。:2009/03/14(土) 12:32:29
echo "jpgファイル" | wc -c
331名無しさん@お腹いっぱい。:2009/03/14(土) 23:02:45
>>328
ありがとうございます。できました。

>>329
>>330
すいません。サイズという表現微妙でした。
解像度?1280x1024とかの値の話でした。
332名無しさん@お腹いっぱい。:2009/03/17(火) 22:56:18
かなりてきとーだけど。

while read l; do
for w in $l; do
type $w > /dev/null 2>&1 && echo $w
done
done < (ファイル) | sort | uniq
333名無しさん@お腹いっぱい。:2009/03/18(水) 19:31:29
>>325 >>331 X環境ならば
xfceのthunarだと画像ファイルを選ぶとステータスバーにサイズを表示する。
あとImageMagickいれるならば関連付けでdisplayにすれば良い
あとはperlなりcなりでperlmagickなりmagickwandなりでやりたい放題。

但しexifはdisplayでは対応しているけれどImageMagickのライブラリーは対応していないので
libexifとかexiftool入れると良いと思う
334名無しさん@お腹いっぱい。:2009/03/18(水) 19:32:16
>>333 つまりこのスレ的にはexiftoolの返しをいかに削るかということだと思う
335328:2009/03/18(水) 20:35:04
つ identify -verbose
336名無しさん@お腹いっぱい。:2009/03/19(木) 01:52:23
削るとかよりも素直に
WIDTH=`identify -format '%w' image.jpg`
HEIGHT=`identify -format '%h' image.ipg`
じゃない?
337名無しさん@お腹いっぱい。:2009/03/21(土) 00:05:33
>>336 元質問者の調べる楽しみを奪っちゃダメだよ。 >>335くらいでとどめておくのが良い
exifに手を出せばいろいろおもしろいんだから、すぐにmanとかで分かるし。
ijgのおまけの返しから削る手だってある。
ノーヒントならともかく「わかった」という喜びを与えてあげよう
それにshell script的には削って置換した方がおもろい。
選択肢が多く汎用性のあるものはいかにおもろいかが重要。
338名無しさん@お腹いっぱい。:2009/03/22(日) 04:07:52
shcでできたCソースからshに戻すというのは楽しいですか?
339名無しさん@お腹いっぱい。:2009/03/22(日) 08:11:40
>>338
俺がお前に聞きたいわ。
340名無しさん@お腹いっぱい。:2009/03/22(日) 23:38:38
shcってechoはsystem("echo");とかに変えるんだろうか?
341名無しさん@お腹いっぱい。:2009/03/25(水) 18:48:49
過去ログ見終わって今来た。ふぅ。

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
みたいなことになってるけど、重複した同じパスの解消ってスクリプトで出来る?
なんだか検索で遅くなりそうだが、気にしないが現実的?
342名無しさん@お腹いっぱい。:2009/03/25(水) 21:04:54
cshなんて使わないのが現実的
.cshrcでは setenvしない(setenvは .loginでする)のが現実的
setenvする場合でも、以前の値が蓄積するような書き方はしないのが現実的

cshの話題は
http://pc12.2ch.net/test/read.cgi/unix/1094041299/
に書くのが現実的
343名無しさん@お腹いっぱい。:2009/03/26(木) 00:23:22
csh って何回も打つからそうなるんじゃない?
それならshでも同じことでしょ

存在しないコマンド打った場合はエラーが帰るのが多少遅くなりそうだけど・・

気持ち悪ければ、「;」を改行に変えて、sort -u して「;」戻して新たにPATHに突っ込めばよいのかもしれんけどそうすると元の順番と変わるなぁ
344名無しさん@お腹いっぱい。:2009/03/26(木) 07:27:35
>>343
>それならshでも同じことでしょ

なんでやねん。アフォかw

shの .profile は「ログインシェル」しか読まない。
shって何回も打っても二重登録されない。
345名無しさん@お腹いっぱい。:2009/03/26(木) 07:41:07
いや.shrcならさ
346名無しさん@お腹いっぱい。:2009/03/26(木) 07:51:23
>>345
はぁ? .shrc なんてファイル何者?

少なくとも/bin/shはそんなファイルを読まない。
ash bash zsh ksh も .shrcなんてファイル読まないぞw
347名無しさん@お腹いっぱい。:2009/03/26(木) 08:00:36
cshには .login ってファイルなかったっけ
348名無しさん@お腹いっぱい。:2009/03/26(木) 08:04:57
>>347
>>342 が回答済み
349名無しさん@お腹いっぱい。:2009/03/26(木) 14:58:19
>>341
普通に使ってたら、そんなことは起きない。
350名無しさん@お腹いっぱい。:2009/03/26(木) 23:52:39
.shrcってないんだ・・
bashしか使わんから.bashrcみたいにあると思い込んでいたよ
351名無しさん@お腹いっぱい。:2009/03/27(金) 01:18:27
マニュアル読まない奴は多いんだね
352名無しさん@お腹いっぱい。:2009/03/27(金) 01:36:44
試してみない奴はもっと多い
353名無しさん@お腹いっぱい。:2009/03/27(金) 12:34:12
初心者質問すいません。
スクリプトの中で変数が空かどうか調べるにはどう書けばよいでしょうか?
ご教示頂きたくm()m
354名無しさん@お腹いっぱい。:2009/03/27(金) 12:44:24
>>353
変数名 HOGE が空かどうかを調べる

(1)空文字列は空とはみなさない場合:

echo ${HOGE-'空だよ'}

---
(2)空文字列がセットされていても空とみなしたい場合:

echo ${HOGE:-'空だよ'}
355名無しさん@お腹いっぱい。:2009/03/27(金) 12:48:45
>>353
)空文字列も空と見做していいなら、

if [ -z "$HOGE" ]; then
: 空の場合の処理
fi
356353:2009/03/27(金) 12:51:54
ありがとうございます!m(_ _)m
357名無しさん@お腹いっぱい。:2009/03/27(金) 12:52:39
>>353
空文字列は空ではないと考えるなら、

if [ "${HOGE+a}" ]; then
: 空の場合の処理
fi
358名無しさん@お腹いっぱい。:2009/03/27(金) 12:56:12
>>357
条件逆になってるよw

if [ -z "${HOGE+a}" ]; then
: 空の場合の処理
fi
359353:2009/03/27(金) 15:36:18
ありがとうございます。
すいませんもう一個疑問が出来ました。
$1のような特殊変数には値の代入はできないのでしょうか??
360名無しさん@お腹いっぱい。:2009/03/27(金) 15:38:12
つ set -- value1
361名無しさん@お腹いっぱい。:2009/03/27(金) 15:52:22
>>359
× 特殊変数
○ 位置パラメータ

代入方法 ( $1 に HOGEを代入したいなら)
set -- HOGE
ただし、$2以降のすべての位置パラメータがリセットされる

他に、「特殊パラメータ」($0 $@ $# $? など)もあって、
特殊パラメータには値は代入できない。
362名無しさん@お腹いっぱい。:2009/03/27(金) 17:23:22
>>357
「空文字列は空ではない」ってどういう意味??

HOGE+aってそんな変数できるの? 変数に足し算?
HOGE+bとかやるとなにか違い出るの?

全然わかりません><
363名無しさん@お腹いっぱい。:2009/03/27(金) 17:28:37
unsetな状態を「空」って言うのか?
364名無しさん@お腹いっぱい。:2009/03/27(金) 19:24:58
変数が無い
変数設定されてるが空。
変数に値が設定されている。
365名無しさん@お腹いっぱい。:2009/03/27(金) 23:44:09
>>364
で、質問は何?
変数が必要なら設定すれば?
366名無しさん@お腹いっぱい。:2009/04/01(水) 09:36:21
>>363
はいって何?
出来るの?
さっきから何度も。
はいって言葉の重みわかってる?
いま出来ますって断言したんだよ君。
その責任の重さわかってんの?
社会に出たらもっと自分の言葉に責任持てよ。
ん?
社会人の一言一言に掛かる責任の重さが分かってないだろ全然。
学生気分でやってんだったら帰ってもらうよ。
とにかく明日からもう来なくていいから。
367名無しさん@お腹いっぱい。:2009/04/01(水) 12:44:33
説教の誤爆はいつ見ても滑稽だな。
368名無しさん@お腹いっぱい。:2009/04/01(水) 14:58:19
誤爆つーかコピペ
369名無しさん@お腹いっぱい。:2009/04/01(水) 15:53:48
今日から新人来るからな。
今までの下っ端が下っ端を抜け出せるかの試練の日。
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です。
対話式とは権限周りが違うのでしょうか?
371名無しさん@お腹いっぱい。:2009/04/01(水) 16:29:25
>>370
cronを使わずに、そのシェルスクリプトを一般ユーザーで実行して正常動作するなら、
NFSでrootの権限がない問題と思われる。
シェルスクリプトのパーミッションを755とかにすれば?
372名無しさん@お腹いっぱい。:2009/04/01(水) 16:44:03
よくNFSだってわかったな。
373名無しさん@お腹いっぱい。:2009/04/01(水) 16:56:37
put ファイル名 でエラーしたんじゃないの?
374名無しさん@お腹いっぱい。:2009/04/01(水) 17:02:47
>>373
それだったらメッセージが違う。ftpdからのメッセージになるから、
5XX cannot write hoge とか。
375370:2009/04/01(水) 17:06:33
一般ユーザーディレクトリにbackup.shを移し、一般ユーザー権限で
/bin/sh /home/ユーザーdir/適当なフォルダ/backup.sh

を実行しましたが、変わらずです。
backup.shのパーミッションは0755。

CRONでもコマンドライン上でも、シェルスクリプト経由でFTPを通すとエラーが出るようです。
一般ユーザー権限でも、対話式なら問題ありません。

376名無しさん@お腹いっぱい。:2009/04/01(水) 17:12:24
CRONとか大文字で書いてるし、どうせ釣りだ
377名無しさん@お腹いっぱい。:2009/04/01(水) 17:17:53
>>375
一般ユーザーで、

$ /bin/sh -x /home/ユーザーdir/適当なフォルダ/backup.sh

を実行した結果を省略せずに貼ると何かわかるかも。
378名無しさん@お腹いっぱい。:2009/04/01(水) 17:34:55
>>377
そんなこと言って、「省略せずに貼」ったとたん、黙り込むんだよなぁ。
または、他の人が正解を回答して、結局、貼った内容は全く関係なかったり
するんだよなぁ。
379名無しさん@お腹いっぱい。:2009/04/01(水) 17:38:59
>>370
その backup.sh の中の ftp -n を、ftp -nv に変えてメッセージを検証して。
380名無しさん@お腹いっぱい。:2009/04/01(水) 17:39:14
>>374
試してみた?>>370 のようなエラーがでたよ
(Solaris8)
381名無しさん@お腹いっぱい。:2009/04/01(水) 17:49:58
>>378
まぁあくまで「わかるかも」だからな。
382370:2009/04/01(水) 18:17:08
遅くなりましたが解決しました。
原因はシェルスクリプト自体の権限が、FTPで接続するユーザート違かったからだと思います。

SSHでログインしているサーバーのユーザーは「root」の他に「admin」「information」などのユーザー名を使用していたのですが、FTPで接続する先のユーザーは全く違う名前でした。
なので、FTPのユーザー名と同じユーザーを作成し、そのユーザー権限でシェルスクリプトを実行したら、無事成功しました。

けど、FTPのユーザー名と、実行するユーザー名が異なると権限のエラーがでるのですね。 不思議です。

皆様ありがとうございました。
383名無しさん@お腹いっぱい。:2009/04/01(水) 18:24:36
そんなはずないと思うんだがなぁ。
384名無しさん@お腹いっぱい。:2009/04/01(水) 18:25:24
Cygwin(bash)を使っています。

for文の中で文字列の代入をさせようとするとエラーが返されます

#!/bin/sh

for i in *
do
  $output = $i
  (・・処理・・)
done

どうしたらfor文の中で文字列の代入をさせることができるでしょうか?
385名無しさん@お腹いっぱい。:2009/04/01(水) 18:26:18
for の外なら

$output = $i

はできてるのか?
386名無しさん@お腹いっぱい。:2009/04/01(水) 18:36:15
>>385
for文の外でも

=: command not found

と言われてエラーを返されました(´・ω・`)
387名無しさん@お腹いっぱい。:2009/04/01(水) 18:38:48
えっと、この空気的には
output=$i
ってマジレスしちゃダメなんだろなぁ
388名無しさん@お腹いっぱい。:2009/04/01(水) 18:39:51
>>386
他の言語の常識持ち込まずに
ちゃんと構文調べてから書いた方がいいよ。

>>387
別にいいんじゃね。
389名無しさん@お腹いっぱい。:2009/04/01(水) 18:46:55
>>387
それでも

output: command not found

とエラーが返されましたorz・・・
390名無しさん@お腹いっぱい。:2009/04/01(水) 18:49:06
cshユーザーに隙はなかった
391名無しさん@お腹いっぱい。:2009/04/01(水) 18:49:20
>>389
>>387をそのまま書く。
空白入れちゃだめ。
392名無しさん@お腹いっぱい。:2009/04/01(水) 18:59:18
>>391
できました。ありがとうございました(;´∀`)
393名無しさん@お腹いっぱい。:2009/04/01(水) 21:22:43
本日の祭り会場はこちら

【ネット】朝日新聞編集局員(49)、2ちゃんで荒らし行為&差別を助長する書き込み→朝日新聞からの書き込み規制され…★64
http://tsushima.2ch.net/test/read.cgi/newsplus/1238588235/


※ソース(3月31日付けasahi.com)
http://www.asahi.com/national/update/0331/TKY200903310332.html
394名無しさん@お腹いっぱい。:2009/04/02(木) 02:25:42
どこかの鯖のシェルスクリプト見るとパスワード書いてあったりするのかwww
なんだかなあ。
395名無しさん@お腹いっぱい。:2009/04/02(木) 08:47:42
findでひっかけたファイル一覧をforで回したいんですけど、引っかけたファイルにスペースが入っている場合、単語単位でforで回ってしまいます。
この場合って、事前にIFSをイジるしか解決策は無いのでしょうか?
findの-print0とかして、forのデリミタをNULLにしたりとかは出来ないのでしょうか?
396名無しさん@お腹いっぱい。:2009/04/02(木) 08:51:34
>>395
find . -exec sh -c 'for arg in "$@"; do echo "$arg"; done' dummy {} +
397名無しさん@お腹いっぱい。:2009/04/02(木) 09:09:17
>>396
ありがとうございます。
出来ました。
ただ何をやっているのか、理解していないと思われる部分があるので質問させて下さい。

dummyは何をやってるのでしょうか?
僕の理解としては、shの引数としてfindの1結果を渡しているんだと思うんですけど、shにとっての第1引数はdummyなので、
dummy ファイル名
が$@に入ってると思います。
ただ、
$ sh -c 'echo "$@"' arg1 arg2
とすると、arg22がechoされるので、dummyが必要なのは現象からわかるのですが、理由がわかりません。

それと、最後の+はどういう意味でしょう。findのmanでは\;で-execは終われと書いてあるように読めるのですが。

以上、すいませんが、解説お願い出来たらお願いします。
398名無しさん@お腹いっぱい。:2009/04/02(木) 10:55:42
どっちもマニュアル嫁だな

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.
399名無しさん@お腹いっぱい。:2009/04/02(木) 11:33:43
forで回したいという要求に合ってない気がするが
空気読んで黙っておくよ
400名無しさん@お腹いっぱい。:2009/04/02(木) 11:47:12
ファイル名にシングルクォートが含まれていないと仮定するなら、

for files in `find . -printf "'%p' "`
do
echo "$files"
done


findに、「シェルで再利用可能なクォートを施した状態でprint」という
機能がない以上、完全な対応は無理。なので、>>396 のように sh -c を -exec する
方法しかない。
401366:2009/04/04(土) 15:56:31 BE:526035762-2BP(0)
お礼遅れてすいません!ありがとうございましたm(_ _)m
402名無しさん@お腹いっぱい。:2009/04/06(月) 02:09:11
LANGが日本語じゃなくてもshだと日本語が表示されるのと、
LANGが日本語じゃないとcshでは表示されない理由を教えてださい

[root@yama ~]# csh -c "setenv LANG C ; echo '日本語'"

[root@yama ~]# sh -c "export LANG=C ; echo '日本語'"
日本語
[root@yama ~]#
403名無しさん@お腹いっぱい。:2009/04/06(月) 02:24:30
% csh -c "setenv LANG C ; echo $LANG"
% sh -c "export LANG=C ; echo $LANG"
404名無しさん@お腹いっぱい。:2009/04/06(月) 07:46:03
>>403 は何がしたいんだ?
>>403 は $LANGがコマンドラインのシェルによって先に展開されてしまうから
shやcsh上での動作をテストしたことにはならない。

>>402 が聞いているのは >>403 とは全く別の問題。

だが、cshはスレ違いなので、これで終了。

ハイ次

405名無しさん@お腹いっぱい。:2009/04/06(月) 08:43:19
↑うぜえよおっさん
406名無しさん@お腹いっぱい。:2009/04/06(月) 17:45:12
solaris10を使用しています。
・やりたいこと
# zlogin <対象ノード>
$ df -h
$ exit
※ログインパスは無し
対象ノードへログインし、ディスク構成をとってきたい。
シェルスクリプト中でのログイン処理はどのように書いたらいいですか?
407名無しさん@お腹いっぱい。:2009/04/06(月) 17:47:46
>>406
ふつうに、
# zlogin 対象ノード df -h
でいいじゃん。
408名無しさん@お腹いっぱい。:2009/04/06(月) 18:22:46
>>407
!!!!
出来ました。ありがとうございました。
てっきりヒアドキュメントやらを駆使するのかと....
409名無しさん@お腹いっぱい。:2009/04/09(木) 20:07:15
シェルの特別パラメータMAILに、/var/mail/ユーザー名、をセットして
printenvもしましたが、メールを出して何分経ってもメッセージが出ません。
他に何か設定がいるのでしょうか?
410名無しさん@お腹いっぱい。:2009/04/09(木) 20:41:57
おまえはなにをいっているんだ
411名無しさん@お腹いっぱい。:2009/04/09(木) 21:27:47
済みませんが詳しくご存知の方のみ回答をお願いします
412名無しさん@お腹いっぱい。:2009/04/09(木) 22:03:08
ちんこかゆい
413名無しさん@お腹いっぱい。:2009/04/09(木) 23:21:26
>>409
質問の仕方が悪すぎるので出直してください。
414名無しさん@お腹いっぱい。:2009/04/10(金) 01:43:53
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がエラーだったときの処理
#...
416名無しさん@お腹いっぱい。:2009/04/10(金) 02:54:40
bashを使っていいんなら、配列を使えばどう?
・0から始まるインデックス変数を用意
・iccに渡したい引数なら、arg[インデックス]="$i"
・最後に、icc "${arg[@]}"
417名無しさん@お腹いっぱい。:2009/04/10(金) 04:06:51
>>416
早速書き換えてみた。スゲー!
長い間悩まされてたMySQLやapacheなどの大物がまたビルドできるようになったよ。ありがとう。
418名無しさん@お腹いっぱい。:2009/04/10(金) 06:45:45
>>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 での解決方法書いておくね。

どうでもいいです。
さらに、間違っているし。 

酢布?
420名無しさん@お腹いっぱい。:2009/04/10(金) 08:08:07
>>418 = 正解

>>419 が 「>>418 = 正解」を見て、
何を「間違っている」と勘違いしたかに興味あるな。

$# 引数の個数を覚えておいて、
同じ "$@" を干渉しないように使い回して
あとで shift する、って結構高度な技が使われてるよ。

高度過ぎて >>419 には「間違ってる」ように見えたかな(笑)
421名無しさん@お腹いっぱい。:2009/04/10(金) 08:23:55
>>420
>高度過ぎて >>419 には「間違ってる」ように見えたかな(笑)



うざいなぁ
418 = 420なの? 顔真っ赤なんだよねw

>exec gcc "$@"

すごく低度な感じ。だれも、そんなこと聞いてない。

まずは、謝ってくれ
422名無しさん@お腹いっぱい。:2009/04/10(金) 08:33:41
>>421
まさかそんなところに突っ込んだの?( )笑

icc に変えればいいだけじゃん。
多分 >>418 の環境には iccがないから、テスト的に gcc でテストしただけだろ。

本当は >>419 は本気で >>418 がどこか間違ってると勘違いしてて、
>>420 で指摘されてとっさに苦し紛れに 「exec gcc "$@"」とか言い訳したんだろな(笑)
423名無しさん@お腹いっぱい。:2009/04/10(金) 08:35:37
<丶`∀´>ウリは謝罪と賠償を要求ニダ
424名無しさん@お腹いっぱい。:2009/04/10(金) 08:37:53
>>419
for i in "$@" の ループ中に $@ をいじってるのを見て
反射的に間違っていると思った、に一票

(for の引数はループ前にしか評価されないから問題なし)

多分図星。
425名無しさん@お腹いっぱい。:2009/04/10(金) 08:46:38
指摘するときにMD5を添えなかった>>419の負け
426名無しさん@お腹いっぱい。:2009/04/10(金) 09:05:40
酢布って何?
427名無しさん@お腹いっぱい。:2009/04/10(金) 10:01:16
シェルスクリプトの画面出力と併行して実行ログを残したいんですが
どんなスクリプトの記述がありますか?
teeやscriptを入れると実行が止まってしまう
428名無しさん@お腹いっぱい。:2009/04/10(金) 10:18:00
全体を
{
} 2>&1 | tee hoge.log
とか
(
) 2>&1 | tee hoge.log
とかで囲ったら止まるの?
429名無しさん@お腹いっぱい。:2009/04/10(金) 10:44:26
screen
430名無しさん@お腹いっぱい。:2009/04/10(金) 11:19:24
もちろん、>>428 でも screenでも実行が止まってしまいます
431名無しさん@お腹いっぱい。:2009/04/10(金) 11:20:12
エスパーでも呼べ
432名無しさん@お腹いっぱい。:2009/04/10(金) 11:26:21
画面出力を保存すればいいよ
433名無しさん@お腹いっぱい。:2009/04/10(金) 11:53:51
デジカメで
434名無しさん@お腹いっぱい。:2009/04/11(土) 00:25:58
DVとかHDMIで出力して録画でもいいと思う。
435名無しさん@お腹いっぱい。:2009/04/11(土) 00:39:58
シリアルターミナルにしてシリアルプリンタ直結もいい
436名無しさん@お腹いっぱい。:2009/04/11(土) 00:42:02
そもそもttyというのは(ry
437名無しさん@お腹いっぱい。:2009/04/11(土) 14:04:29
やっぱりダム端末だなwww
438名無しさん@お腹いっぱい。:2009/04/11(土) 22:45:58
viで全角文字を入力することはできますか?
439名無しさん@お腹いっぱい。:2009/04/11(土) 23:09:26
>>438
もちろん、できません。というか、半角文字であってもできません。シェルスクリプトでは。
440名無しさん@お腹いっぱい。:2009/04/12(日) 02:07:24
全角文字がそもそもキーボードから入力できない現実。
441名無しさん@お腹いっぱい。:2009/04/12(日) 03:29:13
>>422
>>421
>まさかそんなところに突っ込んだの?( )笑

全く話にならないねw
はらいてー ぷけら
442名無しさん@お腹いっぱい。:2009/04/12(日) 03:30:32
>>422
もう、書き込まないで一生ろむってろっっwww

趣旨があってねーYO。ぷぷぷ
443名無しさん@お腹いっぱい。:2009/04/12(日) 09:21:49
自分の発する笑い声をあえて手を動かして文字にするところにその人の必死さが滲み出るよね
444名無しさん@お腹いっぱい。:2009/04/12(日) 11:28:35
数スレ前だったと思うが、ズレた指摘をする人がいたのを思い出した。
たしか、
for file in *
do
ある処理 "$file"
done

みたいな感じで、「ある処理」の部分を質問していた。
で、質問自体は解決していた。
解決後に、「それじゃダメ」みたいなことをいう人がいて、
何レスか続いたあと、結局「* じゃドットファイルが処理されない」ことを
言いたかったらしい。でも、質問者はforループ内の「ある処理」の部分について
質問したかっただけで、forの部分は質問のために参考に書いただけ
(実際のスクリプトではおそらく違うのだろう)

今回荒してる >>419 = >> 441 と同じ匂いがする。
445名無しさん@お腹いっぱい。:2009/04/12(日) 11:36:34
頭の病気だからスルーしる
446名無しさん@お腹いっぱい。:2009/04/12(日) 17:03:02
PGはそんなものだよ。細かい所が取り柄。女にはモテないけど。orz
447名無しさん@お腹いっぱい。:2009/04/12(日) 17:57:53
ドットファイルっていうのは、隠しファイル的な意味があって * に含まれないことが
利点なのだから、特別な処理をするわけでもない一般的なスクリプト中では
単純に * と書くことが良い。







などと、さらにズレてて無意味なレスをしてみる。
448名無しさん@お腹いっぱい。:2009/04/14(火) 00:22:50
女にモテるためには細かい事気にしないのも大事。
449名無しさん@お腹いっぱい。:2009/04/14(火) 13:21:52
女にモテるためには細かい事に気を配るのも大事
450名無しさん@お腹いっぱい。:2009/04/14(火) 14:44:57
C言語マスターすればモテモテ
451名無しさん@お腹いっぱい。:2009/04/14(火) 15:53:16
それはない
452名無しさん@お腹いっぱい。:2009/04/14(火) 22:14:33
女にモテるためには細い方がイイ
453名無しさん@お腹いっぱい。:2009/04/15(水) 00:32:23
はじめてのCぐらいは読んでヤリかたをマスターしておくのがマナー。
ガリが嫌いな女も居るぉ。
454名無しさん@お腹いっぱい。:2009/04/15(水) 09:41:51
お願いです先達の皆様

ファイルの作成日付を取得する方法を教えてください。
sh使ってます。
455名無しさん@お腹いっぱい。:2009/04/15(水) 09:50:55
↓これだけしか記録されていないので不可能。

st_atime: ファイルのデータが最後にアクセスされた時刻。
st_mtime: ファイルのデータが最後に修正された時刻。
st_ctime: ファイルステータスが最後に変更された時刻 (inode データの修正)。
456名無しさん@お腹いっぱい。:2009/04/15(水) 10:55:13
じゃあ最終更新日付でいいので、取得出来るコマンドはありますか?
457名無しさん@お腹いっぱい。:2009/04/15(水) 10:58:12
>>454
ctimeは「ファイルの作成日付」だと広く混同されているので、
「ファイルの作成日付を取得してくれ」と要求した人が
本当は「ctimeを取得してくれ」という意味で言ったのなら、
ctimeを取得すれば桶。
だから ls -lc (ls -lc --fu # for GNU) (ls -lcT # for *BSD)( ls -lce for solaris)
458名無しさん@お腹いっぱい。:2009/04/15(水) 11:15:50
いけました。

lsだとフォーマットが一定しないのでlsでやりたく無かったんですが(年が入ったり入らなかったりする)、
ls -lc 等だとその問題もないみたいです。
ありがとうございました。
459名無しさん@お腹いっぱい。:2009/04/15(水) 11:22:41
tcsh -fc 'filetest -C filename'
↑この方が環境依存性は小さくなる。
460名無しさん@お腹いっぱい。:2009/04/15(水) 11:37:32
tcshよりperlの方が入ってる可能性高いんじゃね?
461名無しさん@お腹いっぱい。:2009/04/16(木) 20:01:06
tcshは入ってないほうが多いだろうな。
perl入れてるなら何でも入れてもいいと思う。
462名無しさん@お腹いっぱい。:2009/04/18(土) 04:32:11
UNIXシェル入門を読んでいるけど、汎用的に書くって想像したよりかなり大変なんだね
CUIで困らない程度に使えるレベルなんだけど、どういう順序でshスクリプトを学習するのがいいのでしょうか?
1 普段、使っているbashの仕様を理解する。例題をヒントにいくつか、書いてみる。
2 ちょっとした自動化できる作業は、意識的にshスクリプトを書いて、どんどん試してみる
3 別のOSを用意し、どちらの環境でも汎用的に使えるスクリプトを書く。普段、良く使うプログラムのいろいろな設定ファイルも極力同一のものにしてみる
4
5

3以降の先は、まったく想像つかないんだけど
463名無しさん@お腹いっぱい。:2009/04/18(土) 05:36:49
bash捨ててdashで書く…
bashにもBash POSIX Modeってのがあるか。
コマンド類はまぁ気合で。
#busyboxあたりにposix互換モードがあると便利なのになぁ。
464名無しさん@お腹いっぱい。:2009/04/18(土) 10:07:33
>>462
shとbashの違い以前に、どこまで古いバージョンに対応するかという問題
もあるし、完全に汎用なシェルスクリプトを追求して、時間コストや労力
に見合う結果を得られるのだろうか。

結局、対応したいOSやバージョン、そこから限定されるシェルの種類とバ
ージョンを設定して、その範囲で動作するものを作るしかないし、動作確
認はその限定された環境で行えばよいのではないだろうか。

仕事なのか趣味なのかによっても違うだろうし。
465名無しさん@お腹いっぱい。:2009/04/18(土) 10:44:46
>>463
bashのPOSIX Modeでbashismは防げない。
でも、dashもPOSIX互換を標榜しつつ、細かいところで
POSIXの機能がなかったりする。
困ったね。
466名無しさん@お腹いっぱい。:2009/04/18(土) 11:09:11
そもそもposixに対応することと「汎用的に書く」ことは全然別の話。
Solarisの/bin/shのように、posix非対応のシェルが標準シェルになってるし、
posix準拠を基準にしてしまうと、「汎用的」ではなくなってしまう。
だから、posixは忘れるのが吉。
467名無しさん@お腹いっぱい。:2009/04/18(土) 12:03:03
>>466
手間がかかるけど、posix規格(または、何かの規格)を意識して書く事は、いいことでしょ?
個人的には方向性も大きく違っていないと思っているんだけど
もちろん、どうしても例外的な事例が発生して、それをどうするんだというのは、あるんだろうけど
Solarisは目の前に現れたら考える

とりあえず、総合すると自分がよく使うOSに対応して、ある要請があったら、そのOSの対応を考えて、
随時対処していく感じが労力と時間を考慮すると現実的になんですかね

100行程度の高機能ではない簡易スクリプトをとりあえず自分の狭い世界観で汎用的に
書くことを想定としています

shスクリプトを学習したい理由は、
・shの機能を通じて、UNIXを理解したいこと
・頻出する作業は自動化して労力を軽減したいこと
 例え、コーディングのほうが結果的には労力かかったとしても
 自分はまだ学習レベルなので労力が結果的にトントンなら大成功
汎用的に書きたい理由は、
・本でそう奨励しているから(?)w
・「汎用的に」書くって響きがかっこいいじゃん
・プログラマなら、ケースバイケースで汎用的書けないと恥ずかしいでしょ
・まあ、多少なりとも汎用性を意識して書くことは、悪いことにはならないよな

馬鹿ってかっこいいなあw
468名無しさん@お腹いっぱい。:2009/04/18(土) 12:41:57
前の案件で1000行くらいのbashのバッチ10本くらい作ったら
後任者が全く理解できずに大惨事になってると風の噂で聞いたので反省している
文字のエンコードするのにiconv何発もかましたうえに\\\\\\\\とかやってるからなぁ
469名無しさん@お腹いっぱい。:2009/04/18(土) 12:47:53
>>468
やっつけ仕事ではなく、ちゃんと他人が読むためのわかりやすいコードを書いたんでしょ?
もちろん、ポイントポイントでコメントでの解説付きで
470名無しさん@お腹いっぱい。:2009/04/18(土) 12:51:34
反省する必要ないよ。後任者が理解できないことで
前任者のすごさをアピールできる。

もちろん、コメントなど書いてはいけない。
471名無しさん@お腹いっぱい。:2009/04/18(土) 12:59:24
Cでそれやったら無能かつ自分勝手な前任者ってことになるんだから、
bashだって同じだろ
472名無しさん@お腹いっぱい。:2009/04/18(土) 13:22:58
3年前に己が書いた1000行くらいのbashのバッチがあったとして
一部修正することになって、ソースを読み込むことになったら、どのくらいの時間で
読めるものだろうか
また、他人が一部修正を任されることになって、読み込むことになって、どのくらいの時間で
読めるものだろうか
473名無しさん@お腹いっぱい。:2009/04/18(土) 13:23:06
>>469
コメントどころか基本設計詳細設計まである
要は複雑なshellの経験者って簡単に集められないから
なんでもshellでやるのもよくないねみたいな
474名無しさん@お腹いっぱい。:2009/04/18(土) 13:36:10
うそーん
475名無しさん@お腹いっぱい。:2009/04/18(土) 13:40:18
自分には解って他人には解りにくいコードをわざと用いること。
コメントもドキュメントも残さないこと。

リストラ時代の保身テクニックですな。
476名無しさん@お腹いっぱい。:2009/04/18(土) 13:52:46
>>473
そこまでやっているなら、問題ないと思うけどなあ
bashのバッチで書かずに何でやるのよ?
学習するチャンスだし、峠を越えたら、あとあと楽になりそうなんだが
今ならPython?

その反省を踏まえて、1から再設計するなら、どういう比率でどの言語でやるんですか?
477名無しさん@お腹いっぱい。:2009/04/18(土) 13:54:18
>>475
それで褒められるのはdjbみたいな教祖様だけだろ。
まあ、djb信者以外は誰も褒めないけどさ。
478名無しさん@お腹いっぱい。:2009/04/18(土) 14:07:00
>>476
シェルスクリプトなんて(大幅に譲歩して)100行を越えたら
別のスクリプト言語で書き直すべきだと思う。
それこそ、PythonでもRubyでも良いからさ。
479名無しさん@お腹いっぱい。:2009/04/18(土) 14:09:06
GNUのconfigureに言ってくれ
480名無しさん@お腹いっぱい。:2009/04/18(土) 14:54:27
>>478
わかる気もするけど
Pythonをちょっとやったけど、クラス化、パッケージ化とか、ちゃんと理解していないんだよなあ
比較的に若い言語というのもあって、他の言語の良いところを取り入れて、すごく書きやすいし、保守しやすいしでいいんだけど、
Pythonで使える概念を全部使って書かれたものを、設計を理解して、他人が保守するとなると大変そうだよね

LL言語でもPerl派、Ruby派、Python派といるだろうし
使用する言語を感情論では決めるべきではないけど
Python派「Rubyを使うなら、コメントどころか基本設計詳細設計まであるbashのバッチでいいじゃん」という意見もあるだろうし
>>473の選択でよかったんじゃないかと思う

もちろん、LL言語でいくのもありだと思うし、後任者の労力的には大差ないと思うけどさ
481名無しさん@お腹いっぱい。:2009/04/18(土) 14:58:54
シェルスクリプトで書いてあって理解できないなら他のでも無理だとおもうヨ
482名無しさん@お腹いっぱい。:2009/04/18(土) 23:05:09
単純な機能ごとに処理を区切って関数化し、相応の名前を付けて書けば
どんな言語だろうと大枠で理解できるよね。過不足なくコメントも付けてさ。

んで、\\\\ みたいなトリッキーな処理は、ちょっと詳しく説明をコメントで
書いてあげればいいはず。

これで理解できなければ後任者が無能、逆に上記のように作られてなくて、
C言語でいうところの、全部がグローバル変数だったり、main関数だけの
ような構造であれば前任者が無能。

ネット関連の超有名企業に勤めてるんだが、エラー処理もロクにない
クソスクリプトばっかりで笑ってしまうorz
483名無しさん@お腹いっぱい。:2009/04/18(土) 23:15:01
シェルスクリプトでは基本的に全部がグローバル変数なわけだが。

あと、「詳しく説明をコメントで書く」って言うけど、
書くなら当然英語で書くと言う意味で言ってるんだよね?

エラー処理をちゃんとやらなくても済んでしまうのがシェルスクリプトのいいところ。
484名無しさん@お腹いっぱい。:2009/04/18(土) 23:47:59
全部グローバル変数なのは仕様だから仕方ないけど、書き方ってもんがあるじゃん。
# 漏れは、局所化したいだけの理由でlocalが書けるbashスクリプトにしちゃうことあるけど。

英語でコメント書かないといけない理由は分からん。

エラー処理してなくてショボイ不具合が結構出るのも納得いかん。
485名無しさん@お腹いっぱい。:2009/04/19(日) 00:42:21
>>483, 484
昔は、loop 系は sub-shell 起こすから loop 内部で宣言した
変数は loop 外から参照できないってのがあったんだが
486名無しさん@お腹いっぱい。:2009/04/19(日) 00:54:53
今でも、whle とかに | 使うとサブシェルになるね。
ならない高機能シェルもあるけどさ。
ループ外で変数が取得できないのは意外と不便w
487名無しさん@お腹いっぱい。:2009/04/19(日) 01:29:35
shってシンプルだが癖は強いからなあ。
ベル研系の言語はどれもそうだな。
副作用禁止で退屈なコード書きましょうと教育された世代には
厳しいもんがあるよ
488名無しさん@お腹いっぱい。:2009/04/19(日) 01:42:00
純正だしw
489名無しさん@お腹いっぱい。:2009/04/19(日) 03:39:34
>>487
awkやRATFORは当時凄くシンプルで仕様の美しい言語。
490名無しさん@お腹いっぱい。:2009/04/19(日) 08:27:53
>>484
> 英語でコメント書かないといけない理由は分からん。

当然社内に外国人担当者もいる。
書いたスクリプトが海外の支社に回ることもある。
コンソールなど日本語が通らない環境でもスクリプトを読みたい時がある。
シェルによってはコメントに日本語が入ったスクリプトをLANG=Cで実行すると発狂する
日本語だと、EUCかUTF-8かJISかSJIS(←これはないが)か悩む必要がある。
491名無しさん@お腹いっぱい。:2009/04/19(日) 11:04:10
偽英語で意味不明のコメント書かれるよりは…
コメント書くために時間かけられるよりは…
時間書けるのを避けるために嘘コメントが残るよりは…
というわけで、母国語のコメント推奨。

必要な時に翻訳すれば良い。
492名無しさん@お腹いっぱい。:2009/04/19(日) 11:09:32
ローマ字を使えば全て解決
493名無しさん@お腹いっぱい。:2009/04/19(日) 15:45:28
>>482
\\\\の処理具体的にどういう話?
どんだけトリッキーなのか、簡単な処理でいいので解説してちょ
>>491
技術文書なんだから中学英語でいいじゃん
英語説明に不安なら同じ説明を違う言い方で二回書けばいいんじゃねえ?
それか、使い方の例を載せるとか

エロイ人は計詳細設計も英語onlyなのかな?
日本語でしっかり書いて、英語で簡単な説明を書くみたいな感じ?
>>491
母国語のコメント推奨とかいうヤツってマジで害悪だよ
母国語の説明に飢えているなら、readme_jp.txtで簡単な説明を書いてもらえいいんじゃない
494名無しさん@お腹いっぱい。:2009/04/19(日) 16:03:59
>>493
日本がいやなら出てけよ。
495名無しさん@お腹いっぱい。:2009/04/19(日) 16:50:33
bashみたいなshに変な機能が追加されてるシェルで悩むくらいなら
cshで書いてしまったほうが圧倒的な汎用性を得られる。
496名無しさん@お腹いっぱい。:2009/04/19(日) 16:56:24
>>495
釣りとしても面白くない。

最近のLinuxには (t)cshがデフォではインストールされていない。
497名無しさん@お腹いっぱい。:2009/04/19(日) 16:59:29
>>495
さすがに論外なんじゃない?
それならLL言語で書いてもらったほうがいい。

Perlだとちょっとこわいけど。
498名無しさん@お腹いっぱい。:2009/04/19(日) 17:13:56
>>494
プログラマーの共通言語は英語。
499名無しさん@お腹いっぱい。:2009/04/19(日) 17:25:26
>>494
1世紀ちょっと前にちょんまげを切ったんだから、そろそろ近代化しようぜ
500名無しさん@お腹いっぱい。:2009/04/19(日) 17:49:34
ダクラス・マッカーサーが「アメリカがもう40代なのに対して日本は12歳の少女だ」
と表現したのを知らないの?
実際、そうだったわけだが。

今は、いくつなんだろうか。大学卒業したぐらい?
501名無しさん@お腹いっぱい。:2009/04/19(日) 18:36:15
>>500
それは民主主義の成熟度に対して言ったものなので
全然話が違いますがな。
502名無しさん@お腹いっぱい。:2009/04/19(日) 18:43:05
40のオッサンが12歳の少女をレイプしまくった訳ですね
503名無しさん@お腹いっぱい。:2009/04/19(日) 19:03:28
国家としての成熟度じゃ、日欧にかないませんわな、アメリカは。どう足掻いても。

まぁその欧の中でも英国は大陸の神話とかに対し憧れとかあるらしいが。トールキンに
関する話によれば。
504名無しさん@お腹いっぱい。:2009/04/19(日) 19:36:07
>>501
明治になって、至ってまともな民主主義だったと言われているよ。
朝日だって最初は反戦だったけど、反戦だと売れないから戦争に賛成になったわけで。
本だって発禁されても、出版社は発禁本と逆に名乗って、商売して儲けたらしいし。
改憲派の中でも明治憲法が理想の人は結構多いと思うよ。

そりゃあ、西欧の民主主義と比べたら歴史の年数が違うから成熟したとは、言い難いし。
宗教や人種で30世紀近くさんざん揉めている国々との外交力の差は明らかだよね。

なんというシェルスクリプトスレw
明治憲法みたいに真面目に設計すればいいものはできるという話かw
後任者の保守運用が・・・
505名無しさん@お腹いっぱい。:2009/04/19(日) 19:57:15
2chは末期だな
506名無しさん@お腹いっぱい。:2009/04/19(日) 20:26:19
>>500
奴隷制度現役だった国に言われたくはないわw
507名無しさん@お腹いっぱい。:2009/04/19(日) 20:31:34
>>504
法学板にでも行きなされ。うざいよ。

ところで、読む相手が日本人しかいないと分かってるスクリプトに
無理して英語でコメントを書くのは時間の無駄じゃないかな。
UTF-8で書いてあれば問題は起こらないわけだし。
508501: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分ぐらいかかってしまいまつ。(´・ω・`)

何かうまい方法があったら教えてください。おながいします。
509名無しさん@お腹いっぱい。:2009/04/19(日) 21:12:11
>>508
とりあえず、kshで実行してみたら?
それでも遅いのなら、シェルスクリプトで実行すること自体が
問題なのだと思う。
510501:2009/04/19(日) 21:22:29
>>509
ありがとうございます。
/bin/shで実行させていたので、明日試してみます。
(手元に実行環境が無いもので…)
511名無しさん@お腹いっぱい。:2009/04/19(日) 21:26:41
>>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 でやってね。
512名無しさん@お腹いっぱい。:2009/04/19(日) 21:29:32
>>508
そのスクリプトでトータル何行(未来の行数も含めて)のログを処理させたいの?
513名無しさん@お腹いっぱい。:2009/04/19(日) 21:34:50
>>511
そこまでできてるなら、echoの直前に

case $mon in Jan)mon=01;;Feb)mon=02;;Mar)mon=03;;Apr)mon=04;;..省略..;;esac

の行を入れれば sedも不要。全部シェルでできる。
514501:2009/04/19(日) 21:43:29
>>511, >>513
ありがとうございますた。参考にさせていただきまつ。m(__)m

>>512
今のところ30万行ぐらいなんですが、もしかしたら最大で
500〜600万行ぐらい処理するかもしれません。
515名無しさん@お腹いっぱい。:2009/04/19(日) 23:05:25
プログラミングで飯喰ってるPGならシェルスクリプトや何の言語でもさっと読んで理解するのを期待したい所では有るな。
コメントに頼るレベルで、プログラムで飯喰おうってのが甘い気がする。
もちろん母国語的、得意な言語が有って、それで前任者のプログラム置き換えていけばいいと思うけどね。
前任者がシェルスクリプトで組んでても、修正出来ないじゃ、作り直すしか無いし。


汎用的なシェルスクリプトよりは、いろいろな環境の癖を知って臨機応変に組めたほうが重宝すると思う。
いろんな環境を体験する事かな。SunOS, Solaris, Linux(rhel系,フリー系), Windows(cygwin, interix)ぐらいかなあ。SunOSはもう流石に無いと思いたいwww
516名無しさん@お腹いっぱい。:2009/04/19(日) 23:15:44
517名無しさん@お腹いっぱい。:2009/04/20(月) 01:23:45
>>515
うちのところにもこういう人います。
意外と仕事が雑なんですよね・・・
518名無しさん@お腹いっぱい。:2009/04/20(月) 01:57:50
>>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]
519518: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
ってやると空行が五行文出力されるようなものです。
521名無しさん@お腹いっぱい。:2009/04/20(月) 02:54:54
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 ""を縦に並べたほうがみやすいんじゃないの?
522名無しさん@お腹いっぱい。:2009/04/20(月) 03:11:36
>>521
自己レスだけど;(セミコロン)は、C言語としての文の終わりとしての意味合いの記号じゃないから、;は入れないほうが望ましいって本に書いてあったな
なにかあるってわけじゃないんだろうけど
printf "\n"; printf "\n"; printf "\n"; printf "\n"; printf "\n"
echo "dddd"
echo; echo; echo; echo; echo
echo "eeee"
523名無しさん@お腹いっぱい。:2009/04/20(月) 07:06:13
>>520
1個のechoで、改行含めて見たままシングルクォートにするのがエレガント。

echo 'aaa





bbb'

以上
524名無しさん@お腹いっぱい。:2009/04/20(月) 07:17:56
そういやこういうのもあるね
echo -e "aaaaa\n\n\n\n\nbbbbb"
>>523
シングルクォートの意味はあるんですか?
あとでダブルクォートを入れやすくするため?
525名無しさん@お腹いっぱい。:2009/04/20(月) 07:25:46
>>524
不用意な展開を防ぐため。

基本はすべてシングルクォート。
$HOGE とか `com` とか、展開が必要な時のみダブルクォート、というのがルール。
526名無しさん@お腹いっぱい。:2009/04/20(月) 07:44:04
>>525
さんくす
もっといっぱい本を読んで、写経します
527名無しさん@お腹いっぱい。:2009/04/20(月) 09:31:41
>>519
kshの速さを実感して貰えて何より。
いまいちマイナーなのが不思議だったりする。
528名無しさん@お腹いっぱい。:2009/04/20(月) 12:48:18
kshは商用SystemV系ってイメージあるし
529名無しさん@お腹いっぱい。:2009/04/20(月) 12:58:57
>>527
昔はこぞってみんな使ってたんだぜ。
bashがなかった時代だけど。
530名無しさん@お腹いっぱい。:2009/04/20(月) 13:16:27
>>525
自分ルールを標準のごとく言ったりエレガントとか言うのはどうかと思う
520〜523までなら後から見たときや他人が書いたものを見たとき520が一番見やすい

echo の内容を | を通して渡す為に >>523 にしたというならともかく(この場合でも他に方法はいくらでもあるけど)
531名無しさん@お腹いっぱい。:2009/04/20(月) 14:16:51
仕事で使うのは最近はkshばかりだなー
マイナーという
532名無しさん@お腹いっぱい。:2009/04/20(月) 14:17:41
マイナーというのはどうかな
533名無しさん@お腹いっぱい。:2009/04/20(月) 14:35:10
>>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
今でもひそかなファンが多いし、重宝されていると言えばいいのかな
534名無しさん@お腹いっぱい。:2009/04/20(月) 14:40:33
>>533
>それともshに対応しないkshスクリプトを書くの?

普通書かない。
shに対応しないkshスクリプトの代表例と言えば [[ ]] の記述。

sh的には if [ "$hoge" = fuga ]; then と書くところを、
kshでは if [[ "$hoge" == fuga ]]; then と書く。

でも、こんなの滅多に見ないだろ。それほど kshはマイナー。
535名無しさん@お腹いっぱい。:2009/04/20(月) 15:02:26
>>533
Linuxには入れちゃうよーん
536名無しさん@お腹いっぱい。:2009/04/20(月) 15:27:09
客先とかだと勝手に入れられない。
537名無しさん@お腹いっぱい。:2009/04/20(月) 16:31:48
もちろん設計段階で盛り込むんだよーん
538名無しさん@お腹いっぱい。:2009/04/20(月) 16:35:48
自分が一生面倒見ますくらいじゃないとそんなの入れられない
特に自社システムじゃなく受託開発なら
トラブル時に責任問題にもなる
539名無しさん@お腹いっぱい。:2009/04/20(月) 16:39:40
なんか、どうでもいい話だな。
540名無しさん@お腹いっぱい。:2009/04/20(月) 16:41:47
サポートのあるものを入れれば大丈夫だよん
541名無しさん@お腹いっぱい。:2009/04/20(月) 16:43:27
>>540
具体的には?
542名無しさん@お腹いっぱい。:2009/04/20(月) 16:57:46
redhatとかsuseとか
それぞれのベンダが提供しているやつ
543名無しさん@お腹いっぱい。:2009/04/20(月) 17:08:15
OpenBSDのkshはpdkshじゃなかったっけ?
544名無しさん@お腹いっぱい。:2009/04/20(月) 17:21:19
たいていpbksh
545名無しさん@お腹いっぱい。:2009/04/20(月) 21:06:27
$ ksh
プログラム 'ksh' は以下のパッケージで見つかりました:
* ksh
* mksh
* zsh
* pdksh
次の操作を試してください: sudo apt-get install <選択したパッケージ>

やはりここはpdksh?
546名無しさん@お腹いっぱい。:2009/04/20(月) 21:46:52
OSが起動した日時を取得する、いい方法は無いでしょうか?
起動からの経過時間でなく、起動日時です。
出来ればシリアル値(1970からの経過秒)で取得できれば嬉しいです。

uptimeの結果から計算するのは起動からの経過時間によってフォーマットが
(daysやminが付いたり、付かなかったり)違うため出来れば避けたいです。
GNU、bash依存でもかまいません。
547名無しさん@お腹いっぱい。:2009/04/20(月) 21:52:23
cat /proc/uptime
548名無しさん@お腹いっぱい。:2009/04/20(月) 21:56:22
cat: /proc/uptime: No such file or directory
549名無しさん@お腹いっぱい。:2009/04/20(月) 21:58:37
だからBSD*は駄目なんだよ
550名無しさん@お腹いっぱい。:2009/04/20(月) 22:14:36
>>546
GNU 依存でいいなら、

date -r /

(ルートディレクトリのタイムスタンプは起動時に touchされて
その後書き込みは普通は発生しないことを利用)
551名無しさん@お腹いっぱい。:2009/04/20(月) 22:18:32
$ date -r /
2009年  2月  6日 金曜日 21:12:47 JST

ずれまくりワロタ
552名無しさん@お腹いっぱい。:2009/04/20(月) 22:24:36
>>545
好きにすればいいじゃない
553名無しさん@お腹いっぱい。:2009/04/20(月) 22:31:52
>>550
OpenBSD on VMware on WindowsXPでやったら、Thu Jan 1 09:00:00 JST 1970になった
まあ、OpenBSD on VMwareだからしゃないやな
554553:2009/04/20(月) 22:46:48
ubuntu8.04 LTS on VMwareだとVM作成時の年数日時
Scientific on VMware,Fedora11 on VMwareだとちゃんと出るんだな

まあ、どうでもいい話でした
555501: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
----
556501:2009/04/21(火) 00:07:41
続きです。

スクリプトの実行速度なんですが、約10万行のログを処理したところ、
kshではなんと4秒で終わっちゃいました。

ちなみに/bin/shで動かしたら、27秒もかかっちゃいまして、
処理性能の違いに驚いた次第であります。
おまいら、ありがとうございますた。
557名無しさん@お腹いっぱい。:2009/04/21(火) 01:03:04
>>556
ちなみにOSは?
558名無しさん@お腹いっぱい。:2009/04/21(火) 01:13:39
>>555
報告おつ
比較をわかりやすく、30万行じゃないのねw

6.75倍はすごいね
559501:2009/04/21(火) 01:26:31
>>557
処理時間を計ったのはVMware上で動いているFreeBSD7.1ですが、
Solaris9(SPARC)でも動くのは確認しますた。


>>558
手元にあったのが10万行のログだったので、
とりあえずこれで試しますた。
深い意味はありませんw
560名無しさん@お腹いっぱい。:2009/04/21(火) 01:31:08
>>546
こんなのどうかな。
GNU依存だし、動かないパターン多そうだけど。

$ last | grep '^reboot' | head -1 | awk '{print $5" "$6" "$7" "$8}' | date -f - '+%s'
561名無しさん@お腹いっぱい。:2009/04/21(火) 01:40:08
今月起動したっていう場合しか無理っぽいな
562名無しさん@お腹いっぱい。:2009/04/21(火) 01:50:16
>>561
wtmp って1月分しか残らないんだっけ?
そう言えば、/proc/uptime はサイズどれだけ有るんだっけ(溢れることはない?)?
563名無しさん@お腹いっぱい。:2009/04/21(火) 03:07:54
bashで、三項演算子を使いたいのですが、どのようにするのでしょうか?
564名無しさん@お腹いっぱい。:2009/04/21(火) 03:55:34
shellはダイナミックライブラリのとスタティックのが有るから、ベンチ遣るならダイナミックのほうが有利だろうな。
565名無しさん@お腹いっぱい。:2009/04/21(火) 07:16:33
>>563
たとえば、
echo $((x > 0 ? x: -x))
とか。
566名無しさん@お腹いっぱい。:2009/04/21(火) 07:38:41
俺の解釈では
A && (B; true) || C
かと。
567名無しさん@お腹いっぱい。:2009/04/21(火) 08:20:54
>>566
アフォか。
それは普通の「2項」の演算子の組み合わせ。
しかも、bash限定でもない。

>>565 が正解。
568名無しさん@お腹いっぱい。:2009/04/21(火) 09:59:52
正解は>>565
>>567は>566に輪をかけたアフォ。
「bashで」というお題は「bash以外では動作しない == bash限定」事を要求していない。
569名無しさん@お腹いっぱい。:2009/04/21(火) 10:53:47
頭のおかしい人はスルーで
はりきるだけだから
570名無しさん@お腹いっぱい。:2009/04/21(火) 11:12:24
するーされてるが >>564 もあふぉだな。
ここでのベンチ(kshとbash)は、ライブラリが動的か静的かよりもはるかに大きい
差を生じているので、そんな点を指摘しても無意味。
さらにアフォな点は、バイナリは「スタティックリンク」の方が速い(有利)ということ。
>>564 は全く逆に覚えてるようだね。
571名無しさん@お腹いっぱい。:2009/04/21(火) 12:34:23
なんでスタティックリンクの方が速いんだ?
572名無しさん@お腹いっぱい。:2009/04/21(火) 12:40:45
>>571
素で質問してるならぐぐれ。
釣りなら面白くない。
573名無しさん@お腹いっぱい。:2009/04/21(火) 13:33:19
ファイル名を通し番号に変えたいんですけど
以下のスクリプトでエラーが出ます。

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コマンドの使い方の問題なのかもしれませんが
自分には原因がわかりません
教えてください
574名無しさん@お腹いっぱい。:2009/04/21(火) 13:42:53
>>571
共有ライブラリは間接呼出しになる。
575名無しさん@お腹いっぱい。:2009/04/21(火) 13:44:59
>>573
スペース入りファイル名が分割されて、
mv hoge hage.m4a 123.m4r
みたいに実行されたのが原因。

シェル変数の展開時には原則すべてダブルクォートを付けること。

mv "$file" "$num.m4r"
576名無しさん@お腹いっぱい。:2009/04/21(火) 13:45:06
>>573
ファイル名に空白(やタブ等)が含まれているのだろう。

mv "$file" $num.m4r
577名無しさん@お腹いっぱい。:2009/04/21(火) 14:04:48
>>575
>>576
なるほど、そういうことだったんですか!
まさにその通りで、ファイル名にスペースが入っていました。
ありがとうございます!
578名無しさん@お腹いっぱい。:2009/04/21(火) 21:57:17
>>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
579名無しさん@お腹いっぱい。:2009/04/22(水) 05:32:25
スタティクは全部読むから読み込みに時間がかかるし、ライブラリのキャッシュも効いてないぞ。
ダイナミックが遅いなら、みんなダイナミック使ってないwww
perlとかも普通はダイナミック。
580名無しさん@お腹いっぱい。:2009/04/22(水) 06:10:01
>>579
オマエ真性の勘違い野郎か。

スタティックリンクでも全部は読み込まない。
仮想記憶って知ってるか?
バイナリプログラムのうち、実際にCPUのプログラムカウンタが走った命令のアドレス
を含むメモリページのみが読み込まれる。実行されなかった部分は読み込まれない。

ダイナミックリンクのライブラリは、リロケーションの関係で、
PIC(ポジションインディペンデント)にコンパイルする必要があり、
PIC自体が通常のバイナリよりも数%遅い。

ライブラリのキャッシュについては確かにいうとおりだが、
これは他の要素に比べて影響は小さいので、
やはりダイナミックリンクの方が遅い。

ダイナミックリンクは遅いが、HDDの節約や、ライブラリのupdateの際に
リンクしてる個々のバイナリを再コンパイルしなくて良い便宜のために
使用されている。どうしても速度優先の場合は、
スタティックリンクを使うことがあるよ。
581名無しさん@お腹いっぱい。:2009/04/22(水) 06:36:28
>>580 に補足。
ライブラリは複数の関数の集まりでできているが、
スタティックリンクの場合、それらの関数のうち、使用している関数だけが
コンパイル(ld)時にリンクされる。使っていない関数はそもそもリンクされない。
(使っていても条件によって呼び出されなかった関数は
仮想記憶によってメモリにはロードされないままになる可能性があるのは
>>580 がいう通り)

ダイナミックリンクの場合は、使っていない関数まで
実行時に塊で付いてきてしまう。
582名無しさん@お腹いっぱい。:2009/04/22(水) 06:57:20
ダイナミックリンク/スタティックリンクの速度の違いなんて小さいからどうでもいい。
それよりもバイトコンパイルやらコマンド組み込みやらの方が効果でかいはず。
583名無しさん@お腹いっぱい。:2009/04/22(水) 07:57:48
>>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


スタティックリンクの方が速いね。
584名無しさん@お腹いっぱい。:2009/04/22(水) 09:15:01
>>563
ミリ秒オーダでしか違わないんじゃほとんどの場合は
そんなこと気にするよりまともなプログラム書いたほうが
いいなw
585名無しさん@お腹いっぱい。:2009/04/22(水) 09:37:11
>>584
dynamicもstaticも「ほとんど違わない」ので、それ以外の要素による違いの方が大きい
ということは元々 >>570 が指摘してる。(こっちが要点)

それ以外に、>>564 は「ダイナミックの方が速い」と間違ってることを言ってるるので、
それをついでに指摘しただけ。

で、>>579 で未だに「ダイナミックの方が速い」の主張を続けるから、
>>580 がそれを否定しているだけ。

別に>>580 が、シェルスクリプトのシェルをスタティックにしろと主張している
わけではない。

元の質問に戻って、>>508 の場合、外部コマンドの cutの呼び出しが多数ループ
されるので、それが遅かったのが原因と思われる。
>>511 はシェルの内部コマンドだけを使っているので、それで激劇に速くなったと。

いすれにしても、その話の流れを読まずに
>>564 で見当違いかつ間違った指摘をしている >>564 はアフォ。
586名無しさん@お腹いっぱい。:2009/04/22(水) 10:22:55
>>580
> ライブラリのキャッシュについては確かにいうとおりだが、
> これは他の要素に比べて影響は小さいので、
> やはりダイナミックリンクの方が遅い。

嘘八百のおバカさん
587名無しさん@お腹いっぱい。:2009/04/22(水) 10:31:05
>>585
主張する内容自体に問題くても、必死すぎるとキモいものだな...
まあ落ち着け。
588名無しさん@お腹いっぱい。:2009/04/22(水) 10:35:53
通常の実行バイナリがstaticかdynamicかという問題のほかに、
>>579 は perlの「ダイナミックロード」のライブラリ(モジュール)の話と
混同してるフシがあるな。(わざわざ的外れなperlを例に持ち出してきてるあたり)

>>579 にとって、「ダイナミック」とは、perlでしかイメージできてなくて、
普通にCをコンパイルする時のstatic linkとdynamic linkを違いを
全く理解できてない(存在自体知らない?)んだろう(笑)
589名無しさん@お腹いっぱい。:2009/04/22(水) 10:49:32
>>584
問題です。
Ubuntuでは、dashをビルドする際に、libcを使わずdietlibcに変更した上で、
スタティックリンクしています。これはなぜでしょうか。
ヒント:Ubuntuでは/bin/shとしてdashを使っています。
590名無しさん@お腹いっぱい。:2009/04/22(水) 11:07:22
ld.so関係で事故が起きても動くように。
スタティックリンクの方が速いからではない。
そもそも速くないし。
591名無しさん@お腹いっぱい。:2009/04/22(水) 11:11:36
>>590
>そもそも速くないし。

は間違い。実際速い。

それ以外にstatic linkにする利点と、さらにdietlibcに変更する理由を質問してる。
>>590 では答えになっていない。

ハイ、答え直し >>590 >>584
592名無しさん@お腹いっぱい。:2009/04/22(水) 11:12:45
それっぽく書くだけで人はこんなにもだまされるんだな。
ちゃんと自分の頭を使って自分の体を動かして自分の目で確認しろよ。
593名無しさん@お腹いっぱい。:2009/04/22(水) 11:31:22
linux はスタティックリンクなバイナリのように見えても、
NSS まわりとかで必要があれば勝手にダイナミックでリンクしちゃうから
わりとどーでもいい。
594名無しさん@お腹いっぱい。:2009/04/22(水) 11:47:34
>>593
争点をぼかすことになるから、ここでは dlopen()系の話は持ち込まない方が
話が簡単になるかと。どうせあほは >>579 1人だろうし。
595名無しさん@お腹いっぱい。:2009/04/22(水) 12:33:36
staticリンクするとGPL汚染するからGPL信者には都合がいい。
しかもdietlibcはLGPLでなくGPLなのでダイナミックリンクでも汚染する。
596名無しさん@お腹いっぱい。:2009/04/22(水) 12:35:04
>>579
すさまじい勘違いだなw
597名無しさん@お腹いっぱい。:2009/04/22(水) 12:38:47
>>584
このオーダーも特に速度が必要な場合は馬鹿に出来ないよ。
まぁ、dynamicかstaticかの違いより、根本的な設計の方がよっぽど大きいけど。
598名無しさん@お腹いっぱい。:2009/04/22(水) 12:49:51
>>597
ミリ秒オーダーの起動オーバヘッドが問題になるほど実行時間の
短いプログラムを何度も起動するのはそもそも設計が悪いよね
599名無しさん@お腹いっぱい。:2009/04/22(水) 12:59:45
>>598
オーバヘッドは「プログラム起動時」だけじゃないよ。
dynamicなライブラリ上の関数を呼び出すたびにオーバーヘッドがかかる。
さらに、関数自体がPICによって速度上不利なコードで書かれているから遅くなる。

staticライブラリなら、プログラム中に絶対アドレスを決めうちで持つから、
その分のオーバーヘッドがなく高速動作する。
600名無しさん@お腹いっぱい。:2009/04/22(水) 13:10:18
ダイナミックリンクが遅い派の人って、なんか宗教じみてるよね
結論ありきというか
そうでないと世界が崩壊しちゃうんだろうね
601名無しさん@お腹いっぱい。:2009/04/22(水) 13:18:31
>>600
今まで「ダイナミックリンクの方が速い」と間違って覚えていて
散々恥を晒した気分はどうだい? >>600 = >>579
602名無しさん@お腹いっぱい。:2009/04/22(水) 13:22:13
>>600
自己紹介乙。
そうか、今までdynamicの方が速いと信じこんでいて、それが間違いだと知って
キミの世界が崩壊しちゃったのか、、よしよし
603名無しさん@お腹いっぱい。:2009/04/22(水) 13:50:41
これ、シェルスクリプトの話?
604名無しさん@お腹いっぱい。:2009/04/22(水) 17:24:32
いんにゃ、全てのライブラリをスタティックリンクさせてメモリを圧迫させようとする秘密組織の陰謀。
605名無しさん@お腹いっぱい。:2009/04/22(水) 23:37:03
すべてのプログラムをGPLに汚染するGNU組織の陰謀だろwww
606名無しさん@お腹いっぱい。:2009/04/22(水) 23:52:09
>>605
ま、次から間違えないようにすれば良いじゃないか。

607名無しさん@お腹いっぱい。:2009/04/23(木) 22:37:10
echo aaabbbccceee | sed 's/aaa//' | sed 's/ccc//'
という場合のsedをひとつにできますか?
608名無しさん@お腹いっぱい。:2009/04/23(木) 22:43:22
>>607
echo aaabbbccceee | sed 's/aaa//;s/ccc//'
609名無しさん@お腹いっぱい。:2009/04/23(木) 22:55:44
>>607

$ alias ひとつ=sed
$ echo aaabbbccceee | ひとつ 's/aaa//' | ひとつ 's/ccc//'
610名無しさん@お腹いっぱい。:2009/04/23(木) 23:29:40
echo aaabbbccceee | sed -e 's/aaa//' -e 's/ccc//'
611名無しさん@お腹いっぱい。:2009/04/24(金) 00:10:17
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|
612名無しさん@お腹いっぱい。:2009/04/24(金) 00:41:35
蛇の足まで描くな
613名無しさん@お腹いっぱい。:2009/04/24(金) 06:46:28
あと、sedとgrepを | でつなぐ奴とか。もうあほかと。
614名無しさん@お腹いっぱい。:2009/04/24(金) 09:27:04
でも少しずつ様子を見ながら作業してるときは、お尻に付け足すほうが
カーソル戻さなくていい分楽なのでついやっちゃうんだよな...
615名無しさん@お腹いっぱい。:2009/04/24(金) 11:10:54
>611
実行速度が大きく違う時がある
-e よりは sed | sed | sedの方が速いときもある

ケースバイケースでしょ
616名無しさん@お腹いっぱい。:2009/04/24(金) 11:47:58
>>613
インターネットで俺の悪口を言うのは止めてくれないか ><
617名無しさん@お腹いっぱい。:2009/04/24(金) 12:46:50
オレのことではないと分かってほっと一息
618名無しさん@お腹いっぱい。:2009/04/24(金) 19:58:34
sedの件ありがとうございます
ただひとつの場合-eはなくてもいいのに複数の場合は必須なんですね?
619名無しさん@お腹いっぱい。:2009/04/24(金) 20:08:32
>>618
>>608 の形式なら -e は不要。
620名無しさん@お腹いっぱい。:2009/04/24(金) 23:03:44
まあコマンドで出力しぼったりしてるときは grep | sed とか書いてもいいべ
621名無しさん@お腹いっぱい。:2009/04/25(土) 04:52:34
sedが3つも起動されてるのはどうだか。
622名無しさん@お腹いっぱい。:2009/04/25(土) 09:27:36
いまどきのマシンなら3つぐらい余裕で動く
623名無しさん@お腹いっぱい。:2009/04/25(土) 09:49:23
>>615
sed 's/afo/moe/g;s/unko/umai/g;s/ahya/uhyo/g'
よりも、
sed | sed | sed の方が速いことはあり得ない。

×ケースバイケース
>>615 の負け惜しみ
624名無しさん@お腹いっぱい。:2009/04/25(土) 10:29:36
615は -e って言ってるのに
625名無しさん@お腹いっぱい。:2009/04/25(土) 12:07:39
>>624
>>615 は一言で言い表すために -e って言っただけだろ。
-e でも>>623 でも同じこと。

まとめると、
>>611 (-e) または >>623 の方が速い。
間違っても、>>615 が言う sed | sed | sed の方が速くなるケースは無い。
626名無しさん@お腹いっぱい。:2009/04/25(土) 16:57:49
シングルなのかクアッドなのかに寄っても違うとか?
まあsed実行中もshellが居座ってるのもなんだかなあだけど。
627名無しさん@お腹いっぱい。:2009/04/25(土) 17:41:53
shellが居座るってよくないの?
そのshell分、ちょっぴりメモリを食うだけでしょ

他になんかデメリットってあるんでしょうか?
628名無しさん@お腹いっぱい。:2009/04/25(土) 18:30:21
下流のsedにshellはいないんじゃないの?
629名無しさん@お腹いっぱい。:2009/04/25(土) 18:32:17
あいや、なんか変な言い方になったな
630名無しさん@お腹いっぱい。:2009/04/25(土) 18:46:52
コマンドがひとつだけなら、
exec command
とやって、forkせずにシェルをコマンドに化けさせられる。

2つ以上のコマンドをパイプする場合は、execが使えない。
敢えて exec を付けても無意味。実験してみればわかる。
631名無しさん@お腹いっぱい。:2009/04/25(土) 22:25:15
>>626はアホなのでスルー推奨
632名無しさん@お腹いっぱい。:2009/04/26(日) 01:12:31
OSごと仮想化されてる時代に慎ましいスレですね
633名無しさん@お腹いっぱい。:2009/04/26(日) 01:20:05
いつまでもシェルスクリプトは使われるだろうね
634名無しさん@お腹いっぱい。:2009/04/26(日) 02:03:58
>>633
そりゃFortran・COBOL・Lispが未だに現役なわけだし。
635名無しさん@お腹いっぱい。:2009/04/26(日) 05:23:42
特にコボルのバッチ処理がしぶとい。
今時オンデマンドでリアルタイムで処理しろよって感じだが。
636名無しさん@お腹いっぱい。:2009/04/26(日) 06:47:10
>>635
まぁ世の中、夜間のバッチ処理に向いてる(リアルタイムに向かない)
処理もある訳で、ホストもバッチ処理もそう簡単には無くならんでしょうな。
637名無しさん@お腹いっぱい。:2009/04/26(日) 22:31:52
海外のフォーラムをみていたけど、意外とksh派って多いんだね
bash 3.5, ksh 3.5, zsh 2, csh(tcsh) 1って感じだった
他のマイナーなShellは出てこず

kshの良い点としてvi-likeの編集機能を何名かがあげていたんですけど、そんなに便利なんでしょうか?
638名無しさん@お腹いっぱい。:2009/04/26(日) 22:47:32
set -o vi となんか違う?
639名無しさん@お腹いっぱい。:2009/04/27(月) 02:51:03
こういうのできるんだね
vi `locate filename.sh`

クドイほどtips and 例文満載の文書ってないのかな
640名無しさん@お腹いっぱい。:2009/04/27(月) 04:44:20
>>637
弱い犬ほど良く吠えるから
発言が活発=利用者が多い
じゃないよ
cshやbash以外は普及してるかと言われればそうでもない
641名無しさん@お腹いっぱい。:2009/04/27(月) 06:35:18
>>640
/bin/shの実体が何かによって利用者の数は決まる気がする。
642名無しさん@お腹いっぱい。:2009/04/27(月) 09:32:46
>>639
vi +/PATTERN `egrep -l PATTERN *`
ってのは良くやるからシェルスクリプトにしてる。
643名無しさん@お腹いっぱい。:2009/04/27(月) 23:29:03
サンクコストだったっけ?>無駄金を諦める
644名無しさん@お腹いっぱい。:2009/04/28(火) 00:07:22
kshはWindowing Korn Shellに憧れたなぁ
結局公開されたkshにはその機能がなくて一度も見ることなく終わったのだが、
どんなもんだったか証言できる人はいますか?

これが使えていたらTcl/Tkとかたぶんやってなかった。
645名無しさん@お腹いっぱい。:2009/04/28(火) 01:11:38
646名無しさん@お腹いっぱい。:2009/04/28(火) 10:24:05
Solarisには普通に入ってなかったっけ?>dtksh
647名無しさん@お腹いっぱい。:2009/04/28(火) 15:36:56
>>645,646
トン。dtkshだったのか。いままで検索しても画面を拝めなかったので
もう見ることはないかと思ってたよ。おかげで

 http://docs.sun.com/app/docs/doc/805-3917/6j3niaoaf?l=Ja&a=view

のプログラミングマニュアルでコードとか動作を初めて拝めた。
Solarisは使ってるけど/usr/dtとかまず使わないからまったく知らなかった。
もしかしてOpenSolarisにも入っているのだろうか・・・

Xツールキットの関数とオプションのまんまラッパーだったんだな。
今見るとベタで微笑ましい位。さすがにスクリプトででもXtは使いたいとは
もう思えないが、当時使えていたらハマッただろうなぁ。
648名無しさん@お腹いっぱい。:2009/04/28(火) 18:39:57
すごいくだらない質問ですまない。
/tmp/old まであるディレクトリ構造で
単純に/tmpディレクトリにあるファイルリストをテキストで出したいのだけど
ディレクトリや隠しファイルの表示は入れたくない
どんなコマンドつかえばできる?
lsやfindでいろんなオプションつけてやってみたけど無理だった
たぶんすごく単純なところで引っ掛かってる気がするので、わかる方いたら教えてください
649名無しさん@お腹いっぱい。:2009/04/28(火) 19:27:00
find /tmp -maxdepth 1 -type f
650名無しさん@お腹いっぱい。:2009/04/28(火) 19:29:16
>>649
隠しファイルの表示は入れたくない
651名無しさん@お腹いっぱい。:2009/04/28(火) 19:30:52
>>648
cd /tmp; for file in *; do [ -f "$file" ] && echo "$file"; done
652名無しさん@お腹いっぱい。:2009/04/28(火) 19:38:57
find内で.*を排除するほうがいいだろう。
くだ質スレでほぼ解決してるからここ見に来るとは思わんけど。
653名無しさん@お腹いっぱい。:2009/04/28(火) 19:42:22
>>652
find内で.*を排除するのは無駄だろ。
せっかく内部コマンドだけでできるのに。
654名無しさん@お腹いっぱい。:2009/04/28(火) 19:44:13
>>652
あっちでやってるのは、find「内」じゃないだろ。
findの「外」のパイプに出してからあとからカットしてる。ノンエレガント。
655名無しさん@お腹いっぱい。:2009/04/28(火) 19:47:52
外部コマンド | 外部コマンド

よりも、

シェル内部コマンドのみ

の方が速いわな。
656名無しさん@お腹いっぱい。:2009/04/28(火) 19:49:47
>>652
find方式だと、「hoge<改行>.hoge」みたいなファイル名があった場合、誤動作する。

>>651 方式なら無問題。
657名無しさん@お腹いっぱい。:2009/04/28(火) 20:17:44
[ が内部コマンドなシェルならいいけど、
外部コマンドなシェルだとパフォーマンス最悪
658名無しさん@お腹いっぱい。:2009/04/28(火) 20:39:13
コストだとかケチくせぇことはいいんだよ。
659名無しさん@お腹いっぱい。:2009/04/28(火) 21:12:44
>>651はファイル名にシーケンス文字列とか含んでると一部のシェルでは誤爆すんよ

$ touch foo\\bar
$ for file in *; do [ -f "$file" ] && echo "$file"; done
foar
660名無しさん@お腹いっぱい。:2009/04/28(火) 21:12:51
[ が外出しのシェルなんて現存しないから。あ、NGワードMINIXな。
661名無しさん@お腹いっぱい。:2009/04/28(火) 21:14:33
>>659
for f in *; do [ -f "$f" ] && printf '%s¥n' "$f"; done
662名無しさん@お腹いっぱい。:2009/04/28(火) 21:30:00
>>660
v7sh
echoも外出し。
663名無しさん@お腹いっぱい。:2009/04/28(火) 21:33:48
>>660
FreeBSD tcsh
% which [
/bin/[
664名無しさん@お腹いっぱい。:2009/04/28(火) 21:48:08
>>663
>>661 で for文使ってるのが見えねぇのかよw

>>662
v7は「現存」しない。
665名無しさん@お腹いっぱい。:2009/04/28(火) 21:51:34
cd /usr/ports/shells/v7sh; make install
666名無しさん@お腹いっぱい。:2009/04/28(火) 21:55:13
>>665
やっぱり「現存」しないじゃん。

わざわざ作らなきゃいけないんだから。
667名無しさん@お腹いっぱい。:2009/04/28(火) 21:57:57
この流れ、前も見た気がするけど、
「testやechoが外部コマンドの場合もある」って主張してる人、
実際そんな古いシェルを「ログインシェル」または「スクリプトシェル」として
現役で使ってるの?

使ってないのに机上の空論してもしょうがないよ。
668名無しさん@お腹いっぱい。:2009/04/28(火) 22:02:39
そんなことはどうでもいい
669名無しさん@お腹いっぱい。:2009/04/28(火) 22:08:53
testを使わない方法を考えてみた。

for f in *; do (cd "$f") 2> /dev/null || echo "$f"; done

Permission deniedなディレクトリがあったら誤判定されるのは仕方ない。
670名無しさん@お腹いっぱい。:2009/04/28(火) 22:14:47
> 誤判定されるのは仕方ない。
> 誤判定されるのは仕方ない。
> 誤判定されるのは仕方ない。
> 誤判定されるのは仕方ない。
671名無しさん@お腹いっぱい。:2009/04/28(火) 22:16:41
>>669
v7sh
cdも外出し。
672名無しさん@お腹いっぱい。:2009/04/28(火) 22:29:15
>>669
誤判定されない方法を考えてみた。

for f in *;do case `(cd "$f") 2>&1` in *'Not a directory')echo "$f";;esac; done
673名無しさん@お腹いっぱい。:2009/04/28(火) 22:56:37
>>647
> もしかしてOpenSolarisにも入っているのだろうか・・・

入ってない。TODOリストに入っているが、
ライセンス関係で新たに作らないといけない。
CDE/Motifべったりだから誰もやらないだろう。

>>666
わざわざエミュレータで動かしてます。
「現存」してないです。とあなたは言うでしょうけど。
674名無しさん@お腹いっぱい。:2009/04/29(水) 01:06:42
648は満足したのかな。
675名無しさん@お腹いっぱい。:2009/04/29(水) 02:37:45
testの内部コマンド化は実用の観点ではぜひ必要だが
美しくないな。
なんてこと言う奴はrcを使えってことか
676名無しさん@お腹いっぱい。:2009/04/29(水) 05:58:40
>>664
> v7は「現存」しない。
うちでは fpga で作った pdp-11 互換 CPU 上で元気に動いてますけど
677名無しさん@お腹いっぱい。:2009/04/29(水) 05:59:43
> cdも外出し。
寝言は寝てから言ってね
678名無しさん@お腹いっぱい。:2009/04/29(水) 06:49:51
>>676
それを「現存しない」と言う。よく覚えとけ。
679名無しさん@お腹いっぱい。:2009/04/29(水) 06:55:31
Solarisでは cdは外出しだよ。
/usr/bin/cd コマンドが存在するし。

多分、親プロセスを chdir()するようなシステムコール? を呼んでる??
680名無しさん@お腹いっぱい。:2009/04/29(水) 08:08:58
>>679
それたしか、自分がcdするだけ、ってnopコマンドじゃなかった?
681名無しさん@お腹いっぱい。:2009/04/29(水) 08:30:53
いや、ちゃんとcdでディレクトリ変わるし、which cd で /usr/bin/cdって出るんだ。
682名無しさん@お腹いっぱい。:2009/04/29(水) 08:59:20
>>681
/usr/bin/cd fooとやると変わらないだろ。
/usr/bin/cd foo && cd fooでフェイルセイフなcdだ。
683名無しさん@お腹いっぱい。:2009/04/29(水) 09:09:49
>>682
> /usr/bin/cd foo && cd fooでフェイルセイフなcdだ。

それ、フェイルな場合 /usr/bin/cd の段階でフェイルして、
エラーメッセージも出てしまうから、ちっともフェイルセーフじゃない。
単に cd foo とやったのと何ら変わりない。
684名無しさん@お腹いっぱい。:2009/04/29(水) 09:28:49
>>679
> 多分、親プロセスを chdir()するようなシステムコール? を呼んでる??
そんなシステムコールあるわけねーだろw
685名無しさん@お腹いっぱい。:2009/04/29(水) 09:39:00
おれ、今OS自作してるけど、fork()の引数でSHARE_CWDをセットすると
子プロセスとカレントディレクトリを共有する仕様にしようと思ってる。
cdを外付けコマンドにしたシェルを実装するんだ。
686名無しさん@お腹いっぱい。:2009/04/29(水) 09:40:04
フラグ乙
687名無しさん@お腹いっぱい。:2009/04/29(水) 09:43:41
あと、SHARE_ENVとSHARE_FDもつければいい
688名無しさん@お腹いっぱい。:2009/04/29(水) 09:47:47
>>685
それ、cdのときだけSHARE_CWDをセットするんなら、cdだけ特別扱い変わらず?
689名無しさん@お腹いっぱい。:2009/04/29(水) 09:54:11
fork()じゃなくてclone()だろ
690名無しさん@お腹いっぱい。:2009/04/29(水) 11:02:21
我が家のアイデア料理の話は要らないから
既存のシェルスクリプトの話をしろよ
691名無しさん@お腹いっぱい。:2009/04/29(水) 15:12:02
シェルってコンピューター用語だよ。
貝料理のことじゃないよ。誰も料理の話はしていないよ。
692名無しさん@お腹いっぱい。:2009/04/29(水) 16:36:32
つまんね
693名無しさん@お腹いっぱい。:2009/04/29(水) 22:08:15
>>678
日本語が不自由な人か?
ちゃんと、未だにPDP-11互換CPU上でV7が動いているんだから
「現存しない」とは言わないと思うぞ
実際にV7が動いてるわけだから
694名無しさん@お腹いっぱい。:2009/04/29(水) 22:14:28
そんなこと言ったら、博物館で復刻動作してる物でも「現存する」ことになってしまう。

testやechoが外部になってるシェルの議論なんてしても無駄。
695名無しさん@お腹いっぱい。:2009/04/29(水) 22:20:02
V7はソース見るとあまりにスッキリしすぎ。
(shは伝説的変態だが)
実際使うとすぐ落ちるんじゃないか?
696名無しさん@お腹いっぱい。:2009/04/29(水) 22:24:31
>>694
現実に動作してるじゃん
それを使う機械の有無は別として
シーラカンスは現存してないものって言ってるのに等しい
697名無しさん@お腹いっぱい。:2009/04/29(水) 22:26:47
>>695
はあ?
普通に使ってますけど?
698名無しさん@お腹いっぱい。:2009/04/29(水) 22:29:24
このスレは、実際にシェルスクリプトを使って仕事をしている人同士の
情報交換なので、個人的な趣味で過去の機械を動かして満足してる人は
無理に話題に入ってこないでいただけるかな?
699名無しさん@お腹いっぱい。:2009/04/29(水) 22:46:36
なんで仕事している人に限定すんだよ
700名無しさん@お腹いっぱい。:2009/04/29(水) 23:49:38
いいレスなら空想家も歓迎。
701名無しさん@お腹いっぱい。:2009/04/30(木) 01:08:37
爺さんが使っているポンコツの話なんぞ、誰も聞きたくないんですよ。
いい加減にしてね(はーと)。
702名無しさん@お腹いっぱい。:2009/04/30(木) 01:10:34
>>701
じゃあ、ネタ振ってよ はーと
703名無しさん@お腹いっぱい。:2009/04/30(木) 11:45:55
>>698
> このスレは、実際にシェルスクリプトを使って仕事をしている人同士の情報交換
ダウト。
>>1には、お勉強・自慢・腕試しと明記されている。従って、趣味でシェルスクリプ
トを勉強している人もOKだろ。


704名無しさん@お腹いっぱい。:2009/04/30(木) 18:33:49
getoptとgetoptsってどっち使ってる?
705名無しさん@お腹いっぱい。:2009/04/30(木) 18:40:44
当然getopts

getoptは外出しの別物
706名無しさん@お腹いっぱい。:2009/04/30(木) 18:42:07
速度的にはビルトインのgetoptsのほうが速いのはわかるけど
オプションの処理なんてたかが知れてるし

その他の面でもgetoptsのほうがいいの?
707名無しさん@お腹いっぱい。:2009/04/30(木) 18:46:55
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を駆使すればできそうなのですが、いまいちわかりません。
よろしくご教示お願いします。
709名無しさん@お腹いっぱい。:2009/05/02(土) 02:24:32
>>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' "ログファイル"


でいけそうな気がする。手元に環境ないんで試せてないけど
710名無しさん@お腹いっぱい。:2009/05/02(土) 02:35:06
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 うんたらで正規表現を試すといいと思うよ
711名無しさん@お腹いっぱい。:2009/05/02(土) 04:37:38
それじゃ駄目
712名無しさん@お腹いっぱい。:2009/05/02(土) 06:34:29
すみませんが、詳しい方、実際に試して確認した方のみ回答をお願いします
713名無しさん@お腹いっぱい。:2009/05/02(土) 09:33:07
>>708
これはどう?
sed -n '/^[0-9]/h; x; /13:[0-5][0-9]/{x;p}' datafile

714名無しさん@お腹いっぱい。:2009/05/02(土) 09:44:16
>>709 で良いんじゃないの?
715名無しさん@お腹いっぱい。:2009/05/02(土) 10:01:29
>>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
716名無しさん@お腹いっぱい。:2009/05/02(土) 14:07:55
(´,_ゝ`)プッ
717名無しさん@お腹いっぱい。:2009/05/02(土) 15:35:40
フラグ使うのはダサいと思うよ
718名無しさん@お腹いっぱい。:2009/05/02(土) 15:45:29
>>717
元の質問読んでる?

この場合は処理が行内で完結せず、
状態をどこかに記憶しなければならないのでフラグは必須なんだが。

>>713 の sedでは、状態をホールドスペースに記憶して、
ホールドスペースある同じ文字列を毎回正規表現で比較し直すという、
フラグよりダサイことをやってる。
719名無しさん@お腹いっぱい。:2009/05/02(土) 15:57:25
>>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
720名無しさん@お腹いっぱい。:2009/05/03(日) 13:26:32
715=718=719 なのかね
>>718 はありえない。毎回正規表現で比較するコストなんてたいしたことない
721名無しさん@お腹いっぱい。:2009/05/03(日) 17:43:17
>>715
質問者はawkとgrepを駆使するつもりだったようなので

>どうせならシェルでやれ。内部コマンドだけがいいぞ。
と強制する必要はないんじゃない?理由もイミフだし。

内部コマンドで済ます事に拘ることで >>715 とワザワザ長ったらしくしながら
大きなアドバンテージがある訳でもなく、もし、aaa とかが "13:xx " や "xxx xxx xxx 13:xx xxx ..." とか有り得るなら
>>709 では問題にならないのに >>715(や>>719も) では上手くいかない事を説明してないし
722721: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'
724名無しさん@お腹いっぱい。:2009/05/03(日) 21:26:12
>>723
ぱっと見、怖いスクリプト書いてるな…
一般的な助言しとくと
 ・カレントディレクトリは明示的に指定しる。

 ・cron実行時のPATH環境はどうなってる?
  (要はfindとrmコマンドは、フルパスでなくても実行可能?)

 ・このスクリプトに実行権与えてる?
725名無しさん@お腹いっぱい。:2009/05/03(日) 21:57:18
>>724
ご指摘ありがとうございます。カレントは「具象化」します。
実行エラーの原因がわかりました。
改行コードが「CRLF」でした _| ̄|○ il||l
「LF」のみして正しく動作しました。
726名無しさん@お腹いっぱい。:2009/05/03(日) 22:45:14
>>724 ← 大はずれ(笑)
おおげさな「助言」が全く関係ないオチだったね。
エスパー失格。
727名無しさん@お腹いっぱい。:2009/05/03(日) 23:10:48
>>726
おまえ何様のつもり?
>>724の指摘内容は、cronでスクリプトが動かないときに
真っ先に疑うべき内容で、別に大げさな助言でもなかろうに。
善意で答えている人に対して失礼すぎ。
728名無しさん@お腹いっぱい。:2009/05/03(日) 23:37:25
>>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
は、実行速度に違いとかありますでしょうか?
730名無しさん@お腹いっぱい。:2009/05/04(月) 01:01:09
>>729
選択性の高いものを先に書いたほうが早い。
例えば比率的に「ファイル数:ディレクトリ数=9:1」で「*phpの数:*php以外の数=1:9」なら -name \*php を先に書いたほうが、90%の確率で -type f を評価する必要がなくなるので、逆に書くよりは高速になる可能性が高くなる。
要は、対象になるディレクトリの中身がどうなる傾向にあるかに拠る。
ただ、-type f単体の評価のほうが-nameより高速であろうから、単純に比率だけからでは一概には言えない。実際に計測して統計とるのが最善。
731名無しさん@お腹いっぱい。:2009/05/04(月) 01:01:14
ない
732名無しさん@お腹いっぱい。:2009/05/04(月) 06:14:41
オプションの並び変えただけで実行速度かわるわけねえだろ、ニャロメ!
>>730は釣り。
733名無しさん@お腹いっぱい。:2009/05/04(月) 09:02:34
エスパーすると、>>730 はfind の内部処理がオプションで指定した順番で
処理するつくりになってると思い込んでいるんだろう

そういう仮定(本人は仮定とは思ってない)が書かれないから、他人には
全く理解不能になってしまう。
734名無しさん@お腹いっぱい。:2009/05/04(月) 11:06:23
>>730ではないが、実行前に実行順を最適化する事は不可能に思える。
従って指定順に処理されると考えるのが普通。
>>733はエスパーしたいなら、エスパースレにいけ。放置された質問たまってるぞ。
735名無しさん@お腹いっぱい。:2009/05/04(月) 13:24:43
>>733
http://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.html
find は与えられたファイル名以下のディレクトリツリーを検索し、同じく与えられた評価式を左から右に向かって優先順位の高いものから評価する (演算子のセクションを見よ)。
評価式の結果が確定すると (and の左項が偽だったり、 or の左項が真だった場合など) 評価は終了し、引き続き次のファイル名が評価される。
736名無しさん@お腹いっぱい。:2009/05/04(月) 14:18:22
なるほど、演算式として評価してるのか
737名無しさん@お腹いっぱい。:2009/05/04(月) 14:45:25
勉強になってよかったな
738名無しさん@お腹いっぱい。:2009/05/04(月) 19:50:01
なるほどね(´・ω・`)
739名無しさん@お腹いっぱい。:2009/05/05(火) 00:38:14
えーと、結論としては、findのオプションの並びが変わっても、実行速度に変わりはないってことだよね?

違ったらごめんw
740名無しさん@お腹いっぱい。:2009/05/05(火) 06:57:49
変わったら変わる。
(変わらないケースもまれにある)
741名無しさん@お腹いっぱい。:2009/05/05(火) 22:31:34
>>729
どちらの言ってることが正しいか自分の環境でテストしてみたんだけど、
1回目のfindでは7秒かかってたのが、2回目以降では、0.5秒で検索できた。

これって、OSがfindの結果をキャッシュしてるってことかなぁ、、、

テストするために、そのキャッシュをクリアする方法ってある?

ご存知の方は教えてくださいm(_ _)m

742名無しさん@お腹いっぱい。:2009/05/05(火) 22:36:20
>>741
それ、find自体は関係なくて、OSのファイルシステム(またはブロックデバイス)の
キャッシュが効いてるのが原因。

キャッシュの影響をなくすひとつの方法は、
umountできるディレクトリなら、
findの直前に一旦umountして、mountして、その直後に1回だけfindを実行する。
次のfindの前にまたumount/mountする。ちょっと面倒だけど。
743名無しさん@お腹いっぱい。:2009/05/05(火) 22:36:22
>>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;
おれは、こうしゃうけどね
でも、キャッシュはしていないと思うけどね
744名無しさん@お腹いっぱい。:2009/05/05(火) 22:37:16
shutdown -r now
745>>741:2009/05/06(水) 00:17:08
>>742
>>743
勉強になるなぁ、、、
どうもありがとう!
746名無しさん@お腹いっぱい。:2009/05/06(水) 13:37:32
>>741
で、テスト結果は?
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のようがはやい。

■結論
オプションの並びをかえると、実行速度はかわる

749名無しさん@お腹いっぱい。:2009/05/07(木) 01:03:51
おいおい・・・
750名無しさん@お腹いっぱい。:2009/05/07(木) 03:47:59
そりゃstat(2)が減るわけだから若干は速くなっておかしくないだろ
751名無しさん@お腹いっぱい。:2009/05/07(木) 04:25:05
>>747
> /dev/nullしろよ。
それじゃreal timeが表示の時間測ってることになるだろ。
752名無しさん@お腹いっぱい。:2009/05/07(木) 06:10:32
>>750
stat(2)は減らない。
1回のstat(2)で、ファイル名とファイルタイプは同時に得られるから。
753名無しさん@お腹いっぱい。:2009/05/07(木) 10:03:02
シェルスクリプトに変更を加えずに alias を有効にする方法はありますか?
GNU の ls や stat を使うように書かれたシェルスクリプトを実行するために、

alias ls='gls'
alias stat='gstat'

を設定した状態で実行したいんですが、シェルでセットしてもシェルスクリプト中では有効になりません。
754名無しさん@お腹いっぱい。:2009/05/07(木) 10:29:17
>>752
stat(2)でファイル名得られるってどういうOSですかあ?
755名無しさん@お腹いっぱい。:2009/05/07(木) 10:55:10
>>754
readdir()等でファイル名一覧が得られたあと、
-type f のオプションがあるかどうかにかかわらず、
findとしてはそのディレクトリのすべてのファイルについて
一旦 stat(2)を実行する。
(でないと、サブディレクトリかどうかとかの判断ができないから)
で、-type fオプションとかがあると、すでに実行済みの stat(2)の結果を
利用するから、stat(2)の実行回数は増えない。
756名無しさん@お腹いっぱい。:2009/05/07(木) 11:10:07
>>753
PATHの一番優先順位のところに自作のディレクトリでもつくって、通して、ls,statというファイル名をつくって
$ cat ls
#/bin/sh
gls $@
$ cat stat
#/bin/sh
gstat $@
みたいなことするんじゃないの?

即席なんでこういうのは、ダサ過ぎなのかもしれないけど
757名無しさん@お腹いっぱい。:2009/05/07(木) 11:45:08
>>755
> (でないと、サブディレクトリかどうかとかの判断ができないから)
ディレクトリの判定には、いきなりchdirしてみると言う方法も考えられるので却下。
758名無しさん@お腹いっぱい。:2009/05/07(木) 11:47:34
>>757
実際のfindではいきなりchdirはしないから却下
759名無しさん@お腹いっぱい。:2009/05/07(木) 11:48:26
>>753
bashがスクリプト中でalias使えるか知らないが、

#!/bin/bash
alias ls='gls'
alias stat='gstat'
. そのシェルスクリプト
760名無しさん@お腹いっぱい。:2009/05/07(木) 11:49:17
>>758
そのような実装のfindが無いことを証明出来るなら採用。
761名無しさん@お腹いっぱい。:2009/05/07(木) 11:51:39
>>760
いきなりchdirすると、それがディレクトリへのシンボリックリンクだった場合に困る。
(-followオプションを付けていないのにsymlinkをたどっては行けないから)

だからいきなりchdirする実装はあり得ない。
762名無しさん@お腹いっぱい。:2009/05/07(木) 12:29:24
無いことを証明することを相手に求めるの男の人って…
763名無しさん@お腹いっぱい。:2009/05/07(木) 12:35:53
証明された後で、無いことの証明は不可能と主張する男の人って…
764名無しさん@お腹いっぱい。:2009/05/07(木) 16:42:56
背理法...?
765名無しさん@お腹いっぱい。:2009/05/07(木) 18:24:10
はいーりはーいりふれ背理法ー
766名無しさん@お腹いっぱい。:2009/05/07(木) 18:24:38
アルプスの少女ハイリ
767名無しさん@お腹いっぱい。:2009/05/07(木) 18:53:47
768名無しさん@お腹いっぱい。:2009/05/07(木) 23:15:48
豆知識:
readdir()すると、
ファイル名とi-node番号だけじゃなくて、
struct direntの中でファイルタイプも返すUNIXがある。
e.g. FreeBSD
769名無しさん@お腹いっぱい。:2009/05/07(木) 23:20:14
FS依存
770名無しさん@お腹いっぱい。:2009/05/08(金) 04:01:23
>>768
お前ら、レベル高いな、、、
ぜんぜん、この話題ついていけねぇ、、、orz

どうやったら、そんな高いレベルになるのか教えてくれ。
何かお勧めの本とか。
771名無しさん@お腹いっぱい。:2009/05/08(金) 06:55:30
>>768
その場合はreaddir()だけでファイル名もファイルタイプも得られるから、
findの-nameや-type fの有無にかかわらず、結局stat(2)の回数は増えない、でFA?
772名無しさん@お腹いっぱい。:2009/05/08(金) 07:38:55
>>771
GNU findは#ifdefで、
ファイルタイプ返すreaddirに対応している。
773名無しさん@お腹いっぱい。:2009/05/08(金) 13:50:32
>>770
OJTって知っている?
ひたすら仕事をすればいいんだよ。
774名無しさん@お腹いっぱい。:2009/05/08(金) 17:42:35
ソースを使え、ルーク
775名無しさん@お腹いっぱい。:2009/05/09(土) 08:38:09
ソースコードに埋め込んで計測すれば良いのにwww
776名無しさん@お腹いっぱい。:2009/05/10(日) 18:00:18
do 〜 doneで、doはドゥーですよね。
doneは皆さん何と読んでいますでしょうか?
人によって、ダーン、ドーン、ドネ、ディーオーエヌイーなどと呼んでいるのですが、
専門家の方はどう読むのでしょうか?
777名無しさん@お腹いっぱい。:2009/05/10(日) 18:07:04
778名無しさん@お腹いっぱい。:2009/05/10(日) 18:23:18
do/did/done の done だろ?
779名無しさん@お腹いっぱい。:2009/05/10(日) 18:52:14
>>776
小学生乙。
780名無しさん@お腹いっぱい。:2009/05/10(日) 19:04:30
UNIXに関する言葉のひらがな読みスレッド
http://pc12.2ch.net/test/read.cgi/unix/1001358861/
781名無しさん@お腹いっぱい。:2009/05/10(日) 19:09:45
やはりここでも意見が分かれますね。
782名無しさん@お腹いっぱい。:2009/05/10(日) 19:25:12
だん、か、だーん、だろ上皇
783名無しさん@お腹いっぱい。:2009/05/10(日) 19:53:43
ところで、Bourneはどう読んでる?
ボーンじゃなくてブールネが正しいって聞いたことがあるんだが。
784名無しさん@お腹いっぱい。:2009/05/10(日) 20:22:03
>>782
だーんって読んだら笑われるぞ
英語じゃないんだから

>>776
ドーンが正解です
ドンでもいいですよ
785名無しさん@お腹いっぱい。:2009/05/10(日) 21:36:26
>>784
denyもデニーですよね。
786名無しさん@お腹いっぱい。:2009/05/11(月) 13:33:52
esacもスーケですよね
787名無しさん@お腹いっぱい。:2009/05/11(月) 16:18:47
イーザック・アジモフ
788名無しさん@お腹いっぱい。:2009/05/12(火) 08:11:17
>>782

i did it

done

アメリカ行って聞いて故意w
789名無しさん@お腹いっぱい。:2009/05/12(火) 08:11:58
>>784

>ドーンが正解です
>ドンでもいいですよ

それなら
 dawn
だなwぷけら
790名無しさん@お腹いっぱい。:2009/05/14(木) 02:26:34
unixのマニュアル(man)で英語の勉強をしているのですが、

これに関連して、全てのマニュアルの英単語の数を計算し、多い順にソートしたいのですが、
いい方法はありますでしょうか?
(#使われている頻度が多い英単語から覚えれば、効率的かなと。。)

791名無しさん@お腹いっぱい。:2009/05/14(木) 02:36:44
>>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
--------------------------------

全てのマニュアルってことになるとどうするんだろ。
792名無しさん@お腹いっぱい。:2009/05/14(木) 04:32:48
>>791
zcat /usr/local/man/man{1..9}/*.gz | nroff | col -b > /tmp/manuals.txt

以下同じ。
793名無しさん@お腹いっぱい。:2009/05/14(木) 05:04:44
そもそも英語の技術文書が英語の勉強に成るかどうかを検証したほうが。
ハリポタでもなんでもいいけど、興味の有る映画とかの本のほうが勉強に成ると思う。
794名無しさん@お腹いっぱい。:2009/05/14(木) 06:18:10
>>793
> ハリポタでもなんでもいいけど、興味の有る映画とかの本のほうが勉強に成ると思う。
ノベライズ(小説)は、難しいと聞くなあ
あと読んで(input)、誰かに書いて(output)ってしにくそう

コンピュータ(例えば、Linux)分野寄りの話なら、最初は大変だけど、メーリングリストに投げるなり、フォーラムに投稿するなり
できるし、書いた英文が不適切でも、コマンドと標準出力、エラーログを添付すれば、意味は通じるからね
コンピュータ寄りだけど英語の勉強になるし、楽しいよ

リスニングに関しては、海外ドラマDVDを家にいるときは字幕なしで流しっぱなしにしているのがいい感じ
単語がわからなくても、表情や動作で意味が伝わってくるからね
映画は連続ドラマに比べて、映画の性質上、無駄なくシーンがポンポン変わるからちょっときつい感じ
>>790
聞いてみるもんだね、簡単にできるんだね
795名無しさん@お腹いっぱい。:2009/05/14(木) 06:32:55
>>794
ノベライズは小説化だよ。
796名無しさん@お腹いっぱい。:2009/05/14(木) 06:34:11
>>793
シェルスクリプトのスレなんだからシェルスクリプトで答えればいいんだよ。
英語の勉強法なら別の板なりスレなりに誘導すればいいだけじゃないか。
797名無しさん@お腹いっぱい。:2009/05/14(木) 06:49:22
>>791
中間ファイル作るの無駄過ぎ。一発でできる。

man ls | col -b | tr ' ' '¥n' | tr '¥t' '¥n' | sort| uniq -c | sort -nr
798名無しさん@お腹いっぱい。:2009/05/14(木) 06:53:30
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{} \;
-------------------------------
これだと「そんなフォルダねーよ」と蹴られてしまいます。
フォルダの階層ごとコピーがしたいですが、何か方法はありますでしょうか?


800名無しさん@お腹いっぱい。:2009/05/14(木) 11:14:51
rsyncでも使えば?
801名無しさん@お腹いっぱい。:2009/05/14(木) 11:24:39 BE:1686938966-2BP(0)
rsyncは使ってますが

Cron
-------
rsync -auvz --delete /var/www /media/disk-1/www-backup
-------

世代バックアップってできましたっけ?
802名無しさん@お腹いっぱい。:2009/05/14(木) 11:34:43
ああ
803名無しさん@お腹いっぱい。:2009/05/14(木) 11:40:09
>>797
trを2個も重ねるの無駄過ぎ。一発でできる。

man ls | col -b | tr ' ¥t' '¥n¥n' | sort | uniq -c | sort -nr
804名無しさん@お腹いっぱい。:2009/05/14(木) 12:03:06
>>799

tar cf - `find ... -print` | (cd $dest; tar xpf -)

みたいなのはどうだろうか?findの結果が多い場合は`...`やめて-Tで
ファイル渡しで。
805名無しさん@お腹いっぱい。:2009/05/14(木) 12:19:08
>>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
うお、クールだ!
早速やってみます
807名無しさん@お腹いっぱい。:2009/05/14(木) 13:33:32
cpio使え
find /var/www -mtime -1 -name "*.php" | cpio -pumd $dest
808名無しさん@お腹いっぱい。:2009/05/14(木) 13:37:32
うるさいのがいるのを忘れてたぜ。

ファイル名が改行などの特殊文字含む可能性がある場合はGNU cpioで
find /var/www -mtime -1 -name "*.php" -print0 | cpio -0 -pumd $dest
809名無しさん@お腹いっぱい。:2009/05/14(木) 13:50:40 BE:1640079375-2BP(0)
>>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が動くのか・・・
よ・・よくわからねーが、そのうち質問者は考えるのをやめた
810名無しさん@お腹いっぱい。:2009/05/14(木) 14:00:12
http://www.linux.or.jp/JM/html/GNU_cpio/man1/cpio.1.html
> コピーパスモードでは、 cpio はファイルをあるディレクトリから別のディレ
> クトリにコピーします。実際に は、アーカイブファイルを用いて、コピーア
> ウトモードとコピーインモードを 組み合わせて実行するような形になります。
> cpioは、コピーするファイルリストを標準入力から受けとります。これらの
> ファイルのコピー先のディレクトリについては、オプション以外の引数で与え
> られ ます。
811名無しさん@お腹いっぱい。:2009/05/14(木) 14:03:30 BE:1405782465-2BP(0)
ごめんね、そもそもcpioの存在を知らなかったんだ

ありがとうございました!
812名無しさん@お腹いっぱい。:2009/05/14(木) 16:25:34
gnu系だしな。

http://pc11.2ch.net/test/read.cgi/linux/1238764663/
シェルスクリプト総合@LINUX Part5
813名無しさん@お腹いっぱい。:2009/05/15(金) 18:34:05
バッチのシェルを作りました。
このシェルをTELNeTに関連付けるにはどうしたらいいですか?
毎回シェルのKEYINが必要なのですか?
814名無しさん@お腹いっぱい。:2009/05/15(金) 18:49:38
バッチのシェル? cmd.exeでも自作したのか?
宣伝したいならvectorにでも行って登録しなさい。
815名無しさん@お腹いっぱい。:2009/05/15(金) 19:08:26
相手しちゃいかんよ。
816名無しさん@お腹いっぱい。:2009/05/15(金) 19:11:57
せめて言葉が通じるぐらいのところまでは勉強してもらわないと
どうにもならんな
817名無しさん@お腹いっぱい。:2009/05/15(金) 19:38:17
I made a shell of batch.
How can I associate this shell with TELNeT ?
Do I need to KEYIN for shell every time ?
818名無しさん@お腹いっぱい。:2009/05/15(金) 19:42:26
私はバッチのシェルをした。
このシェルはどうすればTelnetを関連付けることができますか?
私は毎回KEYINシェルのためには必要ですか?
819名無しさん@お腹いっぱい。:2009/05/15(金) 20:10:36
ラテン語でおk
820名無しさん@お腹いっぱい。:2009/05/15(金) 20:19:44
?κανα ?να κοχ?λι τη? batch. Π?? μπορ? να συνδ?σω αυτ? το κοχ?λι με Telnet; Χρει?ζομαι σε KEYIN για το κοχ?λι κ?θε φορ?
821名無しさん@お腹いっぱい。:2009/05/15(金) 22:14:52
引っぱりすぎ。
822名無しさん@お腹いっぱい。:2009/05/16(土) 03:55:45
そりゃギリシャ文字
823名無しさん@お腹いっぱい。:2009/05/16(土) 08:21:23
正直どうでも良い。
824名無しさん@お腹いっぱい。:2009/05/22(金) 17:38:26
word1="This is a pen"
array=( word1 )

echo ${array[0]}

これを実行すると、Thisって表示される。

array[0]にThis is a penを格納したいんだけど、どうすればいいですか?
825名無しさん@お腹いっぱい。:2009/05/22(金) 17:43:48
>>824
array=( "$word1" )
826名無しさん@お腹いっぱい。:2009/05/22(金) 17:47:22
罰腫胃損乙
827名無しさん@お腹いっぱい。:2009/05/22(金) 18:00:47
>>825
できました!

ありがとうございました。
828名無しさん@お腹いっぱい。:2009/05/25(月) 20:19:14
00 01 02 03 04
05 06 07 08 09

というような内容のファイルを

0 1 2 3 4
5 6 7 8 9

という内容に変換するにはどうやったらいい?
829名無しさん@お腹いっぱい。:2009/05/25(月) 20:22:32
>>828
tr -d 0
830名無しさん@お腹いっぱい。:2009/05/25(月) 20:25:13
おれでも答えられそうな低級レベルの質問きたー
$ 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
831名無しさん@お腹いっぱい。:2009/05/25(月) 20:26:09
>>829
最初の0が残らないぞ。
832名無しさん@お腹いっぱい。:2009/05/25(月) 20:43:52
>>830
それだと、102 とかが 12 になってしまう。
833名無しさん@お腹いっぱい。:2009/05/25(月) 20:49:29
0203 とか 0052 とかの対応も含めて
ゼロサプレスをもう少しちゃんとやるとすると、こうか?

sed 's/¥<0*¥([^0]¥)/¥1/g'
834名無しさん@お腹いっぱい。:2009/05/25(月) 20:50:46
>>833
それ、今度は 00 が 00 のままになる。
835名無しさん@お腹いっぱい。:2009/05/25(月) 20:58:19
>>830 も、単独の
00
だけの行があると
00
のままになるよ。

ハイ、やり直し。
836名無しさん@お腹いっぱい。:2009/05/25(月) 21:02:20
00だけ別対応だな。

sed 's/¥<0*¥([^0]¥)/¥1/g;s/¥<00*¥>/0/g'
837名無しさん@お腹いっぱい。:2009/05/25(月) 21:05:22
>>836
対応できてませんけどw
838名無しさん@お腹いっぱい。:2009/05/25(月) 21:13:12
>>830
元ファイル:
04 03 02 01 00

結果:
4 3 2 1 00
839名無しさん@お腹いっぱい。:2009/05/25(月) 21:17:40
フルボッコw
840名無しさん@お腹いっぱい。:2009/05/25(月) 21:22:45
>>828
それを実行してるFreeBSDのバージョンは?
841名無しさん@お腹いっぱい。:2009/05/25(月) 21:57:51
>>840
質問した本人は言い辛いと思うので(ていうかもう見てないか)言っておくが、
書いても君には答えられない。
そもそも書く意味がほとんど無いから書いてない。
842名無しさん@お腹いっぱい。:2009/05/26(火) 01:14:33
3日ぶりの質問に群がるレスは煽りと否定ばかり
間違ってはいたけど建設的なのは一人だけ、まぁ全てが自演かもしれんけど
こんなんでどうだろう?

sed -e 's/0*\([0-9]*[0-9]\)/\1/g' hoge.txt
843名無しさん@お腹いっぱい。:2009/05/26(火) 02:38:05
多分>>830>>833 = >>836だろ
844名無しさん@お腹いっぱい。:2009/05/26(火) 06:10:05
シェルスクリプトというよりsedスレ化してるな。
845名無しさん@お腹いっぱい。:2009/05/26(火) 07:38:19
>>842
もとの質問の「仕様」が不明確だから何とも言えないけど、

A00B みたいなのが A0B に変換されてしまうのはいいんだよな??
846名無しさん@お腹いっぱい。:2009/05/26(火) 12:26:35
sed 's/^/ /;s/ 0*\([0-9]\)/ \1/g;s/^ //'
847名無しさん@お腹いっぱい。:2009/05/26(火) 13:06:05
いまどきのsedなら\bあるんじゃね?

sed 's/\b0*\([0-9]\)/\1/g'
848名無しさん@お腹いっぱい。:2009/05/26(火) 14:14:49
いまどきの sed とぼかさずに、はっきり GNU sed と言ったら?
849名無しさん@お腹いっぱい。:2009/05/26(火) 17:51:35
sedだと改行が難しいんですよねー

ところで、文章が書き込まれているテキストファイルを1行に1文字づつに変換するには
どのコマンドを使用するべきだと思います?
850名無しさん@お腹いっぱい。:2009/05/26(火) 18:00:32
>>849

fold -1
851名無しさん@お腹いっぱい。:2009/05/26(火) 18:25:19
>>850

ファイルに出力したくなかったので助かりました、ありがとうございます
852名無しさん@お腹いっぱい。:2009/05/26(火) 22:09:36
質問です。 bash です。

ls コマンドが次のように定義されています。
ls ()
{
/bin/ls ${1+"$@"}
}

わざわざ ${1+"$@"} にしている理由は何でしょうか?
/bin/ls "$@" にした時との差異がわかりません。
853名無しさん@お腹いっぱい。:2009/05/26(火) 22:38:27
古いshでは引数が与えられていない時の
command "$@"はcommand ""と同じだった。それを避けるための記法。
854名無しさん@お腹いっぱい。:2009/05/26(火) 22:38:35
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
データにはスペースが入ることもあるのでどうしてもタブで分割させたいんですが、
いいやり方ってないでしょうか?
855名無しさん@お腹いっぱい。:2009/05/26(火) 22:51:26
>>854
echo "$LINE"
というオチか

ダブルクォートが無いと、echoした時、せっかくのタブがスペースになってしまう。
856852:2009/05/26(火) 23:07:25
>>853
ありがとうございます。
納得しました。
857854:2009/05/26(火) 23:35:03
>>855
そんな簡単な理由だったとは・・・orz
ありがとうございます!明日早速試してみます
858名無しさん@お腹いっぱい。:2009/05/27(水) 02:02:24
ファイルの3行目から10行目を表示というのをかっこよく書くとどうなりますか?
859名無しさん@お腹いっぱい。:2009/05/27(水) 05:49:52
head foo | tail -n 8
かっこよくないなぁ
860名無しさん@お腹いっぱい。:2009/05/27(水) 06:44:54
>>859
では、10行未満のときにうまくいかないことに気がついた。
head foo | tail -n +3
でも、かっこわるいなぁ
861名無しさん@お腹いっぱい。:2009/05/27(水) 06:48:34
>>858
sed -n 3,10p
862名無しさん@お腹いっぱい。:2009/05/28(木) 02:16:45
そろそろスレ違い。

http://pc12.2ch.net/test/read.cgi/unix/1085730992/
sed
863名無しさん@お腹いっぱい。:2009/05/28(木) 03:16:01
そろそろ?
864名無しさん@お腹いっぱい。:2009/05/29(金) 17:19:16
tar: 空の書庫作成はご容赦願います

日本語のエラーメッセージ見て久々に吹いたw
こんな事になったのはいつからだ?

少し前は、どうしても空の書庫を作ろうとしませんとかだったような気がするが
865名無しさん@お腹いっぱい。:2009/05/29(金) 17:31:42
LC_MESSAGES=C しとけ
866名無しさん@お腹いっぱい。:2009/05/29(金) 17:34:23
おれは rm -f /usr/share/locale/ja/LC_MESSAGES/tar.mo 派。
867名無しさん@お腹いっぱい。:2009/05/30(土) 04:43:29
ja_JPとかで使って便利と思った事が無い。
868名無しさん@お腹いっぱい。:2009/05/30(土) 11:09:28
俺の場合、デフォルトは LC_CTYPE=ja_JP.UTF-8 にして、LANG が ja_JP.UTF-8 に
なってたほうがいいアプリには個別対応してる。
869名無しさん@お腹いっぱい。:2009/05/30(土) 11:10:42
.xinitrc で ja_JP.UTF-8 にしてる
870名無しさん@お腹いっぱい。:2009/05/31(日) 00:49:43
>>845
もとの質問の「仕様」が不明確?どこが?

例として10個もデータ載せてて0-9とスペース(タブ?)しか使って無いんだから
1001 とかの考慮は必要だろうけど、A00B なんて何勝手に仕様追加してるの?

もしそういうのもあるなら質問者も10個のデータ内、1つ位はそんなデータを載せるだろうよ

汎用性を考えるのは重要だけど元々無い仕様を勝手に追加して、
それに対応する方法を自分で書くならまだしも、人が書いた事を否定するだけって、何の意味があるの?
871名無しさん@お腹いっぱい。:2009/05/31(日) 09:08:48
一桁目だけ取り出す/余計な0を削除する。
実際のデータが例示されたものだけならどちらでも動くが、仕様は二通り考えられる。

今回の質問はそれほど不明確では無かったが、不明確な質問しといて後から
条件追加するアフォが多すぎるので防衛反応だろう。
872名無しさん@お腹いっぱい。:2009/06/01(月) 12:15:24
aliasでパターンマッチのようなことが出来るシェルってありますか
例えば特定の環境変数を指定した引数の値にセットして
makeを呼び出せるようなことが出来るとありがたい

bash風なシェルだとすると、次のようなイメージ
 alias mak pattern='SOME_ENV_VARIABLE=$(pattern) make'

あるいは、代替案があればご教示頂けると幸いです
873名無しさん@お腹いっぱい。:2009/06/01(月) 12:54:54
bashなら関数定義すりゃいいんじゃねーの?
874名無しさん@お腹いっぱい。:2009/06/01(月) 12:56:06
何言ってるかわからん
875名無しさん@お腹いっぱい。:2009/06/01(月) 13:04:19
function mak () {
local x="$1";
shift;
HOGE="$x" make "$@"
}
876名無しさん@お腹いっぱい。:2009/06/01(月) 13:20:29
>>875
ありがとうございます。快適になりました。
877名無しさん@お腹いっぱい。:2009/06/02(火) 02:01:37
バックグラウンドで実行したコマンドの終了ステータスを取得する方法はありませんか?
例えば、以下の様に実行した command の exit status を実行元のシェルで取得したいのです。

(sleep 3; command >/dev/null 2>&1) &
878名無しさん@お腹いっぱい。:2009/06/02(火) 02:07:33
>>877
>>1
> manや参考リンクを見ましょう。
879名無しさん@お腹いっぱい。:2009/06/02(火) 06:38:35
>>878
できないならできないって答えてやれよ
880名無しさん@お腹いっぱい。:2009/06/02(火) 07:14:37
wait %1
881名無しさん@お腹いっぱい。:2009/06/02(火) 07:23:01
>>880
シェル依存。

バックグラウンドコマンドがすでに終了していると、
wait %1 ではステータスが取れないシェルがある。
882名無しさん@お腹いっぱい。:2009/06/02(火) 08:25:01
何も答えずに回答者の揚げ足とるだけよりマシかと
883名無しさん@お腹いっぱい。:2009/06/02(火) 08:29:38
>>882
いや、一般論としては「できない」が正解。

「できない」とすでに答えてる。
884名無しさん@お腹いっぱい。:2009/06/02(火) 10:01:27
環境書かないなら一般論で答えるしかないな。
885名無しさん@お腹いっぱい。:2009/06/03(水) 02:21:44
バックグラウンドコマンドの終了ステータスをファイルに保存して、参照すればいいんでないの?
886名無しさん@お腹いっぱい。:2009/06/03(水) 08:20:18
実行してるシェルスクリプトが、自身のステータスコードって吐けるの?
887名無しさん@お腹いっぱい。:2009/06/03(水) 09:11:32
この場合は欲しいのはcommandのステータスなんだから

(sleep 3; command >/dev/null 2>&1; echo $? > status) &

で保存できるだろ。
888名無しさん@お腹いっぱい。:2009/06/03(水) 10:27:42
次に実行したコマンドの終了ステイタスで上書きされるから意味が無い。
889名無しさん@お腹いっぱい。:2009/06/03(水) 11:03:05
>>888
そんなのを回避する方法は、お前以外の人間はいくらでも思いつく。
890名無しさん@お腹いっぱい。:2009/06/03(水) 12:08:48
>>887
>>877は、実行してしまったシェルスクリプトを後からどう
にかしたいらしいので、>>887みたいに、実行前にタイムマ
シンで戻ってシェルスクリプトを編集するのは不可じゃない
の?
>>887みたいに$?を使っていいなら、>>877はそもそも質問し
ていないと思うけど。
891名無しさん@お腹いっぱい。:2009/06/03(水) 13:44:26
>>890
質問を普通に読むことができれば、そういう考えには至らない。
892名無しさん@お腹いっぱい。:2009/06/03(水) 13:57:42
>>877はどこ行った?
893名無しさん@お腹いっぱい。:2009/06/03(水) 14:05:09
>>890
なんだ単なるネタか。余りにつまらないんでレスしちまったぜ。
これほど、つまらないネタを見るのは始めてだ。
894名無しさん@お腹いっぱい。:2009/06/03(水) 14:35:20
>>890
もしそういう問題ならシステムコールトレースでも仕掛けておけば
いいんじゃねーの?w
895名無しさん@お腹いっぱい。:2009/06/03(水) 15:24:06
>>887 さんの方法で解決しました。
echoの直前にセミコロンが抜けていますね。
ほかの方の回答は興味がないので無視させていただきました。
896名無しさん@お腹いっぱい。:2009/06/03(水) 15:41:55
では次の質問どうぞ。
897名無しさん@お腹いっぱい。:2009/06/03(水) 18:47:09
抜けてないw
898名無しさん@お腹いっぱい。:2009/06/03(水) 20:24:59
>>897
>直前 >直前 >直前
899名無しさん@お腹いっぱい。:2009/06/03(水) 22:11:34
正規表現でアルファベット6文字というのはどう書けばいいでしょう?
900名無しさん@お腹いっぱい。:2009/06/03(水) 22:17:08
>>899
>>1
>正規表現の話題はスレ違い(正規表現スレへ)
901名無しさん@お腹いっぱい。:2009/06/03(水) 22:21:06
>>900
うす!
902名無しさん@お腹いっぱい。:2009/06/04(木) 01:24:43
>>898
なにそれ?
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]と表示できる方法をどなたかご教示いただけないでしょうか?
904名無しさん@お腹いっぱい。:2009/06/06(土) 10:47:36
> fileAの中身を工夫して1234[aa]と表示できる方法
そんな方法は無い。不可能。絶対に無理。
905名無しさん@お腹いっぱい。:2009/06/06(土) 11:55:02
csh% echo "`cat fileA`"
はどうなの?
906名無しさん@お腹いっぱい。:2009/06/06(土) 12:52:52
>>905
>echo文は変えられないので
907名無しさん@お腹いっぱい。:2009/06/06(土) 13:49:29
>>903
シェルを変えろ。話はそれからだ。
908名無しさん@お腹いっぱい。:2009/06/06(土) 14:02:49
echoのソースを八苦するしか無いなw
909名無しさん@お腹いっぱい。:2009/06/06(土) 14:04:46
>>903
alias echo 'cat'
910名無しさん@お腹いっぱい。:2009/06/06(土) 14:21:02
cshの話題だから敢えて無視してたけど、
マジレスするとechoより前に set noglob すればOK
ただし、そのスクリプト自体変更できないと言うなら不可能。
911名無しさん@お腹いっぱい。:2009/06/06(土) 16:03:34
903です。
皆様ありがとうございます。
スクリプト自体を変更できないのです。^^;
残念ながらあきらめるしかないのですね。
お手数ですが、不可能な理由をご教示願えないでしょうか?
912名無しさん@お腹いっぱい。:2009/06/06(土) 16:04:05
出来ないように作られているから。
913名無しさん@お腹いっぱい。:2009/06/06(土) 18:53:00
#!/bin/csh とか -f を付け忘れてるスクリプトなら、.cshrc でなんとかなるかも
914名無しさん@お腹いっぱい。:2009/06/06(土) 23:31:54
そこまでcshでがんばる理由も無いと思うけどね。乙。
915名無しさん@お腹いっぱい。:2009/06/08(月) 22:21:18
abcdefg を
a
b
c
d
e
f
g
と表示する方法ありますか?
916名無しさん@お腹いっぱい。:2009/06/08(月) 22:27:37
917名無しさん@お腹いっぱい。:2009/06/10(水) 02:11:49
パスを変えてecho -> /bin/cat を優先させるという
918名無しさん@お腹いっぱい。:2009/06/10(水) 14:51:51
内部コマンドじゃないの?
919名無しさん@お腹いっぱい。:2009/06/10(水) 15:08:27
>>909 = >>917 は根本的に勘違いしてる。
たとえechoが内部コマンドじゃなかったとして、
echoをcatにすり替えることができたとしても、

>>903
> echo `cat fileA`
は、

cat `cat fileA`

になるだけ。これでは何の解決にもなっていない。
920名無しさん@お腹いっぱい。:2009/06/11(木) 00:03:40
何が目的で
cat fileA
じゃなくて
echo `cat fileA`
としてるのか問い詰めたい
921名無しさん@お腹いっぱい。:2009/06/11(木) 00:10:30
cat fileAと
echo `cat fileA`
は明らかに異なるが。どうして同一だと考えられるのだろう。
問い詰めたい。問い詰めたい。問い詰めたい。問い詰めたい。
922名無しさん@お腹いっぱい。:2009/06/11(木) 00:58:46
>>903
これってうちのtcsh 6.15.00だと再現しないんだけど純正csh限定なの?
923名無しさん@お腹いっぱい。:2009/06/11(木) 09:57:44
debianのパッケージで入れたcshでも再現しないな。パッケージのバージョンは
20070713-2となっているが元がどういうのかはよくわからない。

どういう仕組みでそうなるんだろうか。solarisのcshに独自の何かがある?
924名無しさん@お腹いっぱい。:2009/06/11(木) 17:12:08
copyrightファイルに書いてあるだろ
>The original sources were retrieved from the OpenBSD CVS repository
>([email protected]:/cvs). The upstream tarball can be
>recreated using `debian/rules get-orig-source'.

オリジナルとの差分
http://patch-tracking.debian.net/package/csh/
925名無しさん@お腹いっぱい。:2009/06/11(木) 23:17:47
次スレのテンプレに、

「cshの話題は厳禁」

明記よろ
926名無しさん@お腹いっぱい。:2009/06/11(木) 23:33:07
csh限定のシェルスクリプトスレでも建てれば?
そもそもシェルスクリプトにこだわる理由も無さそうだが。
927名無しさん@お腹いっぱい。:2009/06/12(金) 16:41:03
'' の中に変数を書いたら、ダメですか?

sed -e 's/$iどうたら/こうたら/' とか。
928名無しさん@お腹いっぱい。:2009/06/12(金) 18:11:14
>>927
恥ずかしいほど基本。
''は変数置換しない。""はする。
929名無しさん@お腹いっぱい。:2009/06/16(火) 00:02:05
>>925,926

なぜcshの話題はだめなのかを誘導しないと「どうしてcshの話題はだめなのですか?」ってのが繁殖するよ
930名無しさん@お腹いっぱい。:2009/06/16(火) 04:23:38
どうしてcシェルスクリプトの話題には、ちゃんと答えられないのですか?
931名無しさん@お腹いっぱい。:2009/06/16(火) 09:07:56
cshは専用のスレがあるからそっちで、で十分だと思うけど。
932名無しさん@お腹いっぱい。:2009/06/16(火) 10:01:06
csh使ってないから。
933名無しさん@お腹いっぱい。:2009/06/16(火) 18:05:06
シェルスクリプトでcshとか・・・おっそ
934名無しさん@お腹いっぱい。:2009/06/16(火) 18:16:09
cshインストールしてあるマシンが手元に無い。
935名無しさん@お腹いっぱい。:2009/06/17(水) 02:41:25
rootのシェルがデフォでcだな。
936名無しさん@お腹いっぱい。:2009/06/17(水) 11:50:49
OS名すら書かずに。
937名無しさん@お腹いっぱい。:2009/06/17(水) 11:54:43
ログインシェルのデフォルトが何かと
シェルスクリプト書くのに何を使うかは
まったく別の話。
938名無しさん@お腹いっぱい。:2009/06/17(水) 11:56:05
エスパーしろよ。rootのデフォcが今でも残ってる時代遅れは*BSDのみ。
939名無しさん@お腹いっぱい。:2009/06/19(金) 01:33:31
犬はbash以外無いからな。リーナスの趣味だっけか。
940名無しさん@お腹いっぱい。:2009/06/19(金) 02:33:32
ログインシェルにはtcshがお薦めですって言って回っていいほど
bashが肥大化しててワラタw
941名無しさん@お腹いっぱい。:2009/06/19(金) 03:09:31
zshに比べたらまだまだだがな
942名無しさん@お腹いっぱい。:2009/06/19(金) 06:10:47
そして毎日肥大化したbashでスクリプトが実行されてしまってる罠。
943名無しさん@お腹いっぱい。:2009/06/19(金) 07:29:20
deb系はdashがデフォルトだよ。
リーナスはSystemV贔屓だが、GNUはあんまり良く思ってないだろう。
emacsとかGNOMEとかGPL3とか悪口言いまくりだし。
944名無しさん@お腹いっぱい。:2009/06/19(金) 18:11:24
dashはリダイレクト処理がバグってる糞シェルだ
Debian信者の俺が言うのもなんだけど
945名無しさん@お腹いっぱい。:2009/06/19(金) 18:15:54
>>944
バグについて詳しく
946名無しさん@お腹いっぱい。:2009/06/19(金) 18:20:08
LANG=ja_JP.eucJP ならバグらないよ。
947名無しさん@お腹いっぱい。:2009/06/19(金) 18:33:14
日本語のファイル名なんて使わないからどうでもいいが、
それを抜きにしても ja_JP.eucJP で使うのが基本。
UTF-8は問題が多い。
948名無しさん@お腹いっぱい。:2009/06/19(金) 19:00:53
スクリプトにLANG=Cって書くのは…ダメ?
949名無しさん@お腹いっぱい。:2009/06/19(金) 20:38:55
>>948
えっと、LANG=C ならもろバグります。(解決になりません)
LANG=ja_JP.eucJPの時はバグらないと。(ただしファイル名もEUC-JPで作られる)
950名無しさん@お腹いっぱい。:2009/06/19(金) 20:39:54
どういうバグなん?
951名無しさん@お腹いっぱい。:2009/06/19(金) 21:44:10
ググればヒットすんだろ
http://znz.s1.xrea.com/t/?date=20090608
952名無しさん@お腹いっぱい。:2009/06/19(金) 21:48:47
ああ、今ググったよありがとう
953名無しさん@お腹いっぱい。:2009/06/19(金) 22:07:02
954名無しさん@お腹いっぱい。:2009/06/19(金) 22:17:37
リダイレクトだけじゃなくて、
シェル変数に代入してもバグるね。

$ echo $LANG
ja_JP.UTF-8

$ bash -c 'a="あいうえお"; echo "$a"'
あいうえお

$ dash -c 'a="あいうえお"; echo "$a"'
?????
955名無しさん@お腹いっぱい。:2009/06/19(金) 22:31:40
$ dash -c 'a="あいうえお"; echo "$a"'
あいうえお

はて?
956名無しさん@お腹いっぱい。:2009/06/19(金) 22:45:36
$ echo $LANG
ja_JP.UTF-8

$ dash -c 'printf "????n"'


$ dash -c 'a=`printf "????n"`; echo "$a"'


$ bash -c 'a=`printf "????n"`; echo "$a"'
957名無しさん@お腹いっぱい。:2009/06/19(金) 22:47:42
$ 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"'
958名無しさん@お腹いっぱい。:2009/06/19(金) 22:53:53
$ dash -c 'a=`printf "\343\201\202\n"`; echo "$a"'


無問題、てかおまいの書き込みはbackslashじゃなくてyenになってんぞ?
959名無しさん@お腹いっぱい。:2009/06/19(金) 23:46:22
バッシュカスワラタw
960名無しさん@お腹いっぱい。:2009/06/20(土) 00:07:12
バグってるのは dashの方で、bashは正常なんだが
961名無しさん@お腹いっぱい。:2009/06/20(土) 11:07:33
ターミナルがUTFを表示してくれるか次第じゃないの?
ホント犬廚ってレベル低いなwww
962名無しさん@お腹いっぱい。:2009/06/20(土) 11:31:45
debianのバグはdebianスレでやれと
963名無しさん@お腹いっぱい。:2009/06/20(土) 11:43:03
>>961
そういう問題じゃない。ちゃんと読み直せ。
964名無しさん@お腹いっぱい。:2009/06/20(土) 11:49:07
>>961のレベルの低さに呆れた
965名無しさん@お腹いっぱい。:2009/06/21(日) 11:15:50
未だに不良品使ってるデブ廚哀れ。

http://pc11.2ch.net/test/read.cgi/linux/1241948212/
【dashが】Debian GNU/Linux スレッド Ver.60【バグ持ち】
966名無しさん@お腹いっぱい。:2009/06/22(月) 03:13:53
変数中の %%:* と ##.* の意味を教えてください

# 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
キーワードが悪いのか、ググっても解決できない・・・
967名無しさん@お腹いっぱい。:2009/06/22(月) 05:31:15
>>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.

968名無しさん@お腹いっぱい。:2009/06/22(月) 05:49:40
>>967
ありがとう
自分の愚かさを理解しました
初心に戻ります・・・

ありがとう!
969名無しさん@お腹いっぱい。:2009/06/23(火) 00:07:39
バラメータにディレクトリ名を渡すbashをつくってるんですが、パラメータなしの場合は/tmpにしたいです

dir=${1=/tmp}

こんな感じでスマートに書けるかと思ったらできなかったんですがどうなんでしょう?
970名無しさん@お腹いっぱい。:2009/06/23(火) 00:37:18
ここはbash開発スレでは有りません。2chにはbash開発スレはないのでMLに行くと良いでしょう。
971名無しさん@お腹いっぱい。:2009/06/23(火) 06:40:26
>>969
dir=${1-/tmp}

ちなみに、bash以外の開発でも↑の書き方で桶。
972名無しさん@お腹いっぱい。:2009/06/23(火) 08:21:35
>>969
自分なら
dir=${1:-/tmp}
973名無しさん@お腹いっぱい。:2009/06/23(火) 08:28:19
>>972
それだと、

shellscript ''

みたいに空文字列を敢えて引数にした時まで、
/tmp に変換されてしまう。

敢えて空文字列指定はしたいので。
974名無しさん@お腹いっぱい。:2009/06/24(水) 01:58:04
>>971
>>972
そもそも書式間違ってたようですね
ありがとうございます!
975名無しさん@お腹いっぱい。:2009/06/29(月) 21:56:04
テキストの置換で質問があります。

hoge0:0 = "TRUE"
hoge0:1 = "TRUE"
hoge0:2 = "TRUE"
  ・
  ・
hoge0:9 = "TRUE"

上記の様な記述がされたテキストのhoge0:0以外の"TRUE"の
部分だけを"FALSE"へ置換したいのですが、sed等の置換で
置換可能でしょうか?
全ての"TRUE"を"FALSE"に変更するのであれば
簡単に出来ますが、「置換条件にあった複数行の数文字目以降だけを置換」
みたいな事って出来るんでしょうか?
976名無しさん@お腹いっぱい。:2009/06/29(月) 21:59:54
>>975

sed '/hoge0:0/!s/TRUE/FALSE/'
977名無しさん@お腹いっぱい。:2009/06/29(月) 23:01:28
>>976
ありがとうございます。
これで何とかなりそうです。
978名無しさん@お腹いっぱい。:2009/06/30(火) 03:41:23
たまにEnterを押しても^Mと出るだけでEnterが渡らなくなるんだけど
これって何?どうやったら直るの?
979名無しさん@お腹いっぱい。:2009/06/30(火) 04:26:51
http://pc12.2ch.net/test/read.cgi/unix/1025917502/
termcap について語るスレ
980名無しさん@お腹いっぱい。:2009/06/30(火) 07:37:47
むしろsttyじゃね?
981名無しさん@お腹いっぱい。:2009/06/30(火) 12:14:39
>>978
$ reset
982名無しさん@お腹いっぱい。:2009/06/30(火) 14:58:21
ttyは誰が制御してるのかと。
そろそろ産め。
983名無しさん@お腹いっぱい。:2009/07/01(水) 01:52:42
>>981
その一コマンドでbashが三日分死ぬ
984名無しさん@お腹いっぱい。:2009/07/01(水) 06:14:50
OSごと落ちるaliasが設定されてる罠。
985名無しさん@お腹いっぱい。:2009/07/01(水) 08:13:06
タンマツリセット
986名無しさん@お腹いっぱい。:2009/07/01(水) 09:58:32
987名無しさん@お腹いっぱい。:2009/07/01(水) 14:39:20
シャットダウンか。
988名無しさん@お腹いっぱい。:2009/07/01(水) 15:04:35
resetコマンドはBSD依存。
Solarisにはない。
989名無しさん@お腹いっぱい。:2009/07/01(水) 18:12:26
stty sane
990名無しさん@お腹いっぱい。:2009/07/01(水) 18:22:13
stty saneは、NEWS-OS 4.xで使えない
991名無しさん@お腹いっぱい。:2009/07/01(水) 22:11:28
stty -raw -nl -cbreak
992名無しさん@お腹いっぱい。:2009/07/01(水) 23:52:52
>>988
/usr/ucb/resetってなかったっけ?
$ tput reset
すれば済むことだけど。
993名無しさん@お腹いっぱい。:2009/07/02(木) 06:38:47
>>992
ダウト。

tput resetでは、画面のエスケープシーケンスがリセットされるだけで、
sttyの設定(^Mとか)はリセットされない。


>$ tput reset
>すれば済むことだけど。

済まない。
994名無しさん@お腹いっぱい。:2009/07/02(木) 07:35:37
term知らない人多いね。
995名無しさん@お腹いっぱい。:2009/07/02(木) 21:28:53
半分死にかけの技術だからかな
996名無しさん@お腹いっぱい。:2009/07/03(金) 10:30:40
まだまだssh無くせないのに。
最近はvncが多いのか?
997名無しさん@お腹いっぱい。:2009/07/03(金) 15:00:24
>>996
VNCは暗号化されないからSSHは捨てられないよな。
VNC+SSHだってるかうし。
998名無しさん@お腹いっぱい。:2009/07/03(金) 20:36:02
tty や pty はテムズ川に沈めて
無い事にしてしまいたいニダ
999名無しさん@お腹いっぱい。:2009/07/03(金) 20:52:56
よゆうの1000ゲット
1000名無しさん@お腹いっぱい。:2009/07/03(金) 20:56:05
1000だ!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。