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

このエントリーをはてなブックマークに追加
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 でトレースしましょう。

前スレ
シェルスクリプト総合 その7
http://pc10.2ch.net/test/read.cgi/unix/1157601611/
2名無しさん@お腹いっぱい。:2007/02/15(木) 14:32:25
□前スレや過去スレ:
シェルスクリプト総合 その7
http://pc10.2ch.net/test/read.cgi/unix/1157601611/
シェルスクリプト総合 その6
http://pc10.2ch.net/test/read.cgi/unix/1143302182/
シェルスクリプト総合 その5
http://pc10.2ch.net/test/read.cgi/unix/1137801629/
シェルスクリプト総合 その4
http://pc10.2ch.net/test/read.cgi/unix/1131026501/
シェルスクリプト総合 その3
http://pc10.2ch.net/test/read.cgi/unix/1124889646/
シェルスクリプト総合 その2
http://pc10.2ch.net/test/read.cgi/unix/1113664637/
シェルスクリプト総合 その1
http://pc10.2ch.net/test/read.cgi/unix/1101820646/

□関連スレ:
sed
http://pc10.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://pc10.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://pc10.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc10.2ch.net/test/read.cgi/unix/1102921590/
3名無しさん@お腹いっぱい。:2007/02/15(木) 14:34:55
□初心者向けリンク
「誰にでも」シリーズ
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名無しさん@お腹いっぱい。:2007/02/15(木) 14:35:28
□最近のシェルスクリプト本(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名無しさん@お腹いっぱい。:2007/02/15(木) 14:38:51
□最近のシェルスクリプト本(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/
6名無しさん@お腹いっぱい。:2007/02/15(木) 14:42:04
□関連書籍と関連リンク:

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名無しさん@お腹いっぱい。:2007/02/15(木) 15:50:29
>>1
8名無しさん@お腹いっぱい。:2007/02/15(木) 16:34:15
3秒間のウエイトっていれる方法ありますか?
9名無しさん@お腹いっぱい。:2007/02/15(木) 16:35:58
>>8
sleep 3
10名無しさん@お腹いっぱい。:2007/02/15(木) 16:36:49
sleep 3 じゃダメなんか?
11名無しさん@お腹いっぱい。:2007/02/15(木) 16:41:00
sleep 3
128:2007/02/15(木) 17:35:57
>>9-11
ありがとう
13名無しさん@お腹いっぱい。:2007/02/15(木) 19:50:58
14名無しさん@お腹いっぱい。:2007/02/15(木) 21:08:02
>>1


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

なんかダブってるけど、これの(2)ってのはあるの?
15名無しさん@お腹いっぱい。:2007/02/15(木) 21:29:48
>>14
! 
ダブリは1のミス
(2)は(まだ)ない
16名無しさん@お腹いっぱい。:2007/02/15(木) 22:41:49
               ________
             ,r'´:.:.:.:.:.:.:.:`.、
           ,r'/:.:.:.:.:.:.:.:.、ヽ;,:.ヽ
             l:.i:.:.i:Mヽヽl:.:i:ヽ;,;,;l
            !:l:i.:トl レレVレ!:.:!-、!
             ヽトl:f_! '´i_,トl:.:.!_,ノ     シエルスクリプトって
             l.ヽ '__,   l.:.:!/      なんですか?
             l:.:| `iー‐'´l:.;!`!
              /!;!´ヽ,! -l;!´`ヽ、
             ,r'´!  人     ,r''ヽ
              !::;;l /:::;ヽ  ,r';;;r':::ヽ
            l:;;/´:::::::::::::;ヽ,r';;/;;:::::::::ヽ
           .l;;i:::::::::::::::::::::::::;;;;;;ヽ;::::::::::ヽ
17名無しさん@お腹いっぱい。:2007/02/15(木) 22:47:32
(||)
18名無しさん@お腹いっぱい。:2007/02/15(木) 22:54:41
今度シェルスクリプトを覚えなければならなくなったのですが、
私のマシンにはシェルがインストールされていないようです
(メニューにそれらしいものがない)
シェルを追加インストールするには、どこをクイックすればいいですか?
OSはKDE3.5です。
19名無しさん@お腹いっぱい。:2007/02/15(木) 23:02:42
catの無駄遣いなんかに関する すごい説得力がある スライド
ttp://www.netmeister.org/misc/useless_use.pdf
20名無しさん@お腹いっぱい。:2007/02/15(木) 23:08:35
>>19
面白いから順に見たけどこれ長いよ!
21名無しさん@お腹いっぱい。:2007/02/15(木) 23:09:38
てかおもしろすぎる
22名無しさん@お腹いっぱい。:2007/02/15(木) 23:11:51
FTP に複数コマンドを渡す際に、複数行を「+」で囲んで FTP のコマンドを記述しています。この方法は他のシェルスクリプトからのコピーです。

一応意図した動作をしているのですが、仕様を知らずに使っているため不安です。

この方法の仕様が説明されているサイト等を教えて頂けませんか?man で sh と ftp を見ましたが、該当の記述はありませんでした。

よろしくお願いします。
23名無しさん@お腹いっぱい。:2007/02/15(木) 23:49:48
>>18
シェルがないと起動プロセスがまともに進行しないので、
ないってことはあり得ない。

また、KDEはOSではなくて、デスクトップ環境の一種。

あなたが必要なのはKonsoleというKDEのアプリケーションと、
エディタ。
24名無しさん@お腹いっぱい。:2007/02/15(木) 23:52:19
瓶詰めぬこカワユス。
25名無しさん@お腹いっぱい。:2007/02/16(金) 00:42:36
lsの結果を配列に入れるにはどうすればいいでしょうか?そもそもできますでしょうか?
26名無しさん@お腹いっぱい。:2007/02/16(金) 00:52:10
headでアレかよ!
27名無しさん@お腹いっぱい。:2007/02/16(金) 02:00:22
>>22

ftp<<EOF
コマンド
EOF

じゃダメなの?
28名無しさん@お腹いっぱい。:2007/02/16(金) 02:55:27
>>19 みて awk 覚えようと思った
29名無しさん@お腹いっぱい。:2007/02/16(金) 03:56:04
最後の三ページを忘れるなよ。
catの無駄遣いも可愛いからいいじゃないか。
30名無しさん@お腹いっぱい。:2007/02/16(金) 07:22:48
>>25

sh$ set `ls`
sh$ echo "$1"
sh$ echo "$2"
:

bash$ hairetsu=(`ls`)
bash$ echo ${hairetsu[0]}
bash$ echo ${hairetsu[1]}
:
31名無しさん@お腹いっぱい。:2007/02/16(金) 13:31:32
ここはネタスレと解釈してもいいですか?
32名無しさん@お腹いっぱい。:2007/02/16(金) 15:03:09
>>28
cutもたまには使ってあげようと思った
33名無しさん@お腹いっぱい。:2007/02/16(金) 15:58:55
たまにはぬこの蚤とりしようとおもた
34名無しさん@お腹いっぱい。:2007/02/16(金) 17:25:28
たまにはK.I.S.Sの格好もしてみようと思った。
35名無しさん@お腹いっぱい。:2007/02/16(金) 20:24:12
大至急、BourneとBASHを覚えなければならなくなったのですが、
手っとり早いお勧めの方法は何ですか?
はっきり言って、理論的なことはどうでもいいです。
最小限の努力で、最大限、見ためだけ高スキルに見えればいいです。
よろしくお願いします。
36名無しさん@お腹いっぱい。:2007/02/16(金) 20:24:38
ちょっと思ったのですが、シェルスクリプトでC言語の#ifdefマクロみたいなことって
出来ますか?

37名無しさん@お腹いっぱい。:2007/02/16(金) 20:26:07
>>36
Yes.
38名無しさん@お腹いっぱい。:2007/02/16(金) 20:43:20
>>35
スクリプトは一日にして成らず、だ
だがあなたの要求だけを見ると高スキルのスクリプトを真似て作ればいいと思われ
問題は努力もしないで中身が理解できれば・・・だが
39名無しさん@お腹いっぱい。:2007/02/16(金) 20:48:59
あのTシャツ欲しいと思った
40名無しさん@お腹いっぱい。:2007/02/16(金) 20:50:49
>>35
英語でのコミニュケーション能力と、pythonとperlはいいのかい?
41名無しさん@お腹いっぱい。:2007/02/16(金) 20:51:33
>>39
つくればいいじゃん
42名無しさん@お腹いっぱい。:2007/02/16(金) 20:52:54
>>40
はい。そっちの方は無問題です。
43名無しさん@お腹いっぱい。:2007/02/16(金) 20:53:38
じゃあとりあえず突撃してみたら?
44名無しさん@お腹いっぱい。:2007/02/16(金) 21:01:02
http://www.thinkgeek.com/tshirts/
探せばあるかも。
45名無しさん@お腹いっぱい。:2007/02/16(金) 21:07:28
ワロタ
Looking For A Japanese Girlfriend
http://www.thinkgeek.com/tshirts/japanese/74a3/

で、
Go away or I will replace you with a very small shell script
http://www.thinkgeek.com/tshirts/frustrations/374d/
46名無しさん@お腹いっぱい。:2007/02/17(土) 00:40:46
そこ結構面白いな。
鬼畜米英じゃなく鬼畜米兵になっとるw
http://www.thinkgeek.com/tshirts/japanese/74b1/
47名無しさん@お腹いっぱい。:2007/02/17(土) 01:05:58
>>28
複数の grep が一つにまとまるのがいい感じだな。
48名無しさん@お腹いっぱい。:2007/02/17(土) 01:34:50
著書なんかには
if [ i = y ]
then
echo aaa
fi
とかあるのだが、実際やってもErrorがでて・・・

if [[ i = y ]]
then
echo aaa
fi

みたいに2重括弧にしないといけないのはなぜなんでしょうか?
49名無しさん@お腹いっぱい。:2007/02/17(土) 01:35:53
ググったり本で調べたりしてどーしてもわからないことがあるので質問させてください。

ksh で 文字コードで grep するエレガントな方法が分かりません。
bash なら、
 grep $'\011' hoge.txt
で可能だということは分かっています。
ksh だと、
 grep "`echo '\011\c'`" hoge.txt
で同じことが可能だということは分かっていますが、bash ほど簡潔ではありません。
(いずれも Linux 上で確認)

昔、Solaris 8 上の ksh スクリプトで bash での記述例くらいに簡潔に書かれたコードを見た記憶があるのですが…。
分かる方がいらっしゃったらご教授ください。お願いします。
できれば ksh88 でお願いします。
50名無しさん@お腹いっぱい。:2007/02/17(土) 02:51:41
>>48
[ はコマンドで、[[ は bash の構文の一つ。
/bin/sh で書くなら [[ は使えない。
あと、比較演算子の書き方やその解釈がちょっと違う。

[ 1 -gt 0 ] と [[ 1 > 0 ]] とか
[ "1+1" -ge 2 ] と [[ "1+1" >= 2 ]] とか

詳細は man bash ね。
51名無しさん@お腹いっぱい。:2007/02/17(土) 10:33:59
>>48
if [ i = y ]
then
echo aaa
fi

↑でエラー出ないよ。
もしエラーが出たんなら、[ や ] や = の前後のスペースを忘れたとか、
そういう問題だと思う。([ ]か [[ ]]かの問題とは違う)

[[ ]] は Bourneでは使えないので、できる限り [ ] で書くのがお勧め。
52名無しさん@お腹いっぱい。:2007/02/17(土) 10:58:27
すいません、
名前にスペースの入ったファイル名のリストを for とか foreach に渡すときは
どうしたらいいでしょうか。
for f in `find なんたらこうたら`; do ほげ "$f"; done; みたいなことをしたいのですが
find の結果のファイル名にスペースがある場合、スペースのとこで割られるようです。
53名無しさん@お腹いっぱい。:2007/02/17(土) 11:10:46
>>52
IFS='
' for f in `find なんたらこうたら`; do ほげ "$f"; done;


IFSに改行コードを入れて、それを区切り文字にする。
54名無しさん@お腹いっぱい。:2007/02/17(土) 11:13:56
>>52
find の部分をコマンド置換すると、ファイル名のデリミタとしての半角空白なのか、ファイル名中の半角空白なのがシェルから見ると区別がつきません。
上手く動かない原因はこれです。
よってコマンド置換で実現するのは諦めましょう。

- start --------------------
find . -type f |
while read f
do
  echo $f
done
- end ----------------------

自分がパッと思いつくのはこれ。
ただ、read コマンドは遅いので、もっとエレガントを考える余地があるかもしれません。

ところで、sh に foreach ってありましたっけ?
55名無しさん@お腹いっぱい。:2007/02/17(土) 11:15:41
#!/bin/sh
IFS=\

for a in `find . -type f`;do echo "$a";done
これでも、名前に改行が含まれるとダメなのでfind -execをおすすめする。
56名無しさん@お腹いっぱい。:2007/02/17(土) 11:20:18
>>53
その方法、いいですね!
でも環境変数を触るのって、どうなのでしょう?

触るとしても、

- start --------------------
OLD_IFS=$IFS
IFS='
'
for f in `find . -type f`
do
  echo $f
done
IFS=$OLD_IFS
- end ----------------------

を推奨すべきかと。
57名無しさん@お腹いっぱい。:2007/02/17(土) 11:27:22
いろいろ条件が許せば、find -print0とxargs -0のコンビにお任せする。
58名無しさん@お腹いっぱい。:2007/02/17(土) 11:29:43
>>55
>>57
ああ、本当だ。改行がファイル名に入るとアウトですな。
for や while だと完全ではないですね…。
59名無しさん@お腹いっぱい。:2007/02/17(土) 12:20:55
>>56
なんでそんなことする必要があるんだ?

>>53 のスクリプト作って、実行した後の $IFS 見てみた方がいいよ。
60名無しさん@お腹いっぱい。:2007/02/17(土) 13:11:12
続きがあるとは想像できないのだろうか?
61名無しさん@お腹いっぱい。:2007/02/17(土) 13:18:38
>>60
続きがあっても関係ない。
↓これ試してみろ。

HOGE=hoge command
echo $HOGE
62名無しさん@お腹いっぱい。:2007/02/17(土) 14:04:31
$ cat hoge
IFS='
' for f in `find -type f`; do echo "$f"; done;
$ sh hoge
sh hoge
for: not found

hoge: 2: Syntax error: ";" unexpected
63名無しさん@お腹いっぱい。:2007/02/17(土) 14:09:59
$ cat hoge
IFS='
' for f in `find . -type f`; do echo "$f"; done;
だった。
64名無し募集中。。。:2007/02/17(土) 21:45:40
変数=値 command ( IFS='改行コード' for ... ) で実行した際
IFSの変更に対して安全かどうなかなんて元のお題には意味なくないか?

元のお題だとそもそもfindで引っかかる数(吐き出す文字数)が予測不能なんだし
tabやspaceのことも含めて for はやめて find | xargs か while の方が安全なんだが

あとファイル名に改行コードが含まれる場合は?とかこの板的には重要かもしれん
けど、そこまで考えるとどうしたら処理できるか?より、そんなファイルが作られないように
するにはどうしたらいいか?という問題になる気がする

その上でそういうファイルをリネームや削除するスクリプトを組みたいっていうなら
環境や状況に合わせたものを組めばいい、動くことが重要で
エレガントな一般的解法なんて考えても無駄だし必要もないはず
65名無しさん@お腹いっぱい。:2007/02/17(土) 22:54:12
もとのお題に対してはどうでもいいが、if, for, while, caseといった
フロー制御コマンドは変数=値 command形式では使えないという事実は、
このスレ的には重要。
6652:2007/02/18(日) 09:45:52
皆さん、どうもありがとうございました。なるほど、IFS とか while ですか。

自分の環境では改行がファイル名に入ることはとりあえずないんですが、
より厳密には find -print0 として IFS に NUL をセットすればいいんですかね?
と思ったんですが... あれ、IFSにNULをセットって、どうやればいいんでしょう?
たびたびすいません。
67名無しさん@お腹いっぱい。:2007/02/18(日) 11:30:58
grep -e 'foo (\w+?) bar' file
とした場合、 perl などでは \1 で (\w+?) の内容を
参照できるのですが、 grep (sed, awk など) でそうする方法はありますか?
68名無しさん@お腹いっぱい。:2007/02/18(日) 12:52:25
>>52
厳密にやりたかったら
1 find -print0を使ってNULLをレコードの区切りと認識できるコマンドで
処理する(shのwhileやforは使用できない)
2 find -execで1個づつ処理する。
3 perlで全部やる

>>67
sedにはある。awkは知らん。マニュアル嫁。
69名無しさん@お腹いっぱい。:2007/02/18(日) 13:03:35
自分が知らんならマニュアル嫁とかほざくな。
70名無しさん@お腹いっぱい。:2007/02/18(日) 13:29:37
マニュアル嫁よ>>69
71名無しさん@お腹いっぱい。:2007/02/18(日) 14:30:15
言うこと無くなると何度も前と同じ事を
繰り返してほざく知恵遅れが小学校の時にいたんだが、
>>68=70 でそいつを思い出した.
もしかするとそいつかもw
72名無しさん@お腹いっぱい。:2007/02/18(日) 15:13:28
何度諭されてもしつこく絡んでくる >>69=>71 みたいなアフォもいたなぁ。

まあ、諭されてることすら理解できてないんだろうけど。
73名無しさん@お腹いっぱい。:2007/02/18(日) 15:32:02
72 が必死すぎる件
7469!=71:2007/02/18(日) 15:33:37
おっと俺はこっちだ。
他人に煽られたからってお前がその煽り文句を真似して効果があるとは限らんぞ。
7568:2007/02/18(日) 15:50:25
いくら煽っても>>67は回答を得られないという事実。

>>71
残念ながら>>70は俺じゃない。>>69のような糞蝿は煽るほどの価値もない。
76名無しさん@お腹いっぱい。:2007/02/18(日) 15:59:07
クスクスクス
77名無しさん@お腹いっぱい。:2007/02/18(日) 17:00:23
(・∀・)ニヤニヤ
78名無しさん@お腹いっぱい。:2007/02/18(日) 23:20:22
>>67
どっちでもできる。
man に載っているよ。
7964:2007/02/19(月) 05:56:44
>>65
お、仰るとおりですな

>>52
普通?は find コマンドと IFS 変数は関係ないよ
いや余程特殊な環境があるなら分からんけど

IFS 変数は Bourne Shell 系 ( sh, ksh, bash など) で区切り文字の定義に使われる
で find コマンド自体はこの環境変数を参照しないから関係ない

find -print0 は出力する各ファイル名にヌル文字を付加する
で find -print0 が使える環境なら xargs -0 も使えるんじゃない?
>>57さんが既に言ってるけどね


>>67, >>78
sed, grep はあるけど awk はなかったような
80名無しさん@お腹いっぱい。:2007/02/19(月) 06:11:10
>>79
grep ではどうやんの?
81名無し募集中。。。:2007/02/19(月) 06:55:03
>>80
環境によっては使えないかもね
manでもネットでも調べれば?

8264:2007/02/19(月) 07:03:11
>>52
あ、find -print0 と IFS を弄って while を組合わせたいって意味なら駄目だよ
>>68さんの言ってる方法で

それより -print0 オプションが使えない環境もあるから
まずはそっちを調べた方がいいよ
83名無しさん@お腹いっぱい。:2007/02/19(月) 07:57:15
>>79
findコマンド自体では IFSは当然関係ないが、
findの結果を ` ` で取り込んで forの引数にする際に
IFSが参照される。(IFSの影響を受ける)
なので、スペース入りファイル名の問題なら、
IFSの内容を改行コードのみにして for f in `find ...` を実行すればOK
なことは既に上に書かれている。
84名無しさん@お腹いっぱい。:2007/02/19(月) 17:57:07
>>68
ちなみに NULL じゃなくて NUL ですね。
85名無しさん@お腹いっぱい。:2007/02/19(月) 22:58:23
>>84
頭ではわかっているが、指が憶えてしまっているのでしょうがない。
86名無しさん@お腹いっぱい。:2007/02/20(火) 02:12:08
>>79
man awk の文字列関数の項を参照してみな。
もしかしたら gawk だけかもしれないけど。
87名無しさん@お腹いっぱい。:2007/02/20(火) 10:40:49
gawk 3.0 以上の拡張機能でございます。
88名無しさん@お腹いっぱい。:2007/02/20(火) 11:31:38
大嘘つき
8964:2007/02/20(火) 17:58:58
いつから正規表現板に?あと自分の環境が全ての人しか居ないの?
素のAIXじゃ、grep '\(a\)\1' はできたが egrep, grep -E は無理みたい
拡張正規表現だと \1 は使えなさそうあとawkも

gawk は知らんけどgawkは無い環境も多いからawkとgawkを一緒にするな
awkと言えば昔ながらの素のawkのことだよ
linuxでshを語るアホウ(そりゃashだ)と同じやね
9064:2007/02/20(火) 19:15:33
最後だけ削除
shについては、Cygwinもash、今時の素のAIX、HP-UXなら実はkshだったりするから
Solaris、FreeBSDは知らんけど例としてはかなり不適切やね、無視してくれ
91名無しさん@お腹いっぱい。:2007/02/20(火) 21:12:01
kshはねーよ。デフォルトでは使いにくい。

set -o emacs
set -o vi

どっち?
92osuga:2007/02/20(火) 22:49:15
>>90
HP-UXのデフォルトがkshかよ
93名無しさん@お腹いっぱい。:2007/02/20(火) 22:58:23
>>64は面白いな
94名無しさん@お腹いっぱい。:2007/02/20(火) 23:48:35
>>89
> 素のAIXじゃ、grep '\(a\)\1' はできた
参考までに grep のバージョン教えてくれ。

>>90
> Cygwinもash
それいつの話?
手元の環境だと ash は入れてあるけど、sh の実体は bash になってるよ?

$ uname -r
1.5.24(0.156/4/2)

$ /bin/sh --version
GNU bash, version 3.2.9(11)-release (i686-pc-cygwin)
Copyright (C) 2005 Free Software Foundation, Inc.
95名無しさん@お腹いっぱい。:2007/02/21(水) 02:37:28
>>89
POSIX的には拡張正規表現(ERE))でbackrefernceが使えるということは
一言も書いていないので、grep -E でbackrefernceが使えるGNU grep
なんかが拡張しているということなんだろう。多分。

96名無しさん@お腹いっぱい。:2007/02/21(水) 04:14:13
それにしてもネタないね
叩きはすぐ集まってくるけど

grep '\(a\)\1' は実際できるし(AIX5.3、SFU)、基本正規表現(BRE)にあるんで
linuxやHP-UXのgrepでも出来た記憶がある、まぁ昔の事なんで自信はない

拡張正規表現(ERE)にはBREの\( \)にあたるものが無いようで
>>95はフォローしてくれたんだろうけど
実際にやってみたが egrep, grep -E じゃできなさそう(AIX5.3)と既に書いている

HP-UXのshについては昔、といっても11iなんだが
純粋なshでは使えないはずの [[ ]] や alias なんかが使えたんで調べたら
sh-posix とか書かれていて、sh->kshで拡張されたものがほぼ?まんま拡張されてた

なんでHP-UXのshはksh、って位の認識だったんだが
POSIX の sh いうんやから [[ ]] や alias が使えるのが今時の純粋な sh ということかもしれんね
97名無しさん@お腹いっぱい。:2007/02/21(水) 09:12:36
おまえら >>1 読め
正規表現については以降はこちらへ

正規表現
http://pc10.2ch.net/test/read.cgi/unix/1039165754/
98名無しさん@お腹いっぱい。:2007/02/21(水) 10:35:28
sh-posix ってのがあるんですよ奥さん
99名無しさん@お腹いっぱい。:2007/02/21(水) 10:37:51
>>98
だから、sh-posixの部分だけ書けばいい。
正規表現の部分はスレ違い。
100名無しさん@お腹いっぱい。:2007/02/21(水) 10:57:54
本当にそういうものはあるのかな?

solaris においては /bin/sh は sh-posixではなく
/usr/xpg4/bin/sh が ごにょごにょ
FreeBSD では /bin/sh は IEEE Std 1003.2 (``POSIX.2'') に対応する途上
NetBSD では /bin/sh は  POSIX 1003.2 and 1003.2a に対応する途上
OpenBSDでは (ry
HP-UX では
101名無しさん@お腹いっぱい。:2007/02/21(水) 10:59:10
あ、きみ宛というよりは>>96宛てかな?
102名無しさん@お腹いっぱい。:2007/02/21(水) 12:16:07
http://docs.hp.com/ja/B2355-60104-02/sh-posix.1.html
でも嫁
現在のHP-UXの/bin/shはsh-posixであって、古いbourne shellは存在しない
sh-posixはkshによく似ているが別物

>>90は間違いだらけ
10395:2007/02/21(水) 12:40:01
>>96
すまん。寝る直前に書いたせいか
フォローのつもりがわけのわからんものになってた。

GNU のツールでそうだからといって、
それがUNIX全般でいえるかというと違うよね。
というのを補足したかった(awkとgawkとか)

104名無しさん@お腹いっぱい。:2007/02/21(水) 13:49:30
>>102
以前は /usr/old/bin/sh に Bourne shell があったんだけど今はもうないの?
手元に実機がないので確認できない。
105名無しさん@お腹いっぱい。:2007/02/21(水) 14:03:34
>>104
実機がなくても参照できちゃうんだなこれが
http://docs.hp.com/ja/B2355-60104-02/sh.1.html
-
注記 : B シェル (/usr/old/bin/sh) は、HP-UX 11i Version 1.5 以降、削除されました。
代りに、POSIX シェル (/usr/bin/sh) を使ってください。

-

本当に実機がこうであるかは確認していないけどね〜
106ksh:2007/02/21(水) 19:49:50
こんばんわ ペソです。
シェル初心者ですが教えてください。
「ディレクトリの中にあるファイルで、実行権限のないファイルを読み込み
そのファイルに実行権限を付与するシェルが必要なのですがどうすればいいのかわかりません。
OS: AIX shell: ksh

#!/bin/ksh
for filename in ${1:+$1/}* ; do
newfilname=$(print $filename |tr [A-Z] [a-z])
newfilename=$newfilename%.}
print "$filename -> $newfilename"
mv $filename $newfilename
done

とりあえず自宅のfedora core5 のkshで実行したら、

' unexpectedtax error: `
と表示されて困ってます。

どうか教えてください。お願いします。
107名無しさん@お腹いっぱい。:2007/02/21(水) 19:56:52
>>106
質問が支離滅裂。実行権限を付けたいといっているのに、
スクリプトではファイル名の大文字を小文字にリネームしようとしている。
あと、クォートが正しくないので、スペース入りファイル名とかでコケるだろう。
釣りじゃないならもう一度よくまとめてから質問し直せ。
108ksh:2007/02/21(水) 20:43:07
すいませんでした。
リネームするスクリプトを少し変更して作ろうとしているのですが、
このファイルもこけて動かないんです。


109名無しさん@お腹いっぱい。:2007/02/21(水) 21:12:05
>>106
そんなの、

#!/bin/sh

chmod +x "$1"/*

だけでいいじゃん。kshである必要もなし。
110名無しさん@お腹いっぱい。:2007/02/21(水) 21:13:56
とりあえず

1. シェルスクリプトのことをシェルというな。
2. forの次の行からdoneの前の行までは全部リネーム用でいらないから削れ。
3. man test
4. man chmod
111名無しさん@お腹いっぱい。:2007/02/21(水) 21:15:07
>>109
「実行権限のないもののみを選び出す」というのが宿題の一部であると
思われるので、問答無用で+xしちゃいけないかもしれない。
112名無しさん@お腹いっぱい。:2007/02/21(水) 21:19:54
「実行権限のないもののみを選び出す」意味がない。
もともと +x なファイルを chmod +x しても影響はない。

AIXで実行しようとしてるし、だとすると
宿題じゃなく、実務で必要なんだろ。

chmod +x で十分。

(ctimeは更新されるけど、そんなの普通関係ない)
113名無しさん@お腹いっぱい。:2007/02/21(水) 21:23:34
>>110
えっと、こういうことでしょうか?

#!/bin/ksh
for filename in ${1:+$1/}* ; do
man test
man chmod
done


やってみましたが、なんか、ファイルの数だけマニュアルのようなものが表示され、
実行権限は付きませんでしたが、、
114名無しさん@お腹いっぱい。:2007/02/21(水) 21:25:51
なんだ釣りか。
115ksh:2007/02/21(水) 22:08:50
kshです。

#!/bin/ksh
for filename in ${1:+$1/}* ; do
if [[ -f $filename ]] ; then
chmod +x $filename
fi
done

なんとかディレクトリの中のファイルすべてに実行権限を付与できました。
これはシェルスクリプトと言うのでしょうか?
お恥ずかしながらシェルスクリプトとはなにか?イメージが完全でなく・・・
116名無しさん@お腹いっぱい。:2007/02/21(水) 22:38:30
>>115
> kshです。
ペソじゃなかったのかw
117ksh:2007/02/21(水) 22:53:27
あっペソです!!
ルールよくわかってなくてすみませんっw
118名無しさん@お腹いっぱい。:2007/02/25(日) 06:28:13
>>102
単に興味本位で聞くけどsh-posixとkshを比較して
実際に機能として違う部分てどんなところがあるの?
119名無しさん@お腹いっぱい。:2007/02/26(月) 18:34:31
すごく久しぶりに man tcsh してみたのだが。

あれ、"THE T IN TCSH" なんて項目、昔あったっけ?

turbo csh じゃないじゃん > 昔俺にそう教えた奴
120名無しさん@お腹いっぱい。:2007/02/26(月) 18:41:12
Tenex CSHの略だと思っていたが、Tenex & Tops-20だったんだな。
121名無しさん@お腹いっぱい。:2007/02/27(火) 00:44:41
TOPS-20 ねぇ。command line editing が欲しくてcshからtcshに移ったが、
それまでは、fep 使ってました。bash は、なじめんな。

今は、zsh 派です。
122名無しさん@お腹いっぱい。:2007/02/27(火) 04:53:35
>>118
102とは別人だけど、kshはksh88とksh93で非常に違う。
とくに後者はperlに遜色ないほどの汎用言語になっている。
kshはbashと同じくshベースということで、
bashがkshから採り入れた機能もけっこうある。ローカル変数とか
123名無しさん@お腹いっぱい。:2007/02/27(火) 17:22:33
>>119
え?違うんだ、知らなかった
124名無しさん@お腹いっぱい。:2007/02/27(火) 22:13:24
kshといえばwkshで一度でいいから遊んでみたかった。
もうwのないkshしかないからなぁ・・・
125名無しさん@お腹いっぱい。:2007/02/27(火) 22:45:55
viで編集中は日本語のメッセージが正しく表示されていたのですが、シェルスクリプトを実行するとメッセージが文字化けします。どうすればよいですか。
126名無しさん@お腹いっぱい。:2007/02/27(火) 22:49:25
viが自動認識して処理してる?

nkf -e < script
nkf -j < script
nkf -s < script
nkf -w < script

で化けないパターンを探してそれに置き換える。
127名無しさん@お腹いっぱい。:2007/02/27(火) 22:51:13
>>125

その vi の実体は、賢い vi で、
シェルの ENV がついていけてないとか。
128名無しさん@お腹いっぱい。:2007/02/28(水) 00:25:54
Cシェル、Oracle10gで
exp 〜 query\"where column_name in\( select col from tableB \) \"
みたくqueryパラメータで副照会できないようなんで
exp 〜 query\"where column_name in\( $COLUMN_NAMES \) \"
なんて具合に変数を埋め込みたい。
シェル変数が展開されてからexportに渡されるようにする方法ないかな?

129名無しさん@お腹いっぱい。:2007/02/28(水) 00:54:58
>>126
nkf -g が無いバージョンかな?
130名無しさん@お腹いっぱい。:2007/02/28(水) 01:00:16
おお、そんなものが。
nkf -wができることに最近気づいたくらいアップデートしてなかったんで。
131名無しさん@お腹いっぱい。:2007/02/28(水) 09:20:31
浜田マキ子って人のジャーナル見てみなよ。
中国の恐さにぞっとすること請け合い。
あいつら本気で日本を侵略する気だ。
そして、手下はやはり立命館?
132118:2007/03/01(木) 04:39:27
>>122
すんません書き漏れです
知りたいのはsh-posixとksh88の機能差です

kshにksh88とksh93があってかなり違うってのは知ってるというか
kshの情報には大抵2つのバージョンの比較が併記されてるもんだし
ただsh-posixとksh88の比較は見たことがないし違いも見つけられなかったもんで
133名無しさん@お腹いっぱい。:2007/03/01(木) 06:28:17
>>132
・ パターンマッチングがegrep相当に拡張
・ [[ ほげ ]] (中身をメタキャラ解釈しないtestのようなもの)
・ 配列が使えた
・ emacs風コマンドライン編集
ってとこか。なおksh93はksh88と挙動が違ったりバグが直されたりしてるし、
ksh88とpdkshでも機能に違いがあるので、
ksh88で動けば他のkshで動作するとは限らない
134名無しさん@お腹いっぱい。:2007/03/01(木) 22:50:40
ksh に限らないが、バージョン依存の対応は本当に面倒だな。
135名無しさん@お腹いっぱい。:2007/03/02(金) 00:10:52
こういうデータを、
----
yes
・・・・
・・・
・・・・・
IPアドレス xxx.xxx.xx.54
----
no
・・・・
・・・・・
IPアドレス xxx.xxx.xx.123
----
yes
・・・・・・・・・
・・・・・
IPアドレス xxx.xxx.xx.23

こういうふうに加工したいのですが、
yes,xxx.xxx.xx.54
no,xxx.xxx.xx.123
yes,xxx.xxx.xx.23

・・・・・・・・・
・・・・・
の部分は2行のときもあるし10行のときもあります。
136135:2007/03/02(金) 00:14:33
最初の
----

IPアドレス
という文字をうまく関連付ければ
加工可能とは思うのですが、
具体的にどうしたらいいのかよくわかりません。

最初の
----
を見つけたら
その次の「IPアドレス」という文字列を捕まえて
xxx.xxx.xx.123を確保する、
という形でしょうか。

うまい方法があればヒントをいただけますか?
cat、more、grep、cut、sedなど一般的なコマンドは習得しています。
137名無しさん@お腹いっぱい。:2007/03/02(金) 00:19:45
1行1レコードじゃないときは
めんどくさいから perl 使っちゃうな。
138名無しさん@お腹いっぱい。:2007/03/02(金) 00:34:22
csplit input '/^----$/' '{*}'
for file in xx*; do echo `sed -n '2p;${s/.* //;p}' $file`; done

csplitってPOSIX標準だっけ?
139名無しさん@お腹いっぱい。:2007/03/02(金) 00:34:30
俺もperlかawkに1票。適材適所ってやつ。
140名無しさん@お腹いっぱい。:2007/03/02(金) 01:17:00
awkで RSに---を入れてやればいいじゃない
141名無しさん@お腹いっぱい。:2007/03/02(金) 01:52:51
ここはあえてCで
142名無しさん@お腹いっぱい。:2007/03/02(金) 02:52:27
>>141
書いてみて
143名無しさん@お腹いっぱい。:2007/03/02(金) 08:40:46
>>135
俺も awk に一票だが、
最初と最後をどうにかすれば grep と sed だけでもできそう。

grep -C 1 -x -e ---- | sed ....

こんな感じで。
144名無しさん@お腹いっぱい。:2007/03/02(金) 08:56:59
143 | sed -n '
N;
N;
N;
s/¥(yes¥|no¥)¥n/¥1 /;
s/----¥n//;
s/--¥n//;
s/IPアドレス //;
p'

改行ってどこのsedでも¥nと書けるのだっけ?
145名無しさん@お腹いっぱい。:2007/03/02(金) 09:03:20
あー、最後の部分がきちんと処理できないな。
146名無しさん@お腹いっぱい。:2007/03/02(金) 09:10:43
sed -n '
/¥(yes¥|no¥)/h;
/IPアドレス /{
H;
x;
s/¥(yes¥|no¥)¥n/¥1/;
s/IPアドレス /,/;
p
}' input

どだっ!?
147135:2007/03/02(金) 13:43:23
みなさんありがとうございます。
僕はまだレベルが低いですし
awkは(難しくて)使えないので
>>143さんの
grep -C
オプションでやってみよと思います。
148名無しさん@お腹いっぱい。:2007/03/02(金) 15:27:32
変数1で指定したディレクトリに変数2のファイル名でlsの結果をリダイレクトするにはどうすればいいですか。
149名無しさん@お腹いっぱい。:2007/03/02(金) 15:32:33
>>148
ちょっと、質問が複数の意味に取れるけど、

ls > "$1"/"$2"

ってことか?
150148:2007/03/02(金) 16:42:33
>>149 できたっす。バックスラッシュいれてたっす。
151名無しさん@お腹いっぱい。:2007/03/02(金) 17:25:16
変数1で指定したディレクトリに変数2のファイル名でlsの結果をリダイレクトするときに、すでにファイルが存在する場合、上書き確認のメッセージを出して処理を分岐させるにはどうすればいいですか。
152名無しさん@お腹いっぱい。:2007/03/02(金) 17:27:36
test -f ファイル
[ -f ファイル ]
153名無しさん@お腹いっぱい。:2007/03/02(金) 18:47:44
その調子で、1から10まで全部ここで聞くのか?
154名無しさん@お腹いっぱい。:2007/03/02(金) 19:02:57
シェルスクリプトの犬小屋でも作るか?
155名無しさん@お腹いっぱい。:2007/03/02(金) 19:07:44
いらね。
156名無しさん@お腹いっぱい。:2007/03/02(金) 21:48:30
>>152
便乗質問ですが、よく、ファイルがあるかどうかを判断するのに、
test -fを使えと言われるのですが、実行しても何も起こりません。
何か設定が必要なのでしょうか?
157名無しさん@お腹いっぱい。:2007/03/02(金) 21:58:24
test -f hoge && echo found
158名無しさん@お腹いっぱい。:2007/03/02(金) 22:18:29
「ファイルがあるかどうか」なら、test -fじゃなく、test -e使え。
test -fだとレギュラーファイル以外はないものと判定されるぞ。
(デバイスファイルとか、broken symlinkとか、socketとか)
159名無しさん@お腹いっぱい。:2007/03/02(金) 22:36:23
>>158
だめーっ。Bourneではtest -eは使えなーい。test -fが定石。
160名無しさん@お腹いっぱい。:2007/03/02(金) 22:40:52
if exist %1
161名無しさん@お腹いっぱい。:2007/03/02(金) 23:04:59
>>156

何かが起こるように書けばいい。
test を実行しただけで何も起こらないのは当たり前。
162名無しさん@お腹いっぱい。:2007/03/02(金) 23:15:29
Bourne Shellのif文で、ifの次に来るのはコマンド(列)
test...も [ ... ] もコマンドを実行してる。
実行した結果のステータスコードで分岐するだけ。
163名無しさん@お腹いっぱい。:2007/03/03(土) 00:09:47
>>159
>>162の通り、testはシェルの内部コマンドではない。Bourneかどうかは関係ない。

まあそれはそれとして、autoconf infoの"Limitations of Builtins"から抜粋。
POSIXも信用せずにportableにしたいならどおぞ。

... use `test -f' or `test -r'. Do not use `test -x', because 4.3BSD
does not have it. Do not use `test -e' either, because Solaris 2.5
does not have it. To test for symbolic links on systems that have
them, use `test -h' rather than `test -L'; either form conforms to
POSIX 1003.1-2001, but older shells like Solaris 8 `/bin/sh' support
only `-h'.
164名無しさん@お腹いっぱい。:2007/03/03(土) 00:37:34
うちのシェルでは内部コマンドなのだが。
165162:2007/03/03(土) 01:05:35
>>164
そういえばそうか。シェルの実装はtestを内部コマンドとして定義しても
いいんだっけか。すまん間違えた。
166名無しさん@お腹いっぱい。:2007/03/03(土) 01:21:37
testは外部コマンドだから条件分岐は出来るだけcaseを使おうって話を
どっかで聞いたことがあるけど、
UNIX黎明期を除けばどのシステムでもシェル組み込みコマンドとして実装されている。
ループで最頻出のコマンドが外部呼び出しじゃ実用的な速度が出ないだろうしね。
167名無しさん@お腹いっぱい。:2007/03/03(土) 01:30:36
>>166
KernighanとPikeのUnix Programming Environmentにそういう記述があった希ガス。
UNIX第7版とかの時代の話だが。
168名無しさん@お腹いっぱい。:2007/03/03(土) 07:57:52
162は俺なのだが……、俺は「外部コマンド」とは書いてないぞ。
169163=165:2007/03/03(土) 11:51:37
>>168
すまん番号間違えた。
漏れは163と165だた
170名無しさん@お腹いっぱい。:2007/03/03(土) 12:08:23
>>166
適当なループ回して試してみろ。
testが内部コマンドである現在のシェルでも、
case使った方が、if [ ... ] よりも若干速いよ。

おそらく、内部コマンドとはいえ、独立したコマンドとして
内部的に実行するオーバーヘッドがtestにはかかるんだろう。
caseの場合はシェル本体が直接解釈するから
オーバーヘッドはtestよりも少ないと。
171名無しさん@お腹いっぱい。:2007/03/03(土) 14:06:00
>>170
釣りか天然か... 判断に苦しむ。
172名無しさん@お腹いっぱい。:2007/03/03(土) 14:20:05
>>171
釣りじゃないだろ。実験してみろ。time sh -c '...' とかで計れる。
確かに caseの方がちょっと早い。
173名無しさん@お腹いっぱい。:2007/03/03(土) 14:34:36
>>171
おかしなところがあるなら具体的に指摘してみればいいじゃない
174名無しさん@お腹いっぱい。:2007/03/03(土) 14:37:35
だね。あと、zshだと何故か違いが顕著になる。


$ time zsh -c 'for i in `seq 1 10000`; do [ a = a ] && :; done'
real 0m3.051s
user 0m2.705s
sys 0m0.207s

$ time zsh -c 'for i in `seq 1 10000`; do case a in a);;esac; done'
real 0m0.915s
user 0m0.703s
sys 0m0.204s


↓おまけ。[ ]の代わりに [[ ]] にすると、内部コマンドじゃなく、
直接のシェル文法になるので、早くなる。

$ time zsh -c 'for i in `seq 1 10000`; do [[ a = a ]] && :; done'
real 0m1.708s
user 0m1.201s
sys 0m0.402s
175名無しさん@お腹いっぱい。:2007/03/03(土) 15:41:12
>>173
おかしなところは推測の部分。単に実装の違いだけでしょ。

ksh(93)
case 0.65 real 0.46 user 0.17 sys
test 0.58 real 0.46 user 0.10 sys

pdksh
case 23.23 real 22.45 user 0.20 sys
test 4.96 real 4.74 user 0.14 sys

bash2
case 3.52 real 3.21 user 0.24 sys
test 4.26 real 3.93 user 0.25 sys

ash
case 0.38 real 0.28 user 0.09 sys
test 0.52 real 0.45 user 0.05 sys
176名無しさん@お腹いっぱい。:2007/03/03(土) 17:55:22
>>175
その実装の違いを推測してるのではないか? なので、おかしくない。

ちなみに俺の環境では、kshでもtestよりcaseの方が速かったよ。
177名無しさん@お腹いっぱい。:2007/03/03(土) 18:59:53
つまり、testよりcase使え、って言うテクは今でも生きてるってわけか。
178名無しさん@お腹いっぱい。:2007/03/03(土) 20:43:22
bash3 [[
real 0m1.758s
user 0m1.562s
sys 0m0.160s

bash3 case
real 0m1.515s
user 0m1.341s
sys 0m0.150s

確かに少しだけど、case の方が速いね
179名無しさん@お腹いっぱい。:2007/03/03(土) 20:53:55
>>178
いや、[[じゃなくて [ と caseを比較するという話だが。

速い順に、
case > [[ > [
となると思う。
180名無しさん@お腹いっぱい。:2007/03/03(土) 21:13:01
>>179
あ、そうだったっけか。

bash3 [
real 0m2.388s
user 0m2.042s
sys 0m0.370s
181名無しさん@お腹いっぱい。:2007/03/04(日) 21:32:58
Bashにおいて以下の条件で動くシェルスクリプトを書く場合、どのように書けばよいのでしょうか?

ディレクトリ名とその中にあるファイルサイズが0のファイル名を出力する。
補足1:ディレクトリが特定されていない場合は、現在シェルが働いているディレクトリ名を出力する。
補足2:もし引数がディレクトリ名でない場合は、すべてのコマンドラインの引数にエラーメッセージを出力する。
補足3:ファイル名の一番最初の文字が、「.」の場合は無視するようにする。
182名無しさん@お腹いっぱい。:2007/03/04(日) 21:54:16
>>181
問題に曖昧なところがあるけど、こういうことか?
bashじゃなくてもB-sh共通で動く。

dir=${1-.}
if [ ! -d "$dir" ]; then
echo "$dir is not a directory" 1>&2
exit 1
fi

for f in "$dir"/*
do
if [ ! -s "$f" ]; then
echo "$f"
fi
done
183名無しさん@お腹いっぱい。:2007/03/04(日) 21:55:25
「すべてのコマンドライン」の意味がちょっと判らないけど、
大体こんな感じじゃない?

usage() {
 echo "Usage: ..." 1>&2
 exit 1
}
test -d $1 && find $1 -not -name '\.*' -size 0 -print || usage()

ただし補足1はGNU findの機能を使ってるので、どのfindでもということなら
$1が空だった場合の扱いを自分でする必要がある。あと、「.」で始まる
フォルダは処理したいのなら、find の条件をもうちょっと詰める必要がある。
184名無しさん@お腹いっぱい。:2007/03/04(日) 21:59:31
宿題にマジレスはご遠慮ください。本人のためになりません。
185名無しさん@お腹いっぱい。:2007/03/04(日) 22:01:31
>>182
レスありがとうございます。
問題文は元々英語の為、変な訳になって細かい部分が伝わらず申し訳ありません。
英文ですが、元の問題はこちらです。ttp://user.ftth100.com/log/up/log/3569.gif
186181:2007/03/04(日) 22:21:53
>>183
分かりやすい解説付でありがとうございます。

この場合、

test -d $1(ディレクトリ名を引数1に格納)
&& find $1 -not -name '\.*' -size 0(ファイル名の頭文字が「.」、サイズが0の物をはじく)
-print || usage() (結果をusage()に返し、出力)
usage() で、正常ならば結果を出力。エラーならば1>&2が働きエラーを表示。そしてexitで終了。

といった感じでしょうか?
187名無しさん@お腹いっぱい。:2007/03/04(日) 22:46:22
>>185
この問題って出所はどこなの?
188181:2007/03/04(日) 23:16:28
>>187
Unix and Shell Programmingという洋書です。
189名無しさん@お腹いっぱい。:2007/03/04(日) 23:23:20
>>184
>>181 のいう通りなので、後は自分で解読してみてください。
190名無しさん@お腹いっぱい。:2007/03/04(日) 23:24:06
しまた、181 <-> 184 ね
191名無しさん@お腹いっぱい。:2007/03/05(月) 14:36:49
>>186

短絡評価でぐぐれ
192名無しさん@お腹いっぱい。:2007/03/05(月) 15:46:28
>>135

sed -n '/^[yn][eo]/p;s/^IPアドレス.//p' data.txt | fmt -w 18 | tr ' ' ,
193192:2007/03/05(月) 15:55:14
ああ先頭が ne とか yo で始まる行があるとだめなので、
yes/no 個別に書くべきですね。
それとスペースを数えると正しくは fmt -w 19 だ ww
194192:2007/03/05(月) 16:14:27
ああ、やっぱ駄目だ。
スレ汚し済まない。
195名無しさん@お腹いっぱい。:2007/03/05(月) 16:49:38
>>135
perl -ne 'BEGIN { $/ = "----\n" } /(yes|no).*(\d+(?:\.\d+){3})/s && print "$1,$2\n"'
196名無しさん@お腹いっぱい。:2007/03/05(月) 17:46:13
>>135
sed -f 135.sed

$ cat 135.sed
/^----/{N
s/^----\n//
x
d
b
}
/^IPアドレス /{
s/IPアドレス /,/
x
G
s/\n//
b
}
d
197名無しさん@お腹いっぱい。:2007/03/07(水) 17:04:39
一連のアクションが3回実施され(割り込み重複なし)
一行ずつ一つのログファイルに延々と結果が記載されます。

100
ABC
101
200
DEF
201

…こんな感じで3行ずつが一連のアクションです。
これを以下のように整形したいのですが、妙案は有りますでしょうか?

100,ABC,101
200,DEF,201

ご教示いただければ幸いです。
198名無しさん@お腹いっぱい。:2007/03/07(水) 17:29:18
>>197
sed 'N;N;s/¥n/,/g'

む、あたまに余計な空行が付くな。

199名無しさん@お腹いっぱい。:2007/03/07(水) 17:31:06
ああ、勘違いだった。198でいいわ。
200名無しさん@お腹いっぱい。:2007/03/07(水) 18:03:28
>>199
やっぱりsedを使うのかな?と思い本を見ていたところでした。

なるほどNで行数分読み込んで、改行\nを,に置き換える…。
見れば直ぐに解りますが、これを0から考えるのは大変でした。
今度は誰かに教えれるよう、頑張ります。

素早いご解答ありがとうございました!
201名無しさん@お腹いっぱい。:2007/03/08(木) 12:24:02
どうしても分からないので教えてください。
利用者が指定した文字列の書いてあるファイルを読み込んで、
配列に文字列を一つずつ格納し、その文字列を順番に出力させたいのですが、
どのようにすれば良いのでしょうか?
202名無しさん@お腹いっぱい。:2007/03/08(木) 12:32:35
>>201
どのシェルよ?
少なくともピュアBourneシェルには配列はない。
203名無しさん@お腹いっぱい。:2007/03/08(木) 12:33:26
>>202
申し訳ありません。bashです。
204名無しさん@お腹いっぱい。:2007/03/08(木) 12:37:11
>>201
tr ' ' '¥012' < ユーザーが指定したファイル | sort
という意味?

指定したファイルの中はどんな構造なの?
1行に1語なのか、フリーテキストか。
205名無しさん@お腹いっぱい。:2007/03/08(木) 12:40:27
>>204
指定したファイルは、おっしゃる通り、1行1語のテキストファイルです。

Sapporo
Tokyo
Osaka
Nagoya
Fukuoka

といった感じです。

単純に中身を表示するだけなら、
echo -n "ファイル名を入力してください:"
read x

cat $x

でよいと思われるのですが、一度配列に全文字列を格納してやるので困っています…。
206名無しさん@お腹いっぱい。:2007/03/08(木) 12:46:39
言ってる意味が分からん。

sort そのファイル
とするのとは違うの?
207名無しさん@お腹いっぱい。:2007/03/08(木) 12:55:10
>>206
sort ファイル とは違い、この場合だと、

array[0]=Sapporo
array[1]=Tokyo
array[2]=Osaka
array[3]=Nagoya
array[4]=Fukuoka

i=0
while [$1 -le 5]
do
echo ${array[$i]}
let i=$i+1
done

読み込んだテキストファイルをこのような感じで出力させたいです。
208名無しさん@お腹いっぱい。:2007/03/08(木) 12:58:49
宿題は自分でやりましょう。
209名無しさん@お腹いっぱい。:2007/03/08(木) 13:05:51
>>201
シェルスクリプトじゃなきゃいかんの?
perlかなんか使った方が楽じゃない?
210名無しさん@お腹いっぱい。:2007/03/08(木) 13:12:43
とりあえず、「順番に」が読んだ順にという意味であって
「整列させて」という意味ではないことは理解した。

211名無しさん@お腹いっぱい。:2007/03/08(木) 13:16:34
while read word; do
words=($words $word)
done < 指定したファイル
してあとは一緒。
212名無しさん@お腹いっぱい。:2007/03/08(木) 13:43:20
>>209
perlじゃ駄目なんです。

>>211
echo -n "ファイル名を入力してください:"
while read word; do
words=($words $word)
done < $word

という事でしょうか?
213名無しさん@お腹いっぱい。:2007/03/08(木) 14:02:36
違う。
214名無しさん@お腹いっぱい。:2007/03/08(木) 14:07:43
>>213
すいません・・・
どうやれば良いのでしょうか?
215名無しさん@お腹いっぱい。:2007/03/08(木) 14:10:26
<の後ろに書くのは、>>207のx

echo -n "ファイル名を入力してください:"
read source

while ....

done < $source

あとは出力のためのループ

216名無しさん@お腹いっぱい。:2007/03/08(木) 14:52:24
>>215
echo -n "ファイル名を入力してください:"
read source

while read word; do
words=($words $word)
done < $source

cat $source | while read
do

echo $words
let source=$source+1

done

でやってみましたが、テキストの最初の文字列しか表示されません。
後半の出力ループがいけないのでしょうか?
217名無しさん@お腹いっぱい。:2007/03/08(木) 15:06:49
ああ、ごめん、bashじゃなくzshでやってたわ。
218名無しさん@お腹いっぱい。:2007/03/08(木) 15:12:44
bashで配列にpushする方法がわからん。
代わりに一パラメータで逃げてみた。

while read word; do
set -- $* $word
done < $source

for word in $*; do
echo $word
done
219名無しさん@お腹いっぱい。:2007/03/08(木) 15:18:07
訂正

×一パラメータ
○位置パラメータ

あんど、こう書くらしい。

while read word; do
size=${#words[@]}
words[$size]=$word
done < $source

for word in ${words[@]}; do
echo $word
done
220名無しさん@お腹いっぱい。:2007/03/08(木) 15:24:40
bash限定スクリプトは、以降はこちらへ

http://pc11.2ch.net/test/read.cgi/linux/1154578200/


ここはBourneのみでよろしこ。
221名無しさん@お腹いっぱい。:2007/03/08(木) 15:49:17
>>219
動作確認出来ました。本当にありがとうございました。

>>220
誘導ありがとうございます。
スレ違いで申し訳ありませんでした。
222名無しさん@お腹いっぱい。:2007/03/08(木) 15:53:31
shです
教えてください

#!/bin/sh
COUNTER=0
while [ $COUNTER -lt 100 ]; do
mv "$COUNTER".jpg /home/more/
let COUNTER=COUNTER+1
done

こんな感じのとき最初の10までが1桁になってしまうのですが
01 02 03,,,,
行頭に0を付けた2桁で処理するのはどうすれば良いのでしょうか?
00-09と10-99でループをわけるしか無いのでしょうか?


223名無しさん@お腹いっぱい。:2007/03/08(木) 15:59:51
最近の環境ならprintf外部コマンドがあるんじゃない?
mv `printf %02d $COUNTER`.jpg /home/more

なければ
mv `echo "0$COUNTER" | sed 's/0*¥(..¥)$/¥1/'`.jpg /home/more
とか、
mv `echo "0$COUNTER" | rev | cut -b1,2 | rev` /home/more
とか。
224名無しさん@お腹いっぱい。:2007/03/08(木) 16:09:12
>>222
for COUNTER in `seq -w 0 99`; do : ...; done

↑でループすれば桶。

あと、letコマンドは純粋な shには無いぞ。
225名無しさん@お腹いっぱい。:2007/03/08(木) 16:11:22
ただ、>>222 がやっていることをやるだけなら、
そもそもループすら不要で、

mv [0-9][0-9].jpg /home/more

だけで一発。シェルは不要。
226名無しさん@お腹いっぱい。:2007/03/08(木) 16:11:48
seqもあったりなかったり
227名無しさん@お腹いっぱい。:2007/03/08(木) 16:12:07
>>223
ありがとうございました。
最終行でうまくいきました。
上の2個も含め手法を理解するように勉強してみます
228名無しさん@お腹いっぱい。:2007/03/08(木) 16:15:29
(たとえば) [0-9][0-9] を展開しているのはシェルですぅ
ので不要じゃないわよ>>225
229名無しさん@お腹いっぱい。:2007/03/08(木) 16:16:49
>>228
お約束どおり釣れましたよ。おめでとう。
230名無しさん@お腹いっぱい。:2007/03/08(木) 16:18:58
>>224-226
ありがとう。
実際にはdateから自動生成された莫大な
画像データを部分的に抽出しながら動画生成を
行うので
例に出したのより多少複雑に書き直します

seqも実験してみます

231名無しさん@お腹いっぱい。:2007/03/08(木) 16:20:11
touch [0-9][0-9].txt
[root@localhost /tmp]$ ls
[0-9][0-9].txt

となります。
00.txtから99.txtを作りたいのですが…
232名無しさん@お腹いっぱい。:2007/03/08(木) 16:20:18
BSDだとseqの代わりにjotだったかな。
233名無しさん@お腹いっぱい。:2007/03/08(木) 16:23:11
zsh があるなら

zsh -c 'touch {00..99}.txt'

とか
234名無しさん@お腹いっぱい。:2007/03/08(木) 16:26:04
231は空のディレクトリで touch *.txt やったときに
どういう結果になってほしいんだろう。
235名無しさん@お腹いっぱい。:2007/03/08(木) 16:27:16
zsh -c 'touch {00..99}.txt'
は、書かれてしまったから

touch `seq -s ".txt " -w 99"`.txt
236名無しさん@お腹いっぱい。:2007/03/08(木) 16:27:59
シェルってゆうな。クズ。
237名無しさん@お腹いっぱい。:2007/03/08(木) 16:28:49
>>234
00.txtから連番で99.txtまでのファイルが欲しいんでしょ
238名無しさん@お腹いっぱい。:2007/03/08(木) 16:30:36
>>236
いつものお約束も釣れましたよ。おめでとう。
239名無しさん@お腹いっぱい。:2007/03/08(木) 16:31:17
シェルっていうな
240名無しさん@お腹いっぱい。:2007/03/08(木) 16:35:08
>>233 >>235
ありがとうございました!
zshって凄いですね。

でも、それに依存しないよう
>>235さんの方法を覚えます。
241名無しさん@お腹いっぱい。:2007/03/08(木) 16:38:39
>>223 のprintf以外の方法だとちょっと無駄。
exprを使うのが定石。

expr 0$COUNTER : '.*\(..\)'
242名無しさん@お腹いっぱい。:2007/03/08(木) 16:40:10
seqもない場合があるけどね
243名無しさん@お腹いっぱい。:2007/03/08(木) 16:43:23
>>235 の seq、間違ってるよ。最後の .txtが余分なのと、"が1個余分。
244名無しさん@お腹いっぱい。:2007/03/08(木) 16:46:42
>>235 よりも、

seq -f %02g.txt 0 99

の方がエレガント。
245名無しさん@お腹いっぱい。:2007/03/08(木) 16:53:02
>>243
-sは間に挟む文字列だから最後の.txtがないと、
00.txt ... 98.txt 99 で終わってしまうぞ。
でも正解は>>244
246名無しさん@お腹いっぱい。:2007/03/08(木) 16:57:54
>>244
確かにこっちなら完璧に出来ますね。

ところで %02g と言うのは何なんでしょうか?
247名無しさん@お腹いっぱい。:2007/03/08(木) 17:06:19
>>246
man seq
つーか
man 3 printf
248201:2007/03/08(木) 18:43:31
>>219
最後にもうひとつだけ質問させてください。
出力をする時に配列の反対(リバースオーダー)から出力をするのはどうやれば良いのでしょうか?

例えば、
Tokyo
Osaka
Nagoya

とあったら

Nagoya
Osaka
Tokyo

と出力されます。
249名無しさん@お腹いっぱい。:2007/03/08(木) 18:46:19
>>248
tac
250名無しさん@お腹いっぱい。:2007/03/08(木) 18:51:21
for ...
done | tac
のようにパイプすればいいのではないでしょうか。

tacがない環境では、

for ...

done | sed '1!G;h;$!d'
251201:2007/03/08(木) 19:14:20
ありがとうございました。
これでなんとか単位が取れます
252名無しさん@お腹いっぱい。:2007/03/08(木) 19:25:38
はぁ? 単位?? 宿題禁止なわけだが、、答えて損した、、
253名無しさん@お腹いっぱい。:2007/03/08(木) 19:46:30
上で指摘されてるのに気付けよ
254名無しさん@お腹いっぱい。:2007/03/09(金) 00:33:46
ファイルを1行ずつ読み込んで配列に入れたいとおもってまつ。
↓みたいに書いてみたのですがエラーでちゃいます。なぜ??

#!/bin/csh
set ALLCOUNT = 5
@ CT = 1
@ NO = 3
@ CN = ""
while ( $NO <= $ALLCOUNT )
set CN[$CT] = `sed -n "$NO p " job.txt
@ CT ++
@ NO ++
end
255名無しさん@お腹いっぱい。:2007/03/09(金) 01:11:36
シェルスクリプトでは、sh だろうと csh だろうと、
配列を使おうと思った時点で負け。別の方法を探すべし。
256名無しさん@お腹いっぱい。:2007/03/09(金) 01:17:09
>>254
>>201と同じ学校の人?
257名無しさん@お腹いっぱい。:2007/03/09(金) 01:19:14
>255
ダメっぽ?

>256
いや趣味
258名無しさん@お腹いっぱい。:2007/03/09(金) 07:50:56
cshの時点で負け。
それが宿題だとすると、そんな教官がいるような学校に
進学した時点で負け。
259名無しさん@お腹いっぱい。:2007/03/09(金) 07:52:39
思考停止論か
260名無しさん@お腹いっぱい。:2007/03/09(金) 07:54:46
宿題で「cshで書け」と指定されている場合以外に、
cshで書かなければいけない合理的な理由は存在しない。

趣味なら自分で研究すること。
261名無しさん@お腹いっぱい。:2007/03/09(金) 17:07:47
シェルスクリプトならファイルが配列ってことで
262名無しさん@お腹いっぱい。:2007/03/09(金) 19:22:22
インデックスによるアクセスが必要ならポジションパラメータ使うだろ。普通。
263名無しさん@お腹いっぱい。:2007/03/09(金) 21:47:41
配列も、位置パラメータも
所詮人間がデータ構造を解釈しているだけの話。
264名無しさん@お腹いっぱい。:2007/03/10(土) 21:31:59
201が宿題やったせいで254も宿題思われてるのかw
というより口だけで実は分からないだけですかおまいら。
265名無しさん@お腹いっぱい。:2007/03/10(土) 21:37:01
>>264
宿題かどうかが問題なんじゃなくて、cshのスクリプトは論外ということ。
誰も答えるはずがない。
266名無しさん@お腹いっぱい。:2007/03/10(土) 21:44:39
自演乙
267名無しさん@お腹いっぱい。:2007/03/10(土) 21:45:26
  / / ,. -'"´         `丶、、 ヽ
       __l //      /  |      \ \\ ゙、        / ̄ ̄ ̄ ̄ ̄ ̄
     / :::||  / / /    l l      ヽ ヽヽド、      /
    l::::::::::|| /   /  /      ! l  ヽ   ヽ ヽヽ ||:::::ヽ    |  l 十``  十_ヽ
   斤.::::::::||/  /   //! ハ  l  !  ヽ   ', ゙ヽ||::::::::勺    |  レ d、  (_| _)
   |ll|i :::::::|| l l  イ l /!l | ヽ  ト、|、  ト、  l  l、||::::::::}ll|   |  ┼‐、ヽ  ┴┴
   |ll|ヽ:::::|l  !l  |l!‐!‐ト、l  ヽ | l | ヽ | l i l  l||:::::::/!l|   |     ノ   月 l |
   |lll| `ー!  l  | l 」-=ミ|`ヽ ヽ | !-‐!‐|-l、|} l  |r、〃|ll|   |  二二``  l__ヽ
   L!l   |   l | 〃{ノ::::iヾ  ヽ! ,. =-ミ、!ハ l  !"´ |ll|   |   ノ     _)
         {l  |!l | ヽ `ー"     ' トイ:::}ヾ  | l |  |ll」   |   ─ァ
         ヽ |l !|               `二ノ  '| ||       |  /\
          l |', |                 /)|l l        |  ┼‐、ヽ
           l | ゙、        ` ´         /-イ| l          |    ノ
            !|  \    ヽニヽ      , ′/゙! l       ∠   '⌒)
         |   |ヽ、  ー     /  〃 | !         |   「
             ,.rr|   丶、   ,.. '´ト、     l′        ヽ  ゚
            l::l {:|     ` ´   |::}}               \______
        _. -‐1::ヽ' -、    _,.. -‐ン::|ヽ、
 _.. -‐ "´     |:::::::::`ゝヽ  /rJ::'"´:::::::!  ` 丶、
268名無しさん@お腹いっぱい。:2007/03/10(土) 21:52:54
だいたい木曜辺りに宿題が出るのか?
269名無しさん@お腹いっぱい。:2007/03/10(土) 22:04:01
宿題は2chでやってもらうのが当たり前です。
270名無しさん@お腹いっぱい。:2007/03/10(土) 22:11:17
逆に、宿題を出す立場の人間です。
毎回、問題を出すのにネタが尽き気味で大変です。
宿題が出た人、どんどんその問題を書き込んでください。
一部変えて出題に使わせていただきます。
271名無しさん@お腹いっぱい。:2007/03/10(土) 22:19:47
2ちゃんを使わせない方法
272名無しさん@お腹いっぱい。:2007/03/10(土) 22:29:26
>>270
分かった。
うちで使うスクリプトを問題として出してやる。
273名無しさん@お腹いっぱい。:2007/03/12(月) 10:34:35
>>270
tacをシェルスクリプトで書かせる。
274名無しさん@お腹いっぱい。:2007/03/12(月) 10:47:03
>>273
そういえば、まだ bash の回答がない。
ttp://golf.shinh.org/p.rb?reverse+lines
この問題にかぎらず、sh で参戦してる人が少ないのでおまいらもやってみてくれ。
おれもがんばってみる。
275名無しさん@お腹いっぱい。:2007/03/12(月) 17:31:24
sedの解が出てるんだからそれを呼べばよいのでは。
何も無理してshだけで文字列操作するこたーないと思うけど。
#!/bin/sh
f () { local l; read -r l && { f; echo "$l"; }; }
f
276名無しさん@お腹いっぱい。:2007/03/12(月) 18:28:56
>>275
readの -r オプションはbash依存。localコマンドは Bourneで使えない。
あと、再帰呼出しは重い。非再帰版の方がエレガント。
出題ネタにしたいので、回答は省略。
277名無しさん@お腹いっぱい。:2007/03/12(月) 18:44:38
#! /bin/sh

txt=
IFS='
'
while read line
do
txt="${line}
${txt}"
done
echo -n "$txt"
278名無しさん@お腹いっぱい。:2007/03/12(月) 19:10:00
>>276
CodeGolfが出ちゃったからbashism上等の答えになったんだと思う。

279名無しさん@お腹いっぱい。:2007/03/12(月) 19:18:19
localはどうか忘れたがread -rはPOSIXにもあったんじゃないか?
280名無しさん@お腹いっぱい。:2007/03/13(火) 01:40:57
そーすpls
281名無しさん@お腹いっぱい。:2007/03/13(火) 02:44:26
282名無しさん@お腹いっぱい。:2007/03/13(火) 09:45:19
283名無しさん@お腹いっぱい。:2007/03/13(火) 20:53:58
awkについて質問します。
single quotation mark("'")をエスケープしたいのですが、
次のコードは×となります。
どなたか、どうやって、"'"をエスケープするのか
教えていただけますか?

たとえば、
awk '{printf "\'%s\'", $2}' file
として、
$2フィールドの値を
'AX'
'PY'
'CU'
のように''で囲みたいのです。
284名無しさん@お腹いっぱい。:2007/03/13(火) 20:57:48
シェルレベルで '...' と ¥' からなる並びに見えるようにする。

'{printf "'
¥'
'%s'
¥'
'¥n", $2}'

見やすいように改行入れてみたが実際にはくっつけて記述。
285名無しさん@お腹いっぱい。:2007/03/13(火) 21:15:45
>>284
できました!
ありがとう。
なんでできるのか、もう少し詳しく
教えていただけないでしょうか?
286名無しさん@お腹いっぱい。:2007/03/13(火) 21:48:08
awk に渡したい文字列を分解するだけだよ。
シェルの解釈する文字をエスケープしながらね。
だから、
'{printf "'"'%s'"'\n", $1}'
などでもいい。
287名無しさん@お腹いっぱい。:2007/03/13(火) 21:49:44
$1じゃなくて$2だったか
288名無しさん@お腹いっぱい。:2007/03/13(火) 22:15:15
wgetの実行結果をファイルに書き込みしたいんですけど
wget アドレス >>ファイル名
で実行して失敗しました。
どうしたらいいかわかりますか?
289名無しさん@お腹いっぱい。:2007/03/13(火) 22:19:00
わかりますよ。
290名無しさん@お腹いっぱい。:2007/03/13(火) 22:25:01
wget --help
291名無しさん@お腹いっぱい。:2007/03/14(水) 17:16:17
テキストファイルのある行が2chのdat形式かどうかを
正しく判別するにはどうすればいいでしょうか?

grep -E ".*<>.*<>[0-9]+/[0-9]+/[0-9].* [0-9:.]+ ID:[a-zA-Z0-9+-/]+<>.*<>.*"

こんな感じでひっかけようと思ったのですが、
何かの間違いでメール欄やレス欄に <> が
まぎれこんでしまってる場合でもマッチしてしまいます。
やりたいことは、このようなゴミのまじった行を削除することなのですが
どうするのがよいでしょうか?
292名無しさん@お腹いっぱい。:2007/03/14(水) 18:47:38
あ、しまった。
293名無しさん@お腹いっぱい。:2007/03/14(水) 21:33:18
> ゴミのまじった行を削除する

全部捨てたらいいんじゃないか。
294名無しさん@お腹いっぱい。:2007/03/14(水) 22:54:48
無理にシェルで書かんでもいいんでは。
295名無しさん@お腹いっぱい。:2007/03/14(水) 23:24:19
>>288

-O
296名無しさん@お腹いっぱい。:2007/03/15(木) 03:28:47
>>270
宿題にするな。テストにしとけ。
297名無しさん@お腹いっぱい。:2007/03/15(木) 09:45:11
ペーパーテストで一発完動のスクリプトかける奴なら即戦力だな。
298名無しさん@お腹いっぱい。:2007/03/15(木) 23:41:20
ShellScriptの中でscpとsshを使用しようと思っているのですが
普通に構文を書くとパスワード入力等を求められると思うのですが
手動入力でなく、完全自動化にできないでしょうか?
Shellは「sh」です。
OSはRedhatです
299名無しさん@お腹いっぱい。:2007/03/15(木) 23:42:09
>>298
ssh-agent
300名無しさん@お腹いっぱい。:2007/03/15(木) 23:53:17
ssh-agent を使用するしか方法はないですか?
他のプログラムとかの絡みで使用できるか・・・・
301名無しさん@お腹いっぱい。:2007/03/16(金) 00:12:20
リモートの.ssh/authorized_keyにローカルの公開鍵を書いとく
302名無しさん@お腹いっぱい。:2007/03/16(金) 00:13:16
>>298
板違い。
【sed】シェルスクリプト総合@LINUX Part2【awk】
http://pc11.2ch.net/test/read.cgi/linux/1154578200/

むしろこっちか。
くだらねえ質問はここに書き込め! Part 142
http://pc11.2ch.net/test/read.cgi/linux/1173460712/
303名無しさん@お腹いっぱい。:2007/03/16(金) 07:56:47
>>300
ssh-agentを知ってるなら質問するなよ!
304名無しさん@お腹いっぱい。:2007/03/16(金) 08:32:48
自分の鍵を暗号化しないでおくというのはどうだろう
305名無しさん@お腹いっぱい。:2007/03/16(金) 08:33:30
パスフレーズを空にする。
ただし、秘密鍵を盗まれないように。
306名無しさん@お腹いっぱい。:2007/03/16(金) 10:28:23
ssh-keychain は?
307306:2007/03/16(金) 10:30:13
gentoo が作ってるやつな
http://www.gentoo.org/proj/en/keychain/
308名無しさん@お腹いっぱい。:2007/03/16(金) 22:01:18
>>298
expect
309名無しさん@お腹いっぱい。:2007/03/16(金) 22:13:13
困ったときは〜expect
310名無しさん@お腹いっぱい。:2007/03/18(日) 18:56:13
expectって標準ではいってたっけ?
311名無しさん@お腹いっぱい。:2007/03/18(日) 22:20:49
なんの標準だかわからんけど
入ってないなら入れればいいじゃん。
312名無しさん@お腹いっぱい。:2007/03/18(日) 23:45:58
>>310
お馬鹿さん?
313名無しさん@お腹いっぱい。:2007/03/20(火) 00:15:56
仕事の場合、そうホイホイと入れるわけにはいかないんだな
314名無しさん@お腹いっぱい。:2007/03/20(火) 00:34:23
じゃあしかたないな
315名無しさん@お腹いっぱい。:2007/03/20(火) 00:46:09
必要ないものはホイホイ入れられないだろうが
必要あるなら入れなきゃいかんだろ。
316名無しさん@お腹いっぱい。:2007/03/21(水) 00:06:29
あたらしい言語処理系が入るというと嫌がられそうだから、
perlの小さなライブラリを追加といってExpect.pmでよくない?
かなりプログラム臭くなるのでexpectに比べてはいけないが、次善の策ではあるはず。
317名無しさん@お腹いっぱい。:2007/03/21(水) 01:28:07
なんでexpect入れる話になってんだ
318名無しさん@お腹いっぱい。:2007/03/21(水) 01:51:29
今回は>>298からの流れ
319名無しさん@お腹いっぱい。:2007/03/21(水) 02:25:07
telnetならexpect使うのがいいだろうけど、sshとscpならパスなしのkeyを使うのが無難だと思うけどな。
パスなしでログインできるのが怖いなら、authorized_keysにcommandを書いて、できることを限定しておくといいよ。
スレ違いだったらすまん。
320名無しさん@お腹いっぱい。:2007/03/28(水) 01:47:01
sedで、最後の行から逆順に文字列検索していって、1件目を出力して終わらせることできるかな?
321名無しさん@お腹いっぱい。:2007/03/28(水) 02:04:06
cat hoge.txt | grep ほげ | tail -1
322名無しさん@お腹いっぱい。:2007/03/28(水) 02:30:58
>>320
awkでやれ
awk '{line[NR]=$0}END{for(i=NR;i>0;i--){if(line[i]=="検索パターン") print line[i];}}' input.txt
323名無しさん@お腹いっぱい。:2007/03/28(水) 02:50:52
tac filename | sed -n '/hoge/{p;q;}'
324名無しさん@お腹いっぱい。:2007/03/29(木) 16:52:36
二つのテキストファイルA.txtとB.txtがあります。
行数は同じでそれぞれの行が関係のある物になっています。
現在、その二つの行をそれぞれスペースで区切って接続を行いたく考えています。

A.txt
山田
山下

B.txt
太郎
二郎

AB.txt
山田 太郎
山下 二郎

A.txtとB.txtからAB.txtを作成する妙案などございましたらご教示いただけませんでしょうか?
よろしくお願い致します。

325名無しさん@お腹いっぱい。:2007/03/29(木) 16:56:53
>>324
paste A.txt B.txt > AB.txt
326名無しさん@お腹いっぱい。:2007/03/29(木) 17:09:44
>>325
PASTE(1)
名前
paste - ファイルを行単位でマージする

大変失礼いたしました…orz
シェルスクリプトとかそう言うレベルで無かったことをお許し下さい…。
327名無しさん@お腹いっぱい。:2007/03/30(金) 09:37:33
b.txt の内容で
幸子の場合、a.txtが山田となっていたら
里中に変更する。という条件付きくらいにしとけば
スクリプトでしなきゃいかんけどな。
328名無しさん@お腹いっぱい。:2007/03/30(金) 15:20:07
~/.forwardに記述して、メールを標準入力から読み込んで
そのenvelope Fromを、実データのFromに置換して/usr/bin/vacation
に渡すスクリプトを書きたいのですが・・・

sed -n 's/^From: [^<]*<\([^>]*\).*/\1/p'の内容を覚えさせておいて、
もう一度先頭から読み込んで置換すればよいと思いますが、
その方法がわからないのです。
微妙な内容なのでググるためのキーワードもいまいちで、ヒットしません。

別にsedでなくてpealやawkでもよいのですが、何かいい方法はありますでしょうか?
329名無しさん@お腹いっぱい。:2007/03/30(金) 15:26:46
>>328
そのまま
・覚えさせる->ファイルに書く
・もう一度先頭から読み込んで置換する->そうする
でいいんじゃないの?
330名無しさん@お腹いっぱい。:2007/03/30(金) 16:01:32
URLが一行ずつずらーと並んでいるのですが
頭とケツにそれぞれ「”」を付けたいです。
何か良い方法は有りませんでしょうか?
331名無しさん@お腹いっぱい。:2007/03/30(金) 16:08:36
sed 's/^/”/' | sed 's/$/”/'
332名無しさん@お腹いっぱい。:2007/03/30(金) 16:17:30
>>331
パイプが無駄。一発でできる。

sed 's/\(.*\)/"\1"/'
333名無しさん@お腹いっぱい。:2007/03/30(金) 16:24:13
pealのようなもの
334328:2007/03/30(金) 16:31:53
>>329

難しく考えずに、そうすることにします。
335名無しさん@お腹いっぱい。:2007/03/30(金) 16:44:44
>>331-332
ありがとうございます。
頑張ってsed覚えます。
336328:2007/03/30(金) 17:10:27
>>334

と思ったら、メール出力から起動されるプログラムは
きわめて弱い実行権限(nobody)しかないので、/tmpにさえ
ファイルを作れません。(人間がテストしたときは巧くいきましたが・・)
権限を強めればセキュリティーリスクが増大するし、
やはり、スクリプトの中で記録と標準入力の再読み込みが必要な模様です。
まあ記録は置換文字列に変数を使えることが判ったので何とかなりそうですが、
「初めからもう一度実行」が途方に暮れてしまいますね。

何かよい方法ありますでしょうか?
337名無しさん@お腹いっぱい。:2007/03/30(金) 17:14:32
・nobody でも /tmp に書ける。
・そもそも sendmail でも postfix でも .forward のファイル所有者と
同じ権限でプログラムが起動する。nobody にはならない。
338328:2007/03/30(金) 18:36:24
>>337

なるほど

では、ほかの原因を考察して見ます。

ありがとうございます。
339名無しさん@お腹いっぱい。:2007/03/30(金) 22:30:53
>>335
sed 's/.*/"&"/'
でもいいな。
340名無しさん@お腹いっぱい。:2007/03/30(金) 23:05:57
>>335
正規表現は使わない方が速いかな。
awkで、
awk '{print "\""$0"\""}'
341名無しさん@お腹いっぱい。:2007/04/03(火) 01:43:34
awkのsystem関数に与えるコマンド文字列の中で「"」や「'」って使える?
「\」を前に置いても駄目でした…

342名無しさん@お腹いっぱい。:2007/04/03(火) 02:26:06
>>341
system が起動しているシェルに食われたんじゃね?
343名無しさん@お腹いっぱい。:2007/04/04(水) 00:17:45
>>342
例えばこんな感じ。実際はこんなシンプルじゃないけど。
awk '{system("grep \"^$\" $1")}' input.file
systemが食われたのか、systemの引数の中では引用符が使えないのか、切り分けができません。

344名無しさん@お腹いっぱい。:2007/04/04(水) 00:26:48
>>343の例だと$1に何も入らないから、とか?
345名無しさん@お腹いっぱい。:2007/04/04(水) 01:00:44
>>344
あそっか、$1は""の外でした。。

awk '{system("grep \"^$\" "$1)}' input.file

本物は業務で使う予定だからコピペできないんだよね。

346名無しさん@お腹いっぱい。:2007/04/07(土) 02:11:04
find /日本/関東/女/ mtime +7300でリダイレクトしたら彼女が出来た
347名無しさん@お腹いっぱい。:2007/04/08(日) 22:55:59
>>345
ちゃんと伝わっていなかったようで。
awkの中にシェルの変数の$1入れてもawkがもっていっちゃうからダメなんだって。
348名無しさん@お腹いっぱい。:2007/04/09(月) 22:22:34
>>347

そうか?普通に↓とか使えてるぞ?

awk '{sum[substr($0,a,b)]+=substr($0,c,d);}END{for(n in sum)print n,sum[n];}' input.txt

349名無しさん@お腹いっぱい。:2007/04/10(火) 20:40:57
なんかかみ合わないんだけど、
>>343>>345の例だと、$1をシェルがもっていっちゃって動かないだろうから、
本来やりたいことである
>awkのsystem関数に与えるコマンド文字列の中で「"」や「'」って使える?
の問題とは違ったところでハマっているでしょ、ってことを書いただけなんだけど。
($1にはinput.txtを入れたいのだろうと推測)

それに対して、$数字は awkで使用できるよ、と書かれても困っちゃうんだが。
350名無しさん@お腹いっぱい。:2007/04/11(水) 06:22:32
>>349
言いたいだろうことは理解するが、347がそれが伝わる書き方とは思えなかったぞ。
例えば、何を誰がもっていっちゃうと書いたか、347と349を比較してみ。
351名無しさん@お腹いっぱい。:2007/04/13(金) 00:00:33
ふいんき(なぜか略)を悪くしたようで正直スマンカッタ
352名無しさん@お腹いっぱい。:2007/04/13(金) 01:37:02
awkは読み込んだレコード全体を$0で参照できて、
フィールドセパレータ(デフォルト空白文字)で区切られたn番目のフィールドを
$nで参照できるんだよな。
awk '{system("grep \"^$\" "$1)}' input.file
で$1はinput.fileから読み込んだカレントレコードの1番目のフィールドを
参照すると。
$数字がawkで使えるのは良いとして結局"や'は
system関数の引数の中で使えるのかどうか?

353名無しさん@お腹いっぱい。:2007/04/13(金) 16:02:04
DebianとFreeBSDを使っていて、共通の.bashrcを参照しているのですが
Debianを使っているときにはUTF-8を、
FreeBSDを使っているときにはEUC-JPを
環境変数LANGに設定するようにしたいのですが
どのようにコードをかけばよいのでしょうか?
354名無しさん@お腹いっぱい。:2007/04/13(金) 16:07:45
>>353
uname とか hostname あたり見るとか。
355353:2007/04/13(金) 16:42:04
>>354
unameとif文を使えばできると思うんですけど
それでsourceコマンドを実行したときに
ちゃんとわりあたるかどうか・・・
356名無しさん@お腹いっぱい。:2007/04/13(金) 16:54:07
>>355
おいおい、sourceなんて使わないよ。
あと、ifじゃなくてcaseを使うのが定石。

case `uname -s` in
Linux) export LANG=ja_JP.UTF-8;;
FreeBSD) export LANG=ja_JP.eucJP;;
esac
357名無しさん@お腹いっぱい。:2007/04/13(金) 16:55:19
別に if 使ってもいいと思うけど、
なんで source が出てくるのかよくわからん。
358名無しさん@お腹いっぱい。:2007/04/15(日) 15:34:49
>>356
Cとかだとswtichは敬遠される傾向にあるけどな。
359名無しさん@お腹いっぱい。:2007/04/15(日) 17:19:24
お前の周りだけだろ。
360名無しさん@お腹いっぱい。:2007/04/15(日) 17:33:16
ifを使うとすると、

