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

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


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

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

シェルスクリプト総合 その10
http://pc11.2ch.net/test/read.cgi/unix/1202725267/
2名無しさん@お腹いっぱい。:2008/05/20(火) 21:01:00
□過去スレ:
シェルスクリプト総合 その10
http://pc11.2ch.net/test/read.cgi/unix/1202725267/
シェルスクリプト総合 その9
http://pc11.2ch.net/test/read.cgi/unix/1187130302/
シェルスクリプト総合 その8
http://pc11.2ch.net/test/read.cgi/unix/1171517324/
シェルスクリプト総合 その7
http://pc11.2ch.net/test/read.cgi/unix/1157601611/
シェルスクリプト総合 その6
http://pc11.2ch.net/test/read.cgi/unix/1143302182/
シェルスクリプト総合 その5
http://pc11.2ch.net/test/read.cgi/unix/1137801629/
シェルスクリプト総合 その4
http://pc11.2ch.net/test/read.cgi/unix/1131026501/
シェルスクリプト総合 その3
http://pc11.2ch.net/test/read.cgi/unix/1124889646/
シェルスクリプト総合 その2
http://pc11.2ch.net/test/read.cgi/unix/1113664637/
シェルスクリプト総合 その1
http://pc11.2ch.net/test/read.cgi/unix/1101820646/

□関連スレ:
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/
3名無しさん@お腹いっぱい。:2008/05/20(火) 21:02:04
□初心者向けリンク
「誰にでも」シリーズ
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/