if [ `uname -s` = Linux ]; then
export LANG=ja_JP.UTF-8
elif [ `uname -s` = FreeBSD ]; then
export LANG=ja_JP.eucJP
fi

となって、unameの実行が2回になって無駄になる。
かと言ってunameを1回にしようとすると、

tmp=`uname -s`
if [ $tmp = Linux ]; then
export LANG=ja_JP.UTF-8
elif [ $tmp = FreeBSD ]; then
export LANG=ja_JP.eucJP
fi

となって、シェル変数1つが余分に要るので美しくない。

よって、caseを使うのがモストエレガント。
361名無しさん@お腹いっぱい。:2007/04/15(日) 17:37:03
>>360
お前の美学はよくわかった。
362名無しさん@お腹いっぱい。:2007/04/15(日) 17:41:22
で、source はなんで出てきたんだ?
363名無しさん@お腹いっぱい。:2007/04/16(月) 19:45:58
そうっすねぇ…。
364名無しさん@お腹いっぱい。:2007/04/16(月) 19:58:24
審議せずに却下
365名無しさん@お腹いっぱい。:2007/04/16(月) 20:37:02
sh にそんなコマンドがないからか?
366名無しさん@お腹いっぱい。:2007/04/16(月) 22:11:51
.があるじゃん。
367名無しさん@お腹いっぱい。:2007/04/16(月) 22:42:57
. はあるけど source はないってオチなのかなと。
368名無しさん@お腹いっぱい。:2007/04/16(月) 23:46:40
source がない sh ってたとえばどれ?
369名無しさん@お腹いっぱい。:2007/04/16(月) 23:52:07
  J
370名無しさん@お腹いっぱい。:2007/04/17(火) 00:16:38
>>368
sh
371名無しさん@お腹いっぱい。:2007/04/17(火) 00:41:10
>>370
どの OS の?
372名無しさん@お腹いっぱい。:2007/04/17(火) 00:47:25
>>371
普通のbshなら.しか使えない。
HP-UXやAIXのshは中身がkshなんで。
373名無しさん@お腹いっぱい。:2007/04/21(土) 02:11:17
zsh 4.3.4登場 - マルチバイト文字の対応を強化
http://journal.mycom.co.jp/news/2007/04/20/023/index.html
374名無しさん@お腹いっぱい。:2007/04/24(火) 14:20:37
/bin/zsh
375名無しさん@お腹いっぱい。:2007/04/25(水) 21:35:53
シェルいい本知りません?初心者向けで
376名無しさん@お腹いっぱい。:2007/04/25(水) 21:45:15
UNIXプログラミング環境
377名無しさん@お腹いっぱい。:2007/04/25(水) 21:50:11
マジレスをおねがいします
378名無しさん@お腹いっぱい。:2007/04/25(水) 21:52:27
どのへんが冗談だと?
379名無しさん@お腹いっぱい。:2007/04/25(水) 21:55:09
初心者向きじゃないし、内容が古い
380名無しさん@お腹いっぱい。:2007/04/25(水) 22:01:27
対案を出してから批判しろ
381名無しさん@お腹いっぱい。:2007/04/25(水) 22:06:43
「試験に出るシェルスクリプト」
382名無しさん@お腹いっぱい。:2007/04/26(木) 00:34:12
>>381
その筋質問箱は付いてますか?
383名無しさん@お腹いっぱい。:2007/04/26(木) 04:36:49
Z80は最強だから大丈夫
384名無しさん@お腹いっぱい。:2007/04/26(木) 10:22:57
じゃあ「できるシゥルスクリプト」
385名無しさん@お腹いっぱい。:2007/05/02(水) 17:38:53
英小文字からなる文字列の最初の一文字だけを大文字に変換するには
どうすればよいのでしょうか?