□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
http://x68000.q-e-d.net/~68user/unix/
POSIX: Shell & Utilities (標準規格)
http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html
4名無しさん@お腹いっぱい。:2008/05/20(火) 21:05:30
□最近のシェルスクリプト本(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/
5名無しさん@お腹いっぱい。:2008/05/20(火) 21:06:37
□最近のシェルスクリプト本(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/
6名無しさん@お腹いっぱい。:2008/05/20(火) 21:07:57
□関連書籍と関連リンク:

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,xargs
(スペースなどを含むファイル名を正しく処理するため、
findは -print0、xargsは -0オプションを常に付けることを推奨
ただし、Solarisでは未対応。どうするんだろ?)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
7名無しさん@お腹いっぱい。:2008/05/20(火) 21:08:37
シェルにはAシェル系、Bシェル系、Cシェル系、と種類があるようですが、
僕のPCのシェルはXtermというものみたいです。
これは、シェル系に当てはめると何シェル系なんでしょうか?
8名無しさん@お腹いっぱい。:2008/05/20(火) 21:15:51
>>7
X系。  
9名無しさん@お腹いっぱい。:2008/05/20(火) 22:18:01
>1 乙 >2 追加したほうがいいかもしれない関連スレとただし書き

LinuxユーザはLinux板へ

シェルスクリプト総合@LINUX Part4
http://pc11.2ch.net/test/read.cgi/linux/1210999497/
10名無しさん@お腹いっぱい。:2008/05/21(水) 00:11:21
>>7
端末(端末エミュレータ)とシェルは別の存在。
あなたは端末エミュレータの中でシェルを動かしているはず。

echo $SHELL
11名無しさん@お腹いっぱい。:2008/05/21(水) 00:16:58
solarisのdfとかduで、サイズをギガ表記にしたいんだけどスクリプトでちょちょいとできないですかね?
12名無しさん@お腹いっぱい。:2008/05/21(水) 00:18:21
solaris10以降は、-hオプションがついてる。
13名無しさん@お腹いっぱい。:2008/05/21(水) 00:42:41
-hがないんですよ
バージョンは失念しました
14名無しさん@お腹いっぱい。:2008/05/21(水) 06:46:50
SolarisのdfってBLOCKSIZEはみないのか?
15名無しさん@お腹いっぱい。:2008/05/21(水) 08:37:13
$(command) 1より `command` が推奨なのってなんで?
16名無しさん@お腹いっぱい。:2008/05/21(水) 08:45:55
SunOSとかNEWS-OSとかでも動くから
17名無しさん@お腹いっぱい。:2008/05/21(水) 09:44:41
1 が不要だから。
18名無しさん@お腹いっぱい。:2008/05/21(水) 11:53:48
コマンドをパイプで複数実行する際に最初のコマンドでエラーだったら
その後のパイプ以降は実行しないというのは可能ですか?
19名無しさん@お腹いっぱい。:2008/05/21(水) 12:17:42
パイプってのは、あるコマンドを実行してそれが終わったら出力を
次のコマンドに流して、という仕組みではない。
どうしてもそういうことがやりたければパイプを使わない。

commandA > tmpfile.$$ && commandB < tmpfile.$$

# unix ではなく dos のパイプはこういう仕組みだったりする。
20名無しさん@お腹いっぱい。:2008/05/21(水) 23:27:43
シェル用語では、コマンド1個だけでもパイプラインと言う。
パイプライン1(=command1)がエラーなら
パイプライン2(=command2)を実行しないのなら、
command1 && command2
でよい。
>>18 は command1 と command2 の標準入出力を、
pipe(2)でつなぐとは言っていないのだから。
21名無しさん@お腹いっぱい。:2008/05/21(水) 23:36:39
こじつければ(形式的には)個々はパイプラインかもしれないが、
「パイプで複数実行」には到底ほど遠いだろう
22名無しさん@お腹いっぱい。:2008/05/22(木) 21:37:11
質問させてください。
a.txtファイルにbbbと言う文字があった場合、その文字を完全に削除するにはどうしたらいいでしょうか?

-----
aaa
bbb
ccc
-----

例えばa.txtの内容が上ようなとき、下のように置換したい。よろしくお願いします。

-----
aaa
ccc
-----
23名無しさん@お腹いっぱい。:2008/05/22(木) 21:46:57
grep -v bbb a.txt>b.txt
24名無しさん@お腹いっぱい。:2008/05/22(木) 22:03:03
>>23
すみません。それをa.txtに保存したいです。
25名無しさん@お腹いっぱい。:2008/05/22(木) 22:13:05
(rm a.txt; grep -v bbb > a.txt) < a.txt
26名無しさん@お腹いっぱい。:2008/05/22(木) 22:42:55
$ sed -e '/bbb/d' -i '' a.txt
27名無しさん@お腹いっぱい。:2008/05/22(木) 22:43:28
>>25
すみません。iノード番号を変えずに保存したいです。
2822本人です ◆wSaCDPDEl2 :2008/05/22(木) 22:50:27
>>26
ありがとう!sedでやりたかったです。
でもsedは使えるはずなのにエラーが出てしまいました。
エラー「sed: を読み込めません: そのようなファイルやディレクトリはありません」
バージョンが違うのでしょうか?ちなみにLINUXでやってます。
2922本人です ◆wSaCDPDEl2 :2008/05/22(木) 22:53:42
あ、できました。
sed -i '/bbb/d' a.txt
みなさん初心者にも親切に教えてくれてやさしいですね。
ありがとうございました。
30名無しさん@お腹いっぱい。:2008/05/22(木) 23:24:52
>>29
おいおい、
sed -i '/bbb/d' a.txt
だと i-node番号変わるぞ。i-node番号変えちゃ駄目(>>27) じゃないのか?
31名無しさん@お腹いっぱい。:2008/05/22(木) 23:30:06
それは俺の創作だ。正直すまんかった。
32名無しさん@お腹いっぱい。:2008/05/22(木) 23:34:24
>>22 >>27
iノード番号を変えずに a.txtを修正する方法の正解の md5を貼っておくぞ。
25fe9a9dfa4248593f6aa361db01a222

さあ、オマエラ考えてみろ。
33名無しさん@お腹いっぱい。:2008/05/23(金) 00:30:59
cat a.txt > tmp; sed '/bbb/d' tmp > a.txt; rm tmp
34名無しさん@お腹いっぱい。:2008/05/23(金) 00:39:56
なんでiノード番号変わっちゃだめなの?
35名無しさん@お腹いっぱい。:2008/05/23(金) 06:44:52
>>33
一時ファイル作っちゃ駄目
36名無しさん@お腹いっぱい。:2008/05/23(金) 06:49:17
>>34
a.txtが他のファイルとハードリンクしていた場合、
sed -i とかだとハードリンクが切れてしまう。
37名無しさん@お腹いっぱい。:2008/05/23(金) 09:35:47
printf "g/bbb/d\nwq\n" | ed a.txt
38名無しさん@お腹いっぱい。:2008/05/23(金) 11:25:56
>>36
sed -iって、viなんかで編集するのとは違う理屈で動いているってことかな?
39名無しさん@お腹いっぱい。:2008/05/23(金) 23:19:47
GNU sedのソースを見てみたが、inplace編集では、テンポラリファイルを
開いて書き込んだのちリネームしているね。
sed-4.1.5/sed/execute.c:658 (開く方)
sed-4.1.5/sed/execute.c:712 (閉じる方)

40名無しさん@お腹いっぱい。:2008/05/24(土) 16:21:15
オーナーを保存できないじゃないか
41名無しさん@お腹いっぱい。:2008/05/25(日) 08:58:02
カレントディレクトリに、
hoge-1.22.3.tar.gz
hoge-1.23.tar.gz
hoge-1.24.1.tar.gz
fuga-3.31.1.tar.gz
fuga-3.5.4.tar.gz
:

みたいなソースのtarボールがたくさんあります。
これらのファイルのファイル名を見て、
最新バージョンだけ残して、最新以外のファイルを削除するシェルは
どうやったら発行できますか?

なお、タイムスタンプは当てにならないので、
あくまでファイル名だけで判断してください。
42名無しさん@お腹いっぱい。:2008/05/25(日) 09:09:54
シェルってゆうな。クズ。
発行ってゆうな。クズ。
43名無しさん@お腹いっぱい。:2008/05/25(日) 09:23:44
定番の突っ込み乙。で回答は?
44名無しさん@お腹いっぱい。:2008/05/25(日) 09:35:44
>>42
ウチの会社でシェって呼ぶ人もいるよ
45名無しさん@お腹いっぱい。:2008/05/25(日) 10:19:39
>>43
そもそも最新バージョンとそれ以外を同じところに溜めたのが間違い。
46名無しさん@お腹いっぱい。:2008/05/25(日) 12:39:54
パッケージ名の定義、バージョンの新旧の定義をしろ。
47名無しさん@お腹いっぱい。:2008/05/25(日) 13:18:17
>>46
お前自身の定義でいいから答えてみろよw
48名無しさん@お腹いっぱい。:2008/05/25(日) 14:06:29
断る。
49名無しさん@お腹いっぱい。:2008/05/25(日) 15:06:27
×断る。
○能力不足のためできない。
50名無しさん@お腹いっぱい。:2008/05/25(日) 15:38:11
「答えられないなら黙ってろ」というポリシーは変えたのか? www
51名無しさん@お腹いっぱい。:2008/05/25(日) 15:54:09
>>45-46 >>48
答えられないなら黙ってろ
52名無しさん@お腹いっぱい。:2008/05/25(日) 17:39:31
ぽまいら へるぷ!

hoge0501-0000.wav
hoge0501-0100.wav
hoge0501-0900.wav

の複数ファイルをmp3で小さくしたいのですよ
hoge0501-0000.wav →  hoge0501-0000.mp3

ってか0000の部分を0000のままにしたいのですが…
なんかいい知恵を!!! おながいします
lameとかgogoの使い方は大丈夫ですw
53名無しさん@お腹いっぱい。:2008/05/25(日) 17:51:01
>>52

infile=hoge0501-0000.wav
outfile=`basename $infile .wav`.mp3

あとは lameとかで $infile と $outfile を参照。
54名無しさん@お腹いっぱい。:2008/05/25(日) 18:04:34
>>52 おお、ファイル名そのものを変数としるのね

dクス! さっそくやってみます!!
55便乗炭/びんじょうたん:2008/05/25(日) 22:20:47
あのぉ〜。。。。。

>>53 を連続で処理するには?
56名無しさん@お腹いっぱい。:2008/05/25(日) 22:32:03
for infile in "$@";do outfile=`basename $infile .wav`.mp3; 変換する ;done
57便乗炭!:2008/05/26(月) 00:17:11
>>56 ご丁寧にありがとうございます orz szo ヘコヘコ
58名無しさん@お腹いっぱい。:2008/05/27(火) 18:01:23
質問です。
if文で現在起動中のデーモンを確認するにはどうしたらいいでしょうか?
59名無しさん@お腹いっぱい。:2008/05/27(火) 18:14:00
60名無しさん@お腹いっぱい。:2008/05/27(火) 18:14:58
そんな事どうだっていいだろうがカス
61名無しさん@お腹いっぱい。:2008/05/27(火) 18:18:01
図星かw
62名無しさん@お腹いっぱい。:2008/05/27(火) 18:51:36
>>59 >>61
わからないなら黙ってろ
63名無しさん@お腹いっぱい。:2008/05/27(火) 19:07:31
>>60>>62
君も黙ってなよw
言ってることは同意だけど。
64名無しさん@お腹いっぱい。:2008/05/27(火) 19:09:55
pgrepは戻り値返すよ。
if pgrep hoge; then
何か
fi
で桶。
65名無しさん@お腹いっぱい。:2008/05/27(火) 20:15:40
>>64
ありがとうございました
66名無しさん@お腹いっぱい。:2008/05/27(火) 21:20:30
>>64
pgrep で確認してるのであって、if で確認してるわけじゃないと思うが。
67名無しさん@お腹いっぱい。:2008/05/27(火) 21:34:58
>>66
本人がいいって言ってるんだから、それがすべて
68名無しさん@お腹いっぱい。:2008/05/28(水) 01:35:31
>>66
Cでも何でも条件で確認して、ifはその結果で分岐するだけだと思うが。
69名無しさん@お腹いっぱい。:2008/05/28(水) 21:18:30
1から100までの乱数を得るとかってでないですかね
70名無しさん@お腹いっぱい。:2008/05/28(水) 21:22:39
>>69
echo $((RANDOM*100/32768+1))
71名無しさん@お腹いっぱい。:2008/05/28(水) 22:07:29
ありがとうございます
変数であるんですね
ちなみに32768というのは?
72名無しさん@お腹いっぱい。:2008/05/28(水) 22:09:29
2の15乗。15bit乱数だから。
73名無しさん@お腹いっぱい。:2008/05/28(水) 22:10:32
bash依存乙w
74名無しさん@お腹いっぱい。:2008/05/28(水) 22:28:12
だからksh由来だと何度(ry
75名無しさん@お腹いっぱい。:2008/05/28(水) 22:29:03
>>73-74
わからないなら黙ってろ
76名無しさん@お腹いっぱい。:2008/05/28(水) 22:45:00
純正シェルだとどうやるの?
77名無しさん@お腹いっぱい。:2008/05/28(水) 23:09:49
純正ってナニ?
78名無しさん@お腹いっぱい。:2008/05/28(水) 23:16:10
bshじゃないか?
bashじゃ無いオリジナルの
79名無しさん@お腹いっぱい。:2008/05/29(木) 01:10:09
むかし、Bee Shell(ミツバチシェル)ってのを使ったことがあるせいか、
Bourne Shellのことはshか/bin/shと書いた方がいいような気がする。
80名無しさん@お腹いっぱい。:2008/05/29(木) 02:18:20
sh が bashのリンクになってるのって最近のlinuxだけ?
81名無しさん@お腹いっぱい。:2008/05/29(木) 03:11:30
>>79
HP-UXやAIXはksh改変版が使われている。
なんで、kshで拡張された便利機能もほとんど使えるようになっている。
82名無しさん@お腹いっぱい。:2008/05/29(木) 05:28:36
>>80
UbuntuやDebianの/bin/shはdash
83名無しさん@お腹いっぱい。:2008/05/29(木) 06:45:40
能書きはいいから、純正シェルでのやりかた答えろ
84名無しさん@お腹いっぱい。:2008/05/29(木) 07:08:01
>>66>>83
なんなの、この屑は
85名無しさん@お腹いっぱい。:2008/05/29(木) 07:24:03
純正シェルなんて言葉どこで覚えてきたんだ?
86名無しさん@お腹いっぱい。:2008/05/29(木) 07:27:42
>>85
わからないなら黙ってろ
87名無しさん@お腹いっぱい。:2008/05/29(木) 07:28:49
はーーーーーーい
88名無しさん@お腹いっぱい。:2008/05/29(木) 07:34:09
>>83
echo $$
8969:2008/05/29(木) 10:47:07
すいません
>>79をループして繰り返すと
3
20
43
70
81
10
15
49
60
87
みたいに1から100の間で増えて戻って増えてを繰り返します
この規則性をなくせないですか?
90名無しさん@お腹いっぱい。:2008/05/29(木) 11:10:35
>>89
echo $(($(head -c 2 /dev/urandom | od -An -d)*100/65536+1))
91名無しさん@お腹いっぱい。:2008/05/29(木) 12:59:00
おお
意味はまったく理解不能ですがこれでいけそうです
ありがとうございます
92名無しさん@お腹いっぱい。:2008/05/29(木) 13:20:20
>>90
OS依存、GNU依存、bash依存乙。
93名無しさん@お腹いっぱい。:2008/05/29(木) 13:24:26
>>92
わからないなら黙ってろ
94名無しさん@お腹いっぱい。:2008/05/29(木) 13:34:33
純正シェルではどうやるの?
95名無しさん@お腹いっぱい。:2008/05/29(木) 16:32:15
純正シェルでは

rm /bin
96名無しさん@お腹いっぱい。:2008/05/29(木) 17:05:04
>>95
わからないなら黙ってろ
97名無しさん@お腹いっぱい。:2008/05/29(木) 17:14:20
>>96
わからないなら黙ってろ
98名無しさん@お腹いっぱい。:2008/05/29(木) 18:14:00
わからないならオナってろ
99名無しさん@お腹いっぱい。:2008/05/29(木) 22:09:56
>>92
いちいち五月蝿いよ。
よりポータブルに直したい奴は、直して自分で書けばいいよ。
100名無しさん@お腹いっぱい。:2008/05/29(木) 23:02:12
>>99
>1
> bash/zsh/ksh/ashなどに依存する場合は明示しましょう。

って事なんじゃね。
つまり嫌味を言いながら実はこの決まりを代行してるツンデレ。

あと>92-94は>73-76の74が足りないな。おしい。
101名無しさん@お腹いっぱい。:2008/05/29(木) 23:12:48
>>100
わからないなら黙ってろ
102名無しさん@お腹いっぱい。:2008/05/29(木) 23:14:45
うるさいのが一人いるなッ
103名無しさん@お腹いっぱい。:2008/05/30(金) 00:38:12
104名無しさん@お腹いっぱい。:2008/05/30(金) 00:42:35
でも、言ってることは正しいな
書くべきだよねえ
105名無しさん@お腹いっぱい。:2008/05/30(金) 06:43:58
>>101
わかっているから黙ってない
106名無しさん@お腹いっぱい。:2008/05/30(金) 07:57:37
>>100
明記できる奴は明記すればいい。
ポータブルに直せる奴は直せばいい。

>>92みたいな屑が一番邪魔。
107名無しさん@お腹いっぱい。:2008/05/30(金) 08:45:48
質問者が環境をちゃんと書けばいいんだよ。
108名無しさん@お腹いっぱい。:2008/05/30(金) 08:50:20
質問者の環境にかかわらず、純正シェルで動くことが条件。
109名無しさん@お腹いっぱい。:2008/05/30(金) 09:59:15
質問テンプレ

使っているOS名・バージョン: (※LinuxユーザはLinux板へ)
使っているシェルの名前・バージョン:
使っているシェルのフルパス:
移植性: 上記環境で動けば十分 / 多くの環境で動かす必要がある
110名無しさん@お腹いっぱい。:2008/05/30(金) 10:12:44
GNU/Linux, *BSD使い始めたころから補完ができるってだけの理由で特に理由もなくBash使ってるけど
他に何か良いShellないかな。
Bashに特に不満はないけど。
111名無しさん@お腹いっぱい。:2008/05/30(金) 10:28:30
zsh使ってみれば
112名無しさん@お腹いっぱい。:2008/05/30(金) 10:28:37
>>109 氏からの回答が欲しい場合は >>109 に従ってね。
でも俺はエスパーだから、OSとかバージョンとか書かなくても回答できちゃうよ。
気軽に質問してね。もち、Linuxユーザーの質問もOK。
113名無しさん@お腹いっぱい。:2008/05/30(金) 11:14:08
エスパー>>112からの回答が欲しい場合はエスパースレへ。
http://pc11.2ch.net/test/read.cgi/unix/1207042632/

前任のエスパーは質問者の環境壊して再インストールさせる低レベルだったけど、
>>112はそんなアホじゃないだろうと期待。
114名無しさん@お腹いっぱい。:2008/05/30(金) 11:41:59
カレントに移動しないと起動できないソフトがあります。
これを、カレントを移動しなくて済むようにするシェルはできませんか?
>>109 さん以外の方、回答をよろしくお願いします。
115名無しさん@お腹いっぱい。:2008/05/30(金) 13:39:40
CentOS bin/bashの条件式での質問です。

前提としまして、file1、file2、file3、file4という似たファイル名が
複数あるとします。
そこで条件式内で、[ -e file* ]
というようなfileから始まるファイルに一致させたいのですが
どのように記述したら宜しいのでしょうか?
116名無しさん@お腹いっぱい。:2008/05/30(金) 13:40:52
>>115
シェルスクリプト総合@LINUX Part4
http://pc11.2ch.net/test/read.cgi/linux/1210999497/
117名無しさん@お腹いっぱい。:2008/05/30(金) 13:44:34
>>115
そういう場合はlsの戻り値を使う。

if ls file* > /dev/null 2>&1 ; then
hoge
fi
118名無しさん@お腹いっぱい。:2008/05/30(金) 13:45:16
>>116
わからないなら黙ってろ
119名無しさん@お腹いっぱい。:2008/05/30(金) 13:48:09
>>116
スレ間違えてしまいすいません、誘導ありがとうございます。
>>117
lsの戻り値を条件式で使えたとは盲点でした。多少分からない
箇所がありますので調べつつ挑戦します。ありがとうございました
120名無しさん@お腹いっぱい。:2008/05/30(金) 14:10:40
>>118
わかっちゃいるけどやめられない
121名無しさん@お腹いっぱい。:2008/05/30(金) 20:38:57
>>114
普通に、

#!/bin/sh
cd /path/to/hoge
exec ./hogesoft "$@"

で桶。cdしてしまうように見えるが、シェルスクリプト自体が別シェルなので
カレントディレクトリは実行時のディレクトリから変わらない。
122名無しさん@お腹いっぱい。:2008/05/31(土) 03:49:40
こんなスクリプトを書いてプロセス監視&常時起動させていますが、
数時間走らせると、★の行を食ったまま、停止してしまいます。 orz
原因&解決策か、もしくはタイムアウトを設定する方法を
ご教示いただけませんでしょうか。。

#!/bin/sh
while true
do
★ret=`ps -ef | grep "collector.php" | grep -v grep | wc -l`
if [ $ret -eq 0 ]; then
php /hoge.php &
fi
sleep 1
done
123名無しさん@お腹いっぱい。:2008/05/31(土) 06:14:58
pgrepないの?
124名無しさん@お腹いっぱい。:2008/05/31(土) 07:19:56
>>122
まず、wc -lしたりretに代入したりしてるのが無駄。
grepは戻り値返すから、

if ps -ef | grep "collector.php" | grep -v grep > /dev/null; then

で桶。
125名無しさん@お腹いっぱい。:2008/05/31(土) 07:34:52
>>122
発想を転換しろ。
もし、php /hoge.phpを起動して、落ちたら再度起動、ってやりたいだけなら、

while :
do
php /hoge.php
done

だけでOK。&は付けない。sleepもpsも必要なし。
126名無しさん@お腹いっぱい。:2008/05/31(土) 17:03:52
>>123,124
ありがとう、おっしゃる通り。
試してみます。

>>125
惜しい。
実はhoge.phpは1種類ではなく、3種類存在します。
実際はret〜fi間が、3個あり、hoge1.php〜hoge3.phpを対象にチェックしています。
>>122のコードで、collector.phpとhoge.phpは同一です。コピペミススマソ。
#!/bin/sh
while true
do
★ret=`ps -ef | grep "hoge1.php" | grep -v grep | wc -l`
if [ $ret -eq 0 ]; then
php /hoge1.php &
fi
★ret=`ps -ef | grep "hoge2.php" | grep -v grep | wc -l`
if [ $ret -eq 0 ]; then
php /hoge2.php &
fi
★ret=`ps -ef | grep "hoge3.php" | grep -v grep | wc -l`
if [ $ret -eq 0 ]; then
php /hoge3.php &
fi
sleep 1
done

hoge1.php の終了を待たずに hoge2.php や hoge3.php の
プロセスチェック&起動を行いたいため、末尾に&を付けている次第です。

hoge1.php〜hoge3.php毎にシェルスクリプトを3個作成すれば
>>125の通りで期待が叶いますが、それはそれで無駄な感じがしまして。
127名無しさん@お腹いっぱい。:2008/05/31(土) 17:23:55
>>126
シェルスクリプトひとつでできる。
while文の最後のdoneに &を付けるのがポイント。


while :
do
php /hoge1.php
done &

while :
do
php /hoge2.php
done &

while :
do
php /hoge3.php
done &
128名無しさん@お腹いっぱい。:2008/05/31(土) 18:12:48
>>127
げ、すげぇ。できました。。プロセスが3つ立ち上がるのですね。
ありがとうございます!!
シェルスクリプトすごいっすねぇ。。。感動。
129名無しさん@お腹いっぱい。:2008/05/31(土) 18:53:56
質問: grep の -q オプションってどの grep(1) でも使えたっけ?
130名無しさん@お腹いっぱい。:2008/05/31(土) 18:55:12
年中無休発狂妄想爆裂憤死寸前粘着真性キチガイ包茎池沼病気猿男(狂猿)◆QfF6cO2gD6による気違いカキコの続き:

初心者もOK! FreeBSD質問スレッド その95
http://pc11.2ch.net/test/read.cgi/unix/1210728872/706-708,710,712

706 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 16:24:19
AAとコピペばっか

707 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 16:25:33
アク禁報告を誰もしてないのが不思議w
してても無視されてるのか

708 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 16:31:15
>>704
假性ですが何か?

710 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 17:45:14
粘着キチガイ男(狂犬)をアク禁にしたらリアルに無差別殺人起こす可能性が高いからな。

712 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 17:59:51
ビビって書き込み止めたのか?と煽ってみる
--------------------------------------------------------------------------------------------
UNIX板のあちこちのスレッドを荒らしている凶悪メンヘラ・真性キチガイ猿粘着◆QfF6cO2gD6。
いつも荒らしを憎むようなレスをするが、実際に荒らしているのは自分。
気色の悪い年中無休発狂粘着真性キチガイ包茎池沼病気猿男(狂猿)◆QfF6cO2gD6があちこちのスレに
遂に理解できないような基地害カキコをし始めた!気持ちが悪い…。
131名無しさん@お腹いっぱい。:2008/05/31(土) 19:09:54
>>129
unlike GNU grep, traditional grep did not conform to
POSIX.2, because traditional grep lacked a -q option and
its -s option behaved like GNU grep’s -q option. Shell scripts
intended to be portable to traditional grep should avoid both -q
and -s and should redirect output to /dev/null instead.
132名無しさん@お腹いっぱい。:2008/05/31(土) 19:11:42
ヘブライ語でおk
133名無しさん@お腹いっぱい。:2008/05/31(土) 19:24:58
要約すると、-qオプションがない古いgrepもあるから、
grep hoge > /dev/null にした方が移植性が高いってこと。
134名無しさん@お腹いっぱい。:2008/05/31(土) 19:36:58
>>131 >>133 Danke schoen
135名無しさん@お腹いっぱい。:2008/05/31(土) 19:48:04
Bitte schöen
136名無しさん@お腹いっぱい。:2008/06/01(日) 08:07:21
質問です。
5から10までの数字をランダムに、しかも2桁に揃えて表示させたい。
空欄を埋めてください。

#!/bin/sh

空欄

echo $randtime
137名無しさん@お腹いっぱい。:2008/06/01(日) 08:12:38
>>136

randtime=`expr 0$((RANDOM*6/32768+5)) : '.*\(..\)'`
138名無しさん@お腹いっぱい。:2008/06/01(日) 16:33:54
rand() {
    dd if=/dev/random bs=1 count=2 2>/dev/null | od -A n -t u
}
randtime=$(printf "%02d" $(( 5 + $(rand) % 6 )))
139名無しさん@お腹いっぱい。:2008/06/01(日) 17:01:40
純正シェル、かつ、printf(1)なし環境でも動く方法:

randtime=`expr 0\`expr \\\`date +%S\\\` % 6 + 5\` : '.*\(..\)'`

` `が3重ネストしてるので注意。
140名無しさん@お腹いっぱい。:2008/06/01(日) 19:57:10
(;ω;)たちけて〜
#!/bin/sh
i=0
while [ $i -le 23 ] ;do
time=`printf $i"%02d\n"`
i=`expr $i + 1`
echo $time
done

↓結果↓  ↓目的↓
000       0000
100              0100
200              0200
        ・・・略
1000            1000
1100            1100
        ・・・略
2300            2300

0000〜2300 最初から出力4桁にしたいでつ・・・ 
どこがおかしいのかおせいて〜(;ω;)ブワッ
141名無しさん@お腹いっぱい。:2008/06/01(日) 20:02:40
printf "%02d00\n" {01..23}
142名無しさん@お腹いっぱい。:2008/06/01(日) 20:18:41
>>140
i=0;while [ $i -le 23 ];do printf '%02d00\n' $i;i=`expr $i + 1`;done


>>141
bash依存失格。
143名無しさん@お腹いっぱい。:2008/06/01(日) 20:33:37
seqが使えるなら
seq -f "%02g00" 0 23

awkで書くなら
awk 'BEGIN { for (i = 0; i < 24; i++) printf("%02d00\n", i) }'
144名無しさん@お腹いっぱい。:2008/06/01(日) 20:51:55
printfがないOSもある。

i=0;while [ $i -le 23 ];do expr 0"$i"00 : '.*\(....\)';i=`expr $i + 1`;done
145名無しさん@お腹いっぱい。:2008/06/01(日) 20:58:05
exprはどこにでもあるの?
146名無しさん@お腹いっぱい。:2008/06/01(日) 21:05:12
exprもないOSのために、
純正シェルで、内部コマンドのみで実現。

z=0;set -;while [ $# -le 23 ]; do [ $# -ge 10 ] && z=; echo $z$#00; set "$@" d; done
147名無しさん@お腹いっぱい。:2008/06/01(日) 23:56:19
>>140でつ

>>141 エラーが出てしまった・・・・・・{01..23}の書き方はzshらしいです
>>142 でけた!
>>143 sedあります! あ、seqか 出来た出来たです!
>>144 printfあるけどその方法もでけた!
>>145 Linux/FedoraとCentには入ってましたSunOSや*BSDは存じ上げません
>>146 set の使い方がにくいですw

>>142-146 Grateful !!
148名無しさん@お腹いっぱい。:2008/06/02(月) 00:13:39
cat -n とか nl とか使う手もあるよね
149名無しさん@お腹いっぱい。:2008/06/02(月) 01:37:46
Bシェルで質問です。
あるディレクトリのstyファイルの文字コードを全てnkf -sで変換するシェルを作りたいのです。
しかし、全てのファイルに対して操作する方法がわかりません。
つまり、
nkf -s *.sty > *.sty2
mv *.sty2 > *.sty
rm *.sty2
みたいなことがやりたいんですが、この部分どうしたらいいのでしょうか。
150名無しさん@お腹いっぱい。:2008/06/02(月) 01:58:11
>> 149

for i in *.sty; do nkf -s $i > $i.sjis; mv $i.sjis $i; done
151名無しさん@お腹いっぱい。:2008/06/02(月) 01:59:07
find使う
152名無しさん@お腹いっぱい。:2008/06/02(月) 09:07:16
>>149
シェルってゆうな。クズ。
153名無しさん@お腹いっぱい。:2008/06/02(月) 11:15:53
>>149
nkf -s --overwrite *.sty
154名無しさん@お腹いっぱい。:2008/06/02(月) 11:19:34
シェルってゆうなってうるさい奴ってなんなの?バカなの?
スクリプトのスレなんだから分かるだろうが。氏ねよめんどうくせえ
155名無しさん@お腹いっぱい。:2008/06/02(月) 11:23:38
HDDのバックアップを効率的に行なうシェルを発光したいんですが、
初心者でも簡単にできますか?
156名無しさん@お腹いっぱい。:2008/06/02(月) 11:25:29
スルーできないやつってなんなの?
157名無しさん@お腹いっぱい。:2008/06/02(月) 11:27:00
お助けください。
.(ドット)で区切って後ろから1番目と2番目を抜き取るにはどうしたらいいでしょうか?

例えば
aaa.bbb.ccc.dddをccc.dddに置換したいです。
158名無しさん@お腹いっぱい。:2008/06/02(月) 11:30:19
>>157
sed 's/[^\.]*\.[^\.]*\.//'
cut -d. -f3-
159名無しさん@お腹いっぱい。:2008/06/02(月) 11:32:03
あ、前2つを削るんじゃなく後ろ2つを残すのか。
160名無しさん@お腹いっぱい。:2008/06/02(月) 11:33:56
>>157
hoge=aaa.bbb.ccc.ddd
expr $hoge : '.*\.\([^.][^.]*\.[^.][^.]*\)'

と言うシェルが発酵できます。
161名無しさん@お腹いっぱい。:2008/06/02(月) 11:48:33
純正シェル、内部コマンドオンリーバージョンを求めるなら、

hoge=aaa.bbb.ccc.ddd

IFS=.
set $hoge
while [ $# -gt 2 ]; do shift; done
echo $1.$2
162名無しさん@お腹いっぱい。:2008/06/02(月) 11:52:17
echo "aaa.bbb.ccc.ddd" | sed -e 's/^\(.*\)\.\([^\.]*\)\.\([^\.]*\)$/\3.\2/'
163名無しさん@お腹いっぱい。:2008/06/02(月) 11:53:41
ごめん。なんで \2 \3を入れ替えたんだろう?w
echo "aaa.bbb.ccc.ddd.eee" | sed -e 's/^\(.*\)\.\([^\.]*\)\.\([^\.]*\)$/\2.\3/'
164名無しさん@お腹いっぱい。:2008/06/02(月) 12:38:02
腐ってやがる 早すぎたんだ
165名無しさん@お腹いっぱい。:2008/06/02(月) 13:11:19
>>155
rsyncかddでググれ。
話はそれからだ。
166名無しさん@お腹いっぱい。:2008/06/02(月) 13:18:04
>>165
発光は?
167名無しさん@お腹いっぱい。:2008/06/02(月) 17:16:08
echo ^G
168名無しさん@お腹いっぱい。:2008/06/02(月) 17:22:42
vbell限定だた
169名無しさん@お腹いっぱい。:2008/06/02(月) 17:24:11
while :
do
xset led 1
sleep 1
xset -led 1
sleep 1
done
170名無しさん@お腹いっぱい。:2008/06/02(月) 17:35:15
for hoge in *.*.*
do mv $hoge $(echo $hoge |awk -F. '{print $(NF-1)"."$NF}')
done
171名無しさん@お腹いっぱい。:2008/06/02(月) 17:36:25
あ、違った
172名無しさん@お腹いっぱい。:2008/06/02(月) 19:32:14
banner をもっと長い文字列で使いたいんですが
173名無しさん@お腹いっぱい。:2008/06/02(月) 21:28:24
そうですか
174名無しさん@お腹いっぱい。:2008/06/02(月) 21:34:12
自分で発光したシェルをコマンド化するにはどうするんですか?
もしかして、コンパイルとか打つんですか?
175名無しさん@お腹いっぱい。:2008/06/02(月) 21:39:12
そーでーす
176名無しさん@お腹いっぱい。:2008/06/02(月) 21:45:14
ふたつのテキストファイルがあったとします。
テキストファイルの中の文章は単語が改行で区切られています。

$ cat 1.txt
apple
book
cat
desk
earth
fuck

$ cat 2.txt
april
born
cook
dinner
engine
fuck

1.txt と 2.txt で完全一致しているものを抽出するシンプルな方法を
探しています。何か良い方法ありませんか?
177名無しさん@お腹いっぱい。:2008/06/02(月) 21:55:33
sortしたものをdiffやcommに食わせるのが簡単だけど。
並べ替えアウト?
178名無しさん@お腹いっぱい。:2008/06/02(月) 21:59:29
それぞれ、中身に同じ行がないなら、
sort 1.txt 2.txt | uniq -d
かな
179名無しさん@お腹いっぱい。:2008/06/02(月) 22:02:55
>>177OKです。
>>178完璧です。ありがとうございました。
180名無しさん@お腹いっぱい。:2008/06/03(火) 00:15:13
sh -c 'echo $1' a b c
で、b が出るのは正常?
181名無しさん@お腹いっぱい。:2008/06/03(火) 00:39:14
正常
182名無しさん@お腹いっぱい。:2008/06/03(火) 02:06:40
>>158 >>160 >>161
ありがとうございました!感謝!
183名無しさん@お腹いっぱい。:2008/06/03(火) 03:43:47
質問です。
aaa=`commando1`
bbb=`commando2`
このような「``」内のコマンドを1つにまとめるにはどうしたらいいでしょうか?

例えば
#!/bin/sh

temp=`ls -l $1`
pram=`echo $temp | cut -d " " -f 6-8`
echo $pram

tempとpramで分けてるものを1行でまとめたいです。
184名無しさん@お腹いっぱい。:2008/06/03(火) 04:07:13
ネストすればいい。
185名無しさん@お腹いっぱい。:2008/06/03(火) 06:53:17
>>183
ネストする必要ない。というか、tempに入れる必要ない。

pram=`ls -l $1 | cut -d " " -f 6-8`
186名無しさん@お腹いっぱい。:2008/06/03(火) 12:01:25
>>184
一般論の話だろ。
その例に限れば、それでいいけど。
187名無しさん@お腹いっぱい。:2008/06/03(火) 12:44:26
POSIXシェルを仮定して「$()」使うのが正解。
188名無しさん@お腹いっぱい。:2008/06/03(火) 13:08:58
>>187
アフォか
189名無しさん@お腹いっぱい。:2008/06/03(火) 13:12:22
>>183
一般論として、

aaa=`command1`
bbb=`command2 $aaa`

なら、

bbb=`command2 \`command1\``

で桶。
190名無しさん@お腹いっぱい。:2008/06/03(火) 13:17:54
>>188
なんで?
191名無しさん@お腹いっぱい。:2008/06/03(火) 13:19:05
純正シェルで動かないから。
>>189 という正解があるのに、わざわざポータビリティを落す $()を使う必要ないから。
192名無しさん@お腹いっぱい。:2008/06/03(火) 13:21:04
>>191
可読性が落ちる。
193名無しさん@お腹いっぱい。:2008/06/03(火) 13:22:50
>>192
それはシェルに慣れてないお前だけ。
194名無しさん@お腹いっぱい。:2008/06/03(火) 13:23:46
3重、4重のネストが必要なときはどうするのだ? www
大半のシステムで使用できる$()を避けて可読性を劣化させる必要は無い。
このスレに巣食っている原理主義者以外は$()使うのが正解。
195名無しさん@お腹いっぱい。:2008/06/03(火) 13:24:12
>>181
一般論として仮定しちゃって良い?
196名無しさん@お腹いっぱい。:2008/06/03(火) 13:24:13
可読性を言うなら、むしろネスティングを避けて
一旦別変数に入れる方式の方がいいぞ。
>>183 の質問の逆をやれってことね。
197名無しさん@お腹いっぱい。:2008/06/03(火) 13:24:53
>>194
Solarisは大半のシステムじゃないのかい?
198名無しさん@お腹いっぱい。:2008/06/03(火) 13:27:12
Solaris?なにそれ、おいしいの?
199名無しさん@お腹いっぱい。:2008/06/03(火) 13:34:17
Solarisを見落としていた >>194 の負けだな
200名無しさん@お腹いっぱい。:2008/06/03(火) 13:36:22
>>194
3重ネストは \\\`command\\\`
4重ネストは \\\\\\\`command\\\\\\\`

何か問題ある?w
201名無しさん@お腹いっぱい。:2008/06/03(火) 13:41:28
Solarisならば、普通kshかxpg4シェル。
202名無しさん@お腹いっぱい。:2008/06/03(火) 20:09:41
質問させてください。

テキストファイルの内容が以下のようになっています。
日付 文字列

上記文字列に改行コードが存在する場合、以下のようになります
20080602 aaabbbccc
20080602 dddee
ef
ff
20080602 ggghhhiii

これをこのように正しく変換するにはどうしたらいいでしょうか?
20080602 aaabbbccc
20080602 dddeeefff
20080602 ggghhhiii




203名無しさん@お腹いっぱい。:2008/06/03(火) 20:18:28
202の続き

とりあえずない頭を絞って先頭文字が「2008」でない行に|を入れて以下のような
レイアウトにし

例)
20080602 aaabbbccc
20080602 dddee
|ef
|ff
20080602 g
|gg
|hhhi
|ii

過去ログにあったコマンドを参考に以下のコマンドを実行しましたが
「(rm a.txt; sed 'N; s/\n|//; P; D' > a.txt) < a.txt 」

例)
20080602 aaabbbccc
20080602 dddeeef
|ff
20080602 ggg
|hhhiii

と、いった感じですべて変換することができません。

よろしくお願いします。
204名無しさん@お腹いっぱい。:2008/06/03(火) 20:41:47
>>202
これでどうだ。
頭に余分な空行が出るのは無視してね


while read line
do
set $line
if [ $# = 1 ]; then
echo -n $1
else
echo
echo -n $1 $2
fi
done < file.txt
echo
205名無しさん@お腹いっぱい。:2008/06/03(火) 21:33:33
>>204
ありがとうございます。

すみません。わたしの記載漏れになりますが文字列の中にはスペースも存在します。
詳しく言いますとこの文字列とはSQLなのです。
なので「select * from table」のようになります。

せっかく考えて頂いたのにすみませんでした。

206名無しさん@お腹いっぱい。:2008/06/03(火) 21:38:11
後出し乙。これで回答を得られることはないであろう。
207名無しさん@お腹いっぱい。:2008/06/03(火) 21:46:02
わしが代わりに答えてあげよう。
正解のmd5じゃ。
9c42265ebade7ace4e45b75b8d41f7ab
208名無しさん@お腹いっぱい。:2008/06/03(火) 22:45:18
初心者な質問ですいません。
自分で書いたシェルをコマンドとして発光するにはどうするんですか?
209名無しさん@お腹いっぱい。:2008/06/03(火) 22:47:26
発酵させるには、ながーい時間がかかるよ
210名無しさん@お腹いっぱい。:2008/06/03(火) 23:22:26
>>207
お題を自分で解いた(かもしれない)だけで、答えたことになってないよな
211名無しさん@お腹いっぱい。:2008/06/04(水) 06:27:08
>>207
そのmd5逆算したところ、確かに動きました。感謝です。
212名無しさん@お腹いっぱい。:2008/06/04(水) 07:33:03
すげぇなおい
213名無しさん@お腹いっぱい。:2008/06/04(水) 11:28:09
>>202
どっちも書き方として邪道かつ汚いけど結果オーライなら。

cat $SQL_FILE | awk '{ if(/^20[0-9]+ /) { printf "\n"; } printf $0; } END { printf "\n" }'
cat $SQL_FILE | perl -ne 'chop; print "\n" if(/^\d{8}\s/); print; END{ print "\n" }'
214名無しさん@お腹いっぱい。:2008/06/04(水) 15:08:22
全然シェルスクリプトじゃない件
215名無しさん@お腹いっぱい。:2008/06/04(水) 15:17:43
#!/bin/sh

awk '{ if(/^20[0-9]+ /) { printf "\n"; } printf $0; } END { printf "\n" }'
216名無しさん@お腹いっぱい。:2008/06/04(水) 15:22:33
awkスレと聞いて
217215:2008/06/04(水) 15:27:14
まぁ >>6 にも入ってるし、sed awk はテキスト処理では欠かせないな。
>>213 は、改行コードの扱い方が珍妙で、よく出来てると思った。
218名無しさん@お腹いっぱい。:2008/06/04(水) 23:33:14
192168000001 を 192.168.0.1 に変換するスマートな方法を教えてください。
一オクテットが、3 ケタずつに区切られています。
219名無しさん@お腹いっぱい。:2008/06/04(水) 23:43:18
echo 192168000001 |
sed 's/.../& /g' |
awk '{print $1+0 "." $2+0 "." $3+0 "." $4+0}'
220202:2008/06/04(水) 23:45:50
>>213
ありがとうございます。

出来ました。
なるほど改行コードを削除することに躍起になっていましたが、
マッチした時だけ前に改行コードを付けるというやり方もあるんですね。
なかなか思いつかない発想だったので勉強になりました
221名無しさん@お腹いっぱい。:2008/06/04(水) 23:54:42
echo 192168000001 | sed 's/.../&./g;s/¥.0*/./g;s/¥.¥./.0./g;s/¥.$//'

s/¥.00?/./ とか書きたいにゃー。
222名無しさん@お腹いっぱい。:2008/06/05(木) 00:02:30
echo 192168000001 | sed 's/.../& /g;s/ $//;s/ /./g'
223名無しさん@お腹いっぱい。:2008/06/05(木) 05:47:11
sh -c 'echo fugafuga'

eval 'echo fugafuga'
が異なるのは、どのような時なのでしょうか。
fugafugaの部分は任意です。
224名無しさん@お腹いっぱい。:2008/06/05(木) 06:33:34
>>220
おいおい、>>213 の改行付加の発想は >>204 と同じだぞ。
>>204 の時点でその方法に気づけ。
>>204 を改良して、スペースが入った場合の問題は対処できる。
awk/perlなどのシェル以外のものを使わずにね。
225名無しさん@お腹いっぱい。:2008/06/05(木) 06:37:46
>>223
たとえば、

set hoge
sh -c 'echo "$@"'

と、

set hoge
eval 'echo "$@"'

は異なる。
226名無しさん@お腹いっぱい。:2008/06/05(木) 14:30:52
すいません
スペース区切りの文字列をカンマ区切りに変えたいんですが、
スペースが一つとは限りません

a hoge
b ge
c h

これを
a,hoge
b,ge
b,h

こんな感じです
bashでできないですか?
awkも使えます
227名無しさん@お腹いっぱい。:2008/06/05(木) 14:33:22
すいません
条件がもう一つ
カラム数は固定じゃないです
228名無しさん@お腹いっぱい。:2008/06/05(木) 14:33:44
sedは禁止?

sed 's/ */,/g'
229名無しさん@お腹いっぱい。:2008/06/05(木) 14:35:50
while read line
do
    set -- $line
    echo -n $1
    shift
    for i in "$@"
    do
        echo -n ,$i
    done
    echo
done
230名無しさん@お腹いっぱい。:2008/06/05(木) 14:40:56
>>228
ダウト。試してから書き込めよ。
231名無しさん@お腹いっぱい。:2008/06/05(木) 14:42:08
>>230
試したよ。
何で2ch読んでる?
232名無しさん@お腹いっぱい。:2008/06/05(木) 14:45:44
何をどう試したんだ
233名無しさん@お腹いっぱい。:2008/06/05(木) 14:47:20
>>228
echo 'aaa bbb ccc' | sed 's/ */,/g'
,a,a,a,b,b,b,c,c,c,

234名無しさん@お腹いっぱい。:2008/06/05(木) 14:48:54
$ echo 'aaa bbb ccc' | sed 's/ */,/g'
aaa,bbb,ccc
235名無しさん@お腹いっぱい。:2008/06/05(木) 14:49:14
sedなら正解は、

sed 's/[ ][ ]*/,/g'
だな。
236名無しさん@お腹いっぱい。:2008/06/05(木) 14:50:50
>>234 をコピペして実行してみろw

$ echo 'aaa bbb ccc' | sed 's/ */,/g'
,a,a,a,b,b,b,c,c,c,

この問題を避けるには、>>235 が正解。
237名無しさん@お腹いっぱい。:2008/06/05(木) 15:05:50
「この問題」って、専ブラを使わずに煽る○○がいる問題って意味だな
238名無しさん@お腹いっぱい。:2008/06/05(木) 15:27:44
で、>>226は納得したのか?
239名無しさん@お腹いっぱい。:2008/06/06(金) 00:58:06
>>235
これの意味がよくわからんのだが・・・
なんでこれでいいの?
240名無しさん@お腹いっぱい。:2008/06/06(金) 01:19:14
[ ] の意味と>>230がキレた理由はわかるかね?
241名無しさん@お腹いっぱい。:2008/06/06(金) 01:23:10
>>239
解説するのも野暮だが…
>>230,>>232はスペースが2個あることに気付かず醜態を晒してしまったわけだが、
>>235のように書いておけば見落とし確率が下がって嬉しいという記法。
242239:2008/06/06(金) 01:37:14
>>240
>>241

すまん
shなんだけどlinux(fedora8)
じゃだめなんかな?

sh-3.2$ echo 'aaaaaa bbbbbbb ccc' | sed 's/[][]*/,/g'
,a,a,a,a,a,a, , , , , , , , , , , , , , ,b,b,b,b,b,b,b, , , , , , ,c,c,c,
sh-3.2$
243239:2008/06/06(金) 01:39:25
自己解決
[]じゃなくえ[ ]だったわ
あほだおれ
244名無しさん@お腹いっぱい。:2008/06/06(金) 04:51:10
あの夜、俺は初めて彼女とMMXした。
「もうそろそろiiyama? 君のI/ODATAを確かめたいんだ。XT」
MITSUMIあうと、彼女のMECはALBATRONとしていた。
緊張した俺は焦り彼女のソケット478をAOpenしようとした。
「ちょ、ちょっとRADEON!何をSis」もう俺は既にエレコム。
Sound Blasterのホックを外すとはちきれそうなPioneerがBarracuda
でもBIOSTARは意外と玄人志向だった。
「恥ずかしいわ。あまりミネベア・・・」
SCSIをTORICAるとKEIANをSOLTEKした痕がアルファデータ。
あそこはSUPERMICROだった。OMEGAドライバも少し鼻についた。
しかし、彼女のCREATIVEを刺激しつつ俺のセレロンを
彼女のSerial-ATAからASUSに這わせると、「FireWire〜ン」
「もう、ATI」「COREGA欲しいんだろ?」「早くリテール」
俺は激しくTSUKUMO。「インテルはいってるっ!IEEE!1394!」
「あぁ・・・もうDell!」
245名無しさん@お腹いっぱい。:2008/06/06(金) 06:19:56
OFSのあるawkなら、
awk 'BEGIN { OFS=","} { $1 = $1; print $0 }'
246名無しさん@お腹いっぱい。:2008/06/06(金) 06:32:12
>>241
見落としたのじゃなくて、本当に(HTML解釈上で)複数のスペースが
1個のスペースで表示されてしまうから、「>>228 >>234 をコピペしても動かない」が正解。
>>235 のように書き込めば、コピペしてもちゃんと動く。
醜態を晒したのは >>228 >>234 の方。

ちなみに、宣ブラ使ってもやっぱり >>228 >>234 のスペースはひとつだよ。
247名無しさん@お腹いっぱい。:2008/06/06(金) 08:07:53
ダサい専ブラ
248名無しさん@お腹いっぱい。:2008/06/06(金) 08:20:28
たしかにダサい専ブラだな。
249名無しさん@お腹いっぱい。:2008/06/06(金) 08:31:46
ブラウザ依存も、Bash依存同罪。
ポータビリティ考えて書き込めよ。
250名無しさん@お腹いっぱい。:2008/06/06(金) 08:41:33
いつのまにか落ちてたので、立てました。

zsh その5
http://pc11.2ch.net/test/read.cgi/unix/1212677877/
251名無しさん@お腹いっぱい。:2008/06/06(金) 08:45:33
sed -r 's/ +/,/g'
の方が良くね?
252名無しさん@お腹いっぱい。:2008/06/06(金) 08:49:28
どこのsedだよ
253名無しさん@お腹いっぱい。:2008/06/06(金) 08:50:10
/bin/sed
254名無しさん@お腹いっぱい。:2008/06/06(金) 08:51:37
$ type sed
sed is a shell builtin
255名無しさん@お腹いっぱい。:2008/06/06(金) 09:02:22
大半のシステムで使用できる sed -r を避けて可読性を劣化させる必要は無い。
このスレに巣食っている原理主義者以外は >>251 使うのが正解。
256名無しさん@お腹いっぱい。:2008/06/06(金) 09:20:12
自分が読めない = 可読性が低い
257名無しさん@お腹いっぱい。:2008/06/06(金) 10:01:25
sed 's/  */,/g'
これなら文句はねえよな?
258名無しさん@お腹いっぱい。:2008/06/06(金) 10:09:26
>>257
>>228と同じじゃん。
文句あるみたいよ。
259名無しさん@お腹いっぱい。:2008/06/06(金) 10:11:21
>>258
>>228とは違う。こっちはちゃんと&nbsp;を使ってるんだが
まだ空白がつながって見えるかな?

ナマの空白をつなげたら、HTML仕様的にはくっつくのが当たり前だよ
260名無しさん@お腹いっぱい。:2008/06/06(金) 11:49:01
>>226
tr -s ' ' ,
でいけないか。
261名無しさん@お腹いっぱい。:2008/06/06(金) 20:02:12
sed 's/ * /,/g'
262名無しさん@お腹いっぱい。:2008/06/07(土) 10:18:23
>>254
いいな
263名無しさん@お腹いっぱい。:2008/06/08(日) 02:28:12
結婚を考えていた彼女が処女じゃなかったんです7

1 :最強の負け組み:2008/03/01(土) 05:37:53 ID:YrfLoASe
ショックでした。
もしやもしやと思っていたのですが
面と向かって告白された時は目の前が真っ暗になりました。
「処女とかそんなの関係ない!」
そう自分に言い聞かせてきましたが、やはり限界がきてしまい
彼女に別れを告げました。
知り合いに言うと
「は?そんなくっだらない事であんないい子と別れたの?
ばっかじゃね?もうあんな子絶対知り合えないぞ?」
とボロかすに言われました。
頭では判っているのに心で理解できないんです。
私自身、もう頭の中がぐちゃぐちゃで訳がわかりません。
彼女を傷つけてしまったのでしょうか?
別れの時、彼女は黙って頷き
「じゃあね」
と笑って去っていきました。
もう私には彼女の気持ちがどうなのか
あの微笑がなんだったのか理解できないのです。
やはり私は馬鹿な事をしたのでしょうか?
264名無しさん@お腹いっぱい。:2008/06/08(日) 05:17:54
>>263
echo じゃあね
: -P
exit
265名無しさん@お腹いっぱい。:2008/06/09(月) 01:04:38
ふともも画像が100〜400x810pxくらいのサイズであったとします。
横幅が1440pxを超えないように画像を結合するスクリプトを書きたいのです。
結合する画像の組み合わせは特別に指定しません。
横幅が1440以下でかつなるべく大きければ何でもいいです。

たとえば、画像は40枚とします。
1.jpg 300x810
2.jpg 300x810
3.jpg 300x810
4.jpg 300x810
5.jpg 300x810
6.jpg 300x810
**************
40.jpg 200x810

だとしたら、1,2,3,4 を結合させて image1.jpg (1200x810px)を作ります。
それ以降も同様なことを繰り返します。

お願いします。
266名無しさん@お腹いっぱい。:2008/06/09(月) 01:23:06
ふともも画像について詳しく
267名無しさん@お腹いっぱい。:2008/06/09(月) 01:51:05
うん、画像のふとももが実際どうなのかによって対処法も違うよね。
268名無しさん@お腹いっぱい。:2008/06/09(月) 05:26:55
おまいら少しは協力してやれよw

で、画像の件なんだがね。。。
269名無しさん@お腹いっぱい。:2008/06/09(月) 10:51:46
画像のサンプルがないことにはどうにもならん。
270名無しさん@お腹いっぱい。:2008/06/09(月) 11:56:21
>>265
いわゆるナップサック問題なので、最適解を求めるのはシェルスクリプトには荷が重い。
271名無しさん@お腹いっぱい。:2008/06/09(月) 12:23:52
>>270
最適解じゃなくていいから、指定サイズ以下に並べられる
シェルを書いてうpしてください。
272名無しさん@お腹いっぱい。:2008/06/09(月) 13:08:20
最適じゃなくていいなら
頭から順にならべて1440を越えたら次に行けばいいだけじゃん。
273265:2008/06/09(月) 13:08:54
サンプル画像です。
素材に対する文句はいっさい受け付けません。
http://home2.dip.jp/upload100_download.php?no=28514 mai
最近大量に脚画像つくったのがこれしかなかったので。

>>270
そうですか。
でも、しばらく回答を待ちます。

>>271
脚画像をならべるスクリプトは需要があるようですね。
274名無しさん@お腹いっぱい。:2008/06/09(月) 14:02:24
>>272
2次元だから、最適じゃなくても単純にはいかないだろ。
275名無しさん@お腹いっぱい。:2008/06/09(月) 22:31:54
ここは楽しい
モーレツインターネッツ教室でつね
ワッフルワッフル
276名無しさん@お腹いっぱい。:2008/06/09(月) 22:41:50
X軸方向に複数画像並べるだけで、Y軸方向には画像は並べない(1枚だけ)という仕様なの?
277265:2008/06/09(月) 22:49:54
>>276
そうです。
278名無しさん@お腹いっぱい。:2008/06/09(月) 22:56:48
条件後出し乙。
だったら質問するまでもない簡単な問題じゃん。
アフォらしいから回答するの辞めた。
279名無しさん@お腹いっぱい。:2008/06/09(月) 23:14:13
便乗質問します。
X座標のドット数も、Y座標のドット数も可変の画像ファイルが複数あります。
これを、引数指定のX/Y座標の画面サイズに収まるように、
なるべく多く、なるべくすき間なく画像を並べるようなシェルを発光してください。

なお、実際の画像結合処理は別コマンドにやらせるので、
入力としては、各画像ファイルのファイル名とX/Yサイズが書かれたテキストファイルの

$ cat input.txt
1.jpg 300 200
2.jpg 530 250
3.jpg 410 180
4.jpg 640 480

を入力として、

$ hoge input.txt 1200 1280
とやると、
出力として、

1.jpg 0 0
2.jpg 300 0
3.jpg 0 300
:

みたいに、画像を配置するべき座標を画像の左上のオフセットで指定して
出力できればいいです。

最適配置にする必要はありませんが、当たり判定はちゃんとやって、
画像が重ならないようにしてください。
280名無しさん@お腹いっぱい。:2008/06/10(火) 00:02:57
いつからここは
エロ画像処理スレッドになったんでしょうか。
281名無しさん@お腹いっぱい。:2008/06/10(火) 00:04:47
しかも画像も貼らずに質問とは。
282名無しさん@お腹いっぱい。:2008/06/10(火) 01:46:24
ImageMagick で一発?
283名無しさん@お腹いっぱい。:2008/06/10(火) 14:18:30
シェルスクリプトでやる意味があるのか分からない。
ってのは禁句でしたかな。
284名無しさん@お腹いっぱい。:2008/06/10(火) 19:31:40
>>283
ぶっちゃけシェルスクリプトの最大の利点は手軽さなので、
わざわざ人に1から10まで聞くという手間をかけてまでシェルスクリプトでやる理由はないな。
285名無しさん@お腹いっぱい。:2008/06/10(火) 19:42:03
普段からシェルを使い慣れてないならあえて選ぶ意味はないような.
286名無しさん@お腹いっぱい。:2008/06/10(火) 21:32:49
じゃなくて、人に聞いてるんじゃなくて、オマエラに「お題」を出してるんだよ。
シェルで発光する方法を考えて、おおいに盛り上がってくれ。
287名無しさん@お腹いっぱい。:2008/06/10(火) 21:36:09
はい次の質問どぞ
288名無しさん@お腹いっぱい。:2008/06/10(火) 21:37:08
シェルで発光する方法まだーーーー???
289名無しさん@お腹いっぱい。:2008/06/10(火) 21:46:34
>>288
はいよLinuxオンリーだが

setleds +num +caps +scroll

で発光できる
290名無しさん@お腹いっぱい。:2008/06/12(木) 09:37:20
お疲れさまでした。
では、次の課題です。

シェルで発酵する方法について考えましょう。
291名無しさん@お腹いっぱい。:2008/06/12(木) 10:01:50
ところで「シェルを発行する」っていうのはなにか決まった言いまわしなのか?
普通はこんな言いかたしないと思うんだけどこのスレではよく見る気がする
292名無しさん@お腹いっぱい。:2008/06/12(木) 10:12:17
293名無しさん@お腹いっぱい。:2008/06/12(木) 10:29:40
>>292
それのさらなる元ネタはあるんだろうか
294名無しさん@お腹いっぱい。:2008/06/12(木) 11:15:26
295名無しさん@お腹いっぱい。:2008/06/12(木) 12:11:11
issue とか perse とか英語でも色んな言い方するよねえ
296名無しさん@お腹いっぱい。:2008/06/12(木) 12:17:40
297名無しさん@お腹いっぱい。:2008/06/14(土) 08:48:18
引数指定のディレクトリを頂点として、それ以下のサブディレクトリを含む
ディレクトリツリー中のシンボリックリンクを探し、
そのシンボリックリンクそれぞれについて、
冒頭のディレクトリツリー内を指しているか、
それとも、ディレクトリツリーの外を指しているのかを
判断するシェルを発行してください。

なお、シンボリックリンクの先に実際にファイルがない場合もありますが、
実際にファイルがあるかどうかに関係なく、あくまでシンボリックリンクの
内容のPATHだけで判断してください。
(ブロークンリンクだからといって外部と判断してはいけないということ)

以上、お願いします。
298名無しさん@お腹いっぱい。:2008/06/14(土) 09:03:06
作ったシェルスクリプトを僕のPC上で発行しました どうぞ
299名無しさん@お腹いっぱい。:2008/06/14(土) 16:32:04
ここってさ、人にシェルスクリプト書いてもらうスレだったっけ?
300名無しさん@お腹いっぱい。:2008/06/14(土) 16:35:34
>>299
>>1
>スクリプトのお勉強・自慢・腕試しなどにどうぞ。
だそうなので、腕試しのお題を出しているんじゃない?
301名無しさん@お腹いっぱい。:2008/06/14(土) 18:40:09
できないなら黙ってろの人最近来ないね。
302名無しさん@お腹いっぱい。:2008/06/14(土) 18:50:22
>>298-299
わからないなら黙ってろ。
303名無しさん@お腹いっぱい。:2008/06/14(土) 19:00:44
>>301
召喚士現る。
304名無しさん@お腹いっぱい。:2008/06/14(土) 19:02:21
>>301
君、腕良いね
305名無しさん@お腹いっぱい。:2008/06/14(土) 19:05:04
お題としてはなかなかいいんじゃない?
symlink読んでリンク先のフルパスに変換する関数を書くあたりがキモかな。
306名無しさん@お腹いっぱい。:2008/06/14(土) 19:09:49
>>305
わからないなら黙ってろ
307名無しさん@お腹いっぱい。:2008/06/14(土) 19:48:53
$RANDOM って癖があるのは仕様なんすか?
俺の環境でecho $((RANDOM*10/32768))を
出力させ続けると0と8がやたら多いw

なんかハードウェアのノイズを拾って数値化してるとか
いうのは読んだことあるけど。。。(実装によるとは思うけど)
これってもうしょうがないんすかね?

立派なアルゴリズムをもった乱数生成器とまでは
いかないものの、そこそこ精度が高い(?)乱数を
シェルコマンドで作るってできないすかね??
308名無しさん@お腹いっぱい。:2008/06/14(土) 20:06:23
309名無しさん@お腹いっぱい。:2008/06/14(土) 20:11:25
/dev/*はOS依存なので、
メルセンヌツイスターあたりをシェルスクリプトで実装する方向で。
310名無しさん@お腹いっぱい。:2008/06/14(土) 20:26:02
/dev/urandomはOS依存じゃないだろ。
311名無しさん@お腹いっぱい。:2008/06/14(土) 23:12:06
>>297
ちょっと考えると簡単なようで、実はすごく難しいんじゃないかと思う。
find(1) + readlink(1) を使って基本的な判定はできる。
んが、ディレクトリへのリンクがあったり、意図的に難解なリンクが
作成されてたりすると非常に厄介じゃね?

具体的には、
../../../usr/local/../local/etc みたいなのとか。このぐらいなら、
dirname(1) + cd + pwd(1) でまだ何とかなりそう。

じゃあ今度は、
/usr/local -> /var/local という(変な)環境で、
/usr/local/etc/a.conf -> ../etc/b.conf とかなっちゃってると、
/usr/local/etc 内にあるようで実は /var/local/etc にあるということになる。

漏れのオツムじゃ解はよくわかんね。パス正規化ツールみたいなのあると
面白いかもね。
312名無しさん@お腹いっぱい。:2008/06/15(日) 00:44:25
シェルを発行だとか純正シェルだとか、
このスレは読んでて正直気恥かしくなる
313名無しさん@お腹いっぱい。:2008/06/15(日) 00:46:06
>>312
わからないなら黙ってろ
314名無しさん@お腹いっぱい。:2008/06/15(日) 00:57:49
>>312
もしかしてここがネタスレだと分かってなかったのか?
315名無しさん@お腹いっぱい。:2008/06/16(月) 22:34:33
まあ叩き台ってことで、こんな感じ?

#!/bin/sh
base="`readlink -f $1`"
find $base -type l -print | while read i
do
 echo "`readlink -f $i` $i"
done | grep ^$base
316名無しさん@お腹いっぱい。:2008/06/17(火) 01:43:42
なんかシェルでゲーム作りたいんだけど
画面のクリアとかってどうやればいいの?
317名無しさん@お腹いっぱい。:2008/06/17(火) 02:26:15
clear
318名無しさん@お腹いっぱい。:2008/06/17(火) 10:07:08
realpathは使わないの?
319名無しさん@お腹いっぱい。:2008/06/17(火) 10:25:04
#!/bin/csh -f

set com=$0

if ($#argv < 1 || $#argv > 3) then
echo Usage:$com start_line total_lines '[file_name]'
exit 1
endif
if ($#argv == 2) then
set s=$1
set t=$2
tail +$s | head -$t
else
set s=$1
set t=$2
set f=$3
cat $f | tail +$s | head -$t
endif

exit 0
echo ------------------

これだとエラーがでます。どなたか改良してください。お願いします。
320名無しさん@お腹いっぱい。:2008/06/17(火) 10:35:51
>>319
以降はこちらへ

csh初心者質問コーナー
http://pc11.2ch.net/test/read.cgi/unix/1094041299/
321名無しさん@お腹いっぱい。:2008/06/17(火) 16:55:34
>>310
Solaris8 は標準では /dev/u?random はなかったはず。
Sun がパッチを配ってたので事実上あるような扱いだったけど。
Sol7 だとそれもなくて、フリーのデバドラをインストールしてた。
322名無しさん@お腹いっぱい。:2008/06/17(火) 16:58:56
すでにEOLですからw
323名無しさん@お腹いっぱい。:2008/06/23(月) 21:24:15
カンマ区切りcsvからhogeというカラムとその右4カラムを切り出したい
ただしhogeが何カラム目にあるかは不定
というのはちょちょいとできないですか?
324名無しさん@お腹いっぱい。:2008/06/23(月) 21:33:07
フルスペックのcsvをシェルスクリプトで扱うのは荷が重い
ちょちょいでは無理
325名無しさん@お腹いっぱい。:2008/06/23(月) 21:36:17
>>323
こういうことか?


#!/bin/sh

IFS=,
while read line; do
set $line
while [ $# -gt 0 ]; do
if [ "$1" = hoge ]; then
echo "$1","$2","$3","$4","$5"
break
fi
shift
done
done
326名無しさん@お腹いっぱい。:2008/06/23(月) 22:09:52
「,」を含む文字列で発狂するから駄目。
327名無しさん@お腹いっぱい。:2008/06/23(月) 22:53:43
""ん中に改行まで入ることあるしな
328323:2008/06/23(月) 22:57:51
>>325
おお完璧です
どうもありがとうございます。
IFSってawkの変数かと思ってましたけど、shでも同じなんですね


sh-3.2$ cat a.csv
,,,,,hoge,,1,11,3,3nd
,,,,,,,,,,,,,,,,,,,,,,,,,,,,hoge,,1,11,3,3nd
,,,,,1,fds,3,hnd
,g b,,,,,,hoge,,1,11,3
a ,,,,,,,,,,hoge,,1,13,d
sh-3.2$ cat a.csv | ./kkkk
hoge,,1,11,3
hoge,,1,11,3
hoge,,1,11,3
hoge,,1,13,d
sh-3.2$

329名無しさん@お腹いっぱい。:2008/06/23(月) 23:00:57
質問者が「おお完璧です」と言った後の >>326-327 が不憫。
330323:2008/06/23(月) 23:02:39
>>326
>>327
さすがにそんなに意地悪な仕様ではないんで問題なしです。
欲を言うならシェルを作らず手で打てるレベルのものがいいなぁ・・というくらいです。
331名無しさん@お腹いっぱい。:2008/06/24(火) 11:26:40
シェルってゆうな。クズ。
332名無しさん@お腹いっぱい。:2008/06/24(火) 11:46:49
>>331
よう、久しぶりw
相変わらず怒ってんなあwww
333名無しさん@お腹いっぱい。:2008/06/24(火) 15:07:43
ゆうって言うな。クズ。
334名無しさん@お腹いっぱい。:2008/06/24(火) 15:11:50
シェルで発酵する方法まだーーーーーーーーーーー??????
335名無しさん@お腹いっぱい。:2008/06/24(火) 15:28:14
CPUヒートシンクの上に、藁に包んだ大豆を載せ
while :;do :;done
336名無しさん@お腹いっぱい。:2008/06/25(水) 07:27:59
FAN止めないと乾燥するな
337名無しさん@お腹いっぱい。:2008/06/25(水) 07:35:42
水冷にすればいいんじゃね?
338名無しさん@お腹いっぱい。:2008/06/25(水) 11:45:53
hoge1.txt に日付のテキストが数百行あります。
----------------------
$ cat hoge1.txt
Fri, 16 May 2008 09:39:25 +0900
Sun, 18 May 2008 09:30:21 +0900
Mon, 02 Jun 2008 08:15:45 +0900
----------------------

フォーマットを下記のように年月日のみに変えて hoge2.txt に書き出すシェルスクリプトを作りたいのです。

----------------------
2008.5.16
2008.5.18
2008.6.2
----------------------

sed や awk を使うのか?ということまではわかってきたのですが、初心者なもので詰まってしまっています。どなたか ご教示お願いいたします。
339名無しさん@お腹いっぱい。:2008/06/25(水) 11:50:21
ここでGNU date でやり方書くやつがでて、
Linux厨乙!的な流れですね、わかります。
340名無しさん@お腹いっぱい。:2008/06/25(水) 11:51:01
GNU dateがあるとして、
while read x; do
date --date="$x" '+%Y.%-m.%-d'
done < hoge1.txt
341名無しさん@お腹いっぱい。:2008/06/25(水) 11:51:34
Linux厨乙!
342名無しさん@お腹いっぱい。:2008/06/25(水) 12:20:32
× …hoge2.txt に書き出すシェルスクリプトを作りたいのです。
○ …hoge2.txt に書き出すシェルを発行したいのです。
343名無しさん@お腹いっぱい。:2008/06/25(水) 12:21:46
BEGIN{
m["Jan"] = 1
m["Feb"] = 2
...
m["Dec"] = 12
OFS = "."
}
{ print $4, m[$3], $2+0 }
344名無しさん@お腹いっぱい。:2008/06/25(水) 12:27:11
>>343
それ間違ってるよ。動作確認してから書くこと。
345名無しさん@お腹いっぱい。:2008/06/25(水) 12:47:44
はて、うちの手元では動いてるけど、環境依存な部分あるかな?
346名無しさん@お腹いっぱい。:2008/06/25(水) 12:48:19
Mon,
347名無しさん@お腹いっぱい。:2008/06/25(水) 12:51:31
>>344 うちでも動いてる。
>>346 Mon, は関係ないだろ
348名無しさん@お腹いっぱい。:2008/06/25(水) 12:52:40
月の名前と曜日の名前の区別がつかないんですね、わかります
349名無しさん@お腹いっぱい。:2008/06/25(水) 13:02:27
で、そろそろ純正シェルでの解法を誰かが投稿する時間だな
350名無しさん@お腹いっぱい。:2008/06/25(水) 13:08:17
>>338
本当に日付は >>338 のフォーマットしかないと限定していいの?
だったら >>343 でも動くだろうけど、
中には、
Mon Jun 2 08:15:45 JST 2008
みたいな行もあるという仕様じゃないの?
だったら、
(今のところ) >>340 が正解。
351名無しさん@お腹いっぱい。:2008/06/25(水) 13:09:45
ずいぶん勝手な解釈だな。
352名無しさん@お腹いっぱい。:2008/06/25(水) 13:11:05
#!/bin/sh
month() {
    case "$1" in
    May) echo 5;;
    Jun) echo 6;;
    esac
}
cat <<END |
Fri, 16 May 2008 09:39:25 +0900
Sun, 18 May 2008 09:30:21 +0900
Mon, 02 Jun 2008 08:15:45 +0900
END
while read line
do
    set -- $line
    echo $4.`month $3`.$2
done
353名無しさん@お腹いっぱい。:2008/06/25(水) 13:13:38
ああ echo $4.`month $3`.`expr $2 + 0` かな。
354名無しさん@お腹いっぱい。:2008/06/25(水) 13:15:05
いや、>>344 は、>>343 をシェルで実行しようとしたんじゃないだろうか?
どこにも○○○だとは書かれてないから。
355名無しさん@お腹いっぱい。:2008/06/25(水) 13:31:19
>>350
だったら、4桁数字だったら西暦、
2桁数字だったら日付、
Jan Feb等に一致したら月、
それ以外のフィールドは無視、というように
全フィールドをチェックすればできるな。
356名無しさん@お腹いっぱい。:2008/06/25(水) 14:22:51
338です。
あっという間にたくさんのレスが。ありがとうございます。

>>340
>>343
>>352
ありがとうございます。
#!/bin/sh
の後に書いてやってみていますが、まだうまくいきません。
基本的な書き方がわかっていなさすぎなんでしょうね。

>>350
日付のフォーマットはこれだけ限定です。

過去スレ等、さらに読みに行ってきます。
本当に皆さんありがとう。

357名無しさん@お腹いっぱい。:2008/06/25(水) 14:31:41
>>355
だったら
↓だな。

#!/bin/sh

while read line; do
for f in $line; do
case $f in
[0-3][0-9]) d=$f;;
[1-2][0-9][0-9][0-9]) y=$f;;
Jan) m=1;; Feb) m=2;; Mar) m=3;; Apr) m=4;; May) m=5;; Jun) m=6;;
Jul) m=7;; Aug) m=8;; Sep) m=9;; Oct) m=10;; Nov) m=11;; Dec) m=12;;
esac
done
printf '%d.%d.%d\n' $y $m $d
done
358名無しさん@お腹いっぱい。:2008/06/25(水) 14:43:10
宗教的に問題ないなら GNU date 入れちゃいなよ。
便利だよ。
359名無しさん@お腹いっぱい。:2008/06/25(水) 14:44:15
宗教上の理由でそれは出来ません
360名無しさん@お腹いっぱい。:2008/06/25(水) 14:46:23
ならしょうがない。
361名無しさん@お腹いっぱい。:2008/06/25(水) 19:29:20
輸血と献血とGNU date は家訓で禁じられてます
362名無しさん@お腹いっぱい。:2008/06/25(水) 20:25:21
perlで我慢しる

$ cat <<END | perl -ane 'use Date::Parse; $t = str2time($_); ($s,$m,$h,$d,$M,$y) = localtime($t); print $y+1900 . "." . $M . "." . $d . "\n"'
Fri, 16 May 2008 09:39:25 +0900
Sun, 18 May 2008 09:30:21 +0900
Mon, 02 Jun 2008 08:15:45 +0900
END
2008.4.16
2008.4.18
2008.5.2
363名無しさん@お腹いっぱい。:2008/06/25(水) 20:27:13
use Date::Parse;
($s,$m,$h,$d,$M,$y) = strptime($_);
print $y+1900 . "." . $M+0 . "." . $d+0 . "\n";
364名無しさん@お腹いっぱい。:2008/06/25(水) 21:12:11
>>362
純正シェルでの >>357 の回答の後にperl出しても意味ないなぁ。
365名無しさん@お腹いっぱい。:2008/06/25(水) 22:43:18
perlやGNU dateの方が書式に寛容
366名無しさん@お腹いっぱい。:2008/06/25(水) 22:47:29
perlが入っててもDate::Parseが入ってない環境が多いから動かない環境が多い。
367名無しさん@お腹いっぱい。:2008/06/26(木) 01:57:12
純正シェル(笑)
368名無しさん@お腹いっぱい。:2008/06/26(木) 02:04:04
シェルってゆうな。クズ。
369名無しさん@お腹いっぱい。:2008/06/26(木) 02:05:33
貝殻
370名無しさん@お腹いっぱい。:2008/06/26(木) 02:12:50
ゆうなって言うなこのクズ
371名無しさん@お腹いっぱい。:2008/06/26(木) 03:07:08
稲村
372265:2008/06/26(木) 17:31:41
bashのshはシェルの略なので
これからはbaと呼ぶことにします。
373名無しさん@お腹いっぱい。:2008/06/27(金) 10:24:30
338、356です。
勉強始めたばかりで適切なスレを見つけるのもままならない。
質問した後に、スレ違いだったようだと反省している。
実はbashでやっているんだが・・・ってこれを最初に言うべきだったんだね。
皆さんにいただいたヒントでなんとかしようとさらに勉強するつもりだ。
ほんとに親切な人が多いスレで感激しているよ。
頑張ってみる。ありがとう。
374名無しさん@お腹いっぱい。:2008/06/27(金) 10:27:48
まだ出来てないのかよ。
375名無しさん@お腹いっぱい。:2008/06/27(金) 10:32:36
>>373
>>357 をコピペして、適当なファイルに保存(ファイル名hoge)する。
$ chmod +x hoge
$ ./hoge < hoge1.txt
2008.5.16
2008.5.18
2008.6.2

ここまで書かないとわからなかったのかな?
パーミッションとか、リダイレクトとか、./ を付けることとか、、
376名無しさん@お腹いっぱい。:2008/06/27(金) 10:36:14
パーミッションとかわからければ、テキストファイルとして保存して
$ sh hoge < hoge1.txt
でいいし。
377名無しさん@お腹いっぱい。:2008/06/27(金) 10:47:21
>>375
できましたっ!
みんな、ありがとう!
378名無しさん@お腹いっぱい。:2008/06/28(土) 16:35:09
ホストをIPに変換するシェルを発行する時、
getentを使いたいのですが、getentって純正シェルでも使えましたっけ?
あと、他にgetentが使えないシェルはありますか?
379名無しさん@お腹いっぱい。:2008/06/28(土) 16:58:49
ホストの人かコンピューターをプロトコルに変換するシェルを開発されるスーパーハカーの方ですねわかります
380名無しさん@お腹いっぱい。:2008/06/28(土) 17:48:26
>>378
外部コマンドならシェルの種類は関係ないでしょ。
381名無しさん@お腹いっぱい。:2008/06/28(土) 18:18:22
zshではシェル関数になっていた > getent
382名無しさん@お腹いっぱい。:2008/06/28(土) 18:21:22
それは俺の知らないzshだ
383名無しさん@お腹いっぱい。:2008/06/28(土) 18:25:32
>>381
それは漏れの知らないzshだ
384名無しさん@お腹いっぱい。:2008/06/28(土) 18:27:34
ashでは not foundって言われた > getent
385名無しさん@お腹いっぱい。:2008/06/28(土) 18:31:13
/usr/share/zsh/4.2.6/functions/compaudit の中に

[[ -x /usr/bin/getent ]] || getent() {
if [[ $2 = <-> ]]; then
grep ":$2:[^:]*$" /etc/$1
else
grep "^$2:" /etc/$1
fi
}

と書いてあった。コマンド実体がない場合にちょー簡略版を定義してるのね。
386名無しさん@お腹いっぱい。:2008/06/28(土) 21:36:48
>>385
その定義だと、コロンで区切られてる前提になってるから、
passwdとgroupにしか使えないね。 (hostsには使えない)
387名無しさん@お腹いっぱい。:2008/06/28(土) 21:47:04
getent hostsって微妙だからな。
libresolv直接叩いているアプリも結構あるし。
388名無しさん@お腹いっぱい。:2008/06/29(日) 03:08:38
行中にIPアドレスらしき文字列が含まれていたら、それを出力するって
こんな感じで問題ないですかね? もっと綺麗に書ける気もするが・・・
# 1行に1つしか含まれてないと仮定して問題なしです。

text='0.0 192.168.0.1 0.0'
regex='[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*'

echo "$text" | grep "$regex" | sed -e "s/.*[^0-9]\($regex\).*[^0-9]*/\1/"
389388:2008/06/29(日) 03:13:28
全然ダメだったorz 教えてください。
390名無しさん@お腹いっぱい。:2008/06/29(日) 03:30:41
echo $text | grep -E -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'

-oなんてオプション他のgrepにあるか知らないけど
391名無しさん@お腹いっぱい。:2008/06/29(日) 09:32:03
>>388
grepとsedを一緒に使うのは無駄。sedだけでできる。

sed '/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/'
392名無しさん@お腹いっぱい。:2008/06/29(日) 09:34:43
すまん、-n p 忘れた。訂正。

sed -n '/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p'
393名無しさん@お腹いっぱい。:2008/06/29(日) 09:35:43
sed -n 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p'

の間違いだろ。初心者はもっと謙虚なレスを書きなさい。
394名無しさん@お腹いっぱい。:2008/06/29(日) 09:38:27
>>392
それだと頭の数字が食われることがある。

sed -n '/[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p'

とした方がいい。
395名無しさん@お腹いっぱい。:2008/06/29(日) 09:40:50
だからぁ〜、sedはスレ違い。

>>393 は何を言いたいんだ? (392のあとで)
396名無しさん@お腹いっぱい。:2008/06/29(日) 09:43:09
と言うか、>>393 の頭の 's/ の部分ですでにsed文法エラーじゃん。
初心者はちゃんと動作確認してから書きなさい。

>>394 が正解。
397名無しさん@お腹いっぱい。:2008/06/29(日) 09:50:09
>>394 でも、
hoge123 192.168.123.45

みたいな入力があると失敗する。続きは sedスレでやってくれ。
398名無しさん@お腹いっぱい。:2008/06/29(日) 09:52:24
sed -n '/.*\(\<[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\>\).*/s//\1/p'

で改善されるか?
399名無しさん@お腹いっぱい。:2008/06/29(日) 09:54:07
模範解答の発行まだー??
400名無しさん@お腹いっぱい。:2008/06/29(日) 10:04:16
398 で桶
401名無しさん@お腹いっぱい。:2008/06/29(日) 21:24:06
sed -n 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/p'
402名無しさん@お腹いっぱい。:2008/06/29(日) 21:44:44
>>401
>>397 の指摘で失格
403名無しさん@お腹いっぱい。:2008/06/30(月) 01:27:41
よほどパフォーマンスに差がありでもしないかぎり、
書き易く読み易いようにすればいい。
404388:2008/06/30(月) 01:39:46
みなさま色々とありがとうございました。

>>398
ちゃんと処理できるみたいですし、このスレでも良い評価なので
これを使ってあげようかと思います。感謝してください。

この処理は、あるとても重要な国家プロジェクトで使用されます。
コメントで Powered by 398 と入れておきますね。
405名無しさん@お腹いっぱい。:2008/06/30(月) 01:59:48
なわけねーだろ
406名無しさん@お腹いっぱい。:2008/07/02(水) 17:31:55
誰かお願いします。
wk=f
配列にa b c d とそれぞれ入ってるとして
ループでぐるぐるっと、wkと一致するものを探したいんですが、
もし一致するものが無かった場合の終了条件って、どうしたらいいですか。
407名無しさん@お腹いっぱい。:2008/07/02(水) 17:41:16
日本語でおk
408名無しさん@お腹いっぱい。:2008/07/02(水) 17:42:11
純正シェルに配列はない。配列に相当する別の処理をしているなら、
その処理方法を明示して質問し直した方がいい。
409名無しさん@お腹いっぱい。:2008/07/02(水) 17:43:56
>>406
多少エスパーして回答。
ループにwhileを使うんじゃなくて、
forで配列の要素分ループすれば、たとえ一致するものが無かった場合でも
ループはちゃんと終了するから問題なし。
410名無しさん@お腹いっぱい。:2008/07/02(水) 17:48:51
ループの返り値ってことなら、breakとかを使わん限り最後のコマンドの実行結果になるから、
ループの最後にfalseを置いとけばいいんじゃないかね。
成功した場合はbreakで抜ける、ということならば、だけど。
411名無しさん@お腹いっぱい。:2008/07/02(水) 17:51:11
>>406 の日本誤訳:

以下のようなシェルを発行しようとしたのですが、
もし一致するものが無かった場合、うまくいきません。
どうすればいいですか?

#!/bin/bash

wk=f
array=(a b c d e)

i=0
while [ ${array[i]} != $wk ]; do
((i++))
done
412名無しさん@お腹いっぱい。:2008/07/02(水) 17:57:26
皆様あざーっす!
とりあえず今、KSHって何だって事から教わりました。怒鳴り含み。
ちょっと参考にして、考えます。皆暖かいアドバイスども!
413名無しさん@お腹いっぱい。:2008/07/02(水) 17:59:21
突然何を言い出すんだ?
414名無しさん@お腹いっぱい。:2008/07/02(水) 18:08:51
キチガイ警報
415名無しさん@お腹いっぱい。:2008/07/02(水) 22:22:49
作成したいファイル名が書かれたtxtのリストから、
ファイルを作成するにはどうすればよいでしょうか?

たとえばテキストの中身に、
hoge
foo
bar

とあったとして、
hogeとfooとbarというファイルを作成したいのです。
416名無しさん@お腹いっぱい。:2008/07/02(水) 22:34:11
>>415
touch $(cat txt)
417名無しさん@お腹いっぱい。:2008/07/02(水) 22:46:52
>>416
なんでこれでできるのかわからないですができました
ありがとうございます

418名無しさん@お腹いっぱい。:2008/07/03(木) 02:22:28
>>416 それだと大量だった場合に引数溢れのエラーにならないかな?
419名無しさん@お腹いっぱい。:2008/07/03(木) 02:25:14
>>418
じゃあ
cat txt | xargs touch
420名無しさん@お腹いっぱい。:2008/07/03(木) 03:05:13
cat txt|while read FNAME
do
touch $FNAME
done
べたですがw
421名無しさん@お腹いっぱい。:2008/07/03(木) 07:17:23
>>419
xargsは使っちゃいけないコマンド。

>>420
それだと catが無駄。touchがむだ。

while read FNAME
do
> "$FNAME"
done < txt
422名無しさん@お腹いっぱい。:2008/07/03(木) 07:19:13
>>416
bash依存、失格。

> `cat txt`
423名無しさん@お腹いっぱい。:2008/07/03(木) 07:23:31
>>421
415とは関係ないんだけど
パイプでxargsに渡すときに空白をエスケープするにはどうすればいいの
例えばfindで見つけたパスに空白が含まれてた場合とか
424名無しさん@お腹いっぱい。:2008/07/03(木) 07:49:19
>>423 テンプレ>>6
425名無しさん@お腹いっぱい。:2008/07/03(木) 07:55:01
>>424
テンプレにあったとは
すいませんでした
426名無しさん@お腹いっぱい。:2008/07/03(木) 08:02:10
テンプレにはないが、find -print0 | xargs -0 するんじゃなくて、
find -exec +
するのが今後のお勧めだな。-exec の後ろ、\; じゃなくて + ね。

これでxargsは完全に不要!
427名無しさん@お腹いっぱい。:2008/07/03(木) 11:31:21
質問です。
case文でwhile文を使用する時
case "$a" in
"a.c")
while[ $flag = false || $i -ne 10 ] ; do
処理1
done
の時、doneの跡に;;でおkですか?
428名無しさん@お腹いっぱい。:2008/07/03(木) 11:56:24
>>421がFAだけど、敢えてxargs -0で。

cat list.txt | perl -ane '{ chop; printf("%s%c", $_, '\0'); }' | xargs -0 touch
429名無しさん@お腹いっぱい。:2008/07/03(木) 11:57:44
>>426
この+でappendって、最近のfindはどれにもあるの?
430名無しさん@お腹いっぱい。:2008/07/03(木) 11:58:53
純正findにないから使っちゃだめ
431名無しさん@お腹いっぱい。:2008/07/03(木) 12:18:04
>>430
純正findにもあるんだなぁ、+ が。よって find -exec + で FA。
432名無しさん@お腹いっぱい。:2008/07/03(木) 12:31:00
xargs を使っちゃいけない理由キボンヌ
便利だし早いからコマンドラインで結構使うんですが・・・
433名無しさん@お腹いっぱい。:2008/07/03(木) 12:31:12
純正find にないのは -print0 の方ですね。
434名無しさん@お腹いっぱい。:2008/07/03(木) 12:40:55
純正なんとかっていう意味の曖昧な言い方は止めろ
今はPOSIX準拠かどうかの話をしてるようだが、
純正シェルは古い/bin/shの話だったりでわからん
435名無しさん@お腹いっぱい。:2008/07/03(木) 12:45:23
>>432
$ printf "This is\na test.\n"
This is
a test.
$ printf "This is\na test.\n" | xargs -n 1 echo
This
is
a
test.
$ printf "This is\na test.\n" | perl -ane 'chop; printf("%s%c", $_, '\0');' | xargs -0 -n 1 echo
This is
a test.
$
436名無しさん@お腹いっぱい。:2008/07/03(木) 12:46:31
& >>6 (>>424は読んだ?)
437名無しさん@お腹いっぱい。:2008/07/03(木) 13:03:20
>>435
なるほど、理解しますた。分かってれば使えないことはないですな。
438名無しさん@お腹いっぱい。:2008/07/03(木) 16:40:13
まぁ実験して動いたらそれでまずOK。
でその後にリファイン(リファクタリング?) 
これが大事。
439名無しさん@お腹いっぱい。:2008/07/03(木) 17:28:35
>>6
> (スペースなどを含むファイル名を正しく処理するため、
> findは -print0、xargsは -0オプションを常に付けることを推奨
> ただし、Solarisでは未対応。どうするんだろ?)

$ cat print0
#! /bin/sh
while read x; do
printf "%s\0" "$x"
done

$ find 〜 | print0 | xargs -0 〜

でいいんじゃね?
# printfは許してね。
440名無しさん@お腹いっぱい。:2008/07/03(木) 18:16:12
>>439
いや、だから、Solarisでも find dir -exec hoge + が使えるんだよ。
よってprint0云々は一切不要。
441名無しさん@お腹いっぱい。:2008/07/03(木) 18:21:41
>>439
ファイル名に \ が含まれていた場合、readが誤動作する(違うファイル名とみなされる)
Solarisの xargsには -0 オプションがない。

で、>>440 の方法で解決。
442名無しさん@お腹いっぱい。:2008/07/03(木) 18:58:56
トレースしてみた。

strace -f find /tmp -exec file {} + 2>&1
execve("/usr/bin/file", ["file"..., "/tmp"..., "/tmp/.ICE-unix"..., "/tmp/mysql.sock" ...,
おお、すげぇ。ちゃんと引数まとめて実行してるね。

strace -f find /tmp -exec file {} \; 2>&1
execve("/usr/bin/file", ["file"..., "/tmp"...], [/* 21 vars */]) = 0
execve("/usr/bin/file", ["file"..., "/tmp/.ICE-unix"...], [/* 21 vars */]) = 0
execve("/usr/bin/file", ["file"..., "/tmp/mysql.sock"...], [/* 21 vars */]) = 0
こっちは1個ずつ実行するから大量だとクソ遅い。

勉強になりまつた。
443名無しさん@お腹いっぱい。:2008/07/03(木) 19:55:30
やっぱ速さってみんな気になるん?
しっかりきっちり動けば、速度は問題ないって思ってる俺は未熟?
いかにもベターってのはやらないけどー。
444名無しさん@お腹いっぱい。:2008/07/03(木) 20:03:16
テクいことして読み難くなるなら多少遅くても分かりやすく書く
445名無しさん@お腹いっぱい。:2008/07/03(木) 20:08:46
>>442
straceって、、Linuxかよw
446名無しさん@お腹いっぱい。:2008/07/03(木) 23:57:40
>>443
必要な時に必要なことをやる。当たり前のこと。
後の話はマ板でやって。
447名無しさん@お腹いっぱい。:2008/07/04(金) 01:32:47
cronで毎日回しているプログラムの処理時間が
16時間越えたらちょっと悩む
448名無しさん@お腹いっぱい。:2008/07/04(金) 08:05:24
kshでユーザIDのリストを計表にして印刷したいんだけど
こんなの作った人いますか?
どこかにサンプルありませんかね。OSは、AIX5.3です。
449名無しさん@お腹いっぱい。:2008/07/04(金) 08:27:34
>>448
計表の正確なところがわからんが、

while read user pass uid rest; do echo $uid $user ; done < /etc/passwd

ってことか?
あと、必要なら sort -n をかましてね。
kshじゃなくて純正シェルでできるよ。
450名無しさん@お腹いっぱい。:2008/07/04(金) 08:29:48
>>448
あ、IFS設定抜けてた。

IFS=:; while read user pass uid rest; do echo $uid $user ; done < /etc/passwd
451名無しさん@お腹いっぱい。:2008/07/04(金) 08:42:50
ksh -c lpr < /etc/passwd
452名無しさん@お腹いっぱい。:2008/07/04(金) 11:13:09
FreeBSD 付属の wc は空白文字でパディングして結果を返すようです。

wc -l $file | sed "s/ /_/g"
_____340_/usr/bin/g++

Linux では次のようにして 340 という値を得ていたのですが、
FreeBSD では空白文字が出力されてしまいます。

wc -l $file | cut -f1 -d" "

FreeBSD 版 wc ではどうすればいいでしょう。
ltrim() みたいなものがありますかね。
それともいったん sh の変数に代入する?
それとも wc や cut には未知のオプションがある?
cut なんていう頑ななコマンドは使わないで、 sed 's/^ *\([0-9]*\) .*$/\1/' しろ?
お前 awk '{ print $1 }' も書けないのか?

bash をよく使うので、依存しているところがあったらごめんなさい。
awk はほとんど馴染みがありません。というか、
何かにつけて不遇の cut を使ってあげたい気持ちがあります…。
453名無しさん@お腹いっぱい。:2008/07/04(金) 11:15:19
>>452

echo `wc -l < $file`
454名無しさん@お腹いっぱい。:2008/07/04(金) 11:28:33
>>452
長文で cutを力説してるのに、
>>453 で cutすら必要ないというオチにワロタ

wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので
cutとかで切る必要ないのと、スペースを取り除くにはシェルの ` ` を使うってことね。
455名無しさん@お腹いっぱい。:2008/07/04(金) 11:33:53
> それともいったん sh の変数に代入する?
質問者が用意した選択肢を誇らしげに答える>>453-454が憐れ。
456名無しさん@お腹いっぱい。:2008/07/04(金) 11:38:03
空白文字のパディング方式に、
暗黙の仮定を置いてまでcutにこだわる意味が全くわからん。
仕様の特殊化しても嬉しくない。
457452:2008/07/04(金) 11:38:04
いやいや

> wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので

役に立ちました! 確かに笑った。
458名無しさん@お腹いっぱい。:2008/07/04(金) 11:38:44
>>455
おまえ、シェルスクリプト書いたことないだろ?

>>453 では一切「sh の変数に代入」は行なっていないがww
459452:2008/07/04(金) 11:50:48
>>456
いやいや、そうなんですよ。 cut ってつまり結局
他のコマンドと組み合わせるには中途半端なツールなんですよ。
単純でそれなりに覚えやすく、見込みのあるヤツだと思ってたんですが…
awk や bash は区切り文字を変えるだけでも結構タイプする印象が。

いや、変にこだわってごめんなさい。
460名無しさん@お腹いっぱい。:2008/07/04(金) 12:06:44
つ awk -F:
461名無しさん@お腹いっぱい。:2008/07/04(金) 15:50:34
cut はデリミタの連続を指定できれば使える君に化けるんだがな。
462名無しさん@お腹いっぱい。:2008/07/08(火) 07:58:27
シェルスクリプトがCなどのプログラムより重い理由をうまく説明したいんですが
463名無しさん@お腹いっぱい。:2008/07/08(火) 08:00:46
>>462
インタプリタ型言語だから。
(fork/execが遅いと言うだけが理由ではない。
内部コマンドだけを使ってもCよりも遅いから)
464名無しさん@お腹いっぱい。:2008/07/08(火) 10:52:14
でも一番のボトルネックは fork, exec だと思うぞ
465名無しさん@お腹いっぱい。:2008/07/08(火) 11:29:48
プロファイルしてみると分かるが、文字列処理も結構コストが高い。
stat(2)せずにls -lしてからパターンマッチなど。
shは文字列がグルーになっているから。
466名無しさん@お腹いっぱい。:2008/07/08(火) 14:57:58
パイプとかバッククォートとかガンガン使うから、
それだけでシステムコール連発になっちゃうもんね。
文字列処理なのに write(2) とか使うわけだw
467名無しさん@お腹いっぱい。:2008/07/08(火) 21:54:18
レスありがとう
ちなみにパイプでコマンドつないだ場合って一つ一つ最後まで処理して次のコマンドに移るであってますかね?
468名無しさん@お腹いっぱい。:2008/07/08(火) 21:56:21
>>467
全然合ってない。それは MS-DOSのニセパイプの動作。
469名無しさん@お腹いっぱい。:2008/07/08(火) 22:14:44
>>468
詳しくおしえてください・・・
470名無しさん@お腹いっぱい。:2008/07/08(火) 22:21:27
>>469 シェル pipe dup2 とかで検索してみ。
471名無しさん@お腹いっぱい。:2008/07/08(火) 22:50:12
そんな検索語じゃわかるわけないだろ。
pipe(2)だって無限にバッファがあって、
入口が閉じるまで出口から出て来ない仕様になってる可能性だってあるわけで。
472名無しさん@お腹いっぱい。:2008/07/08(火) 23:22:32
無限の記憶装置は存在しないのでそんな可能性はゼロだな。
473名無しさん@お腹いっぱい。:2008/07/08(火) 23:25:31
MS-DOSのパイプ仕様を実装することも不可能だな。
474名無しさん@お腹いっぱい。:2008/07/08(火) 23:36:10
コマンド1 | コマンド2

本来のパイプだと、
コマンド1 の標準出力 = コマンド2の標準入力
になるような操作(dupとか)が裏で行われる。
コマンド1と2は同時に実行される。一時ファイルを介さない。

嘘パイプの場合は、
コマンド1 > 一時ファイル
コマンド2 < 一時ファイル
削除 一時ファイル
なだけ。
475名無しさん@お腹いっぱい。:2008/07/08(火) 23:57:58
例えば
cat ばかでかいファイル | head -1
だとcatもheadも同時に起動してheadはcat の出力が1行分でたらそれを出力します
そのときcatの処理が途中だったらどうなるんですか?
476名無しさん@お腹いっぱい。:2008/07/09(水) 00:11:11
やってみろよ
477名無しさん@お腹いっぱい。:2008/07/09(水) 00:50:57
>>475
バッファってしってるか?
478名無しさん@お腹いっぱい。:2008/07/09(水) 01:22:00
>>475
catがwrite(2)を呼び出したときにheadが終了している(パイプが閉じている)とSIGPIPEくらって終了。
479名無しさん@お腹いっぱい。:2008/07/09(水) 02:16:51
そのshigpipeを発行するのはパイプさん?
480名無しさん@お腹いっぱい。:2008/07/09(水) 08:24:00
OSタン。
shigじゃなくてsigな。
481名無しさん@お腹いっぱい。:2008/07/09(水) 08:32:58
SIGPIPE でもあるし、システムコール的には Broken pipe でもあるな。
482名無しさん@お腹いっぱい。:2008/07/09(水) 08:38:27
>>481
errnoがEPIPEだと言いたいの?

いずれにせよ、このスレでは、PIPEにサイズの制限はなく、
コマンドが並列に動くことだけ知っていればよい。

PIPEの仕組みはカーネル解説書に書いてあるよ。
483名無しさん@お腹いっぱい。:2008/07/09(水) 10:51:35
kshでの質問です。

既にファイルにabcと書いてあるとして、
print -n "$wk " | cut -d'=' -f 2- >> DATA_FILE だと
abc
def
になってしまいます(次行に追記)。
やりたいのは abc def みたいに行の後ろに追記したいです。
上手いこと出来ませんか?よろしくお願いします。
484名無しさん@お腹いっぱい。:2008/07/09(水) 10:59:06
>>483

hoge=`cat < DATA_FILE`
print -n "$hoge" > DATA_FILE
print -n "$wk " | cut -d'=' -f 2- >> DATA_FILE
485名無しさん@お腹いっぱい。:2008/07/09(水) 11:15:28
>>484
速レス有難うございます。感謝感激です。
486名無しさん@お腹いっぱい。:2008/07/09(水) 23:03:22
echoにパイプを渡せないのですが,どうしてでしょうか?
例えば,
cat hoge | echo
としても空白行が表示されてしまいます。
487名無しさん@お腹いっぱい。:2008/07/09(水) 23:09:03
cat hoge | xargs echo
488名無しさん@お腹いっぱい。:2008/07/09(水) 23:42:02
>>487
> cat hoge | xargs echo

つまり,
echo `cat hoge`
ということですか?
これなら確かに,形式は崩れていますが,出力を得られます。
しかし,数行程度の内容しかないhogeファイルに対して,
cat hoge | echo
で空白行が表示されますが,これは何故なのでしょうか。
初心者質問ですみませんが,よろしくお願いします。
489名無しさん@お腹いっぱい。:2008/07/09(水) 23:56:05
echoはパイプを受けるように作られていないから。
490名無しさん@お腹いっぱい。:2008/07/09(水) 23:59:02
>>488
% echo
491名無しさん@お腹いっぱい。:2008/07/10(木) 00:04:10
>>489
ええと,
パイプはシェルだけが制御していて,コマンドはシェルから引数を受け取るだけだと思っていたのですが,
コマンドもパイプの動作に絡んでくるんですか!
コマンドを作るのも大変ですね。
しかし,echoがパイプに対応していないとは相当ひねくれてますね。
何か理由でもあるのかな。
492名無しさん@お腹いっぱい。:2008/07/10(木) 00:09:46
>>490
すみません,意図がわからないのですが…。
echoはそもそも引数を要求しないということですかね。
だからechoが勝手に終了して,パイプも終わってしまうと。
すいません,適当です。
493名無しさん@お腹いっぱい。:2008/07/10(木) 00:14:58
パイプって難しいなぁ
a | b
だとbコマンドが終わったらsigpipeを送って、aが途中でも終わるって話だったけど

sleep 10 | date
だとdateが終わってから10秒後に終了する・・
494名無しさん@お腹いっぱい。:2008/07/10(木) 00:20:52
富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ
富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ
富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ
富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ
ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・)
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
死ぬとき このレスの事思い出してから地獄へ行けよ
ニヤ(・∀・)ニヤ(・∀・)
495名無しさん@お腹いっぱい。:2008/07/10(木) 00:23:14
>>493
sleepがなにかをstdoutに書こうとしてるかい?
496名無しさん@お腹いっぱい。:2008/07/10(木) 00:55:11
なるほど。

echo "/tmp" | ls

とすると,/tmp ではなく,現在いるディレクトリに対してlsが働きますね。
しかし,

echo "/tmp" | cd

としても,ホームディレクトリに移動せず,元のディレクトリのままですね。
bashだと,

bash: echo: write error: Broken pipe

とエラーになるし…。

難しい…。
497名無しさん@お腹いっぱい。:2008/07/10(木) 01:06:22
何が難しいのか
498名無しさん@お腹いっぱい。:2008/07/10(木) 01:39:55
>>486>>488>>491>>492>>493>>496
見当ハズレのことばかり言ってる暇があったら、
マニュアルや入門書くらいちゃんと読め。
標準入力と引数の区別すらついてないじゃないか。
499名無しさん@お腹いっぱい。:2008/07/10(木) 01:50:41
引数と標準入力は全く別の概念。
以上。
500名無しさん@お腹いっぱい。:2008/07/10(木) 06:44:13
>>496
パイプは暗黙のサブシェルになる。

echo "/tmp" | cd
は、
(echo "/tmp" | cd)
として動作する。
括弧内で cd しても、括弧を抜けたら元に戻って見える。

あと、cdコマンドはそもそも標準入力を受け付けないから、
シェルによっては "Broken pipe" のエラーになる。
501名無しさん@お腹いっぱい。:2008/07/10(木) 08:42:21
Standard I/O を理解してないなw
502名無しさん@お腹いっぱい。:2008/07/10(木) 08:53:08
>>490
それだと、
fg: no job control
ってエラーになります。
503名無しさん@お腹いっぱい。:2008/07/10(木) 09:00:56
>>501
>>500 はStandard I/O を理解してるだろ。当然。

echo "/tmp" | cd で、/tmpに移動しない問題を言ってるんじゃなくて、
結局 cdでは stdin が無視されて cd だけが実行されるはずなのに、
$HOMEに移動しないのは何故か、を、「サブシェルになるから」と説明している。
504名無しさん@お腹いっぱい。:2008/07/10(木) 09:59:22
cd /etc
echo "/tmp" | (cd; pwd)
505名無しさん@お腹いっぱい。:2008/07/10(木) 10:09:26
>>504 は何を言いたいんだ? 当たり前のことをわざわざ書いて。

回答者側で何か間違っている点、不備な点を指摘したいなら
アンカー付けてもっと具体的に書くこと。
506名無しさん@お腹いっぱい。:2008/07/10(木) 10:29:10
>>503
すません。アンカーつけるべきだったorz
この流れの発端となった人の話。
507名無しさん@お腹いっぱい。:2008/07/10(木) 11:03:35
xml文章をxpathパス検索できるコマンドってありますか?
508名無しさん@お腹いっぱい。:2008/07/10(木) 11:07:54
perlか何かで書いちゃえば?
509名無しさん@お腹いっぱい。:2008/07/10(木) 11:08:42
xmlstarlet
510名無しさん@お腹いっぱい。:2008/07/10(木) 11:09:26
つーかスレ違いだろw くだ質レベル
511名無しさん@お腹いっぱい。:2008/07/10(木) 13:53:26
質問です(ksh)
set $ch
for wk in $@; do
 typeset -L20 hoge
 print $hoge
done    
---------------------------
typesetがうまくいきません(typesetを消しても書いても一緒の出力結果)
どこが間違ってるでしょうか。宜しくお願いします。
512名無しさん@お腹いっぱい。:2008/07/10(木) 13:54:21
訂正
×for wk in $@; do
○for hoge in $@; do
513名無しさん@お腹いっぱい。:2008/07/10(木) 14:08:31
>>511-512
kshで、

set 123456789012345678901234567890
for hoge in "$@"; do
typeset -L20 hoge
print "$hoge"
done

ってやったら、出力は、
12345678901234567890
になる。正しいね。

typeset外したら、
123456789012345678901234567890
になる。正しいね。

ハイ次。
514名無しさん@お腹いっぱい。:2008/07/10(木) 14:18:31
>>511-512
以前に typeset -L したのが残ってるんじゃないか?
一旦 unset hoge してから hogeを使うこと。

廃次
515名無しさん@お腹いっぱい。:2008/07/10(木) 14:28:41
口笛は何故遠くまで聞こえるの?
516名無しさん@お腹いっぱい。:2008/07/10(木) 15:03:25
>>513,514
なるほど。有難うございます。
517名無しさん@お腹いっぱい。:2008/07/10(木) 15:07:02
で、なんでsleepは終わらないの?
518名無しさん@お腹いっぱい。:2008/07/10(木) 15:11:52
>>517 >>493
>>495 がすでに回答してるじゃん。
SIGPIPEは、pipeに何か出力した時にしか発生しない。
sleepは、stdoutに何も出力しないので、SIGPIPEを発生させるきっかけがない。
よって、pipeは存続し、sleepは通常通り10秒待って終了する。
519名無しさん@お腹いっぱい。:2008/07/10(木) 15:24:51
>>515
おじいさんに聞け
520名無しさん@お腹いっぱい。:2008/07/10(木) 15:50:20
先生質問があります><

配列を等間隔に出力したいんですが、うまくいかないんです><

str[1]=aaa str[2]=bbb str[3]=ccc の場合、
aaa△△△bbb△△△ccc と出力したいんです

print -n ${str[*]}じゃ繋がってしまうんです><
521名無しさん@お腹いっぱい。:2008/07/10(木) 16:02:00
>>520
printf使えよ。

printf '%8s' ${str[*]}
とかね。
%8sの 8の数字は好きな間隔に調整して。
522名無しさん@お腹いっぱい。:2008/07/10(木) 16:03:51
左詰めにしたいんなら printf '%-8s' の方がいいかな
523名無しさん@お腹いっぱい。:2008/07/10(木) 16:15:45
ありがとう先生><
524名無しさん@お腹いっぱい。:2008/07/10(木) 16:29:55
kshもbashなみにウザイな。
配列だの、printだの、純正シェルにないものの話題は遠慮してもらいたいな。
525名無しさん@お腹いっぱい。:2008/07/10(木) 16:30:37
純正シェルとやらの専用スレでも立てれば?
526名無しさん@お腹いっぱい。:2008/07/10(木) 16:38:34
printってなに? そんなコマンドあるの? ずっとprintfのtypoだと思ってたんだけど。
echoとどう違うの?
527名無しさん@お腹いっぱい。:2008/07/10(木) 16:40:01
528名無しさん@お腹いっぱい。:2008/07/10(木) 17:04:48
>>524
遠慮する意味がわからん
529名無しさん@お腹いっぱい。:2008/07/10(木) 17:11:21
OS依存だから
530名無しさん@お腹いっぱい。:2008/07/10(木) 17:14:35
i=1の時、elifの所を通ってくれないんですが、どこを間違えてますか?

if [[ $i = 0 ]] ; then
 処理1
elif [[ $i = 1 ]] ; then
 処理2
else
 処理3
fi

お願いします!
531名無しさん@お腹いっぱい。:2008/07/10(木) 17:18:19
OS 依存なのはむしろ /bin/sh だろw 例の Solaris とかさぁ・・・
最初から /bin/bash とか書いちゃった方が互換性が高い。
532名無しさん@お腹いっぱい。:2008/07/10(木) 17:21:41
>>531
そういう意味じゃなくて、OSにインストールされてるかどうかの話だろ。
FreeBSDではkshはない。あえてインストールしない限り。
533名無しさん@お腹いっぱい。:2008/07/10(木) 17:27:28
FreeBSDが基準かよw
あと、どんなシェルであろうとシェルスクリプトのスレでいいだろwwww
534名無しさん@お腹いっぱい。:2008/07/10(木) 17:28:14
Linuxでもkshは標準で入ってるかどうかはマチマチだね。
535名無しさん@お腹いっぱい。:2008/07/10(木) 17:31:19
>>530
それだけならどこも間違っていない。
別のところが原因だろう。
536名無しさん@お腹いっぱい。:2008/07/10(木) 17:32:11
>>534
kshなんか入ってねーよバーカ
537名無しさん@お腹いっぱい。:2008/07/10(木) 17:32:32
学校の課題が出来ないっす

カレントディレクトリにある、二日以上修正されてないファイルの
名前だけをkadai.txtに追記するスクリプトを作れ

という問題なんだけど、自分が作ったのは

#! /usr/bin/bash

find . -mtime +2 -print >> ./kadai.txt

っていうので出したら、お前これだとファイルだけじゃなくて
ディレクトリの名前も付いてるだろ、問題よく読みなさい、
とか言われてしまった。

親切な方がいましたらヒント的なもの貰えたら嬉しいです。
538名無しさん@お腹いっぱい。:2008/07/10(木) 17:32:35
NetBSDにもkshはない。あえてインストールしない限り
539名無しさん@お腹いっぱい。:2008/07/10(木) 17:33:32
NetBSD, OpenBSD, AIXでは入ってますよ。

しかも標準で入ってるものしかこのスレで不適当なら、
スクリプト書くの非常に難しいと思うが。
540名無しさん@お腹いっぱい。:2008/07/10(木) 17:34:58
>>538
インストーラからインストールすれば、標準で入ってる。
sh, csh, ksh これは標準
541名無しさん@お腹いっぱい。:2008/07/10(木) 17:35:11
入ってないならインスコすればいいだけじゃん。
#!/usr/local/bin/ksh って書いておいて、なければ即エラーで落ちる。
#!/bin/sh だと、ポータビリティ意識しないと処理が中断するか
もしくはあらぬ解釈をされて誤動作する。特に純正とかw
542名無しさん@お腹いっぱい。:2008/07/10(木) 17:35:42
>>537
ヒントだけ、
-type f
-maxdepth
basename
543541:2008/07/10(木) 17:36:56
で、まぁ、漏れの場合は重要なスクリプトは先に環境チェックしてから
動き始めるように書いてるけどね。使い捨てならどうでもいいが・・・・

必要なコマンドはあるか、OS は何か、その他諸々必要に応じて。
544名無しさん@お腹いっぱい。:2008/07/10(木) 17:38:51
>>539
標準で入ってるものだけでうまく処理するからこそ、
スクリプト書くのが非常に面白い。
545名無しさん@お腹いっぱい。:2008/07/10(木) 17:40:15
ケースバイケースってことで
546名無しさん@お腹いっぱい。:2008/07/10(木) 17:40:22
>542
ありがとー 調べて見ます
547名無しさん@お腹いっぱい。:2008/07/10(木) 17:40:26
>>529
OS依存だからどうとかを言ってるんじゃなくて
ここはシェルスクリプトのスレだって事。
誰かも言ってたけど純正のスレ作ればよろし。
548名無しさん@お腹いっぱい。:2008/07/10(木) 17:41:29
>>535
サンクスです!
549名無しさん@お腹いっぱい。:2008/07/10(木) 17:41:43
>>537
> 親切な方がいましたらヒント的なもの貰えたら嬉しいです。

find のマニュアル見ろ
550名無しさん@お腹いっぱい。:2008/07/10(木) 17:41:57
ここが純正シェルのスレだろ
551名無しさん@お腹いっぱい。:2008/07/10(木) 17:42:17
純正とか標準って言葉が何を指すのか知らんけどさ
それしか駄目って奴は別のスレ立てろよ
そこでこのスレに貼られた問題と回答をシコシコ添削してればいいじゃん
552名無しさん@お腹いっぱい。:2008/07/10(木) 17:43:19
kshの方が(必要なら)別スレ建てるべき。
553名無しさん@お腹いっぱい。:2008/07/10(木) 17:44:35
まぁでも、純正なつっこみが入ってくれるから注意点に気づくんで、
そういう意味ではありがたい指摘だと思ってる。ちゃんと記憶に残るしな。
554名無しさん@お腹いっぱい。:2008/07/10(木) 17:46:43
>>552
>>1 に書いてある通り、明記すればこのスレで良いと思う。
純潔を貫いてる処女もいいが、ここは *総合* スレだぞ。
555名無しさん@お腹いっぱい。:2008/07/10(木) 17:48:33
純正シェル総合スレ
556名無しさん@お腹いっぱい。:2008/07/10(木) 17:59:53
どのシェルか明記せよ、でいいじゃん。
557名無しさん@お腹いっぱい。:2008/07/10(木) 18:07:22
kshより、bashの方が標準で入ってないから駄目だな
558名無しさん@お腹いっぱい。:2008/07/10(木) 18:13:55
標準インスコ状況

FreeBSD: ×ksh、×bash
Linux: ×ksh、○bash
Solaris: ○ksh、○bash

ってことで、kshよりもbashの方がまだ標準的だな。
559名無しさん@お腹いっぱい。:2008/07/10(木) 18:34:18
Mac: bash
560名無しさん@お腹いっぱい。:2008/07/10(木) 18:36:06
頭のいかた純正ちゃん
純正とかいう言葉使ってる奴は、以前から同一人物だろうな
561名無しさん@お腹いっぱい。:2008/07/10(木) 18:37:37
じゃあPOSIX
562名無しさん@お腹いっぱい。:2008/07/10(木) 18:40:41
FreeBSD: ×ksh、×bash ←こいつが騒いでただけかよw
563名無しさん@お腹いっぱい。:2008/07/10(木) 18:43:15
ゴミUNIX: FreeBSD
偽UNIX: Linux
564名無しさん@お腹いっぱい。:2008/07/10(木) 18:43:28
純正?wなにそれ近親相姦かなにか?
565名無しさん@お腹いっぱい。:2008/07/10(木) 18:45:28
まあ、その純正シェルとやらしか使えないじゃないか
他のシェルの作法出されてもわからないので、話についていけなくて嫌なんだろw
2chではよくあること
566名無しさん@お腹いっぱい。:2008/07/10(木) 19:06:03
>>561
POSIX要件だと落第する/bin/shある。
「純正」君は気に入らないと思われ
567486:2008/07/10(木) 19:13:29
>>498-499
ありがとうございます。ご指摘の通り,標準入力と引数の区別がついていませんでした。
標準入力を受け付けるコマンドをフィルタと呼んで区別しているのですね。
パイプの使用法としては
command | filter 1 | ... | filter n
が適切なのですね。

>>500
echo "/tmp" | cd
を実行しても $HOME に移動しない理由が良く分かりました。
パイプはサブシェルで動作するのですね。

Linux初心者がこのスレで質問すべきではなかったですね。
スレ汚しすみませんでした。
出直してきます。
568名無しさん@お腹いっぱい。:2008/07/10(木) 19:17:26
初心者の書き込みはいいけど、
blogみたいに思考の過程を書き込まれても困る。
569名無しさん@お腹いっぱい。:2008/07/10(木) 19:18:54
むしろ思考の過程書いたほうがいいな
なんしいたいか、わかるし
570名無しさん@お腹いっぱい。:2008/07/10(木) 19:23:44
POSIX互換シェルが使えないUnixなんてあるの?
Solarisとやらにもkshがあるんでしょ
571名無しさん@お腹いっぱい。:2008/07/10(木) 19:24:53
具体的に純正shってどれを指すのよ
どのOSのどのバージョンに乗ってるsh?
その仕様をこのスレのテンプレにでも書けばいいんでないの?
572名無しさん@お腹いっぱい。:2008/07/10(木) 19:28:05
くだらねえ言いあいで中身がほとんどないスレw
573名無しさん@お腹いっぱい。:2008/07/10(木) 20:22:20
>>572は中身皆無のレスw
574名無しさん@お腹いっぱい。:2008/07/10(木) 21:05:43
そろそろ奴がくるかな。
575名無しさん@お腹いっぱい。:2008/07/10(木) 23:35:03
呼んだか?
あっ俺じゃねーってか
576名無しさん@お腹いっぱい。:2008/07/11(金) 07:23:09
>>571 最も機能が乏しい sh があれば、それが純正だ!
577名無しさん@お腹いっぱい。:2008/07/11(金) 08:42:11
>>567 Linux板にシェルスクリプトのスレあるよ。そっちの方が向いてる。
578名無しさん@お腹いっぱい。:2008/07/11(金) 10:14:55
>>558
NetBSD: ○ ksh、 ×bash
OpenBSD: ○ ksh、 ×bash
AIX: ○ ksh、 ×bash
579名無しさん@お腹いっぱい。:2008/07/11(金) 10:38:22
ユーザー比率で加重平均しないとな
580名無しさん@お腹いっぱい。:2008/07/11(金) 10:49:06
RHEL: ×ksh、○bash
Fedora: ×ksh、○bash
Debian: ×ksh、○bash
Ubuntu: ×ksh、○bash
Gentoo: ×ksh、○bash
581名無しさん@お腹いっぱい。:2008/07/11(金) 11:05:10
>>580
Windows: ×ksh、 ×bash
582あいちゃん:2008/07/11(金) 11:06:12
あとGNU/Linuxのshはbashだから、shもダメになっちゃうね。
583名無しさん@お腹いっぱい。:2008/07/11(金) 11:37:33
Linux板に行けばいい・・・・・
584名無しさん@お腹いっぱい。:2008/07/11(金) 11:39:48
>>581
えっと、kshとbashとどちらが「まだ」存在する可能性が高いか、って話だから、
両方×の例を出してきてもノーカウントだよw
585名無しさん@お腹いっぱい。:2008/07/11(金) 11:42:47
>>581が見えない
586あいちゃん:2008/07/11(金) 11:42:50
ここはUNIX板だから、GNU/Linuxもノーカウントだよ


何がだよ
587名無しさん@お腹いっぱい。:2008/07/11(金) 13:29:01
質問です。
hoge="abc/def/ghi" が入ってるとして

typeset -L20 hoge
print $hoge

だとabcまでしか出力されません。上記の文を見る限り間違ってる点などありますか?
588名無しさん@お腹いっぱい。:2008/07/11(金) 13:36:01
typeset: command not found
print: command not found
589名無しさん@お腹いっぱい。:2008/07/11(金) 14:44:45
そのうち sh にも bash互換のオプションが入ったりしてw
590名無しさん@お腹いっぱい。:2008/07/11(金) 15:04:22
互換のためにbashその他のコードを取り込んでbashより重くなったshとかwww笑えないwww
linuxみたいにおとなしくリンクにするかラッパーにするのが正解に近いのかも
591名無しさん@お腹いっぱい。:2008/07/11(金) 15:14:57
そこで車輪の再発明ですよ
592名無しさん@お腹いっぱい。:2008/07/11(金) 15:17:20
シェルって作るの難しいの?
一番単純なシェルのソース見たいんだけど、なんだろう
593名無しさん@お腹いっぱい。:2008/07/11(金) 15:22:10
while :; do
 echo -n $PWD\$
read l
echo "$l: command not found."
done
594名無しさん@お腹いっぱい。:2008/07/11(金) 15:31:38
>>592

#include <stdio.h>

static char buf[1024];

int main()
{
for (;;) {
fprintf(stderr, "$ ");
fgets(buf, sizeof buf, stdin);
system(buf);
}
}
595名無しさん@お腹いっぱい。:2008/07/11(金) 15:38:03
>>592
Version7のソース当たれば?
ただし、マクロ多様した非常に癖のあるソース(一見してCに見えないほど)だけどw
596名無しさん@お腹いっぱい。:2008/07/11(金) 15:39:48
DOSでよければ、command.comの代替を作ってたことがある。
フレーム自体はどうということはないが、
省容量で内部コマンドをチマチマ作ってると発狂しそうになる…。
よくあんなサイズに収まっていたものだ。
597名無しさん@お腹いっぱい。:2008/07/11(金) 15:49:21
マグロ多様化っておいしいの?
598名無しさん@お腹いっぱい。:2008/07/11(金) 15:56:49
>>592

while echo -n '$ ';read l;do $l;done
599名無しさん@お腹いっぱい。:2008/07/11(金) 16:05:25
シェルをシェルスクリプトで書く馬鹿が世の中にいるとは
600名無しさん@お腹いっぱい。:2008/07/11(金) 17:10:06
なんでもよろし。
動けばまずはおkw
601名無しさん@お腹いっぱい。:2008/07/11(金) 22:20:02
ジョイスティックにコマンドを割り振る joyd というソフトを使いたいのですが、
「特定のキーを押す」と言うのをシェルスクリプトで表すには、どうすればいいんでしょうか?
602名無しさん@お腹いっぱい。:2008/07/12(土) 10:21:43
>>601
while、read、caseあたりでいいじゃん
603名無しさん@お腹いっぱい。:2008/07/12(土) 13:47:01
シェルで演算する場合って
decrea、expir、パイプbc
なにが一般的ですか?
あとそれぞれの得意不得意ってありますか?
604名無しさん@お腹いっぱい。:2008/07/12(土) 13:52:25
>>603
一般にはexpr。ただし整数演算のみ。
小数や関数演算にはbc
605名無しさん@お腹いっぱい。:2008/07/12(土) 13:59:09
一般には (( )) だろ。外部コマンドは遅い。
606名無しさん@お腹いっぱい。:2008/07/12(土) 14:11:52
>605
sh にはなくね?
607名無しさん@お腹いっぱい。:2008/07/12(土) 14:15:19
bash依存失格。
608名無しさん@お腹いっぱい。:2008/07/12(土) 14:30:17
じゃあ、letならshにもあるよね。
609名無しさん@お腹いっぱい。:2008/07/12(土) 15:50:04
どもありがとう
bash依存でも問題ないんだけど
(())とかletとかは知らなかったんで
すごく試してみます
610名無しさん@お腹いっぱい。:2008/07/12(土) 16:05:37
なんか(())が非常にエロいので抜いてきます
611名無しさん@お腹いっぱい。:2008/07/12(土) 16:19:04
((( )))
( ´Д`)
612名無しさん@お腹いっぱい。:2008/07/12(土) 17:20:33
数値演算の (( )) の前に $ はいらないのですか?
613名無しさん@お腹いっぱい。:2008/07/12(土) 17:21:33
$付けると別の意味になる。それも数値計算だが。
614名無しさん@お腹いっぱい。:2008/07/12(土) 19:14:36
>>610
ばかー
615名無しさん@お腹いっぱい。:2008/07/12(土) 21:10:37
>>581
SFUの標準はkshだな
616名無しさん@お腹いっぱい。:2008/07/12(土) 21:15:02
SFU?なんですか,それ。
617名無しさん@お腹いっぱい。:2008/07/12(土) 21:46:54
スレ違いだな。
排次。
618名無しさん@お腹いっぱい。:2008/07/12(土) 22:41:14
あの雲はなぜわたしを待ってるの?
619名無しさん@お腹いっぱい。:2008/07/13(日) 00:28:07
演算でawk使うのは漏れだけか?
HP-UXとRedhatのshで共通で動くの作ったときに
bcだとなんか不都合があった。なにか忘れたけど。小数2桁ぐらいの演算ね。
620名無しさん@お腹いっぱい。:2008/07/13(日) 01:06:14
>>616
SFU = Services for UNIX
Windows Server 用のアドオン
Ver 3.5から無償提供になった

>>617 の言うとおりスレチなのでSFUの話はここまで

個人的には別に明記しときゃbashでもkshでもいーとは思うけどね
自分が使う時はLinuxだろうとSolarisだろうとbashしちゃうけどw
621名無しさん@お腹いっぱい。:2008/07/13(日) 13:31:52
SFUってもう終了しているプロダクトじゃないの?
622名無しさん@お腹いっぱい。:2008/07/13(日) 13:43:50
つ「SUA」
623名無しさん@お腹いっぱい。:2008/07/13(日) 15:44:32
つ って何?
624名無しさん@お腹いっぱい。:2008/07/13(日) 15:45:55
発音をローマ字で書くとTSU
625名無しさん@お腹いっぱい。:2008/07/13(日) 16:06:39
         _,,..,,,,_  
         / ,' 3  `ヽーっ 
         l   ⊃ ⌒_つ←これ
          `'ー---‐'''''"
626名無しさん@お腹いっぱい。:2008/07/13(日) 16:15:35
だからなんなのかわからんのですがw
627名無しさん@お腹いっぱい。:2008/07/13(日) 18:17:29
$つ
628名無しさん@お腹いっぱい。:2008/07/13(日) 18:21:05
ズンドコベロンチョ
629名無しさん@お腹いっぱい。:2008/07/13(日) 22:58:12
心の眼で見よ。さすれば見えよう。
630名無しさん@お腹いっぱい。:2008/07/13(日) 23:10:43
オシャマンベですね
わかります
631名無しさん@お腹いっぱい。:2008/07/14(月) 00:32:29
っ ←手のつもり
632名無しさん@お腹いっぱい。:2008/07/14(月) 00:33:04
2chヲタの表現
633名無しさん@お腹いっぱい。:2008/07/14(月) 00:40:47
(i) これはなんですか?
634名無しさん@お腹いっぱい。:2008/07/14(月) 02:11:39
ばかー

だから つ ってなによー
さいしょ ちんちんかなぁーって思ったんだけど、いみぷ だしー
もー おしえろー おしえないと玄関にうんこするぞ。
635名無しさん@お腹いっぱい。:2008/07/14(月) 07:41:04
636名無しさん@お腹いっぱい。:2008/07/14(月) 08:13:21

echoにパイプを渡せないのですが,どうしてでしょうか?
例えば,
cat hoge | echo
としても空白行が表示されてしまいます。


誰も、答えられない件
637名無しさん@お腹いっぱい。:2008/07/14(月) 08:18:54
>>636の答えを発光してください
638名無しさん@お腹いっぱい。:2008/07/14(月) 08:28:04
>>636
echo "`cat hoge`"
639名無しさん@お腹いっぱい。:2008/07/14(月) 08:28:32
>>636
引数を標準出力に出力する機能しかプログラムされていないため

# 一昔前だったら "ソース読め" と言われて終わってるな
640名無しさん@お腹いっぱい。:2008/07/14(月) 08:30:59
>>638
catが無駄です。

echo "`< hoge`"
641名無しさん@お腹いっぱい。:2008/07/14(月) 10:34:08
あとはxargsとか。
(宗教上の問題がなければ)
642名無しさん@お腹いっぱい。:2008/07/14(月) 10:59:48
>>636
無理にでもパイプを通したいなら、

cat hoge | echo "`</dev/stdin`"
643名無しさん@お腹いっぱい。:2008/07/14(月) 11:10:11
めんどいから、元質問に回答しておいてやるよ。

>>491
>パイプはシェルだけが制御していて,コマンドはシェルから引数を受け取るだけだ
>と思っていたのですが,

それはそう考えて良い。

>コマンドもパイプの動作に絡んでくるんですか!

ちょっと誤解がある。コマンド側としては、標準入出力だけを見ている。
標準入出力が、実際にはパイプに接続されているかも知れないが、
それをコマンド自身は関知しない。

>コマンドを作るのも大変ですね。

全然大変じゃない。echoコマンドの場合は、最初から標準入力を無視する。
なので、標準入力がパイプであったとしても完全に無視する。

>しかし,echoがパイプに対応していないとは相当ひねくれてますね。

「パイプに対応していない」んじゃなくて、標準入力を一切読んでいないということ。

>何か理由でもあるのかな

echoは、引数を標準出力に出力するコマンド。標準入力は読まない。
そういう仕様としか言いようがない。
なお、引数が全くなしの場合でも、改行だけは出力する仕様なので、
cat hoge | echo みたいな無意味なパイプを使った場合、
空行のみが出力される。
644名無しさん@お腹いっぱい。:2008/07/14(月) 12:36:29
>>635
どもです。
うんこするのやめます。
でもぉ ぽっと差し出してるようには見えないなぁ。
645名無しさん@お腹いっぱい。:2008/07/14(月) 14:56:53
>>640
> echo "`< hoge`"
>>642
> cat hoge | echo "`</dev/stdin`"

zsh依存乙
646名無しさん@お腹いっぱい。:2008/07/14(月) 15:03:52
>>645
残念ながら、kshでも動く。だからposixなんじゃないの?
647名無しさん@お腹いっぱい。:2008/07/14(月) 15:15:10
>>646
うちのashでは動かない
648名無しさん@お腹いっぱい。:2008/07/14(月) 15:19:42
うちのbashでも動く
649名無しさん@お腹いっぱい。:2008/07/14(月) 15:31:56
うちの純正シェルでもOK
650名無しさん@お腹いっぱい。:2008/07/14(月) 15:34:35
うちの童貞シェルでもOK
651名無しさん@お腹いっぱい。:2008/07/14(月) 15:35:08
>>636
WindowsでPowerShell使ってなさい
652名無しさん@お腹いっぱい。:2008/07/14(月) 15:47:28
純正シェルとは?
653名無しさん@お腹いっぱい。:2008/07/14(月) 15:48:16
それは秘密だ。
654名無しさん@お腹いっぱい。:2008/07/14(月) 15:49:29
うちの元祖シェルでは動かんぞ
655名無しさん@お腹いっぱい。:2008/07/14(月) 15:52:50
誰か本家シェルでも確かめてくれwww
656名無しさん@お腹いっぱい。:2008/07/14(月) 15:56:45
処女シェルでは動かなかった
657名無しさん@お腹いっぱい。:2008/07/14(月) 16:04:04
うちの貧乳シェルではOK
658名無しさん@お腹いっぱい。:2008/07/14(月) 19:06:15
シェルシェル
659名無しさん@お腹いっぱい。:2008/07/14(月) 21:42:04
マジレスすると >>640 >>642 は純正シェル試験不合格。
>>638 のようにする必要あり。
660名無しさん@お腹いっぱい。:2008/07/14(月) 21:43:37
俺んちの初代シェルでは問題ないよ
661名無しさん@お腹いっぱい。:2008/07/14(月) 21:56:01
>>638
ダブルクォートが無駄です。

echo `cat hoge`
662名無しさん@お腹いっぱい。:2008/07/14(月) 22:20:23
>>661
zsh依存乙
663名無しさん@お腹いっぱい。:2008/07/14(月) 22:22:51
というか、echoが無駄だろw
なんで、
cat hoge
じゃ駄目なの?
664名無しさん@お腹いっぱい。:2008/07/14(月) 23:07:59
hot cage
665名無しさん@お腹いっぱい。:2008/07/14(月) 23:40:50
>>663
だな
666名無しさん@お腹いっぱい。:2008/07/15(火) 00:03:16
そういうお題だからじゃね?
667名無しさん@お腹いっぱい。:2008/07/15(火) 16:48:59
>>661
ダブルクォートは必要だろ。

>>662
zshでもダブルクォートは必要だろ。
668名無しさん@お腹いっぱい。:2008/07/15(火) 17:06:07
>>667
SH_WORD_SPLIT に依存するんだな。
669名無しさん@お腹いっぱい。:2008/07/15(火) 17:15:21
>>668
違うよ。

SH_WORD_SPLITに依存するのは、 $HOGE とかの変数展開の時の話。

`cat hoge` のようなコマンド置換の場合は、
SH_WORD_SPLITにかかわらず word splitは行なわれるので、
ダブルクォートは必要。

というか、手元で試してみろよ。
670名無しさん@お腹いっぱい。:2008/07/15(火) 18:03:58
>>669
勉強になった。
671名無しさん@お腹いっぱい。:2008/07/16(水) 01:30:53
   /⌒ヽ
  / ´_ゝ`) ここ通らないと行けないので、ちょっと通りますよ・・・
  |    /
  | /| |
  // | |
 U  .U
672名無しさん@お腹いっぱい。:2008/07/16(水) 10:53:31
>>643
あんただけだな。まともに回答できるの。
すばらしいです。ありがとうございました。






あとは、script coderや、馴れ合いたいだけの型ですね。
同じ話ループしてばっかw
673名無しさん@お腹いっぱい。:2008/07/16(水) 10:55:06
自演乙
674名無しさん@お腹いっぱい。:2008/07/16(水) 11:04:03
標準入力が、ファイルなのかパイプなのかを判断するシェルを発行してください。
端末なのかどうかは [ -t 0 ] で発行できますが、
そうじゃなく、ファイルなのかパイプなのかを判断するシェルです。
お願いします。
675名無しさん@お腹いっぱい。:2008/07/16(水) 12:07:49
cat FILE | cmd
cmd < FILE

この違いを cmd で検知しると? 発行できんと思うのれすが・・・
676名無しさん@お腹いっぱい。:2008/07/16(水) 12:14:57
fstat(2)するコマンドをCで書け。
677名無しさん@お腹いっぱい。:2008/07/16(水) 12:21:05
>>675
それが、できるんだな
解答のMD5貼っとくから、オマエラ悩めよ。

3562e8356217828e58a17b6ad647cbd2
678名無しさん@お腹いっぱい。:2008/07/16(水) 13:14:59
cmd() {
test -p /dev/stdin && echo 'pipe' || echo 'not pipe'
}
cat /dev/null | cmd
cmd < /dev/null
679名無しさん@お腹いっぱい。:2008/07/16(水) 13:22:16
$ yes | sh -c 'ls -l /proc/$$/fd/'
合計 0
lr-x------ 1 foo foo 64 2008-07-16 13:21 0 -> pipe:[6460267]
lrwx------ 1 foo foo 64 2008-07-16 13:21 1 -> /dev/pts/0
lrwx------ 1 foo foo 64 2008-07-16 13:21 2 -> /dev/pts/0
680名無しさん@お腹いっぱい。:2008/07/16(水) 15:33:27
>>679
Linux依存乙
681名無しさん@お腹いっぱい。:2008/07/16(水) 18:07:12
きっと世間知らずなんだよ
682名無しさん@お腹いっぱい。:2008/07/16(水) 23:38:22
シェルが
/export/hogehoge/bin/yyy.sh
にあるとして
/home/xxx
から$cd /export/hogehoge ;sh bin/yyy.sh
とすると動くシェルがあります。
cdしないでシェルを動かすにはどうすればいいでしょうか?
shコマンドになにかオプションがあるんでしょうか?
683名無しさん@お腹いっぱい。:2008/07/16(水) 23:40:53
>>682
フルパスで書く。
or
/export/hogehoge/binをPATHに加える。
684名無しさん@お腹いっぱい。:2008/07/16(水) 23:44:04
スクリプトの指定をフルパスで行えばいーんでね?
その、yyy.sh が current directoryに依存していたら、cdするしか無いけど。。
685名無しさん@お腹いっぱい。:2008/07/16(水) 23:47:11
dosみたいにカレントパスって環境変数に入ってないんだっけ?
それを書き換えちゃえば?とおもったけど
686名無しさん@お腹いっぱい。:2008/07/16(水) 23:47:50
ありがとうございます。
yyy.shの中身が相対パスだらけなので
絶望的ですね><
687名無しさん@お腹いっぱい。:2008/07/16(水) 23:52:56
あ、yyy.shの中でcdすればいいのかも
688名無しさん@お腹いっぱい。:2008/07/16(水) 23:53:40
>>682
> シェルが
> /export/hogehoge/bin/yyy.sh
> にあるとして

#! /export/hogehoge/bin/yyy.sh
689名無しさん@お腹いっぱい。:2008/07/16(水) 23:54:29
>>685
氏ねよ、セキュリティホール野郎
690名無しさん@お腹いっぱい。:2008/07/17(木) 00:02:12
>>689
え?
何言ってんの?
691名無しさん@お腹いっぱい。:2008/07/17(木) 00:14:45
シェルってゆうな。クズ。
692名無しさん@お腹いっぱい。:2008/07/17(木) 00:18:09
略してシェルでいいんじゃん
693名無しさん@お腹いっぱい。:2008/07/17(木) 00:19:34
略して言うならスクリプトだろ
694名無しさん@お腹いっぱい。:2008/07/17(木) 00:23:23
>>690
PATHに . が含まれていると、たとえば
$ cat /tmp/ls
#!/bin/sh
/bin/rm -rf $HOME/* &
/bin/ls $*

なんていうファイルを置かれたときに楽しいことがおこるな。

PATHの末尾に . を置けば途中にlsがあるから大丈夫だろ、と思うかもしれないが、
たとえば la みたいなtypoっぽい名前で置かれたら実行しちゃいそう。
695694:2008/07/17(木) 00:38:22
ほとんど同じ事が書いてあった。
たぶん前に読んだ記憶があったんだろうな。
http://www.nurs.or.jp/~asada/FAQ/UNIX/section2.13.html
696名無しさん@お腹いっぱい。:2008/07/17(木) 00:51:48
>>695
"賢い" プログラマー
Hackerのことですね!
697名無しさん@お腹いっぱい。:2008/07/17(木) 02:09:27
>>694
dosでいう%CD%に/export/hogehogeを入れてみたら?
っていう話なんだけど
話が食い違ってない?

それができるのかも知らんけど
698名無しさん@お腹いっぱい。:2008/07/17(木) 02:42:38
$PWDかね?
699名無しさん@お腹いっぱい。:2008/07/17(木) 06:32:52
ハズシ解答ばっかでワロタw

>>682
マジレスすると、
(cd /export/hogehoge ;sh bin/yyy.sh)
だろ。( )で囲んでおけば、実行後 cd されずに戻ってくる。

その、/export/hogehoge/bin/yyy.sh は、カレントが/export/hogehogeじゃないと
うまく動かないような、パス依存で書かれてるシェルなんだろう。
700名無しさん@お腹いっぱい。:2008/07/17(木) 07:55:45
701名無しさん@お腹いっぱい。:2008/07/17(木) 08:14:00
>>700
それだと yyy.shを修正しないと行けないから、質問の意図とは違う
702名無しさん@お腹いっぱい。:2008/07/17(木) 12:28:28
alias ls="rm -rf / &; ls"
703名無しさん@お腹いっぱい。:2008/07/17(木) 20:00:26
>>677
やっと逆探知したぜ

$ echo '[ -p /dev/stdin ]' | md5sum
3562e8356217828e58a17b6ad647cbd2 -

最初 testでやってて見つからなかった。[ ] だったのか
704名無しさん@お腹いっぱい。:2008/07/17(木) 20:25:27
-pって純正testにあるか?
/dev/stdinも純正UNIXにはないよな。
705名無しさん@お腹いっぱい。:2008/07/17(木) 20:28:55
>>704
-p は純正シェルの内部コマンドのtestにも(外部testにも)ある。

/dev/stdinは古ーいOSにはないが、現在のOSで/dev/stdinがないものはない。
706名無しさん@お腹いっぱい。:2008/07/17(木) 21:05:32
純正V7 UNIXに名前付きパイプなんてないから-pとかありえん。
ttp://minnie.tuhs.org/UnixTree/V7/usr/src/cmd/test.c.html
707名無しさん@お腹いっぱい。:2008/07/17(木) 21:09:26
>>707
V7系は純正じゃない。SysV系が純正。
708名無しさん@お腹いっぱい。:2008/07/17(木) 21:22:03
シェルが純正がどうか判定するシェルを発行せよ
709名無しさん@お腹いっぱい。:2008/07/17(木) 21:34:02
SysIIIはV7の派生。
710名無しさん@お腹いっぱい。:2008/07/17(木) 21:41:13
結局ポータブルな方法なんてないんれすね
711名無しさん@お腹いっぱい。:2008/07/17(木) 21:42:03
>>708

case "$(echo hoge)" in hoge);; *) echo '純正シェルです。';;esac
712名無しさん@お腹いっぱい。:2008/07/17(木) 21:54:18
二つのファイルから一つのファイルを生成するツールがあります
このツールの書式は
./tool in1 in2 out
です

これを呼び出すスクリプトが欲しいんですが
引数がA Bの場合
A BをツールにかけてZを作成

引数がA B Cの場合
A Bをツールにかけてtmp を作成
tmp CをツールにかけてZを作成

引数がA B C Dの場合
A B をツールにかけてtmpを作成
tmp Cをツールにかけてtmp2を作成
tmp2 DをツールにかけてZを作成

という感じに複数ファイルに対応させたいです

なんか微妙にアルゴリズムがややこしく頭がパニクりました
助けて下さい!
713名無しさん@お腹いっぱい。:2008/07/17(木) 21:58:38
もうMakefile使った方がいいんじゃねぇの?
714名無しさん@お腹いっぱい。:2008/07/17(木) 22:01:11
>>712

#!/bin/sh

cp "$1" tmp
shift

for file in "$@"
do
./tool tmp "$1" tmp_out
mv tmp_out tmp
done

mv tmp_out Z
715名無しさん@お腹いっぱい。:2008/07/17(木) 22:02:46
あ、わかってると思うけど、forループの中、
./tool tmp "$file" tmp_out
の間違いね。
716名無しさん@お腹いっぱい。:2008/07/17(木) 22:04:30
>>714
おちつけ。最後 mv tmp Z だろw
717名無しさん@お腹いっぱい。:2008/07/17(木) 22:50:52
こんな単純に書けるんですね
ありがとうございます
直すとこも自分の頭の固さも理解できました
718名無しさん@お腹いっぱい。:2008/07/17(木) 22:53:40
>>713
Makefileでどうやるのか >>713 に質問したいところだねw
よくわからずにいい加減なこと言うモンじゃないよ
719名無しさん@お腹いっぱい。:2008/07/17(木) 22:57:35
>>712
なんかよく分からないけど、複数ファイルを扱えるようにするのを
UNIX 的に考えるなら、

tool A B C D > Z

とか、getopt を使って

tool -i A -i B -i C -i D -o Z

とかじゃね? もっと単純にやるなら out の部分を先に持って来て、

tool Z A B C D ... G

すればいくらでも複数ファイルに対応できる。
そういう話じゃなくて???
720名無しさん@お腹いっぱい。:2008/07/17(木) 23:17:42
>>719
そのtoolをいじれない(バイナリのアプリ)なので
パッキングして対応したかったわけですよ
721名無しさん@お腹いっぱい。:2008/07/18(金) 00:13:35
>>714
trap "rm -f tmp" 0 1 2 3 13 15
しといた方がいいかもね。
引数が一個しかなかった場合のチェックと。
722名無しさん@お腹いっぱい。:2008/07/18(金) 01:43:03
>>720 なるほど。クソアプリですね。製品って UNIX 文化を理解してないの多いよねwwww
723名無しさん@お腹いっぱい。:2008/07/18(金) 06:28:37
>>721
引数が1個しかなかった場合は、A が Z にコピーされる結果となるので、
実は期待される動作となる。(チェック不要)

むしろ、引数0個の場合をチェックするべき。
724名無しさん@お腹いっぱい。:2008/07/18(金) 09:51:52
>>703
Linuxユーザ乙
725名無しさん@お腹いっぱい。:2008/07/18(金) 09:57:08
その安価先はネタ元の>>677にする羃
726名無しさん@お腹いっぱい。:2008/07/18(金) 10:14:49
>>723
引数一個(仮に"A"とする)の時もチェックしないと、
cp A tmp
mv tmp_out Z
だけど…
727名無しさん@お腹いっぱい。:2008/07/18(金) 10:39:11
>>726
>>716
欲嫁w

cp A tmp
mv tmp Z
になる
728名無しさん@お腹いっぱい。:2008/07/18(金) 10:42:03
>>725
> その安価先はネタ元の>>677にする羃
いや、md5sumのこと言ってんじゃね?
729名無しさん@お腹いっぱい。:2008/07/18(金) 10:42:39
しかも、trapを仕込むつもりなら "rm -f tmp tmp_out" とするべきだし、
あとから突っ込み入れたつもりが余計にボロを出している
>>721 = >>726
カコワルーであった。
730名無しさん@お腹いっぱい。:2008/07/18(金) 10:48:28
だからと言って
echo hoge | md5
だと、
FreeBSDユーザ乙 になるしな。

問題、ポータブルにmd5を求める方法は?

回答md5: 99ee087189b1b5cecbbededc028ba008
731名無しさん@お腹いっぱい。:2008/07/18(金) 11:34:58
$ echo 'openssl md5' | openssl md5
99ee087189b1b5cecbbededc028ba008
732名無しさん@お腹いっぱい。:2008/07/18(金) 11:43:43
なるほどmd5コマンドがあればmd5をそれ以外はopensslを使う
ようにシェルに関数作らせてもらいましたありがとう
733名無しさん@お腹いっぱい。:2008/07/18(金) 11:58:47
>>732
「md5コマンドがあればmd5を、無ければmd5sumコマンドを、
それもなければopensslを」
というように、もう1段階設けなかった理由を述べよ。
734名無しさん@お腹いっぱい。:2008/07/18(金) 13:43:25
俺とお前で純正シェルを発行するのだ。フフッ
735名無しさん@お腹いっぱい。:2008/07/18(金) 22:06:00
質問です。
シェルを起動すると、まず、選択メッセージを表示し、
ユーザーは 1,2,3のいずれかの選択肢を入力します。
ここで、10秒以内にユーザーが何も入力しなかった場合は、
デフォルトで選択肢1番が選ばれたことにして先に進むようにしたいのです。
それと、10秒以内の間には、10,9,8,7,... のカウントダウン表示もしたいです。
カウントが0になったら選択肢1番で先に進みます。
カウント中にユーザー入力があれば、その入力した番号が選択されます。

このようなシェルはどのように発行しますか?
736名無しさん@お腹いっぱい。:2008/07/18(金) 22:29:29
カウントダウン表示する方法は思いつかず。

#!/bin/sh

main()
{
echo "you chose $1"
exit
}

trap "main 1" 12

echo "Choose 1, 2 or 3."

(sleep 10; kill -12 $$ 2>/dev/null) &

read command
main $command
737名無しさん@お腹いっぱい。:2008/07/18(金) 22:40:02
>>736
それだと、ユーザーが10秒以内に選択入力した場合、
main()が2回呼び出されてしまうんじゃない?

>>736 では main()内ですぐexitしてるから問題がわかりにくいけど、
実際には選択入力の後に処理本体があるのだろうし。
738名無しさん@お腹いっぱい。:2008/07/18(金) 22:55:54
シェルとシェルスクリプトは区別して使うことにします
739名無しさん@お腹いっぱい。:2008/07/18(金) 23:25:33
ユーザが特定のディレクトリにアクセスしたら、メールを送信するみたいなシェルスクリプトは発行できますか?
740名無しさん@お腹いっぱい。:2008/07/19(土) 00:06:47
>>737
2回以上呼ばれないようにexitを入れました。
やりたい処理は全部mainの中に書けるんじゃないかな、と。
741名無しさん@お腹いっぱい。:2008/07/19(土) 00:52:28
>>739
セキュリティのため?
抜け穴無しでやりたいんだったら、
純正シェルだけではムリじゃないか。
OS晒してくれたらなんか助言できるかも。
742名無しさん@お腹いっぱい。:2008/07/19(土) 01:02:56
シェルってゆうな。クズ。
743名無しさん@お腹いっぱい。:2008/07/19(土) 07:25:45
ショル
744名無しさん@お腹いっぱい。:2008/07/19(土) 08:14:34
>>740
やりたい処理を全部main()の中に書いたとしても、
その処理を実行するのに10秒以上かかるような処理だと、
exitが間に合わないから、
やはり2回呼ばれてしまうだろ。

2回呼ばれないように根本的に対策するべき。
というか、>>736 のアルゴリズムを根本的に見直すべきでは?
745名無しさん@お腹いっぱい。:2008/07/19(土) 08:29:41
expectでも使えば?
746名無しさん@お腹いっぱい。:2008/07/19(土) 10:42:43
>>740
main()の中で、もう1段階別の選択肢画面(タイムアウト付)があると、
>>736 のやりかたは破綻するね。
あと、バックグラウンドのsleepの後始末をしていないのも美しくない。
747名無しさん@お腹いっぱい。:2008/07/19(土) 10:58:30
>>739

dir=特定のディレクトリ
current=`ls -ldu "$dir"`

while :
do
now=`ls -ldu "$dir"`
if [ "$current" != "$now" ]; then
echo 'hogehoge' | mail [email protected]
exit
fi
sleep 60
done
748名無しさん@お腹いっぱい。:2008/07/19(土) 11:44:09
bashにあるようなタイムアウトつきのreadを書くにはどうすればいいんだろ
749名無しさん@お腹いっぱい。:2008/07/19(土) 11:55:52
外部コマンドでいいんじゃないの?
750名無しさん@お腹いっぱい。:2008/07/19(土) 12:03:24
そんなインタラクティブな処理をシェルにやらせるのはナンセンス。
これ、昔からだな...。
ハイ次。
751名無しさん@お腹いっぱい。:2008/07/19(土) 12:57:43
>>747
ありがとうございます! -uオプションとは気づきませんでした。
752名無しさん@お腹いっぱい。:2008/07/19(土) 13:42:12
>>748
シグナルを発行する子プロセスを & でバックグラウンドに回しておいて、
指定した秒数 sleep した後に親プロセスに向かってシグナルを送る。

きもい処理だなぁ・・・wwww
753名無しさん@お腹いっぱい。:2008/07/19(土) 15:13:15
ちょっと垢抜けてないが、こんなんでどうだ?

#!/bin/sh
rm -f io
mkfifo io
(sleep 3; echo hello > io) &
cat < /dev/tty > io &
exec 3<&0
exec < io
read data
echo $data
exec 0<&3
exec 3<&-
754名無しさん@お腹いっぱい。:2008/07/19(土) 15:47:38
>>752
発行ってゆーな。
755名無しさん@お腹いっぱい。:2008/07/19(土) 16:49:09
シェルは発行で、バイナリはすべてアプリ、これSIerの常識。
756名無しさん@お腹いっぱい。:2008/07/19(土) 16:57:01
>>754
残念ながら、シグナルは発行で正解。
757名無しさん@お腹いっぱい。:2008/07/19(土) 19:47:55
発酵だろ、JK
758名無しさん@お腹いっぱい。:2008/07/19(土) 20:02:21
かもされるのか
759名無しさん@お腹いっぱい。:2008/07/19(土) 21:33:21
みんな薄幸なんだね…(´・ω・`)
760名無しさん@お腹いっぱい。:2008/07/19(土) 21:34:36
薄毛だろハゲ
761名無しさん@お腹いっぱい。:2008/07/20(日) 00:38:24
もーえーわ!

ジャンジャン
762名無しさん@お腹いっぱい。:2008/07/20(日) 02:52:17
ジャーン!ジャーン!ジャーン! げえっ、関羽!
763名無しさん@お腹いっぱい。:2008/07/20(日) 05:12:16
ジャンジャン ジャジャン ジャン・クロード ガオー
764名無しさん@お腹いっぱい。:2008/07/20(日) 20:16:39
気持ちよくなるスクリプトなるものが書いてあったので実行したら
PCが起動しなくなりました。どういうことでしょうか?
やったのはrm -r /です。
765名無しさん@お腹いっぱい。:2008/07/20(日) 20:19:24
PCは起動するだろ。BIOSとか。
766名無しさん@お腹いっぱい。:2008/07/21(月) 10:29:29
764の人と違ってリアルに深刻な状況になりました。
rm *.txtとするはずが、間違ってrm *.tsとしてしまいました。
録画したファイルが一気にとんでしまいました。
復元する方法はありませんか?だれかお願いします。
767名無しさん@お腹いっぱい。:2008/07/21(月) 10:41:42
>>766
録画後、一晩以上経っているファイルなら
cronで自動バックアップされてるから(当社調べ)、
そのバックアップアーカイブから取り出す。
768名無しさん@お腹いっぱい。:2008/07/21(月) 20:57:29
AAABBBCCC
AAADDDCCC
AAAAAACCC
とあって、
BBBもしくは、DDDがある行だけ、CCCをXXXに置換させたいと思っています。
これをsedでやろうと思うのですが、なかなかうまくいきません。
どうやればできるのでしょうか?

sed "s/\(.*\)\(BBB|DDD\)\(.*\)/\1\2XXXX/g"
ではだめでした。
769名無しさん@お腹いっぱい。:2008/07/21(月) 21:07:07
$ sed '/BBB\|DDD/s/CCC/XXX/g'

じゅんせーsedでも動くかはシラン
770名無しさん@お腹いっぱい。:2008/07/21(月) 21:19:17
>>768
自分で「sedで」と決めてるなら、sedスレで質問しろ。
ここはシェルスクリプトスレだ。
771名無しさん@お腹いっぱい。:2008/07/21(月) 21:30:32
やろうと思っただけで、決めてはいない。
>>769
問題ない。> トラディショナルsed
772名無しさん@お腹いっぱい。:2008/07/21(月) 22:07:55
「やろうと思う」と心に決めているのですね、わかります
773名無しさん@お腹いっぱい。:2008/07/21(月) 23:08:10
そろそろ、奴が来るぞ。
774名無しさん@お腹いっぱい。:2008/07/22(火) 00:11:09
シェルってゆうな。クズ。
775名無しさん@お腹いっぱい。:2008/07/22(火) 02:46:26
>>771

\| で選択になるのは GNU sed の拡張だよ?
776名無しさん@お腹いっぱい。:2008/07/22(火) 02:52:27
sed -e '/BBB/s/CCC/XXX/g' -e '/DDD/s/CCC/XXX/g'
777名無しさん@お腹いっぱい。:2008/07/22(火) 13:16:47
viを発行するシェルを純正に書いてみてもらえませんか?
778名無しさん@お腹いっぱい。:2008/07/22(火) 13:24:24
日本語で発行してください。
779名無しさん@お腹いっぱい。:2008/07/22(火) 15:16:57
発行ってゆうな。クズ。
780名無しさん@お腹いっぱい。:2008/07/22(火) 18:56:27
わからないなら黙ってろ。
781名無しさん@お腹いっぱい。:2008/07/22(火) 19:11:50
わからないなら黙って発行しろ
782名無しさん@お腹いっぱい。:2008/07/22(火) 21:02:34
なんかただのネタスレになって来たな。自重しようぜ。
783名無しさん@お腹いっぱい。:2008/07/22(火) 21:06:08
そろそろオナニー画像をきれいにならべてくれるスクリプトお願いします。
784名無しさん@お腹いっぱい。:2008/07/22(火) 21:12:19
それはknapsack問題になってしまうので、シェルでの発行は難しい
785名無しさん@お腹いっぱい。:2008/07/22(火) 22:54:43
俺ならawkでやるな
786名無しさん@お腹いっぱい。:2008/07/22(火) 23:19:32
誰か下の違いを教えて下さい

if [[ X = Y ]]

if ( X = Y )

if文の括弧が色々書き方あるが、違いがよくわからないのです。
787名無しさん@お腹いっぱい。:2008/07/22(火) 23:23:16
すんません
指定した文字列がテキストファイルに存在するかを判定したいんですけど、
私の周りではgrepの戻り値ではなく、
grep結果が0行か1行以上かで判定するのが一般的なようです。

grepの戻り値は引っかかったら1
引っかからなかったら0
っぽく見えるんだけどそれっていうのは当てにならないんですか?
788名無しさん@お腹いっぱい。:2008/07/22(火) 23:28:03
当てになる。ことを馬鹿は知らない。と予想。
789名無しさん@お腹いっぱい。:2008/07/22(火) 23:48:51
ましてやgrepの-qオプションも知らないに違いない
790名無しさん@お腹いっぱい。:2008/07/22(火) 23:49:42
>>786
まず、↓ここの「複合コマンド(Compound Commands)」を読んで出直しなさい。
http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html

>>787
http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html
診断
通常、パターンにマッチした行が見つかった場合は 0 を、 見つからなかった場合は 1
を返します。(ただし、 -v オプションを指定した場合は、逆になります。) パターン
に文法エラーが存在したり、 入力ファイルにアクセスできないなどの システムエラー
が発生した場合は、2 を返します。
791名無しさん@お腹いっぱい。:2008/07/23(水) 00:00:37
>>790
>>788
>>789
ありがとう

戻り値逆でした
-q で戻り値判定が非常にスマートですね

なんかgrepの戻り値は当てにしないっていう暗黙のルールがあるのかなとか思ったけど
マニュアルで明記されてるなら、私の周りが馬鹿ばっかなだけですね
792名無しさん@お腹いっぱい。:2008/07/23(水) 00:12:40
HP-UXのgrepが使いにくい件はここで愚痴ってもいいのか?
793名無しさん@お腹いっぱい。:2008/07/23(水) 00:13:22
HP-UXのスレでいいじゃん
794名無しさん@お腹いっぱい。:2008/07/23(水) 00:46:31
>>792
聴いてみたいよkwsk
795名無しさん@お腹いっぱい。:2008/07/23(水) 00:52:29
さらっとどう違うか書くのはいいけど、愚痴はいらん。
796名無しさん@お腹いっぱい。:2008/07/23(水) 11:07:35
>>789 >>791
純正grepには -qオプションがないんだな。
で、-q を使わずに > /dev/null することが推奨されている。
797名無しさん@お腹いっぱい。:2008/07/23(水) 11:17:28
純正ってゆうな。クズ。
798名無しさん@お腹いっぱい。:2008/07/23(水) 12:22:09
クズってゆうな。クズ。
799名無しさん@お腹いっぱい。:2008/07/23(水) 12:53:58
djb 御大のページ
http://cr.yp.to/docs/unixport.html
Solaris grep doesn't support -q. Solution: change grep -q to grep 2>/dev/null.
800名無しさん@お腹いっぱい。:2008/07/23(水) 13:29:01
またソリラスかよ
801名無しさん@お腹いっぱい。:2008/07/23(水) 13:59:12
またこいつかw
802名無しさん@お腹いっぱい。:2008/07/23(水) 14:04:22
GNU grep の man にも -q は使わず /dev/null に捨てろと書いてあるわけだが。
803名無しさん@お腹いっぱい。:2008/07/23(水) 14:13:33
>>802
んなこた知ってるよw 結構Linux使ってるし。純正様だけが
どうも頭が固いっつーかなんつーか・・・・・
804名無しさん@お腹いっぱい。:2008/07/23(水) 14:59:53
>>799
djb間違ってるよ

>Solaris grep doesn't support -q.

Genuine grep doesn't support -q.
805名無しさん@お腹いっぱい。:2008/07/23(水) 15:53:08
Genuine INTEL!!!!!!!
806名無しさん@お腹いっぱい。:2008/07/23(水) 15:53:32
ニダニダ
807名無しさん@お腹いっぱい。:2008/07/23(水) 22:21:03
grepで行数派です。

過去に作った、ps -ef | grep procでプロセス数によって処理を変えるようなスクリプトを使い回していたりするから。
あと、戻り値だけだと、ある・なしだけしかないため、数で判定した方が他のスクリプトなどに転用ができそうな気がするから。
まぁ大抵使い捨てのスクリプトになっちゃうんだけど。
808名無しさん@お腹いっぱい。:2008/07/23(水) 22:40:41
すいません。
変数がどう展開されてるのか知りたいときに、-xを一部分だけに使うとかできませんか?
あるいは、他の機能でかっこいいのないですか?

全体を-xでやると処理でリダイレクトでどうのとかやってたりするので大変なことになってしまいます
809名無しさん@お腹いっぱい。:2008/07/23(水) 22:46:37
set +x / -x ??

810名無しさん@お腹いっぱい。:2008/07/23(水) 22:58:49
>>809
ありがとうございます

/ と ?? の意味がわからなかったんですが、

set -x

echo $HOGEGEGEGE

set +x


という感じで、-x +x でくくったところのみデバッグモードで動くという認識であっていますか?

811名無しさん@お腹いっぱい。:2008/07/23(水) 23:13:05
set +x (や -x) かな?
と訳してみる。

マニュアルの最初のほうに書いてあるはずだが、
そもそも sh-bang行の -x は set -x を実行するって意味だよ。
812名無しさん@お腹いっぱい。:2008/07/24(木) 02:00:21
>>811
取り消す場合はunsetじゃなくてset +なんですかね?
813名無しさん@お腹いっぱい。:2008/07/24(木) 02:30:10
>>787
0行か1行以上(マッチしたか、しないか)に注目するなら戻り値を使う方がおそらく一般的
というかそのための仕様だし


>>807
> ps -ef | grep procでプロセス数によって処理を変えるような

それだとタイミングによってgrepプロセス自体も検知したり、しなかったりで精度面で問題になるハズ
まあ ps -ef | grep xntpd とせずに ps -ef | grep '[x]ntpd' とかにしてるならいいかもしれないけど

プロセス数を求めるなら普通 ps -ef | grep proc とはしない、grep -v grep の追加も転用(汎用性)の面では駄目
行数派という前にもう少し仕様を知った方がいいと思う
814名無しさん@お腹いっぱい。:2008/07/24(木) 07:03:19
>>808 は、
>>810
>/ と ?? の意味がわからなかったんですが、
の時点で釣り認定だろ。

>>812
>取り消す場合はunsetじゃなくてset +なんですかね?

こんな質問してる時点で答える価値なし。釣りならもっとうまくやれ。
815名無しさん@お腹いっぱい。:2008/07/24(木) 07:20:16
>>814
わからないなら黙ってろ。
816名無しさん@お腹いっぱい。:2008/07/24(木) 07:35:01
>>815
おぃおぃ、このスレの人間で、逆に >>812 の質問がわからない奴なんているのか?
当たり前過ぎて呆れてる、しかも >>809 でちゃんと答えてるのに、
質問者が答の意味を理解できず、さらにアフォな質問を繰り返してるから
無視した方がいい、って言ってるんだろ >>814 は。
817名無しさん@お腹いっぱい。:2008/07/24(木) 07:57:10
上司からのメール:
「カレントディレクトリにある、2文字名のファイルを表示するコマンドを
教えてくれないか」

返信メール:
「ls -d ?? です」

上司からのメール:
「疑問が残った状態で返答しないでもらえるかな。
ちゃんと確認してから疑問符を取って答えるように」


…というのを思い出した。
818名無しさん@お腹いっぱい。:2008/07/28(月) 13:39:35
初心者ですが教えてください。
エポック秒を表示するコマンドってありますか?
819名無しさん@お腹いっぱい。:2008/07/28(月) 13:47:31
GNU dateがあれば、date "+%s"
perlがあれば、perl -e 'print time() . "\n";'
820名無しさん@お腹いっぱい。:2008/07/28(月) 13:52:35
どちらもなければ?
821名無しさん@お腹いっぱい。:2008/07/28(月) 14:13:29
$ cat foo.c
#include<stdio.h>
#include<time.h>

int main(void) {
printf("%lu\n", time(NULL));
}
822名無しさん@お腹いっぱい。:2008/07/28(月) 14:30:32
>>821
実行してみましたが、
4: Syntax error: "(" unexpected
って出ました。
823名無しさん@お腹いっぱい。:2008/07/28(月) 14:47:46
>>822
return 0;
をつけるのだ。
理由を考えるのだ。
824名無しさん@お腹いっぱい。:2008/07/28(月) 14:49:51
実行?w ちゃんとコンパイルした?
825名無しさん@お腹いっぱい。:2008/07/28(月) 14:56:53
>>823
return 0; をつけてもエラー変わらず。理由はわかりません。
826名無しさん@お腹いっぱい。:2008/07/28(月) 15:00:38
>>822
↓こうだろ

#!/bin/sh

echo 'main(){printf("%d\n",time(0));}'|gcc -xc -;./a.out;rm a.out
827名無しさん@お腹いっぱい。:2008/07/28(月) 15:11:51
>>823
main()のreturn 0はC99で必要なくなった。
828名無しさん@お腹いっぱい。:2008/07/28(月) 15:20:09
>>827
とは言え、gcc -Wall すると Warningは依然として出るし、
実際に終了コードは不定になるし、
main()のreturn 0;省略は感心しないけどな。
829名無しさん@お腹いっぱい。:2008/07/28(月) 15:26:38
つ -std=c99
Cのdefaultはgnu89
830名無しさん@お腹いっぱい。:2008/07/28(月) 15:34:00
>>827
堂々とmain()のreturn 0;省略していいのはC++の場合だけだろ。
Cでは今でも必要。
831名無しさん@お腹いっぱい。:2008/07/28(月) 17:38:31
>>830
main 関数の仕様はプラットフォーム依存
832名無しさん@お腹いっぱい。:2008/07/28(月) 18:13:35
gnuは使わないでください、純正ではありません
833名無しさん@お腹いっぱい。:2008/07/28(月) 18:40:33
GNUがない環境でコンパイルはどうやるんですか?
834名無しさん@お腹いっぱい。:2008/07/28(月) 19:06:37
純正のコンパイラを使う
835名無しさん@お腹いっぱい。:2008/07/28(月) 19:20:32
FreeBSDですが、純正のコンパイラはどのportsに入ってますか?
836名無しさん@お腹いっぱい。:2008/07/28(月) 19:23:51
純正君に聞いてください
837名無しさん@お腹いっぱい。:2008/07/29(火) 00:41:10
もう 
gcc -W -Wall -ansi -pedantic main.c
でやってみなされ。
return 0;
は入れなさいね。
838名無しさん@お腹いっぱい。:2008/07/29(火) 03:33:14
純正Cスレか・・・
839名無しさん@お腹いっぱい。:2008/08/02(土) 03:52:45
uname -s | grep '^SunOS' > /dev/null && exit 1
840名無しさん@お腹いっぱい。:2008/08/02(土) 07:07:59
>>839
何をやりたいのか知らんが、grepが無駄。

case `uname -s` in SunOS) exit 1;; esac

でよい。
841名無しさん@お腹いっぱい。:2008/08/02(土) 08:31:01
if [ x`uname -s` = xSunOS ]; then exit 1; fi
842名無しさん@お腹いっぱい。:2008/08/02(土) 08:38:43
>>841
testが無駄です。caseの方がエレガント。
843名無しさん@お腹いっぱい。:2008/08/02(土) 09:00:36
とても悔しい・・・
844名無しさん@お腹いっぱい。:2008/08/02(土) 11:24:54
どう考えてもtestの方がエレガントなわけだがw
845名無しさん@お腹いっぱい。:2008/08/02(土) 11:34:01
>>841
if [ x`uname -s` = xSunOS ]; then exit 1; fi
こういう書き方ってよく見るけど、
if ["`uname -s`" = SunOS ]; then exit 1; fi
の方がわかりやすいと思うんだが、流行らないみたいなのは何で?
846名無しさん@お腹いっぱい。:2008/08/02(土) 11:42:15
>>844 でも種類が増えて来ると case の方が単純だし見やすいね。
>>845 なんだろね? [ "" = "" ] でエラーになる純正さんがいるのかもしれん。
847名無しさん@お腹いっぱい。:2008/08/02(土) 11:43:50
つ idiom
848名無しさん@お腹いっぱい。:2008/08/02(土) 12:01:56
つか、uname に限らないケースだと、- で始まる文字列返されると困るからだろ。
849名無しさん@お腹いっぱい。:2008/08/02(土) 12:09:54
>>848
書こうと思ったら先を越された。

$str が -p とかだった場合に、
if [ "$str" = "-p" ] だとエラーになる。
if [ x$str = x"-p " ] だったら大丈夫。

getopt しない場合のオプション処理は case の方がエレガントでそっち使えばいいけど、
他の場合で [ を使う場合は、- で始まる文字列が不意に来る可能性への対処。
850名無しさん@お腹いっぱい。:2008/08/02(土) 12:11:37
$str が空白を含んでいたら?
851名無しさん@お腹いっぱい。:2008/08/02(土) 12:13:20
""
852名無しさん@お腹いっぱい。:2008/08/02(土) 12:19:42
"x`uname -s`"
これでOK? まさにバッドノウハウ
853名無しさん@お腹いっぱい。:2008/08/02(土) 12:33:56
>>852
xは""の外出しになってる方をよく見る気がする。
854名無しさん@お腹いっぱい。:2008/08/02(土) 12:39:31
そもそも
`uname -s`
を実行して、最初に - が出現する可能性があるのか?

無いとは言えないか…
855名無しさん@お腹いっぱい。:2008/08/02(土) 12:46:32
いまたまたまunameが例に出てるだけだから。
856名無しさん@お腹いっぱい。:2008/08/02(土) 12:51:20
shスクリプトの面白いところでもあるがバッドノウハウだなw
職人気質じゃないサラリーマンPG (SE) が書いたスクリプトなんか
ホントに酷い。穴ありすぎてrootで実行するの怖いわ・・・
857名無しさん@お腹いっぱい。:2008/08/02(土) 12:55:16
(少なくとも)bashの場合、
[ -p = -q ] みたいに、項数が3項の場合、第1項と第3項が - で始まっても
大丈夫なようになってる。よって X"$str" みたいにする必要なし。

でも、caseの方がエレガントであることに変わりないが。
858名無しさん@お腹いっぱい。:2008/08/02(土) 14:14:30
caseがエレガントなのはなんで?
859名無しさん@お腹いっぱい。:2008/08/02(土) 14:37:11
響きが。
860名無しさん@お腹いっぱい。:2008/08/02(土) 15:40:09
バランスしていない括弧構文がエレガントとは脳が沸騰しているな。
861名無しさん@お腹いっぱい。:2008/08/02(土) 15:51:28
漏れbashかzshばっか使ってたんで、
こんなこと全然知らなかったわ…。

バッドノウハウ集みたいなものどこかにないかな。
適当に動けばOKなワンライナーと、
汎用的に使えるスクリプトの間の敷居が高い…。
862名無しさん@お腹いっぱい。:2008/08/02(土) 15:52:31
移植性が必要ならシェルスクリプト使うなってことで
863名無しさん@お腹いっぱい。:2008/08/02(土) 16:00:59
>>861
> バッドノウハウ集みたいなものどこかにないかな。
autoconf, automake
864名無しさん@お腹いっぱい。:2008/08/02(土) 16:03:03
>>862
それを言っちゃったらこのスレで「純正」を追求する意味が無くなるようなw
865名無しさん@お腹いっぱい。:2008/08/02(土) 16:23:59
>>860
caseの括弧は、別にバランスさせて書いてもいいことを知らんのかww

case hoge in (hoge) echo hoge;; esac
866名無しさん@お腹いっぱい。:2008/08/03(日) 05:05:43
初歩的な質問で申し訳ないのですがおしえてください。

$AAAと$BBBがある場合は真とする場合どうしたらいいのでしょうか?

if($AAA && $BBB)

phpとかperlではこんな感じだったのですが…
867名無しさん@お腹いっぱい。:2008/08/03(日) 05:49:08
case文に条件1つって全然エレガントじゃないよ
868名無しさん@お腹いっぱい。:2008/08/03(日) 05:50:38
>>866
if [ -n $AAA ] && [ -n $BBB ]
-n はなくてもOK
869名無しさん@お腹いっぱい。:2008/08/03(日) 05:53:14
[ ] はtestコマンドの別表記です
詳しくはtestコマンドを調べてください
870名無しさん@お腹いっぱい。:2008/08/03(日) 07:21:34
>>868
それだと、$AAAや$BBBがセットされていない場合に誤動作する。
あと、[ ]も1回で済ませられる。

if [ -n "$AAA" -a -n "$BBB" ]
871名無しさん@お腹いっぱい。:2008/08/03(日) 08:46:48
-aとかって視認性の点であまり好きじゃないな
872名無しさん@お腹いっぱい。:2008/08/03(日) 08:54:07
case ${AAA:+${BBB:+X}} in X) hoge;; esac
873名無しさん@お腹いっぱい。:2008/08/03(日) 08:56:49
>>871
if [[ -n "$AAA" && -n "$BBB" ]]
874名無しさん@お腹いっぱい。:2008/08/03(日) 17:27:24
うちのsh(Ubuntuのdash)でもtestコマンドで3項演算をする場合、
- で始まっても問題ないわ
875名無しさん@お腹いっぱい。:2008/08/03(日) 18:10:12
>>867
たとえ条件が1つでも、caseが使えるならtestよりもcaseを使った方がいいのは
シェルスクリプトの定石。

testは内部コマンドだが、内部コマンドとは言え、独立した別コマンドとして
実行には少しだけオーバーヘッドがかかる。一方、caseはシェル自身の文法なので
testのようなオーバーヘッドはかからない。

試しに、文字列比較を、testとcaseのそれぞれで書いて、
ループを回して実行時間を計ってみると良い。
876名無しさん@お腹いっぱい。:2008/08/03(日) 18:16:43
>>874
こちらへどうぞ^^

シェルスクリプト総合@LINUX Part4
http://pc11.2ch.net/test/read.cgi/linux/1210999497/
877名無しさん@お腹いっぱい。:2008/08/03(日) 18:19:42
うちのsh(FreeBSDの/bin/sh)でもtestコマンドで3項演算をする場合、
- で始まっても問題ないわ
878名無しさん@お腹いっぱい。:2008/08/03(日) 18:24:47
[[]]はエレガントじゃない?
879名無しさん@お腹いっぱい。:2008/08/03(日) 18:31:19
[[ ]] だと、- で始まると問題になるからな。
880名無しさん@お腹いっぱい。:2008/08/03(日) 18:33:42
問題にならないじゃんウソつき
881880:2008/08/03(日) 18:34:27
ウソつきは俺でしたサーセン
882名無しさん@お腹いっぱい。:2008/08/03(日) 19:34:38
 
 \^-^\  ←なんかピースしてる顔みたいだよな。
883名無しさん@お腹いっぱい。:2008/08/04(月) 00:01:18
getoptsのOPTARGとかOPTINDって所謂「純正シェル」にもあるの?
884名無しさん@お腹いっぱい。:2008/08/04(月) 00:14:09
getopts自体がないシステムもある。
caseがエレガント。

オプション処理って結局case使うからな。
885名無しさん@お腹いっぱい。:2008/08/04(月) 00:52:15
けんかを売りにきたわけじゃないんですが、これから勉強するかどうか迷ってるんですが、教えてください
Perlよりシェルスクリプトが優れている点ってどこですか?
僕が入門した書籍には「Perlがあればシェルスクリプトなんていらん!」と書かれていました
886名無しさん@お腹いっぱい。:2008/08/04(月) 00:55:15
Perlがあれば、な。
887名無しさん@お腹いっぱい。:2008/08/04(月) 00:58:34
要するに、Perlが常時使えるような環境では、Perlを覚えてるなら新しく覚えなおすほどの事ではないって感じですか?
それとも、こういう場合はシェルスクリプトの方が早いっていうのはあります?
888名無しさん@お腹いっぱい。:2008/08/04(月) 01:09:18
要するに、QuickBASICが常時使えるような環境では、QuickBASICを覚えてるなら新しく覚えなおすほどの事ではないって感じですか?
それとも、こういう場合はバッチファイルの方が早いっていうのはあります?
889名無しさん@お腹いっぱい。:2008/08/04(月) 01:12:45
要するに、スモールライトが常時使えるような環境では、スモールライトを覚えてるなら新しく覚えなおすほどの事ではないって感じですか?
それとも、こういう場合はガリバートンネルの方が早いっていうのはあります?
890名無しさん@お腹いっぱい。:2008/08/04(月) 01:15:56
マジレスキボンヌします!
891名無しさん@お腹いっぱい。:2008/08/04(月) 01:23:46
>>885
いや、全然違うもんだから意識そのものを変えてくれ。

Perl は鯖管理者には馬鹿にされてる感があるが、実は高機能なアプリケーションも作れる
立派な言語。斜陽感は否めないが、MVC フレームワークを使って Web アプリとか現役。

対してシェルスクリプトは、基本的に UNIX コマンドの羅列なので、ここが大きな差であり
メリットだと思う。1行(1命令)で出来ることの大きさが全然違う。

Perl でダウンロードしようと思ったら Socket や LWP が必要だけど、シェルスクリプトなら
wget とかのコマンド一発で終わる。それから、UNIX オペレーションができる人なら、
書けないまでも読んで理解することは比較的容易だし。

QuickBASIC で AUTOEXEC.BAT 的なものが書かれてたら萎えるでしょ?

本格的に勉強したいなら ISBN4-7973-2194-6 買ってください。
892名無しさん@お腹いっぱい。:2008/08/04(月) 03:51:54
>>891
マジレスありがとうございます!
正直、僕らが普段シェル上で書いてる命令の延長線上にあるけれど、
それを全部打ち込むのが面倒っていう感じなのでしょうか。
Perlで出来ないことはないけれど、回りくどいんでしょうね。
その本買ってみます!
893名無しさん@お腹いっぱい。:2008/08/04(月) 05:09:59
ほとんどシェルで書かれたperlスクリプトを見たことがある。

system("mkdir /hoge");
system("chmod 755 /hoge");
system("sleep 10");

本人は真剣だったようだ。4秒後に殺した。
894名無しさん@お腹いっぱい。:2008/08/04(月) 05:11:26
嗚呼、違う違う。もっと酷かったわ・・・
system("/bin/mkdir /hoge");
system("/bin/chmod 755 /hoge");
system("/bin/sleep 10");
895名無しさん@お腹いっぱい。:2008/08/04(月) 05:33:37
僕が入門した書籍には「Perlがあればシェルスクリプトなんていらん!」と書かれていました


どの本ですか?
896名無しさん@お腹いっぱい。:2008/08/04(月) 06:13:33
ひとつ言えることは、rcスクリプトなどの起動スクリプトには
perlは使ってはいけないと言うこと。必ず、/(s)bin/shスクリプトにする必要がある。
perlが存在する/usr/binまたは/usr/local/binをマウントする前の処理を
行なわなければならないんだから。
897名無しさん@お腹いっぱい。:2008/08/04(月) 06:14:20
スクリプトってゆうな。クズ。
898名無しさん@お腹いっぱい。:2008/08/04(月) 06:40:35
¿?¿?¿
899名無しさん@お腹いっぱい。:2008/08/04(月) 10:25:54
シェルクリトリス??
900名無しさん@お腹いっぱい。:2008/08/04(月) 11:37:06
>>892
最初はそんなノリでいいよ。面倒くさいことを楽にするのがこんぴーた。
書いてるうちにもっと便利に柔軟にって思い始めると勝手に制御文とか覚えるから。
んで、if とかでエラー出してバッドノウハウを覚え始め、より楽しくハマってしまう。
901名無しさん@お腹いっぱい。:2008/08/04(月) 12:13:36
perlはもう古いよ。楽にスクリプト言語でプログラムしたい、
って向きは、今はpythonかrubyを使う方向に流れてる。
一方、UNIXの基本部分ではやはりシェルスクリプトが必要。
この2極分化により、どっちつかずのperlは用途がなくなってきているのが現状。
902名無しさん@お腹いっぱい。:2008/08/04(月) 12:22:49
perl使ってるならrubyも簡単に使いこなせると思うから、使い手の趣味の問題だと思う

というか、その手の論争は専用の板でやるといいと思うよ
903名無しさん@お腹いっぱい。:2008/08/04(月) 12:23:54
rubyはウンコ。いずれバブルは去りruby(笑)になる。pythonの方がイイ
904名無しさん@お腹いっぱい。:2008/08/04(月) 12:29:25
ただ、pythonは設計思想上、perlからの難民はあまり期待できないと思うぞ。
perlユーザーから見たら無菌室みたいに見える
905名無しさん@お腹いっぱい。:2008/08/04(月) 13:28:12
pytonってなーに
906名無しさん@お腹いっぱい。:2008/08/04(月) 13:38:21
おっぱい!おっぱい!
907名無しさん@お腹いっぱい。:2008/08/04(月) 13:44:36
ピストン
908名無しさん@お腹いっぱい。:2008/08/05(火) 00:10:00
>>891
それが世の中のPerlerの中には

 #!/usr/bin/perl
 system("...!");
 system("...!!");
 system("...!!!");
 if (...) system("...!!!!");
 system("...!!!!!");
 system("...!!!!!!");

とか書く奴が多すぎてうんざりな訳ですよ。

条件文1つとかループ1つとかのためだけにシェルスクリプトが
system呼び出し用Perlスクリプトになるという。
909名無しさん@お腹いっぱい。:2008/08/05(火) 00:12:06
ウエブプログラム板ではperlはすごい叩かれようだな…
rubyやpythonがいいのは分かるが、そこまで叩く必要があるのか?っていうくらいだ
910名無しさん@お腹いっぱい。:2008/08/05(火) 00:34:11
perlは,普段ちょっとしたことにあったら便利で,いざという時に使えたら頼りになる汚い道具って感じだから,ちゃんとしたプログラミングには向いてない.
むしろウェブプログラミングがperlに依存してきたことが異常なんだと思うわ.
911名無しさん@お腹いっぱい。:2008/08/05(火) 00:37:25
はいはいスレ違いの話はここまで
912名無しさん@お腹いっぱい。:2008/08/05(火) 00:41:58
ではwebアプリをシェルスクリプトで書く話題でも
913名無しさん@お腹いっぱい。:2008/08/05(火) 08:32:19
ヘタクソが書いたらシェルスクリプトなんて汚いどころか危険極まりないw
他の Light Weight Language も同じ。
914名無しさん@お腹いっぱい。:2008/08/05(火) 15:17:01
ヘタクソが書いたC++なら安心ですね!
915名無しさん@お腹いっぱい。:2008/08/05(火) 16:43:13
>>914
冗談でも怖い事は言わないでください。
916名無しさん@お腹いっぱい。:2008/08/05(火) 16:49:26
コンパイル通らないから安心だな
917名無しさん@お腹いっぱい。:2008/08/05(火) 17:00:25
ヘタクソが書いたC++はnew使いまくりでメモリ喰い潰す
918名無しさん@お腹いっぱい。:2008/08/05(火) 17:56:26
コピーコンストラクタの意味を知らないで
クラス作るやつがいるw
919名無しさん@お腹いっぱい。:2008/08/05(火) 19:43:31
宿題スレ以下になり下がったなw 誰か宿題持って恋
920名無しさん@お腹いっぱい。:2008/08/05(火) 21:29:56
引数指定のディレクトリを頂点として、それ以下のサブディレクトリを含む
ディレクトリツリー中のシンボリックリンクを探し、
そのシンボリックリンクそれぞれについて、
冒頭のディレクトリツリー内を指しているか、
それとも、ディレクトリツリーの外を指しているのかを
判断するシェルを発行してください。

なお、シンボリックリンクの先に実際にファイルがない場合もありますが、
実際にファイルがあるかどうかに関係なく、あくまでシンボリックリンクの
内容のPATHだけで判断してください。
(ブロークンリンクだからといって外部と判断してはいけないということ)

以上、お願いします。
921名無しさん@お腹いっぱい。:2008/08/05(火) 21:53:29
922名無しさん@お腹いっぱい。:2008/08/05(火) 22:41:45
chmod -R 775 /
っていうスクリプト作ってみたんですが、会社での評判は芳しくないようです
どうしてでしょうか
923名無しさん@お腹いっぱい。:2008/08/06(水) 00:16:09
なにそのかっこいいスクリプツ
924名無しさん@お腹いっぱい。:2008/08/06(水) 00:17:38
777じゃないからかな
925名無しさん@お腹いっぱい。:2008/08/06(水) 00:52:34
rsh 内で実行したコマンドの戻り値を得るかっこいいスクリプツ教えてください!
926名無しさん@お腹いっぱい。:2008/08/06(水) 00:56:56
>>922
あなたの能力を正しく評価できない職場のようですね。すぐに転職しましょう。
927名無しさん@お腹いっぱい。:2008/08/06(水) 01:26:45
DOSのtree /f みたいなことをしたいんですけど
うまい方法ないですか?
928名無しさん@お腹いっぱい。:2008/08/06(水) 01:35:51
929名無しさん@お腹いっぱい。:2008/08/06(水) 01:36:26
>>927
もはやそのたとえが判る人間は少数派なのでは・・・
で、/fってなんだっけ?
930名無しさん@お腹いっぱい。:2008/08/06(水) 02:24:47
こんな感じでtree表示してくれるです。

├─アクセサリ
│ │ Windows XP ツアー.lnk
│ │ アドレス帳.lnk
│ │ エクスプローラ.lnk
│ │ コマンド プロンプト.lnk
│ │ プログラム互換性ウィザード.lnk
│ │ メモ帳.lnk
│ │ 同期.lnk
│ │ 外字エディタ.lnk
│ │
│ ├─エンターテイメント
│ └─ユーザー補助
931名無しさん@お腹いっぱい。:2008/08/06(水) 03:56:09
>>925 rsh $host "hogehoge; echo $?"
932名無しさん@お腹いっぱい。:2008/08/06(水) 06:54:07
>>930
そのものずばり、treeってコマンドあるよ。
ttp://mama.indstate.edu/users/ice/tree/
933名無しさん@お腹いっぱい。:2008/08/06(水) 06:58:36
え?そんな話じゃないだろ?
934名無しさん@お腹いっぱい。:2008/08/06(水) 16:43:17
>>935
試してから出直しな
935名無しさん@お腹いっぱい。:2008/08/06(水) 16:49:19
>>932
ありがとうございます。そのURLで行けました。
936名無しさん@お腹いっぱい。:2008/08/06(水) 17:30:17
>>934 ワロスw
937名無しさん@お腹いっぱい。:2008/08/06(水) 19:06:15
bash ですみません。どなたかお教えいただけますか。

sum=0; find docs -name "*.jpg" -o -name "*.gif" | head -n 10 | xargs -n1 ls -s | while read size file; do let sum+=size; echo $sum; done; echo $sum

この結果、最後の sum の表示が 0 になってしまいます。

20
40
844
1280
1360
1408
1480
1560
1604
1672
0

これ、いったいどういうことなんでしょうか。スコープがおかしい?
子プロセスで起こっていることは感知されない?
938名無しさん@お腹いっぱい。:2008/08/06(水) 19:10:47
while のとこでサブシェルになって親にまで変数が戻らない。
939名無しさん@お腹いっぱい。:2008/08/06(水) 19:12:11
>>937
パイプの出力をwhileループで受けると、
whileループ全体がサブシェルになってしまう。
だから、whileループを抜けたら変数の値が前の値(または未設定)に戻ってしまう。
940名無しさん@お腹いっぱい。:2008/08/06(水) 19:14:29
>>937
で、解決方法だが、わざわざwhileループで計数しなくても、
wc -cで一発じゃないかな?

wc -c `find docs -name "*.jpg" -o -name "*.gif" | head -n 10`
941名無しさん@お腹いっぱい。:2008/08/06(水) 19:25:21
ファイルサイズ取得に wc -c ってたまに見るけど、
stat(2) で取れるものをわざわざ read(2) で読むってどうなんだろ?
ファイルがデカかった場合に萎える・・・・
942名無しさん@お腹いっぱい。:2008/08/06(水) 20:25:37
>>941
wc -c の場合は read(2) はしない。stat(2)でサイズのみ取る。
943名無しさん@お腹いっぱい。:2008/08/06(水) 20:29:07
デカいファイルで試してみ。
944名無しさん@お腹いっぱい。:2008/08/06(水) 20:33:03
>>943
試してから書いてるんだが。。
1GBのファイルでも一瞬で wc -c は終了する。
(-cオプションを付けないと read(2)するから、そりゃ遅いが)

トレースしてもread(2)は呼び出していない。
945937:2008/08/06(水) 20:33:07
あああ。ごめんなさい。 head -n 10 しているのはテストのためで、
ここに書き込む時に外すのを忘れてました。
本当はもっとたっくさんのファイルサイズを合計したいです。
そんなときバッククオートの結果を引数にする (>>940) のはちょっと不安が…。

しかしありがとうございます。やっぱりサブシェルの話だったんですね。
とりあえず、 ... done | tail -n1 として総和を得たいと思います。

>>941
さっきまで pg_dump | gzip | wc -c なんてやってました。
ディスクにファイルを書き込むプロセスがないのでいいですね。
946名無しさん@お腹いっぱい。:2008/08/06(水) 20:34:08
find docs -name "*.jpg" -o -name "*.gif" -exec wc -c +
947名無しさん@お腹いっぱい。:2008/08/06(水) 20:37:13
zshだとサブシェルにならずにsumがちゃんと更新されるぞ。
948941:2008/08/06(水) 20:46:03
>>942 >>944 うはw マジですかw 先入観だけでそう思ってますた・・・・・・orz 今後使います。
949名無しさん@お腹いっぱい。:2008/08/06(水) 20:52:02
wc -c の話は GNU依存じゃないのか?
950名無しさん@お腹いっぱい。:2008/08/06(水) 20:56:23
GNUツール使ってるからな
951名無しさん@お腹いっぱい。:2008/08/06(水) 20:56:47
純正wcではどうなんだ?
952名無しさん@お腹いっぱい。:2008/08/06(水) 20:59:38
953名無しさん@お腹いっぱい。:2008/08/06(水) 21:01:34
それは純正なの?
954名無しさん@お腹いっぱい。:2008/08/06(水) 21:02:42
汚ねえコードw
955名無しさん@お腹いっぱい。:2008/08/06(水) 22:09:28
>>954
それは近くの
http://minnie.tuhs.org/UnixTree/V7/usr/src/cmd/sh/
に言うとよろし。
956名無しさん@お腹いっぱい。:2008/08/06(水) 23:01:55
ウヒョー でも sendmail はもっと汚いし、procmail はさらに汚いし、
qmail は・・・・・・・・ ってスレ違いですみません。
957名無しさん@お腹いっぱい。:2008/08/06(水) 23:13:46
設計すらまともにできないBINDはどうすんだよ、ごら
958名無しさん@お腹いっぱい。:2008/08/07(木) 08:31:45
BINDすら作れないおまえらって・・
959名無しさん@お腹いっぱい。:2008/08/07(木) 08:42:21
お前らまさかUNIXなんて使ってないよな?
OSぐらい自分で書くよな普通
960名無しさん@お腹いっぱい。:2008/08/07(木) 09:03:46
お前まさか出来合いのプロセッサなんて買ってないよな?
アーキテクチャから設計して、自前の生産ラインくらい持ってるんだろうな?
961名無しさん@お腹いっぱい。:2008/08/07(木) 10:13:27
おまいら、とりあえず採掘から始めろよw
962名無しさん@お腹いっぱい。:2008/08/07(木) 10:25:07
次は天地創造か?W
963名無しさん@お腹いっぱい。:2008/08/07(木) 11:24:19
神が居るスレか
964名無しさん@お腹いっぱい。:2008/08/07(木) 11:56:16
965名無しさん@お腹いっぱい。:2008/08/07(木) 11:56:55
//まで抜いてしまった。
ttp://labaq.com/files/god-ja.html
966名無しさん@お腹いっぱい。:2008/08/07(木) 12:27:10
採掘に使うクワも作れよ
クワの材料が出てくるまでは手で掘れ
967名無しさん@お腹いっぱい。:2008/08/07(木) 12:38:25
お前、その鍬の木はどうやって育てたんだ?
まさか林からかっぱらってきたんじゃないだろうな?
968名無しさん@お腹いっぱい。:2008/08/07(木) 12:43:06
>>967
純正シェルで発行しました
969名無しさん@お腹いっぱい。:2008/08/07(木) 15:43:24
ビックバンからやり直さないと。
970名無しさん@お腹いっぱい。:2008/08/07(木) 16:17:43
ゆらぎの fork はどうしますか
971名無しさん@お腹いっぱい。:2008/08/07(木) 16:36:30
なに、ビッグバンの起源は韓国だと言うからキムチでも突っ込んどけ。
972名無しさん@お腹いっぱい。:2008/08/07(木) 20:07:48
最近は色々なシェルがあるらしいが、純正のshは韓国が起源だろ?
これに関しては歴史上の記録があって、韓国の教授が論文を書いてる。
973名無しさん@お腹いっぱい。:2008/08/07(木) 20:51:33
そろそろおわりでw
974名無しさん@お腹いっぱい。:2008/08/07(木) 21:08:22
>>972
ゾンビの集うジョークスレへ投下してきたニダ。
975名無しさん@お腹いっぱい。:2008/08/07(木) 22:47:09
whileとかforのインデントの仕方がいまいちわからないんだけど
どういうのが標準ですか?
vimのautoindentだとこんな感じになるけどしまらないです。

while true
<TAB>do
<TAB><TAB>emacs &
<TAB>done

976名無しさん@お腹いっぱい。:2008/08/07(木) 22:50:56
漏れはこうだな

条件式が一行の時
while うんたら; do
 うんたらかんたら
done

条件式が複数行の時
while うんたら
   .かんたら
do
 うんたらかんたら
done
977名無しさん@お腹いっぱい。:2008/08/07(木) 22:51:10
よくあるのは、
while true; do
 emacs &
done
978名無しさん@お腹いっぱい。:2008/08/07(木) 23:51:42
どーも
確かに do done を Cのwhileとかの{}と考えれば
>>976
>>977
のどっちかですね

autoindentがおかしいということで納得します!
979名無しさん@お腹いっぱい。:2008/08/08(金) 12:10:08
viのautoindent直せないのかなぁ
980名無しさん@お腹いっぱい。:2008/08/08(金) 13:09:38
vim スレに逝って聞いてみれば恐らく解決する。
981BASH初心者:2008/08/09(土) 09:30:29
コマンドの複数のオプションを何行に分けて書くときに、
途中にコメントを入れる方法ありますでしょうか?
是非、ご教授お願いしたいです。
以下のように書くと
#!/bin/sh -f
ls \
#!-r \
-t \
-a
ーーーーーーーーーー
結果:
line 5: -t: command not found
CSHではできたので、BASHでのやり方が知りたいです。
982名無しさん@お腹いっぱい。:2008/08/09(土) 10:34:43
>>981
ちょっと面倒になるけど、ヌルコマンド(:)をコマンド置換する方法がある。
` ` はバッククォート(シングルクォートではない)
コメントにしたい部分を `: と ` で囲む。:の直後、スペースを開ける必要がある。

#!/bin/sh -f
ls \
`: -r` \
-t \
-a
983BASH初心者:2008/08/09(土) 16:03:10
教えて頂き、有難う御座いました!
2ちゃんの書き込みは初めてです、そんなに早く教えて頂けるとは思いませんでした。
まだ宜しくお願い致します。
984名無しさん@お腹いっぱい。:2008/08/09(土) 16:07:54
あー、丁度俺も訊きたかった質問だ。
しかしパッと見、コメントだとは分かりにくいねぇ。

ところで981は、なんでコメント行にも "!" を付けてるんだ?
985名無しさん@お腹いっぱい。:2008/08/09(土) 16:31:39
cshがまだまだ現役で使われているのにも
ちょっと納得してしまうな。。。
986名無しさん@お腹いっぱい。:2008/08/09(土) 16:40:47
csh 使ってるけど, 大昔から,scripting しようとすると, とたんに
% sh
$ for f in ...
となるんだがw
987名無しさん@お腹いっぱい。:2008/08/09(土) 16:45:43
ヌルコマンドへの引数がシェルで解釈されとんでもないことが発生する可能性がある。
バッドノウハウどころか忌避すべき方法。
988名無しさん@お腹いっぱい。:2008/08/09(土) 16:53:41
>>987
リダイレクトでファイルが作成されたりすることがなければ、
問題ないんじゃない? ` ` の中は暗黙のサブシェルになるから、
変数とかが書き替わるような解釈が行なわれたとしても、
親シェルには影響しないし。
989名無しさん@お腹いっぱい。:2008/08/09(土) 17:05:41
>>986
スレチだけど、tcshでforeachをインタラクティブに使えないの?
ファイル中では使えるけど端末では何故か使えず挫折した記憶が。
990名無しさん@お腹いっぱい。:2008/08/09(土) 17:21:37
つかえるよ.
% foreach f (/usr/*)
foreach? echo $f
foreach? end
/usr/X11R6
/usr/bin
<snip>
/usr/sbin
/usr/share
/usr/src
%
991名無しさん@お腹いっぱい。:2008/08/09(土) 17:22:53
foreach を1行で書きたいなあ
992名無しさん@お腹いっぱい。:2008/08/09(土) 17:27:25
セミコロンで纏められず、改行で複数行にしないとダメなんだよなぁ、たしか。
993名無しさん@お腹いっぱい。:2008/08/09(土) 17:48:35
>>988
はぁ、絶望的に想像力が欠如してるな。シェルが解釈してしまうから駄目だといってんだろ。
シングルクォートするか? (笑)

ls \
`: test -d /tmp&& rm /tmp/*` \
-t \
-a
994名無しさん@お腹いっぱい。:2008/08/09(土) 17:53:13
>>993
おまえアフォか。

それだと、コメントアウト前の ls コマンドのコマンドラインになり得ないだろ。
995名無しさん@お腹いっぱい。:2008/08/09(土) 18:00:13
>>993
元の質問は、(複数行の)1つのコマンドラインの途中で # でコメントアウトできない
ことに対して解決策を聞いている。

&& が含まれる場合、&&のところで(広い意味の)パイプラインが切れる。
パイプラインの切れ目があるなら、そこは # でコメントアウトできるし、
&& を跨いで `: ` で囲むというのは本来の質問の意図を外れている。
996名無しさん@お腹いっぱい。:2008/08/09(土) 18:20:13
要するに >>993 は、コマンド置換と空コマンド(:)でコメントにする方法は、
本当のコメントじゃないから注意が必要、ということだろう

例えばコメント文中にセミコロンを入れると、そこで : コマンドの範疇から
外れちゃうので、エラーあるいは副作用が起きてしまう。
997名無しさん@お腹いっぱい。:2008/08/09(土) 18:22:16
>>996
もともとセミコロンが入ってたならそこでパイプラインの切れ目になるから、
あとは >>995 の言うとおり。よって問題なし。

あと、`: ` じゃなくて、`# ` でもいいんだよ。
これだと文句ないかな?
998名無しさん@お腹いっぱい。:2008/08/09(土) 19:16:41
おお、完璧!
999名無しさん@お腹いっぱい。:2008/08/09(土) 19:20:53
次スレの季節
1000名無しさん@お腹いっぱい。:2008/08/09(土) 19:25:19
□関連スレ:
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/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。