sedだと只それだけで一文字目の後ろに改行を挿入してホールドスペースに入れて、
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ てなことして
また連結して改行を削除みたいな、バカ手間が掛かるので投げ出してしまった。
もっと簡潔に出来たら良いなと思うのですが・・・
386名無しさん@お腹いっぱい。:2007/05/02(水) 17:42:25
>>385
echo aaa | sed 's/\(.\)/\U\1/'
387385:2007/05/02(水) 18:01:30
>>386

それは。どこのsedですか?
うちではそれはUaaaと出力します。\Uという正規表現はUそのものを表すようです。
388385:2007/05/02(水) 18:42:47
ちょっと調べてみたらGNUのsedだと、>>385の動作が出来るようです。
しかし、なんでもコマンドを高機能なやつに入れ替えるのもどうかと思うし、
使っているOSがGNUツール群を標準装備していないのもそれなりに理由があるだろうし
高々文字列変換で新たなツールを使うのには、消極的になりますね。
389名無しさん@お腹いっぱい。:2007/05/02(水) 19:11:07
echo "abc" | awk '{print toupper(substr($0,1,1))substr($0,2)}'
echo "abc" | perl -pe 's/(.)/\U\1/'
390名無しさん@お腹いっぱい。:2007/05/02(水) 19:18:21
echo aaa | awk -v FS= -v OFS= '{$1=toupper($1);print}' はどう。
391385:2007/05/02(水) 20:06:42
>>389
有り難うございます。
awkのsubstrで文字位置指定して、toupperで大文字に変換ということですね。
perlの方はgsedと互換な感じの構文ですね。(てかgsedが模倣した?)
>>390
済みません。
awk: illegal statement
input record number 1, file
source line number 1
と成ります。

いずれにしてもいろいろと勉強になります。
>>386,>>389,>>390の皆さん、ありがとうございました!
392名無しさん@お腹いっぱい。:2007/05/03(木) 02:41:58
GNU の sed でも y/a-z/A-Z/ みたいな表現できないんだよね。
互換性維持のためなんだろうけど。
393名無しさん@お腹いっぱい。:2007/05/03(木) 09:18:45
kshのコマンドヒストリで矢印キーが使いたいのだが、
emacsのCTRLキーはめんどい。
エロい人、設定のしかた教えてチョ。
394名無しさん@お腹いっぱい。:2007/05/03(木) 10:08:20
>>393
くだらない質問はここに書き込め!Part 52
http://pc11.2ch.net/test/read.cgi/unix/1176049968/
395名無しさん@お腹いっぱい。:2007/05/03(木) 18:24:22
>>393
bashつかえw
396名無しさん@お腹いっぱい。:2007/05/04(金) 16:26:20
cshで変数の中に空白文字で区切られた複数のワードからなる文字列が代入されてる。
例:「aaa bbb ccc ...」
各ワードに接頭辞と接尾辞を付加したいが、sedでできるかな?
例:「prefix.aaa.postfix prefix.bbb.postfix prefix.ccc.postfix ...」
ちなみにワード数は不定。
置換後の文字列長はLINE_MAX以下でないと駄目?

397名無しさん@お腹いっぱい。:2007/05/04(金) 16:44:54
はい、cshはスルー、次の方どうぞ
398名無しさん@お腹いっぱい。:2007/05/04(金) 16:56:59
こんなんでよい? bashだけど

$ s="aaa bbb ccc"
$ echo $s | sed -e 's/\([^ ]*\)/prefix.\1.postfix/g'
prefix.aaa.postfix prefix.bbb.postfix prefix.ccc.postfix

399名無しさん@お腹いっぱい。:2007/05/04(金) 23:17:48
Gnomeなどのデスクトップ環境でxxx.shに何らかのファイルをドロップしたとすると、そのファイル名はどういった変数に格納されているのでしょうか。
tex処理を簡単にしたいと考えたのですが、これが分からずにつまっています。
400名無しさん@お腹いっぱい。:2007/05/05(土) 00:39:09
$1, $2, ...
401名無しさん@お腹いっぱい。:2007/05/05(土) 06:17:46
>>398
$1,$2...って9個までしか使えないんじゃ?
396は「ワード数不定」って言ってるから、10個以上もありうるだろ。

402名無しさん@お腹いっぱい。:2007/05/05(土) 06:21:09
↑gオプション付いてるやん。何かみついてんだコイツ
403名無しさん@お腹いっぱい。:2007/05/05(土) 14:01:50
>>401
アホー

>>400>>399へのレスだ。
404名無しさん@お腹いっぱい。:2007/05/05(土) 23:04:16
>>399
多分、コマンドでこう起動したのと同じ扱いになっている思う。

$ xxx.sh < "abc.tex"

スクリプト側でリダイレクトされる前のファイル名を
取得する方法が分かれば、どうにかなるんじゃないかな。
405名無しさん@お腹いっぱい。:2007/05/06(日) 01:12:45
画像変換するスクリプトを作っています。
スクリプ中で使用するコマンド(今回はmogrify)がインストールされているかどうか
調べるのに手っ取り早い方法ありますか?

今のところ思いつくのは、PATHから「:」で区切って1つづつ抜き出し、その直下に
mogrifyがあるか「test -x」する方法です。
406405:2007/05/06(日) 01:26:07
ちょっと自己解決

whereis使えばいいか。
whereisって見つからなくても0返すんですね・・・

whereis -b mogrifya | grep -v ':$' > /dev/null
if [ $? ...
って感じかな

もっとスマートな方法ありましたらご教授ください。
407名無しさん@お腹いっぱい。:2007/05/06(日) 01:47:14
whichは?
408名無しさん@お腹いっぱい。:2007/05/06(日) 02:09:28
if which mogrify > /dev/null 2>&1 ; then
...
は?
409名無しさん@お腹いっぱい。:2007/05/06(日) 02:18:36
>407,408
whichか、なるほど
解決しましたありがとうございました。
410405:2007/05/06(日) 02:45:19
たびたびすいません
&&や||の後に複数のコマンドを書くにはどうすればいいのでしょうか?

見つからなかった場合、NGと表示しexitしたいのですが、
which mogrify > /dev/null 2>&1 && echo 'bc ok' || (echo 'bc NG'; exit 1)
としてもミニシェルから抜けるだけなのです

if文で書けばいいだけなのですが、勉強の意味でも知っておきたいのです。
411名無しさん@お腹いっぱい。:2007/05/06(日) 03:18:41
function echo_exit() {
echo $*
exit
}
とか定義しちゃえば?
412名無しさん@お腹いっぱい。:2007/05/06(日) 03:28:54
>>410
... || { echo NG; exit 1; }
は?
413410:2007/05/06(日) 11:45:38
>411
いいですね。たくさんコマンド実行したいときに使わせていただきます。

>412
おー、意図したとおりになりました。今回はこちらを使わせていただきます。

ありがとうございました。


ちなみにcommand1が成功したときはcommand2、失敗したときはcommand3という時に、
command1 && command2 || command3
という書き方は問題ないですか?
動作は意図したとおりなんだけど、「|| command3」はcommand2の結果に
かかってくるように見えるのでちょっと気持ち悪い・・・
414名無しさん@お腹いっぱい。:2007/05/06(日) 12:35:35
>>413
>command1 && command2 || command3
>という書き方は問題ないですか?

command2が falseを返した時、command3まで実行されてしまうのが問題。
if - else の代わりにするなら、

command1 && { command2; true; } || { command3; }

と書けば完全。command2や command3は、; で区切って複数コマンド可能。
415413:2007/05/06(日) 14:40:39
>414
なるほど。
command2にはechoとかしか入れてなかったので気づかなかった・・・
勉強になりました。ありがとうございます。
416名無しさん@お腹いっぱい。:2007/05/11(金) 23:38:51
tail -f ログファイル名 | awk -f 手続きファイル

上記コマンドを指定の条件をつけてwhileによる繰り返しでログを整形する
シェルをつくりたいのですが、末尾に">>ファイル名"としても指定のファイル
にリダイレクトできません。
while〜doneの後、シェルスクリプト実行時の末尾に>>を指定してもだめです。
出力は画面のままです。(通常のtail -fのイメージ)
&でバックグラウンドで実行しても同様です。

tail -f で読み取っている内容を別のログファイルに出力するにはどうすれば
よいですか?
417名無しさん@お腹いっぱい。:2007/05/12(土) 09:13:18
teeじゃだめ?
418名無しさん@お腹いっぱい。:2007/05/12(土) 10:06:11
シェルってゆーな。クズ。
419名無しさん@お腹いっぱい。:2007/05/14(月) 21:13:31
tail -f って終了しないじゃん
420名無しさん@お腹いっぱい。:2007/05/15(火) 00:34:17
tee -a hoge.log
421名無しさん@お腹いっぱい。:2007/05/15(火) 17:57:30
hoge%68%6F%67%65 のような文字列を
%68%6F%67%65%68%6F%67%65 のように
%表記に直すにはどうしたらよいでしょうか?
422名無しさん@お腹いっぱい。:2007/05/15(火) 18:50:16
perlつかえ。
423名無しさん@お腹いっぱい。:2007/05/15(火) 18:50:23
>>421
よく意味がわからんが、URLエンコーディングとかの話か?
424名無しさん@お腹いっぱい。:2007/05/15(火) 19:05:07
>>423
よく意味がわからんなら答えなくていいよ。
425名無しさん@お腹いっぱい。:2007/05/15(火) 19:25:20
>>421
s/hoge%68%6F%67%65/%68%6F%67%65%68%6F%67%65/g
426名無しさん@お腹いっぱい。:2007/05/15(火) 19:27:18
>>425
できました!! ありがとう!!
427名無しさん@お腹いっぱい。:2007/05/15(火) 19:28:00
自演乙
428名無しさん@お腹いっぱい。:2007/05/16(水) 01:53:36
ESP発揮して混じれ酢すると
hogeを%表記しようとしたときに
右側の既に%表記されてる部分が
さらに%表記に変換されてしまうことを
回避したいと思っているのではないかと
429名無しさん@お腹いっぱい。:2007/05/16(水) 02:00:50
一旦デコードしてからエンコードするのが確実だな
430201:2007/05/16(水) 02:03:24
01.jpg 02.jpg 03.jpg 04.jpg ...

と沢山のファイルがあってfor文(じゃなくてもいいけど)により

convert +append 01.jpg 02.jpg 03.jpg out1.jpg
convert +append 04.jpg 05.jpg 06.jpg out2.jpg
...

というように、3つずつ抜き出して一気に処理したいのですが、どうすればいいのでしょうか?
431名無しさん@お腹いっぱい。:2007/05/16(水) 02:23:41
>>430
100個ずつとかだと別の方法を使うが、3個ずつならこんなもんか

#!/bin/sh
set -- ??.jpg
i=1
while :; do
case $# in
0) break;;
1) convert +append $1 out$i.jpg; break;;
2) convert +append $1 $2 out$i.jpg; break;;
*) convert +append $1 $2 $3 out$i.jpg; shift; shift; shift; i=`expr $i + 1`;;
esac
done
432名無しさん@お腹いっぱい。:2007/05/16(水) 02:27:07
set -- *.jpg
i=0
while [ $# -gt 0 ]; do
i=`expr i + 1` #式使えるならそれでも。
convert +append $1 $2 $3 out$i.jpg
shift 3
done

shiftの数引数ってBourne Shellでも使えるのかな。
使えないなら3回shift。
433名無しさん@お腹いっぱい。:2007/05/16(水) 02:27:49
ああ、ちょうど3の倍数になっていない場合は考慮してなかったな。
434名無しさん@お腹いっぱい。:2007/05/16(水) 02:28:55
ちょうど3の倍数になっていない場合はどうすんの?
435名無しさん@お腹いっぱい。:2007/05/16(水) 02:29:55
/dev/null とかで補完
436名無しさん@お腹いっぱい。:2007/05/16(水) 02:37:35
名前欄は無視でお願い
437430:2007/05/16(水) 02:45:01
おお、夜食食べている間にこんなにもレスが
3の倍数になっていないときは私自身考慮してませんでいした。
431さんの set だけ使ったことがないのですが、とにかく
>431-435 で十分対処できそうです。
setも調べてみます
ホントにありがとうございます。





438430:2007/05/16(水) 02:46:51
よく見たら432さんもsetありましたね。
とにかくありがとう
439421:2007/05/16(水) 11:12:47
>>422
シェルスクリプトで難しいならperlを使ってもかまいません。

>>423
URLエンコーディングならアルファベットはそのままだと思うのですが、
アルファベットも16進数表示したいわけです。
pukiwiki のバックアップをローカルに落とすのに、
ファイル名を知りたいんです。
440名無しさん@お腹いっぱい。:2007/05/16(水) 11:21:18
>>439
pukiwikiスレあたりで「戻し方教えれ」って聞いた方がいいんじゃね?
441416:2007/05/16(水) 23:44:33
ご返事いただきありがとうございます。

tail -f ログファイル名 | awk -f 手続きファイル

上記コマンドではawkによる整形結果を標準出力できる状態で、
さらにパイプでteeコマンドを実行してみましたがうまくログが
出力できませんでした。

名前付きパイプを作成し、オリジナルログの出力先を名前つきパイプにして
直接awkで名前つきパイプを標準入力状態にしても、tail -f のような画面に
標準出力はできますがファイルへのリダイレクトは無理でした。
難しいですねぇ。。
442名無しさん@お腹いっぱい。:2007/05/17(木) 00:48:16
tee の使い方間違ってるだけだろ
443ウサチャソ:2007/05/17(木) 00:52:02
>>441
tail -f をパイプすると、上手く動かないよ。
GNUのだとどうなんだろ?

「tail パイプ バッファリング」
でググると、それっぽい事いっぱいでてくるYO
444名無しさん@お腹いっぱい。:2007/05/17(木) 18:41:18
a.shに . b.sh として読み込まれるb.shが自分の名前がb.shであると知る方法はありますか?
445名無しさん@お腹いっぱい。:2007/05/17(木) 18:50:24
>>444
ない。
. で読む場合は $0もセットされないし。
446名無しさん@お腹いっぱい。:2007/05/17(木) 19:05:57
>>445
ありがとうございます。
あらかじめ埋め込んでおくしかなさそうですね…。
447416:2007/05/17(木) 23:00:53
>>443
バッファの問題だったんですね。

通常のawkはやめて、gawkのfflush関数を使うことでうまくいきました。
ありがとうございました。
448名無しさん@お腹いっぱい。:2007/05/18(金) 19:10:57
シェルスクリプトでログインログアウトを自動化するにはどうしたらいいでしょうか?
もし良かったら数行のコマンドでレスお願いします。
449名無しさん@お腹いっぱい。:2007/05/18(金) 19:15:55
>>448
何をやりたいのかもうちょい詳しく。
450448:2007/05/18(金) 19:59:20
>>449

1.現在rootでログイン中。
2.testユーザーでログインして何か作業をする。
3.そしてまたrootに戻る。

これを自動化したいです。
451名無しさん@お腹いっぱい。:2007/05/18(金) 20:03:21
>>450
su test 何か
もしくは
su - test 何か

違いについては man su 等を参照。
452名無しさん@お腹いっぱい。:2007/05/18(金) 20:30:15
>>451
間違ってるよ。man su 等を参照するべきなのはオマエ。
453名無しさん@お腹いっぱい。:2007/05/18(金) 20:59:46
>>450
sudoじゃダメなんか?
454名無しさん@お腹いっぱい。:2007/05/18(金) 21:30:20
>>448
testユーザで実行するバッチファイルを作っておいて、
  su - test -c バッチファイル
で実行しる。
455名無しさん@お腹いっぱい。:2007/05/18(金) 21:35:19
バッチファイル
バッチファイル
バッチファイル
バッチファイル
wwww
456名無しさん@お腹いっぱい。:2007/05/19(土) 00:37:47
ほんとうにloginしたいならexpectを使うとか
457448:2007/05/19(土) 03:04:26
rootでログイン中
expectでsu - testとして
touch /home/test.txtを実行して
再度expectでsu - rootでrootになっても
/home/test.txtは作成されてませんでした
なぜでしょう?
458名無しさん@お腹いっぱい。:2007/05/19(土) 10:21:42
パーミッションじゃないの?
/homeにtestユーザは書き込めないんでは。
459名無しさん@お腹いっぱい。:2007/05/20(日) 04:33:32
質問。
11.22.33を
33.22.11に文字を反転させたい。
460459:2007/05/20(日) 04:42:15
459は取り消し!
11.22.33を
a[0]=11
a[1]=22
a[2]=33
のように配列に代入したい。
よろしくお願いします。
461名無しさん@お腹いっぱい。:2007/05/20(日) 05:39:47
宿題でつか
462459:2007/05/20(日) 06:19:25
宿題でつ
463459:2007/05/20(日) 07:14:05
スレ汚してごめんなさいできまつた
464名無しさん@お腹いっぱい。:2007/05/20(日) 21:56:12
テキストファイルに、ファイルの場所がずらずら書かれていて

-----
/usr/local/etc/pussy001.jpg
/usr/local/etc/pussy002.jpg
/usr/local/etc/pussy003.jpg
     :
-----

そこに書かれているファイルを指定した場所に移動させたいんです。
で、こんな感じで動くスクリプトを書きたいなぁと考えているんですが

cat list.txt | grep jpg | mv.sh /work/pussy

この mv.sh の書き方が分かりません。

465名無しさん@お腹いっぱい。:2007/05/20(日) 22:02:27
>>464
mv `grep jpg list.txt` /work/pussy

で、一発。・・・で、pussyってww
466名無しさん@お腹いっぱい。:2007/05/20(日) 22:47:23
>465
残念ながら、ファイル名にスペースがあるとだめでした。
sh, tcsh, bashで試してみましたが、どれも同じです。
467名無しさん@お腹いっぱい。:2007/05/20(日) 23:18:02
>>464 の例では、ファイル名にスペースが入ってないじゃないか。
そういう条件は先に例に含めて書くこと。
ファイル名にスペースがある場合のやり方ももちろん知ってるが、
わざわざ教える気にならないので俺はパス。
468名無しさん@お腹いっぱい。:2007/05/20(日) 23:25:45
>>466
IFS='
' mv `grep jpg list.txt` /work/pussy
469名無しさん@お腹いっぱい。:2007/05/21(月) 00:42:01
(while read f; do mv "$f" dest/ ; done) < file

>>467
ファイルの長さを考慮しないgrep戦法しか提示しなかった奴が
そんな理屈をこねても見苦しいだけ。
470名無しさん@お腹いっぱい。:2007/05/21(月) 06:22:05
>>469
残念ながら、ファイル名に \ があるとだめでした。
471名無しさん@お腹いっぱい。:2007/05/21(月) 10:38:53
じゃあ諦めな。
472名無しさん@お腹いっぱい。:2007/05/21(月) 11:09:30
>>471
ファイル名の \ を考慮しないを考慮しないwhile read戦法しか提示しなかった奴が
そんな理屈をこねても見苦しいだけ。
473名無しさん@お腹いっぱい。:2007/05/21(月) 11:17:06
というか、>>469 って、元の質問の jpg で grepするの忘れてるじゃん。
テストだったら0点。
474名無しさん@お腹いっぱい。:2007/05/21(月) 11:25:38
でもテストじゃないよ。
475名無しさん@お腹いっぱい。:2007/05/21(月) 11:33:37
そういう香具師が、「それはケアレスミス。答えはわかってた」とか後で言うんだよな。
476名無しさん@お腹いっぱい。:2007/05/21(月) 11:37:45
なんでそんな完璧にこだわるんだろ。
質問者のヒントになればいいじゃん。
477名無しさん@お腹いっぱい。:2007/05/21(月) 16:16:07
低能同士、仲良く!
478464:2007/05/22(火) 00:44:46
すみません、御礼が遅れました。
という訳で >465 >468 >469 全て参考になりました。特にIFS=〜は初めて
知ったので成程と関心しました。
この場をお借りして厚く御礼申し上げます。
479名無しさん@お腹いっぱい。:2007/05/22(火) 00:59:36
xargsは?

grep jpg list.txt | xargs -i mv {} /work/pussy
480名無しさん@お腹いっぱい。:2007/05/22(火) 12:09:35
>>479
空白が含まれているとダメだろ。
481名無しさん@お腹いっぱい。:2007/05/22(火) 14:28:33
grep jpg list.txt | tr '\n' '\0' | xargs -0 -i mv {} /work/pussy
482名無しさん@お腹いっぱい。:2007/05/22(火) 14:39:38
>>481
ファイル名に改行が含まれてるとだめだろw
483名無しさん@お腹いっぱい。:2007/05/22(火) 19:06:13
sudo find / -name '*pussy*' -exec rm -rf \{\} \;
484名無しさん@お腹いっぱい。:2007/05/22(火) 19:18:18
デリミタが改行なリストなんだから要素に改行は含められないんじゃ?
改行入りファイル名を考慮するならリストは改行文字以外で区切るべき
だと思う.
485名無しさん@お腹いっぱい。:2007/05/22(火) 19:20:20
ファイル名に改行を入れるアホなんてほっとけ(w
486ウサチャソ:2007/05/22(火) 21:00:22
試しに作ってみた。

% touch aaaa^Maaaa
% ls -lF
aaaa*--r-- 1 ウサチャソ users 0 5月 22 20:58 aaaa

表示バグってるよ…
487名無しさん@お腹いっぱい。:2007/05/22(火) 21:19:38
改行と復改の区別ができないお子様は犬... 以下略
488ウサチャソ:2007/05/22(火) 21:37:01
>>487
改行のみ入れるのは面倒臭かったんだスマソ
489名無しさん@お腹いっぱい。:2007/05/22(火) 21:57:27
>>488
$ touch 'aaaa
aaaa'

だろ。

$ > 'aaaa
aaaa'

でも可。
490ウサチャソ:2007/05/22(火) 22:14:31
CTRL+Vが楽だったんで、つい…

ちなみに、>>489 でも >>486 でもCygwinだと同じ表示。

-rw-r--r-- 1 ウサチャソ なし 0 May 22 22:10 aaaa?aaaa

今日始めて知った。
491ウサチャソ:2007/05/22(火) 22:15:58
あ゛っごめん、Cygwinは「--show-control-chars」が必要だった…。
スレ違いなんでもう消えます、スマソ
492名無しさん@お腹いっぱい。:2007/05/24(木) 20:33:53
質問します。

lsnrctl >>_EOF_
set log_file listener.tmp
RET=$?
if [ $RET -ne 0 ];then
logger -t loglog -p local1.notice "切り替えに失敗しました"
exit 1
fi
exit
_EOF_

という事をしたいのですがどうしてもsetコマンド以降エラーに
なってしまいます。
対処法を教えていただけないでしょうか?
493名無しさん@お腹いっぱい。:2007/05/24(木) 20:51:21
逆だ。
lsnrctl <<_EOF_
494名無しさん@お腹いっぱい。:2007/05/24(木) 20:55:16
あと、ヒアドキュメントの部分は、LSNRCTLのコマンドしか受け付けないぞ。
495名無しさん@お腹いっぱい。:2007/05/24(木) 21:23:10
すいません逆に書いてました。
やはりLSNRCTLコマンドしか受け付けないですか・・・
う〜ん、どうしてもLSNCTLの中でシェルスクリプトの処理の記述を
したかったのですが無理そうですね。
ありがとうございました。
496名無しさん@お腹いっぱい。:2007/05/28(月) 07:13:03
質問。
ファイルの最終から20行を削除したい。
どうしたらいいでしょうか?
497名無しさん@お腹いっぱい。:2007/05/28(月) 07:46:41
>>496
wc で数えて、head で切り出すぐらいしか考え付かない
498名無しさん@お腹いっぱい。:2007/05/28(月) 08:09:27
awk
499名無しさん@お腹いっぱい。:2007/05/28(月) 08:33:29
tac なんてLinuxでもないかぎり標準装備じゃない罠

cat file | tac | sed '1,20d' | tac
500名無しさん@お腹いっぱい。:2007/05/28(月) 12:43:49
無意味なcat出た
501名無しさん@お腹いっぱい。:2007/05/28(月) 14:05:40
tacが使えなければ sed '1!G;h;$!d' すればいいじゃない。
502名無しさん@お腹いっぱい。:2007/05/28(月) 15:55:05
cat!出た!cat出た!得意技!cat出た!cat!これ!cat出たよ〜〜!
503名無しさん@お腹いっぱい。:2007/05/28(月) 16:13:35
>>502
楽しそうだな
504名無しさん@お腹いっぱい。:2007/05/28(月) 18:27:43
俺は限界だと思った
505名無しさん@お腹いっぱい。:2007/05/29(火) 00:14:45
tail つかって最後から20行みれ
で、>>499しる
506名無しさん@お腹いっぱい。:2007/05/29(火) 00:58:13
基本的にサブシェルはshを新たに起動するよりは動作が軽いですよね?
507名無しさん@お腹いっぱい。:2007/05/29(火) 01:26:05
>>498
awkには入力ファイルの行数を保持する組み込み変数はないんじゃね?
だから、結局wcでカウントしないとダメだったり。
508名無しさん@お腹いっぱい。:2007/05/29(火) 01:47:08
は?

awk '{a[NR]=$0}NR>20{print a[NR-20]}'
509名無しさん@お腹いっぱい。:2007/05/29(火) 02:37:14
>>508 短くていいが、でかいファイル通すとメモリが…
510名無しさん@お腹いっぱい。:2007/05/29(火) 02:54:34
無理して一行でやるより、行舐めの回数が少ない方が好きだな。
511名無しさん@お腹いっぱい。:2007/05/29(火) 02:57:15
>>510 ワンパスだし。消費メモリを考えればいいと思うが。
512名無しさん@お腹いっぱい。:2007/05/29(火) 03:15:32
>>499
は論外。
513名無しさん@お腹いっぱい。:2007/05/29(火) 09:33:18
awk '{if (FNR>20) print a[FNR%20]; a[FNR%20]=$0}'
514名無しさん@お腹いっぱい。:2007/05/29(火) 10:12:43
20行分だけバッファして遅延して出力させて
ファイル末尾に到達したら終了させるとか。
515名無しさん@お腹いっぱい。:2007/05/29(火) 19:07:30
>>514
書いてみよう
516名無しさん@お腹いっぱい。:2007/05/29(火) 19:20:43
>>514
>>513 がやろうとした事(間違ってるがw)
517名無しさん@お腹いっぱい。:2007/05/29(火) 19:44:45
>>496
こういう場合、ed を non-interactive に使うのがいい。

最後20行ということは、$-19から $までだから、

echo '$-19,$d
w outfile
q' | ed infile

↑で桶。
518名無しさん@お腹いっぱい。:2007/05/29(火) 21:46:07
sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'|sed -e '$d'
519名無しさん@お腹いっぱい。:2007/05/30(水) 08:58:50
>>516 間違ってる?
520名無しさん@お腹いっぱい。:2007/05/30(水) 19:17:11
質問なんですが・・

#!/bin/sh -

tmpfile=/tmp/program.$$
cat "$1" | tr ' ' '\n' > tmpfile

while read word
do
grep ${word} "$2" | いろいろと処理・・・
done < tmpfile

てな感じのスクリプトなのですが、
第一引数のファイル中に、例えば -i と言うような語があると
grep がオプションと解釈するのか何なのか、直後に while ループが
終了してしまいます。
'${'"$word"'}' だと grep には ${word} として渡されてしまいます。

何とかシェルを騙して grep に '-i' として渡す方法は無いでしょうか?

(渡す前に条件判断して先頭文字が - なら sed などで先頭に \ を
付加すると言うのも行けそうな気はしますが、出来れば余計なIFとか
変数とか無しで行きたいものです)
521名無しさん@お腹いっぱい。:2007/05/30(水) 19:35:35
grep -e
grep -
522520:2007/05/30(水) 19:53:07
>>521

ありがとう。
シェルを騙さなくても grep の方で用意されていましたか、
良く考えりゃ当然ですね。
523名無しさん@お腹いっぱい。:2007/05/30(水) 21:22:55
オプション -- で、それ以降はオプションとは解釈しないってのは
結構な数のコマンドで使える。
524520:2007/05/30(水) 23:07:09
>>523

ですね。

これまで -- なんて、はぁ?って感じでしたけど、
実に有用性が高いですね。
勉強になります。
525名無しさん@お腹いっぱい。:2007/06/02(土) 11:43:37
質問
インターネットに接続できるか試すコマンドってありますか?

やりたいこと
インターネットに接続できたら echo "できます"
インターネットに接続できなかったら echo "できません"
としたいです。
526名無しさん@お腹いっぱい。:2007/06/02(土) 11:59:13
インターネットとLANの区別をしなくていいのかな?
527名無しさん@お腹いっぱい。:2007/06/02(土) 12:05:24
多分、この程度の精度でOKなんだろ。

if ping -c 1 www.yahoo.com >/dev/null 2>&1; then
echo "出来ます"
else
echo "出来ません"
fi
528525:2007/06/03(日) 03:05:39
>>562>>527
ありがとうございます
できればヤフーなどの特定のサイトに依存せず
確実にインターネットに繋がるかどうか判断したいです。
もし無理なら特定のサイトでも構いませんが
こういう場合通例としてyahoo.comを使うのが適切でしょうか?
529名無しさん@お腹いっぱい。:2007/06/03(日) 07:09:14
接続できていると分かったら、どこかと通信するんでしょ?
その通信相手にすればいいよ。
530名無しさん@お腹いっぱい。:2007/06/03(日) 07:21:06
>>528
何が目的なん?
531名無しさん@お腹いっぱい。:2007/06/03(日) 08:59:25
その通信相手がICMPブロックしてるかも知れないから、ブロックしてない
www.yahoo.comとかwww.google.comとか使えばいい。
532名無しさん@お腹いっぱい。:2007/06/03(日) 11:01:00
>>528
君のほうから、どことつながったらインターネットに繋がっていると言えるかの
判断基準を出してくれないと先に進めないと思うよ。
533名無しさん@お腹いっぱい。:2007/06/03(日) 12:04:41
相手もそうだがプロトコルもな。
ファイアウォールの具合でICMP通らないかもしらんし。
534名無しさん@お腹いっぱい。:2007/06/03(日) 23:19:33
まぁ、スレ違いだな。
535名無しさん@お腹いっぱい。:2007/06/04(月) 07:59:35
>>527
>if ping -c 1 www.yahoo.com >/dev/null 2>&1; then

関係ないが、この 2>&1
エラー対策でつか?
536名無しさん@お腹いっぱい。:2007/06/04(月) 14:12:29
遅レスだが、

tail -r ファイル名| tail +20 | tail -r

でもいけた(tailばっかりでカッコ悪いか)
537名無しさん@お腹いっぱい。:2007/06/04(月) 21:46:12
>>535
終了ステータスだけとれりゃいいので、エラーメッセージとか捨てる。
538名無しさん@お腹いっぱい。:2007/06/04(月) 21:50:18
それを捨てるなんて、とんでもない!
539ウサチャソ:2007/06/04(月) 23:49:23
きのうはおたのしみでしたね。
ウホッ
540名無しさん@お腹いっぱい。:2007/06/04(月) 23:51:56
*「おお しんでしまうとは なにごとだ!」
*「アッー!」
541名無しさん@お腹いっぱい。:2007/06/05(火) 06:33:28
vmstat 1 の結果の左側に`date +%H:%M:%S`(時分秒)を付けて流して表示させようとしています。

以前、gawkでstrftimeを利用して同じ事をしたのですが、今回使ってるサーバのawkは
gawkでない為に別の方法が必要です。

どうもウマイ方法が思いつきませんで・・・ご教示お願いします。
542名無しさん@お腹いっぱい。:2007/06/05(火) 08:54:12
Perlあるなら
vmstat 1 | perl -MPOSIX -pe 'BEGIN{$|=1} print strftime q{%H:%M:%S }, localtime'
543名無しさん@お腹いっぱい。:2007/06/05(火) 08:59:20
これは重そうだけど
vmstat 1 | while read line; do echo `date +%H:%M:%S` $line; done
544名無しさん@お腹いっぱい。:2007/06/05(火) 20:13:14
>>539-540
DQ I ?
545541:2007/06/05(火) 22:31:39
>>542
HP-UX10.20だったのですがperlが入っていませんでした(汗
でも、これを機会にperlもちょっとづつ勉強したいと思います。どもでした。

>>543
readがそんな使い方できるとは知りませんでした。
おかげさまでばっちり動きました。ありがとうございます。
546名無しさん@お腹いっぱい。:2007/06/05(火) 23:39:38
bash.infoの説明だと
echo hoge | read v

echo $V →hoge
になるように読める
で、できないってことはわかったんだけど結局readはどう使うんですか
なんでwhile中だとうまく動くんでしょう
547名無しさん@お腹いっぱい。:2007/06/06(水) 00:17:57
サブシェルが起動するから。
read で代入する変数はサブシェルのものだから、親シェルに戻ると忘れる。
while でなくても、下のような書き方をすれば {...} の中にかぎり有効。

echo hoge | {
read v
echo $v
}

あと、ksh はふつーに可能だったような記憶がうっすらとあるが自信ない。
548名無しさん@お腹いっぱい。:2007/06/06(水) 15:14:41
質問
シェルスクリプトを、windowsでCD-Rに焼き、linuxで実行すると
改行がコマンドとして認識され、command not foundとなってしまいます。
普通に改行を改行として認識させることはできないのでしょうか?
549名無しさん@お腹いっぱい。:2007/06/06(水) 16:33:41
よくわからんが改行コードの問題? 改行コードをLFで保存できるテキストエディタ使えよ
550名無しさん@お腹いっぱい。:2007/06/06(水) 16:52:46
>>549
ありがとうとざいます
LFで保存したところ大丈夫でした。
ただし1行目だけはなぜかcommand not foundとなってしまう。。
551名無しさん@お腹いっぱい。:2007/06/06(水) 20:15:14
log=20070101.log

$logを 2007-01-01
という風に、[西暦]-[月]-[日]な形にしたいのですが、どすればよいでしょうか?
どなたか、お力をお貸し下さいませ。

.log と取って、4桁、2桁、2桁ごとに「-」を挟む。というのはわかるのですが
方法や何のコマンド使ってよいものやら見当もつきません。お願いします!
552名無しさん@お腹いっぱい。:2007/06/06(水) 20:26:09
echo $log | sed 's/\(....\)\(..\)\(..\).*/\1-\2-\3/'
553名無しさん@お腹いっぱい。:2007/06/06(水) 20:30:18
>>552 ありがとうございました!出来ました!
sedは使えるつもりでいたんですが、まだまだの若輩者でしたorz
こんなに早く答えて頂いて本当に助かりました。
554名無しさん@お腹いっぱい。:2007/06/06(水) 23:42:52
じぇっとすとりーーーむ〜
555名無しさん@お腹いっぱい。:2007/06/06(水) 23:42:59
シェルが何かは分かったのですが、シェルスクリプトが良く分かりません…

専門用語を交えないで言うと、どういったものなのでしょうか?
556名無しさん@お腹いっぱい。:2007/06/06(水) 23:44:51
シェルが何かどうわかったか、専門用語を交えずに説明してからだ
557名無しさん@お腹いっぱい。:2007/06/07(木) 00:11:41
レストランのメニューがシェル。コース料理がシェルスクリプト。
大分違うな…
558名無しさん@お腹いっぱい。:2007/06/07(木) 00:35:32
http://e-words.jp/w/E382B7E382A7E383ABE382B9E382AFE383AAE38397E38388.html

専門的な概念なのに専門用語使うなというのは無理な話。
559名無しさん@お腹いっぱい。:2007/06/07(木) 02:08:21
>>557

その説明で開眼しました!!

今ならどんなプログラムも書けそうです!!
(^ω^)
560名無しさん@お腹いっぱい。:2007/06/08(金) 00:50:30
if [ -e foo ] ;
then
echo "foo exists."
else
echo "foo does not exist."
fi
これを Solaris 8の bash, cygwinの sh, bashで実行するとOK。
でも Solaris 8の shで実行した時だけ
test: argument expected
と出てしまいます。どうにも分かりません。助けて下さい…

561名無しさん@お腹いっぱい。:2007/06/08(金) 03:13:50
Solarisなどの旧式shのtestコマンドには-eというものはない。
これは外部コマンドのtestも同様。
562名無しさん@お腹いっぱい。:2007/06/08(金) 06:27:46
>>561
ダウト。
Solarisの外部コマンド版のtestの実体はkshスクリプトだから、
Solarisでも外部コマンド版のtestには -eオプションがある。

ただし、純正Bourneには -eがないので、使わないこと推奨なのは同意。
[ -f foo ] あたりで代用だな。
563名無しさん@お腹いっぱい。:2007/06/08(金) 08:29:58
grepコマンドで検索した行の前後三行を出力するコマンドってないすか?

たとえば、以下のようなファイルがある。
----------------------------
aaa
bbb
ccc
ddd
eee
fff
ggg
----------------------------

grepコマンドをつかって、
$ grep ddd -a 333
とすると
bbb
ccc
ddd
eee
fff
と表示されるようなやつよ。
564名無しさん@お腹いっぱい。:2007/06/08(金) 08:45:56
>>563
-A とか -B とかない?
565名無しさん@お腹いっぱい。:2007/06/08(金) 10:35:48
>>563
普通にgrepだけで行けるぞ
grep -A 3 -B 3 'ddd' filename
566名無しさん@お腹いっぱい。:2007/06/08(金) 10:44:10
普通は-Aとか-Bなんてない。
567名無しさん@お腹いっぱい。:2007/06/08(金) 11:01:46
何が「普通」かなんて人それぞれでしょ。
-A がある grep とない grep がある。
それだけ。
568名無しさん@お腹いっぱい。:2007/06/08(金) 11:02:54
目的達成できるなら、それでいいじゃん
569名無しさん@お腹いっぱい。:2007/06/08(金) 11:03:45
grep -n して
sedで : より前だけ取り出して
awkにくべて前後の必要な行番号を全部計算して
sort -nuして
sedでsedのコマンドに成形しなおして
sedで抽出。
てゆうか、grepにこだわらずにawk1個の方がめちゃ楽そう。
570名無しさん@お腹いっぱい。:2007/06/08(金) 11:04:44
>>569
awkだけだとどうなるの?
571名無しさん@お腹いっぱい。:2007/06/08(金) 11:29:37
FreeBSDは変にsed使うよりawk1本に絞った方が軽い。
572名無しさん@お腹いっぱい。:2007/06/08(金) 11:43:53
複数行のテキスト整形には弱い
普通は、prelとかrubyを使う
まあ、perlとかruby使えないから聞いてるんだろうけど
573名無しさん@お腹いっぱい。:2007/06/08(金) 11:52:15
>>572
sedやgrepでどうしようかななんて考えてる時間が無駄だよな
perl覚えちゃたほうがいいのにね、これを機会に
574名無しさん@お腹いっぱい。:2007/06/08(金) 11:55:16
これを機会にGNU grep入れちゃえ。
575名無しさん@お腹いっぱい。:2007/06/08(金) 12:00:44
パタン行より前の行も表示しないといけないのでawk一本だとちょっと手間でしょ。
perlやrubyを使ってもそれは同じじゃないかな。
sed+awkなら
sed -e "$(awk '/pattern/{for (i=-2;i<=2;i++)if(i+NR>=0)print (i+NR) "{p;d;}"}' file|sort -nu)"';d' file

zshでしか試してないのでクォート回りはshだと違うかも知れんが、
だいたいこんな感じで。
576名無しさん@お腹いっぱい。:2007/06/08(金) 12:19:38
GNUは偉大だな、改めて思った
577名無しさん@お腹いっぱい。:2007/06/08(金) 12:26:01
当たり前じゃね?
だってGNU拡張は、ユーザが便利だと思うものを実装して
拡張していったんだから

きっと、>>563みたいなことを、数年前にも同じといってる人が
現れてんだよw
それで拡張されてる
578名無しさん@お腹いっぱい。:2007/06/08(金) 12:40:49
GNU sed awk grep を使いましょうね
579名無しさん@お腹いっぱい。:2007/06/08(金) 15:54:55
俺はgawk派
580名無しさん@お腹いっぱい。:2007/06/08(金) 16:04:21
ガウォーク
581名無しさん@お腹いっぱい。:2007/06/08(金) 16:14:46
GNU is Not UNIX
の意味がやっとわかったようでなにより
582名無しさん@お腹いっぱい。:2007/06/08(金) 16:21:47
んでけっきょく >>563 はどうしたの?
583名無しさん@お腹いっぱい。:2007/06/08(金) 16:25:28
GNU教に入信する準備をしてます
584名無しさん@お腹いっぱい。:2007/06/08(金) 16:29:28
しこしこ、書いてんじゃね
585名無しさん@お腹いっぱい。:2007/06/08(金) 17:38:00
mac でターミナルで操作しているのですが、safariでgoogleなどのページで
キーワードを打ち込んで検索させたりはできないものなんでしょうか?
初心者なんで仕組みなどわかりませんので構造上できないものなら教えてください
586名無しさん@お腹いっぱい。:2007/06/08(金) 17:49:58
587名無しさん@お腹いっぱい。:2007/06/08(金) 21:02:22
シェルスクリプトとGUIアプリの連携ってか?
588名無しさん@お腹いっぱい。:2007/06/08(金) 22:41:28
質問です!
---hoge.txt---
aaa
bbb
ccc

これを

---hoge.txt---
aaa
ccc

こうしたい。

sed -i "s/bbb//g" hoge.txtだと

---hoge.txt
aaa

ccc

こうなってしまう・・・
589名無しさん@お腹いっぱい。:2007/06/08(金) 22:49:06
sed -i -e '/bbb/d'
590名無しさん@お腹いっぱい。:2007/06/08(金) 23:03:06
>>589
ありがとうございます!
591名無しさん@お腹いっぱい。:2007/06/08(金) 23:37:42
GNU sedは正規表現のエスケープまわりが腐ってるんだよなあ
それに、わざわざBourne Shellに縛ったスレなのに、GNU拡張に依存するのもどうかと思う
ポータビリティも勘案すると、perl使った方がいい
592名無しさん@お腹いっぱい。:2007/06/09(土) 10:18:52
GNU grepの-oは便利
593名無しさん@お腹いっぱい。:2007/06/09(土) 11:53:54
>>592
モレも-Po がマジ便利だと思う。
594名無しさん@お腹いっぱい。:2007/06/09(土) 12:23:49
それを言ったらshよりzshのが便利だ
595名無しさん@お腹いっぱい。:2007/06/09(土) 12:49:24
そうだよ
596名無しさん@お腹いっぱい。:2007/06/09(土) 14:42:53
FreeBSDよりWIndowsのが便利だ
597名無しさん@お腹いっぱい。:2007/06/09(土) 14:54:08
当たり前だろ
598名無しさん@お腹いっぱい。:2007/06/09(土) 15:01:51
perlの書法がもっと自由度低かったら決定版たったのだが。
お行儀悪く書けてしまうのが悩みの種
599名無しさん@お腹いっぱい。:2007/06/10(日) 01:08:21
お行儀良く書きたいならRubyなりPythonなりへ行けば良い
お行儀悪く書いても心が痛まないのがPerlの長所
600名無しさん@お腹いっぱい。:2007/06/10(日) 01:10:39
use strict; するんだからそれほどひどいコードにはならないような
601名無しさん@お腹いっぱい。:2007/06/10(日) 22:37:24
どーせワンライナーか数行でやれるようなのしかPerlで書かないから
どうでもいい
602名無しさん@お腹いっぱい。:2007/06/15(金) 02:31:42
cshを勉強し始めたものです。
研究室で使うためです。
C言語もほとんど知らないので、取っ付きにくく、苦労してます。

今よく分からないのは、シェル変数と環境変数です。
普通に話に出てくるのですが、変数だとは理解してますが、違いが分かりません…

どなたか教えて頂けませんか?
603名無しさん@お腹いっぱい。:2007/06/15(金) 02:41:57
シェル変数はシェルが使う
環境変数は(主に)呼び出されたコマンドが使う

それはいいとして、なんでcshかちゃんと確認しろ
csh使う必然性がなければ、shにしとけ
604名無しさん@お腹いっぱい。:2007/06/15(金) 03:12:03
環境変数は子プロセスに引き継がれる。
シェル変数はそのシェルのみが使い、
子プロセスに引き継がれない。
605602:2007/06/16(土) 01:09:53
レス有り難うございます。

なぜcshなのかと言うと、 今研究室で使われてるのがcshだとしか…

Cで書かれたソースプログラムをcshに渡して、
結果を他のプログラムに渡して……
って感じらしいです。

まだ学部なので、難しいプログラムは書けず、
既成のプログラムの値を変えて走らせたりするようです。

最近の課題が、あるcshの中身を渡され、理解してくるものでしたが、
プログラムの知識が無い自分にはさっぱりというわけです…

606名無しさん@お腹いっぱい。:2007/06/16(土) 01:58:47
そんなに何種類もcshがあるのか?
607名無しさん@お腹いっぱい。:2007/06/16(土) 03:31:44
cshで書かれたシェルスクリプトってとこじゃないか?
608名無しさん@お腹いっぱい。:2007/06/16(土) 15:17:35
いや、cshの中身だぞ?
609名無しさん@お腹いっぱい。:2007/06/16(土) 15:47:46
とりあえず>>605よ、
cshの中身というのはcshスクリプトという意味か?
610名無しさん@お腹いっぱい。:2007/06/16(土) 16:11:27
こらこら、cshの話はもう終り。禁止。
611名無しさん@お腹いっぱい。:2007/06/16(土) 16:53:10
GNU grepの話をしてもいいなら、cshも良くないか
612名無しさん@お腹いっぱい。:2007/06/16(土) 18:01:05
良くない。
613名無しさん@お腹いっぱい。:2007/06/16(土) 18:02:26
シェルスクリプトのスレでシェルのソースコードの話かぁ……
614名無しさん@お腹いっぱい。:2007/06/16(土) 19:35:05
質問です。

ファイルの内容が同じものをリストアップする目的で、
対象ファイルのmd5sumを計算したいと考えています。
ただし、ファイルが大きいと時間がかかってしまうので、まずはファイル頭の
512バイトだけでmd5sumしたいです。以下のようなものを書いたのですが、
ファイル数が多い(1000とか)とプロセスの起動がボトルネックになってしまう
ようで、遅いです。

while read -r filename
do
dd if="${filename}" ibs=512 count=1 2> /dev/null | md5sum >> output
done < ${tempfile_prefix}2_filesize_onajiyatu

md5sumに先頭から512バイトだけで計算しろと指示することはできますか?
もしくは何かいい案ありますでしょうか?

615名無しさん@お腹いっぱい。:2007/06/16(土) 19:45:20
えろ画の整理スクリプトかよ
616名無しさん@お腹いっぱい。:2007/06/16(土) 19:49:09
違います。
エロ動画です。
だからでかいのです。
617名無しさん@お腹いっぱい。:2007/06/16(土) 19:52:32
>>614
プロセス起動がネックならperlとかpythonとかrubyとか好きなのでやれ。
618名無しさん@お腹いっぱい。:2007/06/16(土) 19:53:08
>>614
perl を使う
619名無しさん@お腹いっぱい。:2007/06/16(土) 20:02:27
まずはファイルサイズで比較すればいいのに
620名無しさん@お腹いっぱい。:2007/06/16(土) 20:11:47
粗く分けるのにmd5なんか使わんでも。
>>619 の通りファイルサイズが手軽だし、もし同じサイズで内容が違うものが
沢山ならファイル中の適当なところをhexdumpでもいいんじゃないの。
621名無しさん@お腹いっぱい。:2007/06/16(土) 20:37:43
横から済まぬが

>>619,620

>> ${tempfile_prefix}2_filesize_onajiyatu

って書いてあるから、そもそも同じサイズ限定ではないのか?
622名無しさん@お腹いっぱい。:2007/06/16(土) 20:40:36
同じファイルサイズのものだけでも1000ファイルもあるって、
結構集めまくったね、絵炉動画をw
623名無しさん@お腹いっぱい。:2007/06/16(土) 21:03:28

>617,618
perlか・・・ついに手を出すときが来たか

>619,621
失礼しました。サイズ比較をあらかじめこんなのでやってます。
ls -l "$@" | sed 's/ \+/ /g' | cut -d ' ' -f 5,8 > ${tempfile_prefix}1_filesize_all
awk '{ if(a[$1,0]==0){a[$1,0]=1;a[$1,1]=$0;} else{if(a[$1,0]==1){print a[$1,1];} a[$1,0]++;print $0;} }' \
${tempfile_prefix}1_filesize_all > ${tempfile_prefix}2_filesize_onajiyatu

>620
ためしに512byteのgomi.txtを作ってみて、以下試しました。
%time (for i in `seq 1 1000`; do cat gomi.txt > /dev/null 2>&1 ; done;)
-> 1.486sec
%time (for i in `seq 1 1000`; do md5sum gomi.txt > /dev/null 2>&1 ; done;)
-> 1.510sec
これくらいのサイズだと処理内容はあまり影響なさそうです。
md5sumの方が比較しやすかったのです。

>622
いやいや、得ろ動画とか1000個とか例えばの話ですよw
624名無しさん@お腹いっぱい。:2007/06/17(日) 00:32:06
>>614
まずは、ファイルサイズではじいたら?
625名無しさん@お腹いっぱい。:2007/06/17(日) 00:34:24
すまん。@bitwarpなもんで、更新漏れだった。
忘れてくれ
626名無しさん@お腹いっぱい。:2007/06/17(日) 03:14:21
xargsでもつかえば?
627名無しさん@お腹いっぱい。:2007/06/17(日) 04:00:08
気が向いたんでやってみた

$ time (for f in tmp/*; do dd if=$f bs=512 count=1 2>/dev/null | md5sum; done)
065d30715dcffa21596406373a9124ac -
...中略...
ed4cf7b8f209f9ce630b5e76219357ae -
(; for f in Desktop/*(.); do; dd if=$f bs=512 count=1 2> /dev/null | md5sum; ) 0.09s user 0.38s system 49% cpu 0.960 total

$ time perl -M'Digest::MD5(md5_hex)' -e 'for (@ARGV) { open F,"<$_"; read F,$a,512; print md5_hex($a),"¥n" }' tmp/*
065d30715dcffa21596406373a9124ac
...中略...
ed4cf7b8f209f9ce630b5e76219357ae
perl -M'Digest::MD5(md5_hex)' -e Desktop/*(.) 0.02s user 0.02s system 18% cpu 0.193 total
628名無しさん@お腹いっぱい。:2007/06/17(日) 17:51:50
xargs使えって
629名無しさん@お腹いっぱい。:2007/06/17(日) 20:19:20
絵炉動画ファイルは、ファイル名にスペースとか特殊記号とか入りまくりである
ことが多いため、xargsは全く持って不適当。
630名無しさん@お腹いっぱい。:2007/06/17(日) 21:13:28
それならfor文やreadでも難しくならないか・・
まxargsのほうがもっと不適当なのだろうが
631名無しさん@お腹いっぱい。:2007/06/17(日) 21:16:22
>>629
man xargs
632名無しさん@お腹いっぱい。:2007/06/17(日) 21:24:09
>>631 は何がしたいんだろうか? まったく外してるわけだが、、
633名無しさん@お腹いっぱい。:2007/06/17(日) 21:26:16
>>631
$ ssh solarishost man xargs
634名無しさん@お腹いっぱい。:2007/06/17(日) 21:33:38
ファイル名の問題以前に、個々のファイルごとに頭の512バイトを切り出したいわけ
だから、xargs使ったところでプロセス起動数は節約できない。
よって、>>626 >>628 は全く的はずれ。
635名無しさん@お腹いっぱい。:2007/06/17(日) 21:34:10
>>632
はずしているのはお前の方。

find 〜 -print0 | xargs --null
636名無しさん@お腹いっぱい。:2007/06/17(日) 21:47:33
>>635
はずしているのはお前の方。

-print0 や xargs --null は、一般には使えない。(たとえばSolaris)

あと、>>634 が指摘してるように、今回の件は xargsでは解決しない。

よって、そういう意味でも外しているのは >>635 の方。
637名無しさん@お腹いっぱい。:2007/06/17(日) 22:10:53
-print0で喜んでるのは石器人。
現代人はふつー find ... -exec ... +
638名無しさん@お腹いっぱい。:2007/06/17(日) 22:21:02
>>632 から某頭の悪い粘着君臭がする。
639名無しさん@お腹いっぱい。:2007/06/17(日) 23:03:19
て言うか、プロセス起動数が云々と言うなら md5sum を改造するなり、
ファイル名の取得からハッシュの計算までやるようなアプリ作ればい
いじゃん。
640名無しさん@お腹いっぱい。:2007/06/17(日) 23:14:55
>>617-618で既に正答が出てるの何を今更…
641名無しさん@お腹いっぱい。:2007/06/18(月) 00:13:31
答えそのものも>627に出てるわけだが...
642名無しさん@お腹いっぱい。:2007/06/18(月) 00:36:28
#find ... -exec ... +
横レスだが知らなかった
ってか手元のmanにはない
643名無しさん@お腹いっぱい。:2007/06/18(月) 03:34:11
最後の「+」ってなに?
644名無しさん@お腹いっぱい。:2007/06/18(月) 08:19:20
xargsは同じプロセスを連続起動するから
工夫されていると聞いたことがある。
これは事実?
645名無しさん@お腹いっぱい。:2007/06/18(月) 15:14:11
基礎的な質問ですいません。

bashで、シェル変数に値を突っ込み -zで存在を確認する手法ですが、

if [ -z $test ] ; then
 echo "val exist"
else
 echo "val isn't exist"


質問
1.[ -z $test ] と書くのはよろしくない?
2.[ -e $test ] とすると、シェル変数が存在しない時に真、
  シェル変数が存在する時に偽となるのはなぜ?


結構、このパターンで利用してたのですが、2.の動作を確認すると、
なぜだか逆になっているような。じゃ、-zもよろしくないのかなぁ、と

ところで、みなさんは、環境変数やシェル変数の存在確認をどうやってますか?
宜しくお願いします。
646名無しさん@お腹いっぱい。:2007/06/18(月) 15:23:43
>>645
まず、[ ] の中ではシェル変数は基本的にダブルクォートを付けること。

[ -z "$test" ] とする。この場合、$testがセットされていれば偽になる。
これだと真偽が逆になってわかりにくいので、
[ -n "$test" ] または -n は省略できるので [ "$test" ] とする。

[ -e $test ] は、$testがセットされていない時、[ -e ] となってしまい、
これは、"-e" という文字列がサイズゼロかどうか(この場合は2バイト)という
判定がなされるため、$testがセットされていないと真になる。
一方、$testがセットされていると、今度は -e は -eオプションとして解釈され、
$testの中身がファイル名とみなされるため、そんなファイルがなければ偽になる。

更に言うと、-e は Bourne shでは使えないため非推奨。
647名無しさん@お腹いっぱい。:2007/06/18(月) 15:39:39
>>646
ありがとうございます。
うーーん、なるほど。1行目でよく分かりました。
648名無しさん@お腹いっぱい。:2007/06/18(月) 16:11:12
丁寧に説明してもらった理由を理解したのかしてないのかよくわからん回答だな
649名無しさん@お腹いっぱい。:2007/06/18(月) 16:12:07
このあたりものこともあって zsh で手抜きスクリプト書くことが多くなった
650名無しさん@お腹いっぱい。:2007/06/18(月) 16:24:47
>>648
舌足らずですみません。
1行目で自分の間違いを気付き、
詳しい説明をしていただいたので助かりました、と書きたかったところでした。

-eオプションの非推奨コメントは特に助かります。
651名無しさん@お腹いっぱい。:2007/06/18(月) 21:09:56
      ______
    /          )))
   /   /// /―――-ミ
   / 彡彡 // /      ヽ))
   / 彡彡 iiiiiiiiiiiiiii  iiiiiiiiii|
   / 彡彡 < ・ > 、<・ >l
  /    |       ヽ   〉
  /  ( | |      __)  |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  /   | ≡  /, ―――  |ゝ < 馬鹿共にshellを与えるな!
  /   |   |  L ___」 l ヾ  \_________
_ミ  l   ______ノ ゞ_
  |  l ヾ    ー   / |  l
  |  |   \ー    ‐/  |  |
652名無しさん@お腹いっぱい。:2007/06/19(火) 08:10:33
>>646

>>更に言うと、-e は Bourne shでは使えないため非推奨。

?????

653名無しさん@お腹いっぱい。:2007/06/19(火) 08:30:50
>>652
教えて欲しいんなら「???」じゃなくて、ちゃんと日本語で書け。初心者君。
654名無しさん@お腹いっぱい。:2007/06/19(火) 09:19:43
ところで-eがないshが標準で載ってるOSってどれ?
655名無しさん@お腹いっぱい。:2007/06/19(火) 09:36:14
Solarisとか。SCOとか。Tru64とか。
656名無しさん@お腹いっぱい。:2007/06/19(火) 11:36:15
>>655
今では使われていないOSばかりですね。じゃあ、-e使ってもいいですねw
657名無しさん@お腹いっぱい。:2007/06/19(火) 11:45:45
つっ、釣られないぞ
658名無しさん@お腹いっぱい。:2007/06/19(火) 13:41:51
>>653
では日本語で書かせていただきます。
私が学習に使用している O'REILLY の「詳解シェルスクリプト」によりますと、
/bin/sh 組込の test コマンドに於ける -e 表現は標準的なものとして記述され
POSIX で定義している旨明記されております。また更に今回の議題の発端である
>>645 質問子の環境と共通する bash 等での独自の拡張に付いて記述した件では、
条件判定構文中の -a 演算子について(非推奨です。 -e を使いましょう)
とまで明記されているものを、使用者の環境の多用性や使用目的の別など勘案せず
一言の下に「非推奨」と断定できる根拠を教えてください。 お願いします。
659646じゃないけど:2007/06/19(火) 13:47:32
>>658
「Bourne shでは使えないため」って書いてあるじゃん。
それが重要かどうかは各自が判断すればいいこと。
660名無しさん@お腹いっぱい。:2007/06/19(火) 13:51:15
>>658
POSIXは理想論ばかりで、現実に即してないんだよ。
いくらPOSIXでどうこう言っても、実際に動くかどうかがすべて。
test -e については、Solarisの/bin/shで動かないんだから、
OS共通のシェルスクリプトでは非推奨であるのは当然。

あと、別件で、-e の意味で -aを使ってはいけない(非推奨)なのはその通りだよ。
-a は別に ANDの演算子の意味があって、そちらの意味で使うべきだからね。

わかったら、今後は -e を使うなよ。今まで書いたシェルスクリプトで
-e を使ってるのがあったら、気づき次第直しとけよ。
661658:2007/06/19(火) 14:12:59
予想通りの回答をどうもありがとうございました。

>>わかったら、今後は -e を使うなよ。今まで書いたシェルスクリプトで
-e を使ってるのがあったら、気づき次第直しとけよ。

ご心配有り難うございます。
そもそも機能が曖昧過ぎて過ぎて使おうと思ったことも御座いませんw
662名無しさん@お腹いっぱい。:2007/06/19(火) 14:15:20
予想してたなら聞く必要ないだろ……。
むだに波風立てんなよ。
663名無しさん@お腹いっぱい。:2007/06/19(火) 22:13:27
シェルスクリプトの互換性過敏症な奴っていじると面白いんだよ
664名無しさん@お腹いっぱい。:2007/06/19(火) 23:22:07
ここにもユトラーか・・・・
665名無しさん@お腹いっぱい。:2007/06/19(火) 23:28:40
>>663
export LANG=C とか書いてるのを見ると反応してしまうのは互換性過敏症ですか?
666名無しさん@お腹いっぱい。:2007/06/19(火) 23:56:18
いや寧ろ互換性を指摘できる人がいて有難い
667名無しさん@お腹いっぱい。:2007/06/20(水) 00:19:14
そんなこといって年寄りほめたらわらわらわいてくるぞ。
SunOS 3.5世代の俺なんかまだまだ甘ちゃんだ。
668名無しさん@お腹いっぱい。:2007/06/20(水) 05:31:28
沸いてきてくれ
それぞUNIXの面白さの真髄だわ
669名無しさん@お腹いっぱい。:2007/06/20(水) 09:12:11
仕事では一緒になりたくねえけどなw
670名無しさん@お腹いっぱい。:2007/06/20(水) 21:45:49
ようするに、 POSIX が理想論で現実に即していないのは当然の話で、
現実がバラバラだから標準化が必要という理念が生まれたわけですわな。

で、各プラットフォームでそれぞれ POSIX に準拠する姿勢を示していながら
どうしても譲れない仕様への拘りがあるから未だに移植性の問題が取沙汰される。

そこの処の理を語らずに、只単に○○では使える or 使えないという議論に
終始するというのは如何にも思慮が浅いと言わざるを得まい。
671名無しさん@お腹いっぱい。:2007/06/20(水) 22:08:39
実社会ではそういうもんだ
672名無しさん@お腹いっぱい。:2007/06/20(水) 23:20:26
携帯電話みたいなものだね
いまだに携帯電話つかわないもうろくジジイとかいるかなw
673名無しさん@お腹いっぱい。:2007/06/21(木) 01:34:39
じじいじゃないけど使ってないよ。
674名無しさん@お腹いっぱい。:2007/06/21(木) 01:36:56
うわw
675名無しさん@お腹いっぱい。:2007/06/21(木) 01:38:49
携帯電話使わない仕事というと、医者とかパイロットくらいか
676名無しさん@お腹いっぱい。:2007/06/21(木) 01:53:54
というか、どこが「携帯電話みたいなもの」なのかさっぱりわからん。
677名無しさん@お腹いっぱい。:2007/06/21(木) 03:01:35
痴呆がはじまった?
678名無しさん@お腹いっぱい。:2007/06/21(木) 23:19:43
>>670
こだわりなんかないだろ、準拠するのが面倒なだけだよ。

準拠したからって売れ行きがたいして変わるわけでもないし。

>>675
院内では携帯は使わないけど緊急呼び出しが頻繁にあるような
医者もいるからなぁ。

パイロットは仕事中は使わないけど、そういう意味なら電車の
運転手なんかも同じだな。

て言うか、仕事中とか会社の中に限定すると携帯持たない/持て
ない奴はそれなりにいるし。
679名無しさん@お腹いっぱい。:2007/06/22(金) 00:04:29
ケータイでも3G(高周波のやつ)は大丈夫らしいけど。
680名無しさん@お腹いっぱい。:2007/06/22(金) 09:16:46
使えない奴にかぎって、くだらねえことに拘ってたりする
681名無しさん@お腹いっぱい。:2007/06/22(金) 20:12:44
そろそろUNIXの話にでも戻す?
682名無しさん@お腹いっぱい。:2007/06/22(金) 20:59:20
よしなに
683名無しさん@お腹いっぱい。:2007/06/22(金) 23:11:19
>>678
>>準拠したからって売れ行きがたいして変わるわけでもないし。

売行きが変わらないからって騒ぐこともないでしょ。
拘りがなければ準拠する方がはるかに楽なのにねぇ

あくまで /bin/sh 標準なのは基本であって、実勢はケースバイケースで、
linux じゃ bash 標準だろうし、 solaris だって適宜 ksh なり使うだろうし、
パーソナルユースや $HOME/bin 限定使用とか、管理者でも同一プラット
ホームだけでの運用が多く、移植性のプライオリティーがさほど高くない
現況において、やいのやいのいう奴は要するに「言いたいだけ」ちゃうんかと。
684名無しさん@お腹いっぱい。:2007/06/22(金) 23:53:48
> 拘りがなければ準拠する方がはるかに楽なのにねぇ

何が楽なのか詳しく書いて欲しいんだが。

商用ソフトってちょっと変えると、検証がスゲー大変なことぐらいは知ってるよな?
685名無しさん@お腹いっぱい。:2007/06/23(土) 00:08:17
楽しいもの見つけてしまった。

http://sed.sourceforge.net/sed1line.txt
http://www.student.northpark.edu/pemente/awk/awk1line.txt

組込みで使っているLinuxにgrepが入ってなくて
sedでシミュレートしたスクリプト書いたんだけど、
それ以上のことがいろいろできそうな感じなり。


おまけ

http://www.fepus.net/ruby1line.txt
686名無しさん@お腹いっぱい。:2007/06/23(土) 00:11:08
>>683
Solarisは古いshとkshを選択できるからいいけど、
HP-UXとかAIXは/bin/shはkshそのもなんで選択の余地はない。

シェルごときで移植性とか言ってるアホが多いっていうのは同意。
687名無しさん@お腹いっぱい。:2007/06/23(土) 03:31:47
視野が狭いのって、幸せでいいよね。
688名無しさん@お腹いっぱい。:2007/06/23(土) 08:31:29
そう?いまどきシェルの互換性なんか気にしてる奴って幸せそうに見えないが。
689名無しさん@お腹いっぱい。:2007/06/23(土) 09:38:27
シェルはさまざまなコマンドと組み合わせて使うしな。
コマンドにも完全な互換性がない以上、シェルスクリプトの互換性や移植性を気にし過ぎるのはアホ。
ささっと書いてテストして動きが変だったら、そのとき直せばいい。
シェルってそういうライトな使い方をするためのものでしょ。
690名無しさん@お腹いっぱい。:2007/06/23(土) 10:04:55
互換性のことも知らずに、暢気に
[ -e file ] とか、export HOGE=hoge とか書いて、
「動いたからOK」とか言ってる香具師の方がアフォに見えるけどな。
691名無しさん@お腹いっぱい。:2007/06/23(土) 10:28:19
「さくっと直せばいいじゃん」って言ってる奴はだいたい直したことがない奴だし。
692名無しさん@お腹いっぱい。:2007/06/23(土) 10:32:04
そもそも、直す必要なんてない、動くから
693名無しさん@お腹いっぱい。:2007/06/23(土) 11:05:10
694名無しさん@お腹いっぱい。:2007/06/23(土) 11:08:34
何が問題か、具体的に
695名無しさん@お腹いっぱい。:2007/06/23(土) 12:54:51
問題を理解できていないことが問題なんだろ。
696名無しさん@お腹いっぱい。:2007/06/23(土) 13:08:14
互換性がいるのは移植する可能性がある場合だろうかと。
あるいは環境が一部不明な場合か。
ただ、知識としてはあれば有効だろうが
697名無しさん@お腹いっぱい。:2007/06/23(土) 14:23:00
開発当初は特定のシステム限定であったとしても、実社会では
いつのまにかそんな制約はなくなってしまうものなのだよ。

ニートにはわからないだろうが。
698名無しさん@お腹いっぱい。:2007/06/23(土) 14:53:17
自分の体験したことが、現実の全てだと思っている>>697がいるスレはここですか?
699名無しさん@お腹いっぱい。:2007/06/23(土) 15:16:00
>>698
「全ての」と「存在する」の違いを未だ習ってないのかい? ぼーや
700名無しさん@お腹いっぱい。:2007/06/23(土) 15:20:19
シェルで移植性の高いスクリプトを書くのはめんどうくさいので
Perlを使うようになりますた
701名無しさん@お腹いっぱい。:2007/06/23(土) 16:25:18
それはそれで別の移植性の低さが問題になりそうな…
702名無しさん@お腹いっぱい。:2007/06/23(土) 16:36:58
Solarisさえ無くなればシェルの互換性の問題はほとんど解決するよね。
703名無しさん@お腹いっぱい。:2007/06/23(土) 16:55:08
UNIXのソフト開発標準を策定しようという取り組みはたくさんあった。
だがそうした標準は、POSIX(Portable Operating System Interface)のように
一般的過ぎて役に立たないか、あるいはUNIX戦争として知られる
Open Software Foundation対UNIX Internationalの企業連合間抗争に
巻き込まれるかだった。
704名無しさん@お腹いっぱい。:2007/06/23(土) 17:09:49
mkmfのようにメタスクリプトを環境依存シェルスクリプトにコンパイルする
プログラムがあるといいと思います!
705名無しさん@お腹いっぱい。:2007/06/23(土) 17:11:11
mkmfって、、また古い遺物を持ち出してきたなぁ、、
706名無しさん@お腹いっぱい。:2007/06/23(土) 20:29:52
本当にそんな互換性が必要ならlintの一つや二つとっくにありそうな気がするが、
寡聞にして知らないなあ。
707名無しさん@お腹いっぱい。:2007/06/23(土) 20:33:44
>>706
つ dash #まあ呼び出したコマンドの互換性まではチェックできないわけだが・・・
708名無しさん@お腹いっぱい。:2007/06/23(土) 20:36:48
役に立たない、ただそれだけ
709名無しさん@お腹いっぱい。:2007/06/24(日) 05:17:26
すべてのシェルが/bin/shを名乗るのを止めて
/bin/shを永久欠番化すれば解決
710名無しさん@お腹いっぱい。:2007/06/25(月) 02:26:09
なんかすごい扱われようだな。
互換性を述べている人は割とバランスの取れたUNIX流の解釈だと思うぞ
711名無しさん@お腹いっぱい。:2007/06/25(月) 03:02:50
どうせUnixなんて適当じゃねえか
varとかetcとか
システム変えることになったらどうせテンヤワンヤだ
712名無しさん@お腹いっぱい。:2007/06/25(月) 05:49:56
ということにしたいんですね:)
713名無しさん@お腹いっぱい。:2007/06/25(月) 23:17:51
>>710
素直に自分よりの解釈だと言えば?
714名無しさん@お腹いっぱい。:2007/06/25(月) 23:43:08
>>685のは結構凄いと思うが、
>>517のedのヤツはもっと凄いな。
オレもed好きになろう。
715名無しさん@お腹いっぱい。:2007/06/26(火) 15:37:00
edで日本語がうまく扱うほうほうがあれば言うことないのだが・・・・
716名無しさん@お腹いっぱい。:2007/06/26(火) 15:40:11
sedにin-placeオプションがなくてperlをよく知らなかったころは
edでやってたな
717名無しさん@お腹いっぱい。:2007/06/26(火) 15:40:12
>715
edより先におまえが日本語をうまく扱えるようになる必要がありそうだ
718名無しさん@お腹いっぱい。:2007/06/26(火) 15:44:41
誰がうまいこといえと
719名無しさん@お腹いっぱい。:2007/06/26(火) 21:37:41
てか、蒸し返すようで恐縮だけど
シェルスクリプトって、基本的に ash と ksh と bash で動けば
移植性で問題になることは極めて低いよね?

この三つで動いても駄目な環境って今どれほど実運用されているのだろうか?
720名無しさん@お腹いっぱい。:2007/06/26(火) 23:39:23
>>719
Solarisが問題だな。Solarisにはkshが標準で付いてるとは言え、
シングルユーザモードでは使えない。
シングルユーザモードを含めたシステムスクリプトは依然、
/bin/shか/sbin/sh(単にstatic linkというだけで中身は/bin/shと同じ)の
範囲内で書く必要がある。
誰かが書いてたように、Solarisが無くなる(もしくは影響力が無くなる)なら、
シェルの互換性の問題は一気に解決するだろう。
721名無しさん@お腹いっぱい。:2007/06/27(水) 00:25:59
Solarisの/binは/usr/binへのシンボリックリンクだからkshやbash使ってもいいんじゃない?
/usr/binの中には/bin/kshで書かれたコマンドもけっこうある。
Solarisのshの動きがヘンなのはたしかにときどきちょっと困る。
722名無しさん@お腹いっぱい。:2007/06/27(水) 00:42:18
> Solarisの/binは/usr/binへのシンボリックリンクだから

マジで?
723名無しさん@お腹いっぱい。:2007/06/27(水) 00:46:28
> シングルユーザモードでは使えない。
> シングルユーザモードでは使えない。
> シングルユーザモードでは使えない。
724名無しさん@お腹いっぱい。:2007/06/27(水) 00:50:42
>>721
マジだよ。/sbinは別れてるけど。
>>720は/usrがマウントできない状況のことを言ってるんだと思うけど最近は/と/usrを分けないのもふつうなんじゃないかな。
725名無しさん@お腹いっぱい。:2007/06/27(水) 00:53:11
どっちかっつーとそういう問題でなくて、
ふつースクリプトは#!/bin/shで書くけど/bin/shが何だかわかんねーじゃん?
って話では?
726名無しさん@お腹いっぱい。:2007/06/27(水) 02:29:26
>>722
HP-UXもだな。
727名無しさん@お腹いっぱい。:2007/06/27(水) 02:31:28
ashもいろいろ修正入ってる。
Solarisの/bin/shはそれこそSystemV7のころのものとほとんど変わっていない。
728名無しさん@お腹いっぱい。:2007/06/27(水) 03:37:47
・・・ってシェルを使えじゃなくてPOSIXだか何かのsh規格に沿って書けって事だよな。
729名無しさん@お腹いっぱい。:2007/06/27(水) 07:44:21
>>721
じゃなくて、シングルユーザーモードの時、
/sbin/shはあるが、
/sbin/kshは無い。

/sbin/shはstatic linkの/bin/sh(/usr/bin/sh)
だから、シングルユーザーモードも含めれば、
結局 /bin/shの文法の範囲で書かざるを得ないという話。

しかも、Solarisの/bin/shは古いままなので、
export a=b も、$(command)も test -e も、
ちょっと新しい書き方はすべて使えない。
730名無しさん@お腹いっぱい。:2007/06/27(水) 08:03:47
互換性の話に便乗だけど、
一部のスクリプトで、未だに

${1+"$@"} って書いてあるのがある。
これ、もう "$@" でいいんじゃないか?

引数が0個の時に ""が残らないようにする措置だろうけど、
Solarisの/bin/shですらそんな不具合は発生しない。(確認済み)
なので、"$@"と書いて問題ないし、視認性上も "$@"と書くべきと思うんだが。

本当に ${1+"$@"}と書く必要がある /bin/shを搭載したOSって、
現存してる?
731名無しさん@お腹いっぱい。:2007/06/27(水) 22:07:07
>>729
なんか Solaris のシングルユーザモードって不便そうですね。
CD 6枚焼いたけど、インストールを躊躇してしまうよ。
732名無しさん@お腹いっぱい。:2007/06/27(水) 22:19:42
/ と /usr をわけたりしなければ気にする必要ないよ。
733名無しさん@お腹いっぱい。:2007/06/27(水) 23:07:41
>>724, >>726
なるほどねぇ、知らんかったよ。ありがと。

>>730
書き換えるのが面倒なだけなんじゃないか?

目障りだと思うなら、君が片っ端から書き換えて動作検証してあげればいいと思う。
734名無しさん@お腹いっぱい。:2007/06/27(水) 23:19:19
>>732
すんません BSD ユーザなもので、 / と /usr を分けるというのが
イマイチ良く解かりません。
ad0s1a に全部突っ込めって事ですか?
/var も /tmp も含めて・・・(よーするに swap 以外は同じパーテーション?)
Solaris だとそんなの有りなんだぁ。(BSDでも無いことは無いけど、なんだか・・)
735名無しさん@お腹いっぱい。:2007/06/27(水) 23:36:43
OSは別に関係ない。パーティションの切り方なんて好みの問題だ。
736名無しさん@お腹いっぱい。:2007/06/27(水) 23:43:05
>>735
でも、その好みの問題に対して Solaris はシングルユーザモードの
挙動をもってして、ユーザに介入してくる分けでしょう?
>>732 のレスからは、そういう風に読めるのだが?
737名無しさん@お腹いっぱい。:2007/06/28(木) 00:09:08
どうでもいいけどよそでやってくんないかな。
738名無しさん@お腹いっぱい。:2007/06/28(木) 05:10:23

>>730 の ${1+"$@"}  てどうゆう意味なの??
なんか理解できん・・・(TT
739名無しさん@お腹いっぱい。:2007/06/28(木) 05:18:04
>>734
NetBSDのデフォルトは分けないからBSDユーザーってのは言い訳にならない。
740名無しさん@お腹いっぱい。:2007/06/28(木) 07:33:15
あと、未だに
if [ X$HOGE = X ]
なんてのも見かける。これも、
if [ "$HOGE" = '' ]
と書いたほうがいい。

むかーしのバージョンのtestで、$HOGEの内容が = だったような場合、
[ = = '' ] みたいになるとエラーになるtestに対する対処として、
X$HOGE とかいう回避法があったけど、今の testコマンドでそれが必要なのは
もう現存しないはず。
741名無しさん@お腹いっぱい。:2007/06/28(木) 14:01:16
>むかーしのバージョンのtestで、$HOGEの内容が = だったような場合、

ちがう。
$HOGE の内容が -f だったような場合に対する対処だから、今でも有効。
742名無しさん@お腹いっぱい。:2007/06/28(木) 14:16:42
>>741
$HOGE の内容が -f でも正常に動くんだけど。
[ -f = hoge ] みたいに、項が3つある時は、
-fはファイル存在オプションとはみなされないから

-f だった時駄目になるような/bin/sh搭載した OSって 何?
743名無しさん@お腹いっぱい。:2007/06/28(木) 14:36:59
>>742

a="-f"
b="-a"
c="="
d=""
test X"$a" = X"$b" -a X"$c" = X"$d"
echo $?
test $a = $b -a $c = $d
echo $?

FreeBSD の ash、Solaris の sh, ksh、GNU bash いずれでも異なる結果になりました。
744名無しさん@お腹いっぱい。:2007/06/28(木) 14:39:58
>>743
それは、複数の式を -a (AND) でつないだ場合の話。
それだと確かに式の評価がおかしくなることがあるが、

[ $HOGE = hoge ] なら、X$HOGE とする必要はなし。

Solarisの/bin/sh でも [ -f = -f ] は無問題。
745名無しさん@お腹いっぱい。:2007/06/28(木) 14:43:14
-a 使ってるかどうかで場合わけするより
一律で X$HOGE にしといた方がおしゃれ。
746名無しさん@お腹いっぱい。:2007/06/28(木) 14:48:53
>>745
-a 使う場合は、各評価式ごとに \( \) で括るのを推奨。

[ \( "$a" = "$b" \) -a \( "$c" = "$d" \) ]

↑みたいにね。これで、X"$HOGE" は不要。
747名無しさん@お腹いっぱい。:2007/06/28(木) 14:54:19
>>744
> [ $HOGE = hoge ] なら、

クォート忘れてる。

> X$HOGE とする必要はなし。

ダウト。
そのへんの対バカ性能をどこまで頑張るかはヒューリスティックで実装依存。

たとえばFreeBSDのtestでは

$ HOGE='!'
$ [ "$HOGE" = hoge ]; echo $?
[: =: unexpected operator
2

となるので変数に任意の値を想定するなら "X$HOGE" = Xhoge は依然必要。
常にtestの引数が正しい式となるよう書くにしくはなし。
748名無しさん@お腹いっぱい。:2007/06/28(木) 15:06:47
>>747 氏に聞きたいのだが、
>>730 についてはどうお考え?

${1+"$@"} は以前必要? もう不要で "$@"で桶?
749名無しさん@お腹いっぱい。:2007/06/28(木) 15:09:08
ここでポリシー決めても
どこ使うんだろ。
750名無しさん@お腹いっぱい。:2007/06/28(木) 17:18:00
こういう突っ込んだ話まで網羅してる本は無いの?
751名無しさん@お腹いっぱい。:2007/06/28(木) 17:20:30
結局トラディショナルな書式に落ち着くんだよな...
752名無しさん@お腹いっぱい。:2007/06/28(木) 17:25:52
文字列の比較なら [ X"$HOGE" = hoge ] なんてするより
case $HOGE in hoge) にするなぁ。

caseだと、たとえ$HOGEの中身が ! だとか -f -a とか特殊記号だったとしても
すべて無問題だから。
753名無しさん@お腹いっぱい。:2007/06/28(木) 17:31:27
>>750
詳解シェルスクリプトを企画するか
754名無しさん@お腹いっぱい。:2007/06/28(木) 17:35:22
需要ないだろー
755名無しさん@お腹いっぱい。:2007/06/28(木) 17:37:22
wikiでいいんじゃね
756名無しさん@お腹いっぱい。:2007/06/28(木) 17:38:15
需要とかそういうことに興味あるのかしら?
757名無しさん@お腹いっぱい。:2007/06/28(木) 17:39:17
>>756
本売るつもりなら大事でしょ。
758名無しさん@お腹いっぱい。:2007/06/28(木) 17:40:07
需要ないだろ。問題になるのSolarisだけだし、Solarisユーザーの人数が、、、
759名無しさん@お腹いっぱい。:2007/06/28(木) 17:41:25
>>757
>>756 が言ってるのは、ユーザーがシェルの互換性に興味あるのか? ってことでは
(需要に興味があるかどうかじゃなく)
760名無しさん@お腹いっぱい。:2007/06/28(木) 17:49:09
今時、シェルスクリプトの本なんて、全く売れないとは言わないにしても
何冊くらい売れるんだ?
このスレでも>>4にある本の話なんて全然出ないし。
761名無しさん@お腹いっぱい。:2007/06/28(木) 17:50:30
入門書はそれなりに売れるんじゃないの?
そういうの読む人がここの話に参加しづいらいだけで。
762名無しさん@お腹いっぱい。:2007/06/28(木) 17:52:47
getopts は互換性あるの?
763名無しさん@お腹いっぱい。:2007/06/28(木) 17:59:17
>>762
よほど古いシェルじゃない限り互換性ある。でもなぜか出番なくてあまり使わない。
764名無しさん@お腹いっぱい。:2007/06/28(木) 18:02:34
詳説正規表現もこんなのみんな興味あるのかよとかおもったけど
意外に受けたらしいから
765名無しさん@お腹いっぱい。:2007/06/28(木) 18:11:11
互換性があって、どのシェルでも使えるのに、
使ってるの見たことないコマンドの筆頭が readonly だな。
766名無しさん@お腹いっぱい。:2007/06/28(木) 18:12:21
>>763
ありがとうございます。
もうひとつ質問なんですが、ポータブルかつ安全に一時ファイルを作成するにはどうすればいいのでしょうか。
767名無しさん@お腹いっぱい。:2007/06/28(木) 18:12:31
UNIXシェルの新刊はここ2年くらいやたら出たが、
もうこの分野で出ても意味ないわな。
カーニハン&パイクとブルース・ブリンけあればいいんじゃないか。
768名無しさん@お腹いっぱい。:2007/06/28(木) 18:17:41
>>766
どこまでの安全性を言ってるのかわからないけど、

(unask 77; > /tmp/hoge$$)

じゃだめかい?

mktempコマンドは、必ずしもあるとは限らないと仮定するべきなのだろうか?
769名無しさん@お腹いっぱい。:2007/06/28(木) 18:21:56
mktemp(1) を勧める文書は「pidは容易に推測できるので危険」とか書いてますよね。
実用上はほとんど問題にならないのでしょうが、気持ち悪いので何か安全な方法があるのかお尋ねしました。
770名無しさん@お腹いっぱい。:2007/06/28(木) 18:31:34
本当に安全でないといけないなら、
mkdirとかでちゃんとロックして、
失敗したら別の名前で試すとかするしかない。
作るディレクトリのパーミッションちゃんとしとけば
推測されてもかゆくもないでしょ。
771名無しさん@お腹いっぱい。:2007/06/28(木) 18:49:36
cat /dev/urandom | od -x
772名無しさん@お腹いっぱい。:2007/06/28(木) 19:09:45
>>771
/dev/urandom はポータブルではないわけで、、
773名無しさん@お腹いっぱい。:2007/06/28(木) 19:10:47
こういう時はお約束だろ



>>771
catが無駄です。
774名無しさん@お腹いっぱい。:2007/06/28(木) 19:45:41
正規表現もそれぞれで実装がまちまちなのに、なにを言ってるのか
775名無しさん@お腹いっぱい。:2007/06/28(木) 19:53:31
そもそも正規表現エンジンが内蔵されてる sh なんかあったっけ?
776名無しさん@お腹いっぱい。:2007/06/28(木) 20:07:27
詳説シェルスクリプトが必要とされているな
777名無しさん@お腹いっぱい。:2007/06/28(木) 20:09:05
なんで正規表現の話が出てきたんだ?
778名無しさん@お腹いっぱい。:2007/06/28(木) 20:13:15
774さんの説明に期待
779名無しさん@お腹いっぱい。:2007/06/29(金) 01:27:29
激しくどうでもいいが、Solarisの/sbin/shは動的リンクされているぞ。
ていうか、間違いだらけの知識を持ってるやつほどSolarisをバカにする傾向があるな。
780名無しさん@お腹いっぱい。:2007/06/29(金) 01:33:43
>>779
Sol10 からね。Sol9 までは static link。
781名無しさん@お腹いっぱい。:2007/06/29(金) 03:23:19
最近Solarisを使いだした奴に限って、Solarisをマンセーしたがる傾向があるな

の間違いでした
782名無しさん@お腹いっぱい。:2007/06/30(土) 16:06:14
>>748
747じゃないけど "$@" -> ${1+"$@"} とするのは set -u でもエラーにならない為かと
すくなくともある環境では0を除いた位置変数が未設定なら前者はパラメータ未設定エラーになるから

別に""の互換性の理由だけで${1+"$@"}にする訳ではないでしょ
783782:2007/06/30(土) 16:14:29
誤) 為かと
正) 為でもあるかと
784名無しさん@お腹いっぱい。:2007/06/30(土) 17:05:31
>>782
実際に ${1+"$@"} が使われてるのは set -u のところじゃない。
コマンドのラッパーで引数を渡す時の話。
なので、>>782 の話は当たっていない。
785名無しさん@お腹いっぱい。:2007/06/30(土) 17:10:16
${1+"$@"} と書くのは、位置パラメータがない場合に
空文字列が残らないようにするため。
他に、${@+"$@"} という書き方もある(あった)。

今議論になってるのはそこじゃなくて、
未だに ${1+"$@"} が必要なシェルが現存しているかどうか、
現存しているなら そのOS名は? という質問。
786名無しさん@お腹いっぱい。:2007/06/30(土) 17:59:27
>>784-785
「でもあるかと」と訂正してるんだが

実際 set -u 設定状態でコマンドラッパーに"$@"で渡そうとしても
$@ を評価(展開)する段階で未設定と判定された訳で

空文字列が残るかどうかなんて今時大抵解消されてるでしょ
幾つかのOS、幾つかのB系シェルを触ったことはあるけど個人的には見たことがない

ただ単純に ${1+"$@"} -> "$@" として問題ないか?と聞かれたら
set -u で問題が起きるからダメだと



787名無しさん@お腹いっぱい。:2007/06/30(土) 18:24:29
>>786
で、その set -u で問題が出たOSって何?
788782:2007/06/30(土) 18:25:32
上の文、言葉のチョイスが変だわ

もともと空文字列対応で今時 ${1+"$@"} とする必要はあるか?かもしれんが、
たとえその為の対応が不要になったとしても、${1+"$@"} -> "$@" にしていいことにはならんよと言いたい

理由は以下のスクリプトを実行するとエラーになる環境もあるからと

#!/bin/sh
set -u
echo "$@"



789名無しさん@お腹いっぱい。:2007/06/30(土) 18:29:44
>>788
だから、そのエラーになる環境は何なのかと。

俺のところの *BSD/Solarisとあと犬で、エラーになるのはひとつもないのだが。
790名無しさん@お腹いっぱい。:2007/06/30(土) 18:56:23
>>789
そのSolarisじゃないの? ほんとに試してみた? バージョンによるのかな?

結局互換性の最大の問題はいつもSolarisだなww
791名無しさん@お腹いっぱい。:2007/06/30(土) 20:36:50
古いSolarisで見限っちゃったやついっぱいいるからな
いまのSolarisをしらない奴がいてもしょうがない

792名無しさん@お腹いっぱい。:2007/07/03(火) 01:38:27
今のソラリスは早いの?
おそーーーーーーーーいので、あまり使いたくない。
793名無しさん@お腹いっぱい。:2007/07/03(火) 12:33:55
昔からCPUなりのスピードは出てると思うがな...
794名無しさん@お腹いっぱい。:2007/07/04(水) 12:36:32
rm -rf /なんてもう古い
時代はmv /bin /ms.green
795名無しさん@お腹いっぱい。:2007/07/04(水) 22:29:33
誰か教えて。Bシェルで

test 1000000 -lt 9999999999
の結果が正にならないんだけど。数値型の値に制限とかあるのかな?
796名無しさん@お腹いっぱい。:2007/07/04(水) 22:31:41
>>795
bashだと無問題。「正」じゃなくて「真(0)」な。
797名無しさん@お腹いっぱい。:2007/07/04(水) 22:35:06
小さい値だとちゃんと真(0)になるんだけどなんでかな。
798名無しさん@お腹いっぱい。:2007/07/04(水) 22:35:10
>>795
実装依存だな。シェルによっては 31bit整数最大の 2147483647 が扱える最大値。
799名無しさん@お腹いっぱい。:2007/07/04(水) 22:37:55
>>798
ありがと。ちなみに対処法って何かあったりする?違う言語使うしかないか。
800名無しさん@お腹いっぱい。:2007/07/04(水) 22:42:13
>>799
bcに喰わせるとか。bcだともっと大きい数まで扱える。

echo '1000000 < 9999999999' | bc

bcでは、testとは逆で、真の場合1になって、それが標準出力に出る。
801名無しさん@お腹いっぱい。:2007/07/04(水) 22:55:38
ありがとう。試してみます。
802名無しさん@お腹いっぱい。:2007/07/05(木) 22:47:11
ipアドレスを0101って2進数にするにはまず・・・・・・・・なにすればいいの?
803名無しさん@お腹いっぱい。:2007/07/05(木) 23:01:13
小数点までを取り出す
804名無しさん@お腹いっぱい。:2007/07/06(金) 01:13:45
こんなのでどうだろう

 (echo obase=2; echo 1.2.3.4 | tr '.' '\012') | bc | xargs -n 1 printf %.8d
805名無しさん@お腹いっぱい。:2007/07/06(金) 01:23:00
もちょっとカイゼン:

 旧:(echo obase=2; echo 1.2.3.4 | tr '.' '\012') | bc | xargs -n 1 printf %.8d
 新:printf %d%.8d%.8d%.8d `echo obase=2.1.2.3.4 | tr . \; | bc`
806名無しさん@お腹いっぱい。:2007/07/06(金) 10:00:27
shebang が #!/bin/shのシェルスクリプト test.shを PATHの通った$HOME/bin に置いたところ、
tcsh では $ test.sh で動作するのに、
bash では $ test.sh で動作せず、
$ bash -c test.sh でも動作しませんでした。

/usr/local/bin/以下に置いたところ、
bash上の $ test.shは動作しましたが、
やはり、$ bash -c test.sh は動作しません。

この原因は、どのあたりにあるのでしょうか。
ヒントでよいので教えてください。
807名無しさん@お腹いっぱい。:2007/07/06(金) 10:26:25
>>806
(t)cshと(ba)sh では、PATHの変数が違う。本当はPATHを通し忘れているというオチ。
あるいは、.bashrcでPATHが再設定されてしまっているとか。
808806:2007/07/06(金) 10:42:36
>>807
bash上で、$ set | grep PATH すると、$HOME/binも入っているのですが、
やっぱり、PATH関係っぽいですよねぇ。

$ bash -c test.shができないのが気持ち悪いです。

ちなみに、$ $HOME/bin/test.sh では実行できました。
809名無しさん@お腹いっぱい。:2007/07/06(金) 10:46:13
>>808
setじゃなくて、printenvで確認した方がいい。
シェル変数のPATHのみセットされていて、exportされてない可能性がある。
すると、bash -c とかやった時、新しいbashにはPATHが引き継がれないから、
そういう現象が起きる。
810806:2007/07/06(金) 10:59:27
>>809
exportされないというのは盲点でした。
おっしゃるとおり、
$ printenv | grep PATH
をしたところ、$HOME/binも含まれていました。
一応、.bashrcでの設定はきいているんですよね。

ググったところ、Cygwin上では、
bashのバグ?かなにかで、bash -c がきかない現象があるようです。

遅くなりましたが、自分の環境は linux 、bash 3.1 です。

811名無しさん@お腹いっぱい。:2007/07/06(金) 11:09:47
ユーザ名だけ伏せていいから、完全なスクリーンダンプ出せ
812806:2007/07/06(金) 12:10:14
>>811
席を外していまして、遅くなってすいません。
スクリーンダンプは以下のようなものでよろしいでしょうか。
実はtest.shは、navi2chインライン画像表示のためのシェルスクリプトで引数もとります。

i) bash上で実行

$ bash --verbose -c navi2ch.makethumb http://www.google.co.jp/intl/ja_jp/images/logo.gif
navi2ch.makethumb
$ sh -x navi2ch.makethumb http://www.google.co.jp/intl/ja_jp/images/logo.gif
+ tmp=/tmp/navi2ch-thumbnails
+ origfile=/tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif
+ thumbfile=/tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
+ thumbsize=300x150
+ '[' '!' -f /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif ']'
+ '[' -z '' ']'
+ /usr/bin/wget http://www.google.co.jp/intl/ja_jp/images/logo.gif -q -N -x -P /tmp/navi2ch-thumbnails
+ '[' '!' -f /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
+ thumbsize=300x150
+ '[' '!' -f /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif ']'
+ '[' -z '' ']'
+ /usr/bin/wget http://www.google.co.jp/intl/ja_jp/images/logo.gif -q -N -x -P /tmp/navi2ch-thumbnails
+ '[' '!' -f /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif ']'
++ identify -format %n /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif
+ scene=1
+ '[' '!' -s /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg -o /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg -ot /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif ']'
+ '[' 1 -gt 1 ']'
+ convert -sample 300x150 /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
+ echo -n /tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
/tmp/navi2ch-thumbnails/www.google.co.jp/intl/ja_jp/images/logo.gif.jpg
813806:2007/07/06(金) 12:13:07
>>812
上の方の
$ bash --verbose -c
では、画像は取得されませんでした。
下の方の
$ sh -x
は、画像が取得されました。
814名無しさん@お腹いっぱい。:2007/07/06(金) 12:18:15
なんかよくわからんけど
フルパス指定じゃだめ?
815名無しさん@お腹いっぱい。:2007/07/06(金) 12:32:04
改行コードが CRLF になってないか?
816名無しさん@お腹いっぱい。:2007/07/06(金) 12:39:22
>>812
test.shが問題だというから、
ちゃんと問題を切り分けて小さくしてるのかと思ったら、それかよ
.bashrcの中身も、printenv PATH そのものも、隠さず出したら?
817806:2007/07/06(金) 12:52:00
/usr/local/bin/下のnavi2ch.makethumbを消し、~/bin/navi2ch.makethumbだけにして、
もう一度試したところ、bash上でも
$ navi2ch.makethumb 引数
が実行できました。
しかし、
$ bash -c navi2ch.makethumb 引数
は、やはり実行できませんでした。

>>814
フルパス指定だとbash上でも実行できます。

一応、回避策として、/usr/local/bin/に置いているので、具体的な支障はないのですが、
"bash -c"だけがうまく動いてくれないのはなぜだろうと不思議に思って、質問しました。

だから、本当はこんなにレスしていただくほどのことでなくて、申し訳ないです。

>>815
nkf でチェックしたところ、EUC-JPでした。(環境はja_JP.UTF-8)
cat -v で見ても、改行コードらしきものはありませんでした。

818名無しさん@お腹いっぱい。:2007/07/06(金) 13:06:23
PATHの問題は知らんけど、引数を渡すのなら
bash -c 'navi2ch.makethumb 引数'
じゃないと駄目だろ
819806:2007/07/06(金) 13:07:41
>>816
#!/bin/sh
echo test

のようなシェルスクリプトですと、~/bin/以下に置いて、
$ bash -c test.sh
test
と実行できます。

$ printenv PATH
/home/mona/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games

ふだんbashを使っていないので、~/.bashrcはありものです。
~/.bashrc
PATH=$HOME/bin:$PATH
↑とりあえず、これだけにしました。

これでもやはり、
$ bash -c navi2ch.makethumb http://www.google.co.jp/intl/ja_jp/images/logo.gif
では画像を取得できませんでした。

"bash -c"はいろいろときびしそうですね。
820806:2007/07/06(金) 13:12:21
>>818
$ bash -c 'navi2ch.makethumb 引数'

で画像を取得出来ました。

超基本的なことに気付かず、おさわがせして申し訳ないです。
どうもすみませんでした。
ほんとうにごめんなさい。
821名無しさん@お腹いっぱい。:2007/07/15(日) 17:20:37
http://blog.miraclelinux.com/thethird/2006/12/post_4e7b.htmlo


(sleep $ALIVE_TIME; ps $$ && kill -INT $$; sleep 1; ps $$ && kill -KILL $$)
1秒待ってもう1度だけkillしてるのはなぜなんですかね?
822名無しさん@お腹いっぱい。:2007/07/15(日) 17:56:03
>>821
よく見ろ。-INT と -KILL で違うだろ。
823名無しさん@お腹いっぱい。:2007/07/15(日) 22:02:12
本当だ。失礼しますた。
824名無しさん@お腹いっぱい。:2007/07/16(月) 22:04:04
シェルスクリプトでif文に正規表現による文字列一致条件を記述できないでしょうか?
sedなどを使ってやればできないことはないですが、
if文一発でできればいいなと。。
825名無しさん@お腹いっぱい。:2007/07/16(月) 22:07:47
>>824
できない。
正規表現と言ってるが、実際にはワイルドカードで十分なことが多い。
ワイルドカードなら ifの代わりに caseを使えばできる。
826名無しさん@お腹いっぱい。:2007/07/16(月) 22:08:01
case使え。
827名無しさん@お腹いっぱい。:2007/07/16(月) 22:25:25
モレはいっつもテストコマンドの中でegrep使ってるけど・・・・素人なのでアフォな事やってるのかも。
828名無しさん@お腹いっぱい。:2007/07/16(月) 23:48:40
if expr $string : $regex >/dev/null; then
...
829名無しさん@お腹いっぱい。:2007/07/17(火) 23:10:26
>>827
機能・性能に問題なきゃそれで充分だろ。

コンピュータ (て言うか、道具) なんて楽するためにあるんだから。
830827:2007/07/17(火) 23:45:10
じゃあ、>>824もそれでよろ(w
831名無しさん@お腹いっぱい。:2007/07/22(日) 20:41:39
UNIX上からリモートでWindowsのバッチを起動させるシェルスクリプトを
作りたいのですが、実装イメージがまったくわからず困ってします。

Win相手に対してrshは使えないであろうし。。。何かいい方法をご存知の方
いらっしゃいませんか。よろしくお願いいたします。
832名無しさん@お腹いっぱい。:2007/07/22(日) 20:44:38
スレ違い
833名無しさん@お腹いっぱい。:2007/07/22(日) 21:38:16
>>831
cygwin + sshdとかな。
834名無しさん@お腹いっぱい。:2007/07/22(日) 23:07:17
>>831
Windows が 2k / XP なら、telnet でどうぞ。
835名無しさん@お腹いっぱい。:2007/07/22(日) 23:07:46
836824:2007/07/22(日) 23:08:49
実行時間は case < expr < sed だったので
結局、caseにしときました。
837831:2007/07/22(日) 23:48:25
>>833>>835
アドバイスありがとうございます。cygwinについて
あまり知識がないので調べてみます。

>>834
telnetで可能ということは、Win上でtelnetサービスを
稼動させておけばいいということでしょうか?

明日にでも実施してみようと思います。
ありがとうございました。
838名無しさん@お腹いっぱい。:2007/07/24(火) 01:24:43
> telnetで可能ということは、Win上でtelnetサービスを
> 稼動させておけばいいということでしょうか?

手元の 2k だと特にわざわざ入れた覚えはないから、多分
標準で入ってると思う。

サービスの中に telnet ってあるはずだから、それを起動
するだけ。

常用するなら、スタートアップの種別を「自動」にする。
839名無しさん@お腹いっぱい。:2007/07/24(火) 03:17:55
telnetは対話型だから、ダメというかめんどくさいだろ。
840名無しさん@お腹いっぱい。:2007/07/24(火) 07:39:36
expectとか使えばいいだけじゃないの?
841名無しさん@お腹いっぱい。:2007/07/24(火) 21:43:20
下記のようなファイル検索をするシェルを作ったのですがうまく動きません

#!/bin/csh
echo 検索するファイル名を入力してください:
set filename = $<
(find /* -name $filename -type f -print > /dev/tty) > & /dev/null

「hoge.txt」を検索する場合はうまくいくのですが、
ワイルドカードを用いた「hoge\*」の検索をすると検索を行わずに一瞬で終了してしまいます。

setで変数に"\*"を入力するのは不可能なのでしょうか?
842名無しさん@お腹いっぱい。:2007/07/24(火) 21:45:14
今日はカレーにする
843名無しさん@お腹いっぱい。:2007/07/24(火) 21:50:39
844名無しさん@お腹いっぱい。:2007/07/24(火) 21:52:21
・シェルスクリプトのことをシェルってゆーな

クオートすれば?
845名無しさん@お腹いっぱい。:2007/07/24(火) 22:31:26
シェルってゆうな。クズ。
csh捨てろ。クズ。
846名無しさん@お腹いっぱい。:2007/07/24(火) 22:34:46
スルーカ
847名無しさん@お腹いっぱい。:2007/07/24(火) 22:44:48
>>843-845
すんまそん、会社でシェルシェル言ってるもんで癖がついてました。
クオート試してみることにします。
cshは会社の都合なんすよ
848名無しさん@お腹いっぱい。:2007/07/25(水) 06:21:28
>>847
最初の行に
sh
と書きゃいいじゃん。
849名無しさん@お腹いっぱい。:2007/07/25(水) 12:34:58
>>848
実社会で勉強してね
cshからshに変えるのは容易ではないのだよ
シェルスクリプトは1人で作るのではないし
1つの会社で作るものでもない
850名無しさん@お腹いっぱい。:2007/07/25(水) 14:06:37
つまり、1人だけではなく1つの会社だけでもなく、
いくつもの会社にまたがって何人もの人がよってたかって
>>841みたいなスクリプトを書いているわけだな。すげぇ。

つーか、csh を使うにしてもせめて #!/bin/csh -f にしろよ。
851名無しさん@お腹いっぱい。:2007/07/25(水) 14:13:50
>>841
の例は、わざわざcshの欠点が目立つような典型例だな。
ワイルドカードの展開の問題とか、
findのstderrを捨てるために苦労してるところとか。

そもそも、findをインタラクティブに実行させるようなスクリプトは、
システム管理用スクリプトじゃない。初心者ユーザー向けに作ったものだろ。

こんなの、/bin/shで書き直せば一発。
>>841 が抱えているcshでの問題も一気に解決する。


>>849 へ。
みんな実社会で「cshスクリプトは使わない」が常識だといってるんだよ。
>>849 は自分の会社名を公表しない方がいいよ。会社の不名誉になるからね。
852名無しさん@お腹いっぱい。:2007/07/25(水) 14:15:45
cshじゃなきゃだめな会社ってどこ?
853849:2007/07/25(水) 14:57:09
>>851
ま、会社名を挙げる気は無いけど、
おれんとこでは全部のスクリプトがcshだし
スクリプトの作成・保守を依頼している会社も
cshで作るようになっている。
OSが古いもの・新しいものが混在しているのも
理由ではあるが、
常識など、会社によって違うものだろ。
シェルがダメなのは分かるが、
シェルを変えろとか無理な話だ
854名無しさん@お腹いっぱい。:2007/07/25(水) 14:59:19
HP-UXでkshを使っているのですが、C-p・C-nで履歴検索ができるとmanpageに書いてあるのですが、
実行しても何も起きません。
どうすればよいのでしょうか?
また、linuxのbashみたいに↑↓キーで履歴表示をしたいのですが、
kshで実現可能でしょうか?
855名無しさん@お腹いっぱい。:2007/07/25(水) 15:07:05
>>853
> OSが古いもの・新しいものが混在しているのも理由ではあるが、
/bin/shが存在しないUnixなんて無いんじゃないのか

> シェルがダメなのは分かるが、シェルを変えろとか無理な話だ
へえ。cshがダメなのははるか前からの常識なのに、誰もその
やりかたを変えようとせず、変えるのは「無理」だと思ってるんだ。
しかも古いスクリプトだけでなく、新しいスクリプトもわざわざ
cshで書き、ゴミを製造し続けていると。

勿論、C++やJavaやPythonなんて誰も使わないんだろうな。
ソース管理は未だにCVSでさえない、いやソース管理なんて概念もないね?

お前さんがアホなのか、会社がアホなのかは知らないが、実に見事に
アホだな。
856名無しさん@お腹いっぱい。:2007/07/25(水) 17:35:21
会社の都合なら仕方ないんだから
そんなに必死に弁解しなくていいよ
857名無しさん@お腹いっぱい。:2007/07/25(水) 20:55:10
>>853
だってさ、起動スクリプトとかOSに元々内蔵されてるスクリプトはshだよね?

そういうスクリプトを修正する時も、cshで書き直してるの?
858名無しさん@お腹いっぱい。:2007/07/25(水) 23:13:35
棄てる気になれば簡単に捨てられる。棄てられないのは>>853がヘタレなだけ。
859名無しさん@お腹いっぱい。:2007/07/25(水) 23:54:41
恐ろしいことにうちはコーディングルールでcsh使うことになってるorz

おまけに最近スクリプトでsql実行してるのを、「COBOLで実装しろ」って指摘された…
SQLの使い方調査があって、スクリプトが調査範囲から漏れたからだと。

860名無しさん@お腹いっぱい。:2007/07/26(木) 00:27:56
>>859
つまりOSインストール時からあるスクリプトも全部cshで書き直してるって事か?
861名無しさん@お腹いっぱい。:2007/07/26(木) 00:40:11
間違っているルールを変更できないなんて将来の無い会社だな。
862名無しさん@お腹いっぱい。:2007/07/26(木) 01:32:53
>>859
なんでcsh使うことになったの?
863名無しさん@お腹いっぱい。:2007/07/26(木) 04:05:17
袋叩きw

csh好きな勉強不足の若者の脳内会社なんだから許してやれよw
864名無しさん@お腹いっぱい。:2007/07/26(木) 10:27:50
某社と某社はcshだったな
皆さんがんばってね
865名無しさん@お腹いっぱい。:2007/07/26(木) 14:51:51
古いBroadVisionなんかだと、パッケージに
cshで書かれたシェルスクリプトがいっぱい付いてくるから
仕方が無い
866名無しさん@お腹いっぱい。:2007/07/26(木) 14:57:19
会社で使うシェルスクリプトなんてコマンド順番に起動して
戻り値チェックするくらいのもんだからな。
867名無しさん@お腹いっぱい。:2007/07/26(木) 17:05:58
それですむならそれでいい
868名無しさん@お腹いっぱい。:2007/07/26(木) 18:40:09
ジュセッペさんお元気?
869名無しさん@お腹いっぱい。:2007/07/27(金) 00:19:38
Zshまんせー
870名無しさん@お腹いっぱい。:2007/07/27(金) 01:30:36
>>866
俺はシェルスクリプトがないと会社で生きて行けんが。
871名無しさん@お腹いっぱい。:2007/07/27(金) 02:53:31
これお勧め:

つ ln /bin/sh /bin/csh

もっといいのは#!起動された時にスクリプトを調べて
昔からのcshスクリプトなら「しょうがなく」csh、じゃなきゃ
shにディスパッチするようにするとか。Linuxなら簡単だな。
872名無しさん@お腹いっぱい。:2007/07/27(金) 04:33:23
まぁ、/bin/shのシェルスクリプトを書かせたらbashスクリプトを書きやがったとか
*.shのファイルを開いたらbashスクリプトだったなんて事を無くす為なら
cshしか使うなってのもありかも知れん。
873名無しさん@お腹いっぱい。:2007/07/27(金) 07:10:12
ないないw
874名無しさん@お腹いっぱい。:2007/07/27(金) 08:49:35
20年モノのcshスクリプトが10万行単位である
とかね
875名無しさん@お腹いっぱい。:2007/07/27(金) 23:08:29
csherは平気でコピペで行数倍増するから10万行も妄想じゃないな。
876名無しさん@お腹いっぱい。:2007/07/27(金) 23:22:10
そんなコードだったな
877名無しさん@お腹いっぱい。:2007/07/27(金) 23:53:59
昔、(偽装)派遣で行ったところは csh が標準だったよ。
ひ孫請の俺がルールを変えるなんて無理だった。

当然ソース管理なんて概念もない。ファイルはタイムスタンプ
(mtime)で管理してたよ。もー馬鹿かアフォかと。

とりあえず、自分のコードは SCCS で管理してた。
当然フリーソフトウェアなんて得たいの知れないものは
使用禁止。

まだあの会社あるかな…
878名無しさん@お腹いっぱい。:2007/07/28(土) 00:03:54
某独立系大手とか
某システム系大手とか
879名無しさん@お腹いっぱい。:2007/07/28(土) 01:05:38

folder>------folder1---test
|
---folder2---test

folder1内にある実行ファイルtestを実行して、
その終了を待って、folder2内のtestを実行する
というスクリプトを作ったんですが、folder2の実行が行われません。
どこがいけなかったんでしょうか?ご教授ください。

#!/bin/sh


for i in 1 2

 do

    cd folder$i

    nohup test
    
wait $!

    cd ..

 done
880名無しさん@お腹いっぱい。:2007/07/28(土) 01:12:09
まず、なんでいちいちwait入れるのかわからん。
ほっとけば、終わってからしか次が実行されんだろ?
あと、本当にtestって名前なのか?
/bin/testかビルトインのtestが動いてるだけでは?
881879:2007/07/28(土) 01:24:56
>880
実際は、testっていうプログラムじゃないんですけど、
実行すると1日くらい走り続けるものです。
wait入れなくて実行したら、二重に実行されてしまったので。
二重に走らないようにしたいので、wait入れたのですが。
882名無しさん@お腹いっぱい。:2007/07/28(土) 01:58:54
実行したいモノを列挙すればいいんじゃね?
それで満たせない要件は後だしでくるような気もするけど
883名無しさん@お腹いっぱい。:2007/07/28(土) 02:20:46
cronかなんかで後から起動しちゃってるだけ?
waitって子プロセスの終了待つだけなんだから
バックグラウンドで動かさん限り無意味
884名無しさん@お腹いっぱい。:2007/07/28(土) 03:15:41
awkについて質問です。

echo "<tr><td></td></tr>" | awk '{print $1, $2, $3, $4}'

とすると、以下のように分解して代入されるようにしたいのですが、
awkのオプションをどのように指定すればよいでしょうか?
(同じことができるなら、awk以外でも構いません)

$1=<tr>
$2=<td>
$3=</td>
$4=</tr>

よろしくご教授お願いします。
885名無しさん@お腹いっぱい。:2007/07/28(土) 07:42:41
sed 's/></> </g' < "<tr><td></td></tr>" | awk '{print $1, $2, $3, $4}'
886名無しさん@お腹いっぱい。:2007/07/28(土) 08:52:38
  < "<tr><td></td></tr>"
この部分は何だ?
887名無しさん@お腹いっぱい。:2007/07/28(土) 09:32:29
そのくらいわからないのか
<tr><td>< というディレクトリの下に
td>< という子ディレクトリがあって、その下に
tr> というファイルがある。
その内容が
<tr><td></td></tr>
なのだ。
888名無しさん@お腹いっぱい。:2007/07/28(土) 09:46:10
hagewarosu
889名無しさん@お腹いっぱい。:2007/07/28(土) 16:48:50
>>884
なんで echo の中で FS 使っちゃいけないの?
890名無しさん@お腹いっぱい。:2007/07/28(土) 16:52:40
おばあちゃんの遺言で
891名無しさん@お腹いっぱい。:2007/08/01(水) 00:31:16
for f in 'ls -1'
do
echo ${f}
done

とか

for s in 'cat hoge.txt'
do
echo ${s}
done

なんかは、基本だな
892名無しさん@お腹いっぱい。:2007/08/01(水) 01:12:54
>>891
何が言いたいのかさっぱりわからん。
893名無しさん@お腹いっぱい。:2007/08/01(水) 02:11:41
if分で「$numbarが10から1000の間なら」という分岐は可能でしょうか?

if [ $numbar = 10 -o $numbar = 11...]

と地道に書いていくしかだめですか?
894名無しさん@お腹いっぱい。:2007/08/01(水) 02:24:09
っman test
895名無しさん@お腹いっぱい。:2007/08/01(水) 02:38:29
case $number in
[1-9][0-9]|[1-9][0-9][0-9]|1000)
....
;;
esac
896名無しさん@お腹いっぱい。:2007/08/01(水) 08:14:47
>>895
0点
897numbar warota:2007/08/01(水) 21:58:49
>>893
[ "$number" -ge 10 -a "$number" -le 1000 ]
898名無しさん@お腹いっぱい。:2007/08/01(水) 22:58:41
>>897
引っかけ問題に引っかかりましたねぇ。
>>893 の問題では、シェル変数名は number じゃなくて numbar
前任者から引き継いだスクリプトとかで変数名がミススペルで、
自分が正しいスペルで書き足すと動かなくて1日悩むこと、よくあるでしょ?
そのための練習問題でした。
899名無しさん@お腹いっぱい。:2007/08/01(水) 23:03:02
>>898
死ぬほどどうでも良いですね。
900名無しさん@お腹いっぱい。:2007/08/02(木) 20:28:27
>>898
おまい、100回くらい死ねよ
901ウサチャソ:2007/08/02(木) 21:08:52
バージョンの略を var と書いてしまう奴は結構いるよな。
902名無しさん@お腹いっぱい。:2007/08/02(木) 21:22:54
見たことないぞそんな奴。
903名無しさん@お腹いっぱい。:2007/08/02(木) 21:25:20
スペルミスならもっと酷いのをいくらでも見たことがある
904名無しさん@お腹いっぱい。:2007/08/02(木) 21:41:27
ここで伝説のuwariteが登場。
905numbar warota:2007/08/02(木) 22:07:37
>>898
シェルスクリプトごときで1日も迷うねーよ。
それと、From:見る癖つけたほうが良い。
906名無しさん@お腹いっぱい。:2007/08/03(金) 00:34:20

「対話的な利用についての話はスレ違い」ってあるけど、
どこに逝っていいのか教えて頂けないでしょうか〜

expect があることは知ってるけど、
インストールが必要だからダメだって。

とりあえず、どういう選択肢があるか知りたいです。


あと perl の話になるんだけど、
Expect.pm を Makefile.pl とか CPAN での
インストールをしないで(起動ディレクトリにモジュールを置くだけとかで)
起動する方法があれば、誘導をお願いしたいです。


907名無しさん@お腹いっぱい。:2007/08/03(金) 00:37:46
>>906
ポエムは確か別の板があったはずだぞ。
908名無しさん@お腹いっぱい。:2007/08/03(金) 01:12:06
>>907

ポエム?

なんかアフォ扱いみたいな感じだけど、
変なこと書いてるんかなー? よく分からん。


とりあえず反応ありがと。
909名無しさん@お腹いっぱい。:2007/08/03(金) 02:14:06
>906 は対話的の意味を勘違いしているに一票
910名無しさん@お腹いっぱい。:2007/08/03(金) 02:17:29
>>906
インストールがダメって言うなら、現行環境に入ってる使えそうな道具立てはなんなのよ?

それとは別に、「対話利用についての話題禁止」の意味をつかめてないに一票
911名無しさん@お腹いっぱい。:2007/08/03(金) 08:19:15
>>909,910

ぐぐってみた。↓に書いてある「対話」?
(例えばどんな話が禁止なのかは分からんが。。)

0からのbash 第1回:対話的シェルの使用法(1) 1.はじめに
http://www.stackasterisk.jp/tech/systemManagement/bash01_01.jsp


>>910

何を書けばいいんだろ。

telnet, ftp, rsh, perl

Expect.pm は上に書いたように
Windows での単体 exe みたいなイメージ
(インストールが必要ない)ならおkらしい


912名無しさん@お腹いっぱい。:2007/08/03(金) 08:56:32
で、結局何をしたいのよ?
913名無しさん@お腹いっぱい。:2007/08/03(金) 10:30:08
>911
やりたいことをできるだけ具体的に
914名無しさん@お腹いっぱい。:2007/08/03(金) 17:58:16
今度、会社で、シェルを使わなければならない可能性が発生する恐れがあるかも知れない状況になる兆しが出て来ました。
とりあえず初心者がシェルの方を始めるには、どのシェルの方から始めればいいでしょうか?
開発ツールの方とか、デバッガーの方はGUIの方であるんでしょうか?
できればフリーの方を希望します。
915名無しさん@お腹いっぱい。:2007/08/03(金) 18:11:06
>>914
> 可能性が発生する恐れがあるかも知れない状況になる兆しが出て来ました。
それぞれ20%と仮定すると、4段階あるから、0.16%だ。
悲観的すぎー

916名無しさん@お腹いっぱい。:2007/08/03(金) 18:17:25
どれがいいかは会社に聞け。
GUI はないと思っていい。
917名無しさん@お腹いっぱい。:2007/08/03(金) 18:18:59
まず日本語を勉強したほうがいいと思われ
918名無しさん@お腹いっぱい。:2007/08/03(金) 22:35:37
>>914
sh
919名無しさん@お腹いっぱい。:2007/08/03(金) 23:10:59
面白いと思ってやってるんだろうか? 低脳としか比喩できない釣りだ。
920名無しさん@お腹いっぱい。:2007/08/03(金) 23:39:16
>>906

push(@INC, '/home/hiroyuki')

とかやればモヂュールのサーチパスに追加されるんじゃないの?
921名無しさん@お腹いっぱい。:2007/08/03(金) 23:40:37
>>919
お前の語彙が少ないのはどうでも良い。
922名無しさん@お腹いっぱい。:2007/08/03(金) 23:48:38
>>916
wishとかwkshとかPowerShellかもしれないじゃないか!
923名無しさん@お腹いっぱい。:2007/08/04(土) 00:37:18
>>921
悔しいのか? でもつまらんものはつまらん。
924名無しさん@お腹いっぱい。:2007/08/04(土) 00:41:13
おや、>>914 が餌をまいているのに、
「シェルってゆーな」の人が登場する可能性が発生する恐れがあるかも知れない状況になる兆しが出て来ませんねぇ
925名無しさん@お腹いっぱい。:2007/08/04(土) 02:19:39
シェルってゆーな
926名無しさん@お腹いっぱい。:2007/08/04(土) 07:31:21
>>915

X 恐れ
◯ 虞れ
927名無しさん@お腹いっぱい。:2007/08/04(土) 09:22:51
>>926
それを言うなら、送り仮名が違う

×虞れ
○虞

ただし、「虞」は常用漢字じゃなく、現在では「恐れ」と表記するのが標準。
ぐぐってみても、「○○する恐れ」は多数ヒットするが、「○○する虞」はごくわずか。
928名無しさん@お腹いっぱい。:2007/08/04(土) 09:34:48
>>924
お前、センスが皆無な上に致命的に頭悪いな。
> シェルスクリプトをシェルとゆうな。
なので、>>914は(呆れるほどつまらない釣りだが)誤用無し。
929926:2007/08/04(土) 14:34:15
>>927
うちのAnthyはそこまでバカじゃない。
送り仮名は「敢えて」俺が書き足した物。

>>ぐぐってみても、「○○する恐れ」は多数ヒットするが、
>>「○○する虞」はごくわずか。

世の中全体が、バカになって来たということですな。
(負の)probabilityをterribleと表記することの
とんでもなさに違和感を感じないとはねぇ・・・
930名無しさん@お腹いっぱい。:2007/08/04(土) 14:39:54
>>929
英語でも I'm afraid ... って言うじゃん。
単に可能性だけじゃなく、もしそうだったら困ると言うニュアンスがあるから
「恐れ」で的確。
いいことに対しては確率が低くても「恐れ」とは言わないし。

ちなみに、probabilityは 0 <= probability <= 1 でしか定義できない。
負のprobabilityなんて言ってる時点で、お前数学も苦手だっただろw
931名無しさん@お腹いっぱい。:2007/08/04(土) 15:26:14
悪い事象の発生するおそれって意味じゃないの。
930はprobability=(数学的)確率というバカの一つ憶えしかしてないから
早合点したんだろう。蓋然性って日本語知ってるか?
932名無しさん@お腹いっぱい。:2007/08/04(土) 15:40:52
>>931
確率を蓋然性と言い替えたところで本質は変わらない。
(数学以外でも)「負の確率」なんて存在しない。
「負の確率」という言葉が出てしまった時点で、アンタの負け。
933931:2007/08/04(土) 16:15:22
てんで指摘を理解してないな。俺は929じゃないし。
日本語も英語もダメな人みたいだね。
934名無しさん@お腹いっぱい。:2007/08/04(土) 16:18:28
もし「悪い事象が起きる確率」のことを「負の確率」と言ったのなら、
それは数学だけじゃなく日本語としてもおかしい。
確率を理解していないことになる。
よって、>>931 のように弁護しても、やはり >>929 は間違い。
935931:2007/08/04(土) 16:21:39
やっぱり理解してないなw
936名無しさん@お腹いっぱい。:2007/08/04(土) 16:22:41
>>934は負の遺産とか負の感情とかいう言葉も使わないんだろうな。
937名無しさん@お腹いっぱい。:2007/08/04(土) 16:37:03
>>936
負の遺産は本当に「負」だろうが。
借金はマイナスの遺産。マイナスだからこそ「負」と言って正しい。

ところが、確率は絶対に「負」にはならない。
負の確率なんて存在しない。
938名無しさん@お腹いっぱい。:2007/08/04(土) 16:45:18
新聞でも、「…する恐れ」って書いてるよ。

>>936 は別の意味で「負」を理解してないなw
939名無しさん@お腹いっぱい。:2007/08/04(土) 17:08:59
937は借金のことを負の遺産というと思ってるのか。
940名無しさん@お腹いっぱい。:2007/08/04(土) 17:17:16
>>939
借金が負の遺産として一番わかりやすい例ということだろ。
いずれにしても負の遺産はマイナスのものに違いない。

で、「負の遺産」を持ち出しても、「負の確率」を正当化することはできない、
という点は理解してますか?
941名無しさん@お腹いっぱい。:2007/08/04(土) 17:20:47
じゃあ負の感情についても論破してみて。
942名無しさん@お腹いっぱい。:2007/08/04(土) 17:28:35
>>941
好感度を数値化できるものとする。
平常心での好感度は0で、何かに好感を持った時プラスの好感度になる。
逆に嫌悪感を持てば、マイナスの好感度になる。
マイナスの好感度は「負の感情」と言ってもいい。
だから「負」で正しい。
(だから「負の確率」を肯定する材料にはならない)
943名無しさん@お腹いっぱい。:2007/08/04(土) 18:37:06
>>942
別の高尚なスレッドでやってください。
944名無しさん@お腹いっぱい。:2007/08/04(土) 19:36:54
そうだな。
どうせ表現するならエロでやってくれなきゃわからん。
945名無しさん@お腹いっぱい。:2007/08/04(土) 21:33:50
漢和辞典ひいてみると、虞の項目には「可能性」という文字はないが、恐れには「可能性」と書いてある。
どちらの項目にも「心配する」の意味はある。
広辞苑でも、恐れのほうが虞より先に載っている。
probabilityは見こみで考えたらいいじゃないかな。
946名無しさん@お腹いっぱい。:2007/08/04(土) 21:54:59
>>945
邪魔だと言っている。

意味が分からないならお得意の広辞苑を引いてくれ。
947名無しさん@お腹いっぱい。:2007/08/05(日) 18:41:23
エアコンの室外機が壊れたんですが
お金がないのです
どうしたらいいでしょうか?
948926:2007/08/05(日) 18:59:36
>>930-945
夜勤明けに遊びに行って、帰ってきたらば
この有様w
板違いだけど感受性がおもしろすぎて、嬉しくなるねぇ。

ちなみに(負の)probabilityってのは、
negativeな蓋然性の意味で用いた訳だが・・

あ、あと「マイナスの確率」ってのも
概念的には存在しうるね。
(数学ではなく統計学になるけど
日本語として間違いでは無いよね)
虚数よりは遥に理解しやすい。
949名無しさん@お腹いっぱい。:2007/08/05(日) 19:53:10
>>948
土曜に夜勤か。ご苦労さん。
俺は優雅な休日だった。
950名無しさん@お腹いっぱい。:2007/08/05(日) 23:00:59
>>948
符号付(確率)測度なんて、数学では大して珍しくも無い概念だが…?
951名無しさん@お腹いっぱい。:2007/08/06(月) 07:38:00
ハッシュ汽盆!!
952名無しさん@お腹いっぱい。:2007/08/06(月) 16:33:27
自己顕示欲の固まりが集まるスレはここでつか?
953名無しさん@お腹いっぱい。:2007/08/06(月) 20:18:07
その確立200%
954名無しさん@お腹いっぱい。:2007/08/06(月) 20:23:11
まあ、おれは例外だけどなw
955名無しさん@お腹いっぱい。:2007/08/06(月) 21:15:58
>>953
×確立
○確率

国語苦手かよw
956名無しさん@お腹いっぱい。:2007/08/07(火) 00:56:36
200%も突っ込みどころだろw
957名無しさん@お腹いっぱい。:2007/08/08(水) 03:18:10
すみません。
シェルスクリプトというかコマンド一発で
デバイス(eth0とかeth1とか)を出力することってできますか?
もしよかったらコマンド一発でおしえてください。お願いします。
958名無しさん@お腹いっぱい。:2007/08/08(水) 03:57:05
くだ質へいきなさい。
959名無しさん@お腹いっぱい。:2007/08/08(水) 09:44:57
Linuxの話ならこっちな。
くだらねえ質問はここに書き込め! Part 150
http://pc11.2ch.net/test/read.cgi/linux/1185111932/
960名無しさん@お腹いっぱい。:2007/08/08(水) 09:52:29
すみません。
シェルスクリプトというかコマンド一発で
デバイス(fxp0とかde1とか)を出力することってできますか?
もしよかったらコマンド一発でおしえてください。お願いします。
961名無しさん@お腹いっぱい。:2007/08/08(水) 10:04:34
つまんね。
962名無しさん@お腹いっぱい。:2007/08/08(水) 10:26:35
>>960
まずはいっぱつやらせろ。話はそれからだ。
963名無しさん@お腹いっぱい。:2007/08/08(水) 10:50:43
アッーーーーーー!
964名無しさん@お腹いっぱい。:2007/08/08(水) 16:53:39
ふむ
analyzeってことか
965名無しさん@お腹いっぱい。:2007/08/08(水) 17:40:37
くそつまんねえネタはやめろ
966名無しさん@お腹いっぱい。:2007/08/08(水) 18:08:48
ふむ
お通じ快適ってことか
967名無しさん@お腹いっぱい。:2007/08/08(水) 21:00:51
くそスレ化するかどうかのふんばり時だな
968名無しさん@お腹いっぱい。:2007/08/09(木) 21:06:16
CentOS Linux on Xen
tcsh 6.13.00

たまになんだけど、
cd dir
ls | echo 1
ls | echo 1 ; echo
ってやったあとに
ls
って打つとtcshが固まるのは何故??

バージョンあげれですかそうですか。
969名無しさん@お腹いっぱい。:2007/08/09(木) 21:10:05
>>968
それはXenとかCentOSにフィードバックしてあげれば?

スレ違いとか板違いっぽいけど
970名無しさん@お腹いっぱい。:2007/08/09(木) 21:10:47
>>968
くそスレ化のための燃料ですか?
971名無しさん@お腹いっぱい。:2007/08/09(木) 21:12:46
>969
はえーなw
そうするわ<フィードバック

再現できた。
ls | echo 1^C
ls
972名無しさん@お腹いっぱい。:2007/08/10(金) 10:31:14
aシェルの中でbコマンドをバックグラウンドで実行した場合、
bはまだ実行中だけど、aが終了したときにbにシグナルを送って強制的に終了することってできますか?

973名無しさん@お腹いっぱい。:2007/08/10(金) 11:10:07
>>972
trap "kill $pid;kill -0 $pid && { sleep 1;kill -9 $pid; }; :" EXIT
974名無しさん@お腹いっぱい。:2007/08/10(金) 11:33:26
>>973
trap: Illegal number: EXIT
975名無しさん@お腹いっぱい。:2007/08/10(金) 13:18:19
>>974
trap "kill $pid;kill -0 $pid && { sleep 1;kill -9 $pid; }; :" 0
976名無しさん@お腹いっぱい。:2007/08/10(金) 13:26:23
スクリプトで排他制御をする手っ取り早く確実な方法は何でしょうか?
セマフォ使えればいいんだけど、そんなコマンドないもんね・・・
977名無しさん@お腹いっぱい。:2007/08/10(金) 13:38:33
>>973
ありがとうございます。
ちなみにSIGKILLはどうしようもないですよね・・・
978名無しさん@お腹いっぱい。:2007/08/10(金) 13:41:55
子の側でときどき親が生きてるか確認する、とか。
979名無しさん@お腹いっぱい。:2007/08/10(金) 13:47:20
>>976
FreeBSDには
LOCKF(1) FreeBSD General Commands Manual LOCKF(1)
NAME
lockf -- execute a command while holding a file lock
がある。
980名無しさん@お腹いっぱい。:2007/08/10(金) 23:17:10
>976
lockf は簡単だけど無ければ mkdir を使うんじゃね?
981名無しさん@お腹いっぱい。:2007/08/11(土) 19:03:37
ksh93での質問です。

typeset -A で連想配列を使用したいんですが、ksh93でKey値の一覧を取得する方法ってあるんでしょうか?
(Perlでいうとkeys関数みたいな感じで)
982名無しさん@お腹いっぱい。:2007/08/11(土) 20:05:44
ksh93をつかっているUnixってあるんだな。
983名無しさん@お腹いっぱい。:2007/08/11(土) 21:25:48
>>982

ソースが公開されてんのって、ksh93だから、LinuxやFreeBSDとかでもpdksh以外のkshを使おうとすると、ksh93になるよね。
逆にksh88的に使いたいならpdkshになるんだけど、pdkshはpdkshでksh88とは振る舞いが結構違うのでいたいところがあるね。
商用系のUnixだと、AIXは/bin/ksh93がksh93、/bin/kshはksh88。HP-UXやSolarisはどうなんだろ?一応、ksh93は存在するみたいだけど・・・
984名無しさん@お腹いっぱい。:2007/08/11(土) 22:08:09
HP-UX11iv1とSolaris8/9/10はksh88しかない。
985名無しさん@お腹いっぱい。
posix-sh をつかうとか