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

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

□前スレや過去スレ:
シェルスクリプト総合 その1
http://pc8.2ch.net/test/read.cgi/unix/1101820646/
☆シェルスクリプトを勉強するにあたって☆
http://pc5.2ch.net/test/read.cgi/unix/989659936/
便利なシェルスクリプト見せろ
http://pc5.2ch.net/test/read.cgi/unix/996949546/
【貝】第1回シェル講座【殻】
http://fun.kz/test/read.cgi/unix/1016372780/

□関連スレ:
sed
http://pc8.2ch.net/test/read.cgi/unix/1085730992/
おまえら! shell は何を使っているんですか?
http://pc5.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc8.2ch.net/test/read.cgi/unix/1102921590/

□他板の関連スレ:
Macでシェルスクリプト総合 Part 1
http://pc7.2ch.net/test/read.cgi/mac/1105074933/
【Shell】どのシェル使ってる?【Script】
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
2名無しさん@お腹いっぱい。:2005/04/17(日) 00:17:59
□お約束
・特記なき場合はbourne shがデフォルトです。
 bash/csh/tcsh/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな

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

□初心者向けリンク
「誰にでも」シリーズ
http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/dareUni/
/bin/shプログラミング入門
http://freebooks.info.nara-k.ac.jp/archive/ShellProgramming/
Bourne Shell 自習テキスト
http://www.tsden.org/takamiti/shText/shText.html
シェルを使おう - 導入からプログラミングまで -
http://www.netfort.gr.jp/~tomokuni/lms/shell/text/
3名無しさん@お腹いっぱい。:2005/04/17(日) 00:18:44
□入門者向け書籍:
プロフェショナルシェルプログラミング
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

□関連書籍と関連リンク:
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/
4名無しさん@お腹いっぱい。:2005/04/17(日) 00:20:03
□シェルスクリプトでよく使うコマンド:
制御・条件判定系:
[,test,expr,true,false,yes,getopts

テキスト処理系:
cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join

ファイル名・ディレクトリ系:
find,xargs,basename,dirname

出力系:
echo,printf

対話コマンド制御系:
expect

http/ftpの処理自動化:
wget,curl
5名無しさん@お腹いっぱい。:2005/04/17(日) 00:21:44
では、引き続きマターリと逝きましょう。
6名無しさん@お腹いっぱい。:2005/04/17(日) 00:39:49
>>1
7名無しさん@お腹いっぱい。:2005/04/17(日) 03:42:00
乙。でも見辛いような気がする。
お約束は>>1に置いといた方がよかったんでは。
次スレのテンプレは前スレ準拠がいいな。
8名無しさん@お腹いっぱい。:2005/04/17(日) 10:55:18
8ビット文字を¥xFFとか指定してファイル名に使いたいです
どうしますか?
9名無しさん@お腹いっぱい。:2005/04/17(日) 10:58:11
bashを使って、
echo -e "\xFF"
で混ぜる。
10名無しさん@お腹いっぱい。:2005/04/17(日) 10:59:44
touch $'\xa4\xb5\xa4\xe6\xa4\xdf\xa4\xf3\xa4\xab\xa4\xef\xa4\xa4\xa4\xa4\xa4\xe8\xa4\xb5\xa4\xe6\xa4\xdf\xa4\xf3'
11名無しさん@お腹いっぱい。:2005/04/17(日) 11:19:12
touch: ゆみさんかわいいよゆみさん: Invalid argument
12名無しさん@お腹いっぱい。:2005/04/17(日) 12:12:49
13名無しさん@お腹いっぱい。:2005/04/17(日) 13:14:53
echo, printならできるが他はダメポだな
14名無しさん@お腹いっぱい。:2005/04/18(月) 21:29:39
ん?できますよ??

> touch ゆみさんかわいいよゆみさん
> ls
ゆみさんかわいいよゆみさん
> touch ゆみさんかわいいよゆみさ
> touch ゆみさんかわいいよゆみ
> touch ゆみさんかわいいよゆ
> touch ゆみさんかわいいよ
> ls
ゆみさんかわいいよ ゆみさんかわいいよゆみさ
ゆみさんかわいいよゆ ゆみさんかわいいよゆみさん
ゆみさんかわいいよゆみ
> rm ゆみさん*
> ls
15名無しさん@お腹いっぱい。:2005/04/18(月) 21:45:40
touch ゆみさんかわいいよゆみさん
はできるけど$'......'の形式がダメ
16名無しさん@お腹いっぱい。:2005/04/18(月) 21:49:54
ゆみさんがかわいくないんじゃなかろうか
17名無しさん@お腹いっぱい。:2005/04/18(月) 22:20:50
ぎゃふん
18名無しさん@お腹いっぱい。:2005/04/18(月) 23:35:03
cronなどに登録して使う、特定のコマンドが終了していたら再起動するスクリプトが欲しいです。
最初に起動したコマンドのプロセス番号を記録しておけばいいんでしょうか。
一度には一つしか使わないので、psコマンドの出力を適当にgrepして使ってもいいでしょうか。

お知恵をお貸しください。しばらく自分で考えてみます。
19名無しさん@お腹いっぱい。:2005/04/18(月) 23:37:21
daemontools使ったほうが早い。
20名無しさん@お腹いっぱい。:2005/04/18(月) 23:37:53
inittabでactionにrespawn
21名無しさん@お腹いっぱい。:2005/04/18(月) 23:38:23
daemontoolsはDebianの専売特許かと思ってましたが…。
そんなにいいならちょっと見てみますね。
2221:2005/04/18(月) 23:39:52
ってか最初にMac OS Xだと言わなかったのはうかつでした。ごめんなさい。
2321:2005/04/18(月) 23:41:45
連投すみません。
ついでに言いますと、root権限がない場合のことも考えておきたいところなんです。
24名無しさん@お腹いっぱい。:2005/04/18(月) 23:42:37
すみませんが
シェルスクリプトでatofに相当するコマンドと使用法を教えてください
2521:2005/04/18(月) 23:44:31
>>24 型とかないし、そのまま計算に使わないの…?
26名無しさん@お腹いっぱい。:2005/04/18(月) 23:47:05
daemon 監視して落ちてたらroot権限なしで再起動?
一般ユーザでってこと?特別な管理専用ユーザつくるってこと?
27名無しさん@お腹いっぱい。:2005/04/18(月) 23:49:46
一般ユーザです。IRCのボットにしようかと思ってます。
28名無しさん@お腹いっぱい。:2005/04/18(月) 23:52:10
>>25
どうやら別のとこが悪かったみたいです。
ありがとうございました。
29名無しさん@お腹いっぱい。:2005/04/19(火) 00:04:59
LogBot (http://www.jibble.org/logbot/) を使っています。
実際のスクリプトでは、最後の行にlftpでログをミラーする文を追加しています。

#!/bin/sh
if ! ps augxww | grep -v grep | grep "java -classpath .:./lib/pircbot.jar org.jibble.logbot.LogBotMain"
then
echo "Restarting LogBot...."
(cd /path/to/LogBot && java -classpath .:./lib/pircbot.jar org.jibble.logbot.LogBotMain) 2>&1 | tee /path/to/LogBot.log
fi

そのまんまでひねりが無いですが、ま、動いています。
30名無しさん@お腹いっぱい。:2005/04/19(火) 05:57:48
無限ループで
終了したら開始するようにしたらダメ?
31名無しさん@お腹いっぱい。:2005/04/19(火) 08:56:01
そういうときの常道としてはPIDファイルを書き出してシェルスクリプトから
execすればいい。

で、PIDファイルに対応するプロセスが死んでたらまたexecして、
生きてたらそのまま終了する。これをcronで好きな間隔でまわせばいい。
32名無しさん@お腹いっぱい。:2005/04/19(火) 10:52:54
>>23 >>27
root に無断でそういうことをするのはやめてくれ。
33名無しさん@お腹いっぱい。:2005/04/21(木) 20:44:53
シェルはbashです

rshを使ってサーバAからサーバBとサーバCに
配置してあるスクリプトXを非同期に実行させようとしています

rshで実行したスクリプトXの戻り値を取得しようと
スクリプトXの戻り値を(Aの)標準出力に表示させているんですが

1 rsh -n servA 'X'&
2 rsh -n servB 'X'&
3 AとBからの戻り値を標準出力から取り込むまで待機する

1と2の処理の間にservAの戻り値が表示されてしまうと
3で止まったままになってしまう気がします

どうすればうまく待ち合わせができるんでしょうか

そもそもrshなんか使うなというツッコミは無しの方向でお願いします

34名無しさん@お腹いっぱい。:2005/04/21(木) 21:35:33
全部フォアで動かせばいいんちやうの?
イマイチ、何をしたいのかが不明だけど。
35名無しさん@お腹いっぱい。:2005/04/21(木) 21:42:23
>>33
> 3 AとBからの戻り値を標準出力から取り込むまで待機する
が意味不明
36名無しさん@お腹いっぱい。:2005/04/21(木) 21:43:26
>>33 は、戻り値の意味を取り違えてるな。
戻り値って終了ステータスのことだよ。
それから、&を付けてバックグラウンドにすると、
戻り値はすべて0になるから、判定不可能になる。
&をやめてフォアグラウンドにしても、
rsh越しだと戻り値を取得できず、
やはりすべて0になって判定不可能になる。
3733:2005/04/21(木) 22:21:53
表現の仕方が間違っていました。反省

rshそのものの戻り値($?)を得たいのではなく
rsh越しのスクリプトXの戻り値を得たいので
スクリプトX側で標準出力に終了を表す文字列(0とかcompleteとか)を表示すれば
擬似的な戻り値を得られると思ったんですが

やりたい事はこうです

A: ->(Xを実行しろと命令してすぐリターン) B
B: Xが終わったのでecho 0(完了の意)
A: Aの端末に0が表示される
A: 0と表示されたのを確認してBのお仕事xが終わったと判断


ひょっとして俺はなにか思い違いをしてます?
38名無しさん@お腹いっぱい。:2005/04/21(木) 22:54:13
> ひょっとして俺はなにか思い違いをしてます?
かなりしてそう。
まず、rshとかAとかBとかもちだすからいかんのだ。

時間のかかるコマンドxとyがある。でどうしたい?
39名無しさん@お腹いっぱい。:2005/04/21(木) 23:03:24
うほっ
40名無しさん@お腹いっぱい。:2005/04/21(木) 23:10:16
>>38
>> ひょっとして俺はなにか思い違いをしてます?
>かなりしてそう。
やはりですか

>時間のかかるコマンドxとyがある。でどうしたい?
xとyを非同期に実行させたいわけです

xを実行
(x:実行中)
yを実行
(x:実行中y:実行中)
xとyの完了を待つ(どちらが先に完了するかは不明)
41名無しさん@お腹いっぱい。:2005/04/21(木) 23:10:25
>>33
3 の実現方法がよく分からんのだが、、、ってのは置いといて、
rsh -n servA 'X' > /tmp/a.$$ & とかして、そのファイルの中身をチェックすればいいんでは?

>>36
バックグラウンドでもwaitとかで取れるだろ。
戻り値取得ってsshならOKだけど、rshってNGなん?
42名無しさん@お腹いっぱい。:2005/04/22(金) 00:01:42
rshだと戻り値取得NGだよ。
でも元質問が「rshなんか使うなというツッコミは無しの方向で」
と言ってるからな。
43名無しさん@お腹いっぱい。:2005/04/22(金) 00:54:03
単に x と y を並列に実行させて、両方が終わるまで待ちたいってことだろ?
戻り値なんてどこに出てくる必要があるんだ?
x & y & wait
44名無しさん@お腹いっぱい。:2005/04/22(金) 01:34:58
>>43
ここはバカばっか。肛門で茶が沸くわw
45名無しさん@お腹いっぱい。:2005/04/22(金) 01:42:44
それはすごい。コンビを組んで売り出すべきだ。
46名無しさん@お腹いっぱい。:2005/04/22(金) 01:49:06
そしてトルコへ公演ツアーへ逝くべし
47名無しさん@お腹いっぱい。:2005/04/23(土) 03:14:33
どなたか前スレ.datを下さi
48名無しさん@お腹いっぱい。:2005/04/23(土) 04:14:04
>>47
ttp://upup2.com/ @1MB up3220
49名無しさん@お腹いっぱい。:2005/04/23(土) 04:18:26
50ero usen-221x255x68x19.ap-US01.usen.ad.jp/:2005/04/23(土) 05:43:51
    っ        ァ        w          ぇ っ             
       と       ァ          w    ぇ    ww           
         る       う              う                
えぇ         ぉハ ハ        お   w          w          
   け  し   の        は w  k    wう                  
     
51名無しさん@お腹いっぱい。:2005/04/23(土) 08:25:41
これも、ワーム?
52名無しさん@お腹いっぱい。:2005/04/23(土) 09:46:46
んだ
なぜかUNIX板でよく見るのは気がする
5347:2005/04/23(土) 12:48:33
>48,49
サンクス
54名無しさん@お腹いっぱい。:2005/04/24(日) 11:21:46
>>37
誰もXからの出力を読んでないじゃないか。

for host in servA servB; do
(exit `rsh -n $host 'X'`) &
done
wait
55名無しさん@お腹いっぱい。:2005/04/26(火) 17:29:16
プログラムはシェルスクリプトが一番頻繁に書かれていると思うのだが。
質問無いね。
56名無しさん@お腹いっぱい。:2005/04/26(火) 19:16:46
すいません。質問です。

-------------------------
[test1]
number = 8
hoge = "foo"

[test2]
rock = 89
scottie = "sharp"
again = 123

[test3]
number = 998
hoge = "thinking"


[test4]
ms = "end"

-------------------------

こんなiniファイルがあったとして、
「test2」「test4」を消したいんですが、
そんなシェルできるのでしょうか?

57名無しさん@お腹いっぱい。:2005/04/26(火) 19:16:51

完成系
-------------------------
[test1]
number = 8
hoge = "foo"

[test3]
number = 998
hoge = "thinking"


-------------------------
58名無しさん@お腹いっぱい。:2005/04/26(火) 19:19:48
さぁ!シェルの作り方についての質問が出ました!
59名無しさん@お腹いっぱい。:2005/04/26(火) 19:27:24
>>56
cat ini |sed -e "/\[test2\|4\]/,/^$/d;"
60名無しさん@お腹いっぱい。:2005/04/26(火) 19:53:31
sedつこてるやん。
だったらおれもperlつかって

cat ini | perl -e '$/="";while(<>){if($_ !~ /\[test[24]\]/){print $_;}}'
61名無しさん@お腹いっぱい。:2005/04/26(火) 19:58:32
え、sed禁止なの?
62名無しさん@お腹いっぱい。:2005/04/26(火) 20:03:56
>>59
/bin/sh ; zsh4.2.0 ; bash 3.00.16だと
$ cat ini |sed -e "/\[test2\|4\]/,/^$/d;"
[test1]
number = 8
hoge = "foo"

[test2]
rock = 89
scottie = "sharp"
again = 123

[test3]
number = 998
hoge = "thinking"


[test4]
ms = "end"

/bin/tcsh; /bin/cshだと
%cat ini |sed -e "/\[test2\|4\]/,/^$/d;"
変数名が不正です.

だめじゃん。

63名無しさん@お腹いっぱい。:2005/04/26(火) 20:09:04
\を\に変えてみて。
64名無しさん@お腹いっぱい。:2005/04/26(火) 20:16:46
¥を\にかえてみて
65名無しさん@お腹いっぱい。:2005/04/26(火) 20:20:26
釣りはそのくらいにしとけ。
66名無しさん@お腹いっぱい。:2005/04/26(火) 20:26:19
>>60 $/=""; ってなに?
67名無しさん@お腹いっぱい。:2005/04/26(火) 20:39:48
にゅうりょくれこーどせぱれーた
68名無しさん@お腹いっぱい。:2005/04/26(火) 20:59:43
>>60
もすこしエレガントに。

cat ini | perl -ne 'BEGIN{$/=""}; /\[test[24]\]/ or print;'
69名無しさん@お腹いっぱい。:2005/04/26(火) 22:58:39
cat ini の存在意義について
70名無しさん@お腹いっぱい。:2005/04/26(火) 23:02:10
Perl使うんなら無いよな
7156:2005/04/26(火) 23:28:34
すげぇ。。
やっぱ余裕でできるんですね。
もっと勉強します。
ちなみにAIX4.3でperlないっすね・・・
72名無しさん@お腹いっぱい。:2005/04/26(火) 23:45:02
bash のドキュメントの bash.texi ファイルってどうして
Command Line Editing

Using Interactive History
が入ってないんだろう?ドキュメントを加工するから texi ファイル
で全ドキュメントが欲しいんだけど
73名無しさん@お腹いっぱい。:2005/04/26(火) 23:45:12
>>62
ダブルクオートをシングルクオートにかえりゃいいじゃん。
どのシェルでもいけるだろ。
74名無しさん@お腹いっぱい。:2005/04/26(火) 23:51:40
どっちかと正規表現の類かもしれないですが教えてください
egrepを使用して

「先頭にABCまたはDEFを含むが、それ以降文中にGHIを含まない」
処理を行いたいと以下の様にしました

egrep "^(ABC|DEF)" | egrep -v "GHI"

マッチしない:ABChogeGHI
マッチする:DEFhogefoo

が、grepを二回呼ぶのはかっちょ悪い気がします
うまい事grep一発でマッチさせる方法はあるんでしょうか
75名無しさん@お腹いっぱい。:2005/04/27(水) 00:33:09
かっこなんか気にすんな
76名無しさん@お腹いっぱい。:2005/04/27(水) 00:39:57
>>74
sed -e '/^\(ABC\|DEF\)/{ /GHI/d; }'
7756:2005/04/27(水) 11:46:05
前回質問させていただいた
iniファイルの特定のセクションを削除するというやつなんですが。
複数のiniファイルの複数のセクションを消したいのです。
例えば
/hoge/foo/test1.iniの[bar22]と[bar33]
/hoge/goo/test3.iniの[test51]と[tea312]と[write556]
/hoge/asdf.iniの[read52]
・・・
ってな感じなんです。
自分のイメージでは消したいiniとセクションをどっかのテキストに書いておいて
んでそれを読み込みながら削除するって感じになるんですかね。
是非教えてください
/bin/sh
78名無しさん@お腹いっぱい。:2005/04/27(水) 11:54:37
>>77
自分ではどこまでできたの?
79名無しさん@お腹いっぱい。:2005/04/27(水) 12:36:27
元質問はシェルを作る話だったのに解決してない件
80名無しさん@お腹いっぱい。:2005/04/27(水) 13:02:00
>>77
別にシェルスクリプトにこだわらなくてもいいんじゃないの。
Windowsのreg.exeみたいな単発ユーティリティ作ったら。
81名無しさん@お腹いっぱい。:2005/04/27(水) 13:10:06
shutils と textutils と /bin に入ってるものくらいの外部コマンドは
使ってもいいというルールならどうかな。

内部コマンドだけではつらい。
bashならできるか。
82名無しさん@お腹いっぱい。:2005/04/27(水) 15:14:31
ini test2 test4
ini2 test1 test3

とか書きこんだファイルの名前を引数にして起動

#!/bin/sh
list=$1
exec < $list
while read LINE;do
for i in $LINE;do
if [ -z $file ];then
file=$i;
else
section=$i
ed $file <<EOF
/$section/
.,/^$/d
w
q
EOF
fi
done
file=""
done

83名無しさん@お腹いっぱい。:2005/04/27(水) 18:43:01
gnu coreutils と bash まで OK
8456:2005/04/27(水) 23:44:33
みなさんありがとうございました。
85名無しさん@お腹いっぱい。:2005/04/29(金) 05:20:17
関数を作って戻り値を取得するにはどうしたら良いでしょう?
以下のようにすると、当然ながら $result に "func" という
文字列が代入されてしまいます・・・

func() {
  return aaa
}

result=func
86名無しさん@お腹いっぱい。:2005/04/29(金) 05:27:40
こういう事?

% func() { echo aaa}
% result=$(func)
% echo $result
aaa
%
87名無しさん@お腹いっぱい。:2005/04/29(金) 07:01:48
>>86
やってみましたが、
bash: fg: %: no such job
bash: fg: %: no such job
 :
と表示されてしまいます。
88名無しさん@お腹いっぱい。:2005/04/29(金) 07:14:38
>>87
% はプロンプトだから入力しないで良いよ
89名無しさん@お腹いっぱい。:2005/04/29(金) 07:28:01
sh だとセミコロン無いと実行出来なかった。
↓これで試してみて。

#!/bin/sh
func() { echo aaa ;}
res=$(func)
echo $res
90名無しさん@お腹いっぱい。:2005/04/29(金) 09:25:57
`func`
91名無しさん@お腹いっぱい。:2005/04/29(金) 10:21:55
こんなのも。

func() {
  ret=aaa
}
result=$ret

戻り値とは言わんけど。
92名無しさん@お腹いっぱい。:2005/04/29(金) 10:51:09
func() { eval $1='aaa'; }
func ret
echo $ret
93名無しさん@お腹いっぱい。:2005/04/29(金) 11:51:30
>>92
それは、いろいろ応用が利きそうだね。
94名無しさん@お腹いっぱい。:2005/04/29(金) 19:39:36
>>93
効かない。
9585:2005/04/30(土) 06:03:43
なるほど・・・return でなくって echo を使うと、コマンドの出力として
受け取れるわけですね。一般的な sh の処理かどうかは分かりませんが、
とりあえずコレでやってみようと思います。

func() {
  echo aaa
}

result=`func`

96名無しさん@お腹いっぱい。:2005/04/30(土) 11:42:40
func(){
  echo aaa
}

func
result=$?
97名無しさん@お腹いっぱい。:2005/05/01(日) 11:10:30
テキストの一番最後の行を切り取って別のテキストに貼り付けたいのですが、
どうやってやるのが一番お勧めですか?
perlでなら出来るのですが、処理が大量に発生するので
もう少し軽い仕組みが出来ないかなと調べているところです。
98名無しさん@お腹いっぱい。:2005/05/01(日) 11:33:55
tail -1 file1 | cat >>file2
99名無しさん@お腹いっぱい。:2005/05/01(日) 11:34:37
tail -1 FILE
100名無しさん@お腹いっぱい。:2005/05/01(日) 11:45:19
>99
m9(^Д^)プギャー
101名無しさん@お腹いっぱい。:2005/05/01(日) 13:06:44
意味のないcatを余分に入れる香具師、初心者に多いな。
10297:2005/05/01(日) 13:59:04
tail -1だと元のテキストに最後の一時行が残ってしまいませんか?
コピーじゃなくて切り取りをしたいのですがいい手ありますか?
103名無しさん@お腹いっぱい。:2005/05/01(日) 14:06:22
>>102
m9
10497:2005/05/01(日) 14:26:02
m9って何ですか?
検索するとスクリプトとは関係ないものばかりヒットして・・・
105名無しさん@お腹いっぱい。:2005/05/01(日) 14:39:03
>>104
m9(^Д^)プギャー
106名無しさん@お腹いっぱい。:2005/05/01(日) 14:46:53
> perlでなら出来るのですが、処理が大量に発生するので

ならperlで良いんじゃ?
107名無しさん@お腹いっぱい。:2005/05/01(日) 15:17:57
シェルだと、入力ファイルと出力ファイルは必ず別のものにしないといけないから、
一時的にコピーするなり、mvするなりの処理がいる。
結局、読み書きopenのできるperlの方が効率よくなる、はず。
108名無しさん@お腹いっぱい。:2005/05/01(日) 16:24:20
>>102
コピーした後で
ed <<file> <<EOF
$
d
w
q
EOF
109名無しさん@お腹いっぱい。:2005/05/03(火) 18:55:15
あなたのシェルは何を表示する?
(true | exit 0; exit 1); echo $?
(set -e; (false); true); echo $?
( (set -e; false; true) && exit 0; set -e; (false; true) && exit 1; exit 2); echo $?
110名無しさん@お腹いっぱい。:2005/05/03(火) 21:20:18
echo の使い方が誤っています。
111名無しさん@お腹いっぱい。:2005/05/04(水) 12:34:43
ファイルから何番目の文字、単語を取り出すってのは分かるのですけど、
行毎に取り出すことは出来ないのでしょうか?

例えば
file1の1行目を取り出して別の関数に引き渡す
引き渡したら2行目を同様に別の関数へ引き渡す。
この繰り返しで3行目、4行目・・・
いった感じを考えているんですが、
shellでは可能でしょうか?
112名無しさん@お腹いっぱい。:2005/05/04(水) 12:38:52
while read LINE; do 〜; done <file1
113名無しさん@お腹いっぱい。:2005/05/04(水) 12:46:46
>>112
ありがとうございます。
全くの初心者のものなので凄く悩んでしまいました。
もっと勉強します。
114名無しさん@お腹いっぱい。:2005/05/05(木) 00:13:39
wineがよく落ちるので、プロセスを消すコマンド

ps ax | grep wine | kill `awk '{print $1}'`
115名無しさん@お腹いっぱい。:2005/05/05(木) 00:19:17
ps ax | grep [w]ine | kill `awk '{print $1}'`
こうしようぜ。
116名無しさん@お腹いっぱい。:2005/05/05(木) 00:53:39
pkill
117名無しさん@お腹いっぱい。:2005/05/05(木) 05:26:07
ぴkill kill kill ぴ kill ki〜♪ヽ(゚∀゚)ノ
118名無しさん@お腹いっぱい。:2005/05/05(木) 20:45:03
同じ文字の連続した文字列を作りたいのだが、良い方法は?
119名無しさん@お腹いっぱい。:2005/05/05(木) 20:47:22
>>118
yes "A" | head -n 10 | tr -d "\n"

120名無しさん@お腹いっぱい。:2005/05/05(木) 20:55:21
>>119
ありがとうございます。
121名無しさん@お腹いっぱい。:2005/05/05(木) 21:09:50
俺なら
ruby -e 'puts("X"*20)'

printf "%020d" 0|tr 0 X
122名無しさん@お腹いっぱい。:2005/05/05(木) 21:25:24
調子こいてもっと聞いちゃいます。
2進数文字列の 00110 01010 のビットAND ORは?
123名無しさん@お腹いっぱい。:2005/05/05(木) 21:58:48
シェルスクリプトでビット演算したい時ってのは思い当たらないが。
124名無しさん@お腹いっぱい。:2005/05/06(金) 15:48:57
${parameter:offset:length}でoffsetに負を与えたとき末尾からのoffsetになってますか?
私のはなりません。
GNU bash, version 2.04.0(1)-release (i386-turbo-linux-gnu)
125名無しさん@お腹いっぱい。:2005/05/06(金) 16:16:23
>>124
負の値をbashで扱いたい時は $((-1)) とするか、明示的に typeset すべき。
126名無しさん@お腹いっぱい。:2005/05/06(金) 16:27:38
>>125
おお、ありがとうございます。
127名無しさん@お腹いっぱい。:2005/05/06(金) 22:21:34
VAL=<<'EOF'
aaa
bbb
EOF
とヒアドキュメントの値を変数に格納したいのですが、
どうやっていいのか分りません。あくまでリダイレクトである以上
変数への格納は無理なんでしょうか?
128名無しさん@お腹いっぱい。:2005/05/06(金) 22:33:48
いや、リダイレクトじゃないし。
129名無しさん@お腹いっぱい。:2005/05/06(金) 22:47:18
>>127
$ VAL=`cat << 'EOF'
aaa
bbb
EOF`
$ echo $VAL
aaa bbb
ってことをやりたいの?
# 移植性は未調査だけど
130名無しさん@お腹いっぱい。:2005/05/06(金) 22:50:08
>>128
そうですね、マニュアル見たら全然別物でした。
>>129
そうです、それがやりたかったです。どうもありがとうございました。
131名無しさん@お腹いっぱい。:2005/05/06(金) 23:02:08
あ、シェルの変数には改行文字を格納することはできないのかな。
スペースになってしまいますね。
132名無しさん@お腹いっぱい。:2005/05/06(金) 23:06:08
cat -e で改行文字を$に変換しておいて、後で使う時に'$ 'を
改行コードに変換するのがいいみたいです。お騒がせしました。
133名無しさん@お腹いっぱい。:2005/05/06(金) 23:53:03
set hiduke = `date '+%y%m%d'`
変数に当日の年月日を設定するのは簡単なんですが
前日を設定するにはどうしたらいいでしょうか?
134名無しさん@お腹いっぱい。:2005/05/07(土) 00:19:50
GNUのdateなら、date --date='-1 days'とか。
他の場合はどうするんだろ。
135名無しさん@お腹いっぱい。:2005/05/07(土) 01:06:19
env TZ=JST+15 date
136sage:2005/05/07(土) 01:25:07
なんか答える気にもならんくらいレベル低いな。
137名無しさん@お腹いっぱい。:2005/05/07(土) 01:26:59
なら黙ってていいよ。
138名無しさん@お腹いっぱい。:2005/05/07(土) 01:42:28
シェルスクリプトぐらいでレベルとか言い出す辺りがイタすぎ
139名無しさん@お腹いっぱい。:2005/05/07(土) 03:24:35
>>138
バカはどんなことでも自分が最高レベルと自負してくからこだわらずにいられない(藁
井の中のザコ、大海から逃げる。
140133:2005/05/07(土) 09:16:40
>>133,134
ありがとうございました、と同時に「こんなんでできるんだ」とonzな感じですた
精進します
141名無しさん@お腹いっぱい。:2005/05/07(土) 10:32:18
最高レベルを自負するバカが何か言うてます。
大海から逃げたザコ、井の中で大口。
142名無しさん@お腹いっぱい。:2005/05/07(土) 10:37:21
朱に交われば
143ヽ(´ー`)ノ ◆.ogCuANUcE :2005/05/07(土) 11:44:46
>>134
> 他の場合はどうするんだろ。
FreeBSD なら
$ date -v+1d とか。
144名無しさん@お腹いっぱい。:2005/05/07(土) 12:26:22
-r オプションで unix Epoch を設定できるものもある。
strftime(3) が %s を解すなら多分こんな感じ

$ date -r $((`date +%s`+86400))


>>132
IFSという環境変数について調べると幸せになるかもしれない。
145名無しさん@お腹いっぱい。:2005/05/07(土) 13:35:58
IPアドレスを01で表記できるようなスクリプトないっすかね( ゚ー゚)
146名無しさん@お腹いっぱい。:2005/05/07(土) 16:55:39
そんなの簡単だろ
自分で作れよ( ゚ー゚)
147名無しさん@お腹いっぱい。:2005/05/07(土) 18:05:33
どこ見てるの?( ゚ー゚)
148名無しさん@お腹いっぱい。:2005/05/08(日) 01:07:08
>>147
もうおまえしか見えない
149名無しさん@お腹いっぱい。:2005/05/08(日) 10:57:36
IFS="."
for i in $1;do
echo "ibase=10;obase=2;print $i, \".\""|bc
done
150名無しさん@お腹いっぱい。:2005/05/10(火) 07:19:36
$ cat cnv
IFS="."
for i in $1;do
echo "ibase=10;obase=2;print $i, \".\""|bc
done
$ sh cnv 127.1
1111111.1.$
151名無しさん@お腹いっぱい。:2005/05/10(火) 14:28:15
ibase=10 って常に無意味じゃないか?
ibase=A を使え。
152名無しさん@お腹いっぱい。:2005/05/10(火) 16:07:56
つーかパディングできないと。
153名無しさん@お腹いっぱい。:2005/05/11(水) 00:12:26
ここは為になるインターネッツですね
154じゃこれでどう:2005/05/11(水) 00:47:25
pad(){
if [ $i -eq 0 ];then
num=00000000
elif [ $i -lt 2 ];then
num=0000000$num
elif [ $i -lt 4 ];then
num=000000$num
elif [ $i -lt 8 ];then
num=00000$num
elif [ $i -lt 16 ];then
num=0000$num
elif [ $i -lt 32 ];then
num=000$num
elif [ $i -lt 64 ];then
num=00$num
elif [ $i -lt 128 ];then
num=0$num
fi
}
IFS="."
j=0
for i in $1;do
if [ $j -gt 0 ];then
echo -n .
fi
num=`echo "obase=2;print $i;"|bc`
pad
echo -n $num
j=`expr $j + 1`
done
echo
155名無しさん@お腹いっぱい。:2005/05/11(水) 00:52:52
初期の B シェルって関数はサポートされていなかったんだっけ?
156名無しさん@お腹いっぱい。:2005/05/11(水) 08:10:11
さあ。
Version7では使えるけど。
157名無しさん@お腹いっぱい。:2005/05/11(水) 18:41:13
さあ。
Version6では使えるけど。
158名無しさん@お腹いっぱい。:2005/05/11(水) 20:53:29
すいません、ちょっといいロジックが思い浮かばないので
ご相談です;y=ー(゚д゚)・∵. ターン

[server_1.txt]
PC等,PCサロン,PCについて誰かが質問に答えるスレ
PC等,UNIX,全文エンジンEstraier
PC等,CG,モデラー silo

[server_2.txt]
PC等,モバイル,ID砲丸投げinモバイル
PC等,UNIX,全文エンジンEstraier
PC等,CG,ローポリスレ△3

ってあるテキストファイルがあるとして、

$ merge.sh server_1.txt server_2.txt
PC等,PCサロン,PCについて誰かが質問に答えるスレ
PC等,モバイル,ID砲丸投げinモバイル
PC等,UNIX,全文エンジンEstraier
PC等,CG,モデラー silo

とマージされるスクリプトを作りたいんです。要件としては
(1) #1,#2がキーでその後ろは自由項目
(3) #1,#2が同じ場合はserver_1.txtを採用

なんか簡単にsortとかでできそうな予感してたんですけど、
だめぽ・・・なんです。

どなたかいいスクリプトを・・・もしくは、スレ違いの
場合は誘導お願いします。

159名無しさん@お腹いっぱい。:2005/05/11(水) 21:10:12
>158
すんません、#1, #2は$1, $2ってことです。
(CSVファイルの1列目、2列目ってことです)
160名無しさん@お腹いっぱい。:2005/05/11(水) 21:32:46
>>158
sortしてuniqじゃね?
uniqってカラムでなんか指定できたことね?
161名無しさん@お腹いっぱい。:2005/05/11(水) 21:45:52
awk で多次元連想配列使うってのは?

Perl/Python 使った方が速そうだが
162名無しさん@お腹いっぱい。:2005/05/11(水) 22:04:12
ちうことで awk。ファイル2つじゃなくて3つ以上でも動く。
出力される順番は不定。

#!/usr/bin/awk -f
BEGIN{ FS="," }
{ if(!($1 SUBSEP $2 in a)) a[$1,$2] = $0 }
END{ for(i in a) print a[i] }
163名無しさん@お腹いっぱい。:2005/05/13(金) 00:50:37
現在bourne shで以下のロジックを組もうとしているのですが、
思うように動作しないため、質問させていただきます。

==============================================
1. 変数Aを用意する。
  変数Bに時刻「05:30」と値が格納されている。
  変数Cを用意する。

2. AとBを比較します。
  (1)Aの方がBよりも時刻が前の場合、Cに"OK"と格納する
  (2)Aの方がBよりも時刻が後の場合、Cに"NG"と格納する
==============================================

このロジックでキモなのは、時刻の比較です。
最初、比較条件を [$A < $B] としておりました。
辞書式のやり方をネットで調べたらありましたので。
ですが、こうすると、変数Bが名前のファイルが出来てしまい、
比較しているのかどうかも怪しいのです。

すみませんが、お知恵を貸してはいただけないでしょうか。
宜しくお願い致します。
164名無しさん@お腹いっぱい。:2005/05/13(金) 00:55:44
>>163
[ $A \< $B ]
165名無しさん@お腹いっぱい。:2005/05/13(金) 08:53:06
時刻を四桁の数字にして比較したらダメなの?
$B=`date +%H%M`
みたいな感じで。
そしたら普通に数値比較の方法でいけるよ
166名無しさん@お腹いっぱい。:2005/05/14(土) 00:14:57
>>163
time_tの値を返すコマンドを作れ。
167名無しさん@お腹いっぱい。:2005/05/14(土) 02:12:30
>> 163
こんなの書いてみた

# 05:30 -> 530 数値に書き換える
function timeToInt() {
 if [ x"$1" = x"00:00" ] ; then
  echo "0"
  return
 fi
 echo $1 | sed s/:// | sed s/^0*//
}

if [ `timeToInt $A` -lt `timeToInt $B` ] ; then
 C="OK"
else
 C="NG"
fi
168名無しさん@お腹いっぱい。:2005/05/14(土) 08:34:04
>>163
俺も
a=09:39; b=05:30; if [ $((10#${a/:/})) -lt $((10#${b/:/})) ]; then c=OK; else c=NG; fi; echo $c
169名無しさん@お腹いっぱい。:2005/05/14(土) 09:07:10
>>165
の言う通り。
”:”だけ削除するロジックを入れれば、変数文字列の先頭に0が残っていても、数字として比較できる。
170名無しさん@お腹いっぱい。:2005/05/14(土) 09:17:46
>>169
0が残っていると8進数になるんじゃない。
171名無しさん@お腹いっぱい。:2005/05/14(土) 11:49:13
>158(>159)です。

>160
>161
>162

ありがとうつД`)・゚・。・゚゚・*:.。..。.:*・゚
でけました。

SUBSEPって言うawk変数の存在さえ知らなかったので
そこから調べました。ちなみに、キー項目はユーザの
入力項目なので初期値の "@" から変更しようかなとか
思ってます。
172名無しさん@お腹いっぱい。:2005/05/14(土) 13:51:47
いや、今は SUBSEP は知らんでいいと思う。
昔の GNU awk は多次元配列の扱いがタコだったので
$1 SUBSEP $2 in a と書かないと動かなかったけど、
最近のは gawk に限らず ($1, $2) in a という書き方ができるので。
173名無しさん@お腹いっぱい。:2005/05/14(土) 13:57:54
あと、SUBSEP のデフォルトは @ じゃないので。
174名無しさん@お腹いっぱい。:2005/05/14(土) 14:03:29
なんかねぼけてるなー。
if((i,j) in a) はできるけど、
for((i,j) in a) はできないから SUBSEP を使うんだな。
175名無しさん@お腹いっぱい。:2005/05/14(土) 14:55:46
2,球技,20050514_120050
1,球技,20050514_120050
1,文化,20050514_160000
2,生活,20050514_170000

というテキストを

2,生活,20050514_170000
1,文化,20050514_160000
1,球技,20050514_120050
2,球技,20050514_120050

のようにしたいです。

ソートの優先条件は
1.日付の降順 ( sort -t , -k 3 -r)
2.先頭の番号の昇順 ( sort -t , -k 1 )
を一緒に実行したいってことです(降順と昇順を同時に指定)。

できますか??
176名無しさん@お腹いっぱい。:2005/05/14(土) 15:03:29
宿題を装った釣りも禁止
177163:2005/05/14(土) 21:59:46
>>164>>165>>166>>167>>168>>169>>170

返事が遅れてしまい、申し訳ありませんでした。
色々考えて下さいまして、ありがとうございました。

あの後、色々当方でも考えましたが、
結局辞書式比較を諦めて、数値比較を行うことにしました。
(その直後に、秒単位まで見ることになってorz)

最初は、時、分、秒とパーツに分け、それぞれで比較を
行ってましたが、すごく馬鹿らしくなってきたので、
>>167氏のようにsedコマンドで":”を外し、それを
比較していく形にしたら、あっさりと出来てしまいました。
頭の"0"を気にしなくても良かったっぽいです。
肝心なのは、その数値の大小を見る事でしたから。

(余談ですが、このロジックが解決した後、色々悩んでた
 問題が次々解決していく状態になりましたw
 例えるとチューリップ開きっ放しみたいな感じ。
 プログラム組んでる時って、こういう事たまにありますよねw)
178名無しさん@お腹いっぱい。:2005/05/18(水) 08:08:13
>>122
AND:
echo 00110 01010 |\
sed -e "s/^/%/; :ll; s/%\(.\)\(.*\) \(.\)\(.*\)/#\1\3%\2 \4/; tll; s/%//; s/#11/1/g; s/#[01]\{2\}/0/g;"

OR:
echo 00110 01010 |\
sed -e "s/^/%/; :ll; s/%\(.\)\(.*\) \(.\)\(.*\)/#\1\3%\2 \4/; tll; s/%//; s/#00/0/g; s/#[01]\{2\}/1/g;"
179名無しさん@お腹いっぱい。:2005/05/18(水) 09:49:41
うひょー
180名無しさん@お腹いっぱい。:2005/05/18(水) 16:47:19
質問があります。
/work/foo/bar/test
のtestだけを取得したいのですが、どのようにすればいいのでしょうか。
情けないがお手上げです・・・
簡単な質問だと思いますがよろしくお願いいたします。
181名無しさん@お腹いっぱい。:2005/05/18(水) 16:50:16
man basename

って basename 知らなくてもどうにでもなるでしょ。
182名無しさん@お腹いっぱい。:2005/05/18(水) 16:52:27
変数なら${foo##*/}とか。
183名無しさん@お腹いっぱい。:2005/05/18(水) 16:52:47
あ、basenameで拾えました。
すいません。。。

ってもうカキコある・・・

ちなみにexprでやろうとがんばってたんですが
exprやって取得するにはどうすればよいのでしょうか?
184名無しさん@お腹いっぱい。:2005/05/18(水) 17:25:56
Solaris で man expr すると、そのまま答が載ってたりなんかする。


Example 2:

basename(1) をエミュレートします。basename(1) は、$a という
パス名の最後の要素を返します。$a が /usr/abc/file か、ただの
file のいずれかと等価の場合に、この例は、file を返します。引
数 としての単独の / に注意してください。expr は / を除数演算
子とみなします (後述の「注意事項」を参照)。

example$ expr $a : '.*/\(.*\)' \| $a
185183:2005/05/18(水) 18:09:19
おぉ
ありがとうございます!
186名無しさん@お腹いっぱい。:2005/05/19(木) 21:10:25
環境:cygwin
!#/bin/sh
rsync.exe -arvz -e ssh /cygdrive/c/Documents\ and\ Settings/hoge/Local\ Settings/Application\ Data/Microsoft/Outlook ugo@mogo:/cygdrive/c/backup/

というviで作成したバックアップのスクリプトを実行させたのですが、rsyncから、t/Outlook: not foundというエラーが返ってきてしまいます。

viで作成したとき、途中で改行されてしまっているのが原因らしいのですが、回避する方法はありませんか?
'や"などを付けて実行しても同じような結果です。
初歩的な質問で申し訳ありません。


187名無しさん@お腹いっぱい。:2005/05/19(木) 21:12:50
\
188名無しさん@お腹いっぱい。:2005/05/19(木) 21:41:10
>>187
> \

やはり、viが画面の端っこまで文字が来ると勝手に折り返して、改行コードを入れてしまうのが問題のようです。
\
を使うといいということですか?

回答ありがとう御座います。

189名無しさん@お腹いっぱい。:2005/05/19(木) 21:51:37
入れねぇだろw
190名無しさん@お腹いっぱい。:2005/05/19(木) 21:52:24
>>189
> 入れねぇだろw

やっぱりそうでしたか。何となく気づいてました。
viの設定で何とかしなければいけないようですね。
191名無しさん@お腹いっぱい。:2005/05/19(木) 23:56:36
>Microsoft/Outlook
ここか?
192名無しさん@お腹いっぱい。:2005/05/20(金) 10:15:02
>>191
> >Microsoft/Outlook
> ここか?

vimだと、t/Outlookで折り返されてしまうのです。
その状態で保存すると、Microsof t/Outlookという感じでパスが区切られてしますのです。
別のエディタでやれば問題なのです。
viの設定でしょうね。
ところで、スクリプトを書くときはどんなエディタを使っていますか?
193名無しさん@お腹いっぱい。:2005/05/20(金) 19:19:45
>>192
KWrite
194名無しさん@お腹いっぱい。:2005/05/20(金) 19:42:10
>>192
~/.vimrc あたりで breakat とか設定しとるか?
いずれにせよ無駄レス繰り返すよりも使ってる .vimrc 貼ったほうがなんぼか
確実なレスが付くし,解決も早いはず.
195194:2005/05/20(金) 19:44:37
ってか,ここってシェルスクリプトスレじゃんかよ>>192
vimスレ逝け
196名無しさん@お腹いっぱい。:2005/05/21(土) 00:34:32
"Documents\ and\ Settings"とか、"Local\ Settings/Application\ Data"
とか邪悪なディレクトリ名を直接スクリプトに書くなんて。。。
OutLookの設定で、データの保存ディレクトリをもっとマシな場所に変えれば済むんじゃないの?
197名無しさん@お腹いっぱい。:2005/05/21(土) 01:31:52
windows 使ってる限り Program Files とか Documents and Settings は
避けて通れないよ。
198名無しさん@お腹いっぱい。:2005/05/21(土) 02:20:52
>>197
素人発見
199名無しさん@お腹いっぱい。:2005/05/21(土) 03:17:52
マイPCしか触らないんならともかく
職業的にWindowsに触れる機会があるんなら
郷に入っては郷に従うべきだろう
200186:2005/05/21(土) 08:59:30
無駄なレスを食ってします。申し訳ありません。
答えて方々ありがとう御座います。
オライリー「入門vi」を読んで、勉強することにします。

とりあえず、xyzzyで編集してしのいでます。
"Documents\ and\ Settings"とか、"Local\ Settings/Application\ Data"
はイヤなんですけど、そこらへんは、どういうわけかあんまり変えたくないのですよ。

201名無しさん@お腹いっぱい。:2005/05/21(土) 10:00:53
>200
いっそのこと Docume~1 とかロングファイルネームを諦めちゃえば?
202名無しさん@お腹いっぱい。:2005/05/22(日) 17:47:28
sshを使って、リモートでマシンの電源を切るスクリプトを作ったのですが、
sshでログインしたところで止まってしまいます。
仕方がないので、ログアウトするためにexitを実行すると、
shutdownコマンドが実行されて、ローカルのマシンの電源が切れてしますのです。

シェルスクリプトでは、リモートのPCを操作して、自動的にログアウトするようなことは、
無理なのでしょうか?

コマンド
#!/sh/bin
ssh hoge@ugo
shutdown -s -t 0
exit


203名無しさん@お腹いっぱい。:2005/05/22(日) 18:07:24
ネタなのかマジなのか。。。
1行目はなんじゃ?
ちなみに、”shutdown -s -t 0”
これってなんていうOSのコマンド?
204名無しさん@お腹いっぱい。:2005/05/22(日) 18:16:39
>>202
man ssh
205名無しさん@お腹いっぱい。:2005/05/22(日) 18:21:29
>>202
ssh hoge@ugo shutdown -s -t 0
206名無しさん@お腹いっぱい。:2005/05/22(日) 18:21:43
ssh hoge@ugo shutdown -s -t 0
207名無しさん@お腹いっぱい。:2005/05/22(日) 19:45:53
>>206
> ssh hoge@ugo shutdown -s -t 0

助かりました。これをスクリプトに保存しておきます。

#!/bin/sh
ssh hoge@ugo shutdown -s -t 0

186の方のように、Windowsを使っています。
208名無しさん@お腹いっぱい。:2005/05/23(月) 16:10:05
>>196
時代遅れ。

KDEでthunderbird使うと
~/.thunderbird/abcdefgh.default/Mail/Local\ Folders/Unsent\ Messages/
だったり、
~/.kde/share/apps/RecentDocuments/Mozilla\ Thunderbird.desktop
だったりするぞ。
209名無しさん@お腹いっぱい。:2005/05/23(月) 21:46:11
他人の書いたシェルを読んでたら
何してるかわからない箇所が出てきて困ってます(>_<)
これってどう解釈したら良いの?
ファイル名の何かをピリオドと比較してるようだけど・・・
詳しくは何してるのかなぁ

#!/bin/sh
filename=$1
if[ "${filename%${filename#?}}"="." ] ; then
210名無しさん@お腹いっぱい。:2005/05/23(月) 22:00:39
他人の書いたシェルを読んでたら
何してるかわからない箇所が出てきて困ってます(>_<)
これってどう解釈したら良いの?
ファイル名の何かをピリオドと比較してるようだけど・・・
詳しくは何してるのかなぁ

#!/bin/sh
filename=$1
if[ "${filename%${filename#?}}"="." ] ; then
211名無しさん@お腹いっぱい。:2005/05/23(月) 22:21:22
>>209
man sh して、Parameter Expansion の項を参照せよ。
212名無しさん@お腹いっぱい。:2005/05/23(月) 22:28:19
先頭が '.' で始まっているかどうか判別してるんじゃねえの?
# expr を使わずに、shell の中だけでやるあたりが。。。
213名無しさん@お腹いっぱい。:2005/05/23(月) 22:34:08
#!/bin/sh
for name in *;do
echo ${name%${name#?}}
echo $name
done

これを実行するとわかってしまう。
214名無しさん@お腹いっぱい。:2005/05/23(月) 22:35:53
${filename:0:1} ってbash固有なの?
/bin/sh がなくって試せないや。
215名無しさん@お腹いっぱい。:2005/05/23(月) 23:01:56
>>214
sh にはないね。Bad substitution エラーになりますた。
216名無しさん@お腹いっぱい。:2005/05/23(月) 23:18:39
${filename:0:1}はbash独自だが、
${name#?}や${name%xxx}も、
巣の/bin/shでは使えない。

ファイル名の先頭が.かどうかを判断するなら、

case "$filename" in
.*)
hoge;;
esac

でやるべきだな。
これなら移植性抜群。
217名無しさん@お腹いっぱい。:2005/05/24(火) 00:20:30
PSコマンドとgrepを利用し、特定のプロセスをkillしたいのですが、
プロセスid(pid)をうまく取得する方法はありますか。

何桁目で取得しているのですが、うまくいかずに困っています。
アドバイスお願いいたしまし。
218名無しさん@お腹いっぱい。:2005/05/24(火) 00:29:11
>>217
pgrep(1) で出来ると思うけど、そのままずばり pkill(1) 使えば?
Solaris 由来のコマンドだけど、最近の Linux にも入ってるらしい

シェルスクリプトでやりたいなら、ps(1) の出力を read(1) で
読んで処理すれば良いと思う

ps -ef | grep [m]y_command | read i j k; kill -9 $i

# i j k は適当。man 読んでね
219名無しさん@お腹いっぱい。:2005/05/24(火) 00:37:54
>>218
スマソ. こっちが正解

ps -ef | grep [m]y_command | while read uidx pidx rest; do kill -9 ${pidx}; done
220名無しさん@お腹いっぱい。:2005/05/24(火) 01:10:55
>>217,218,219
ps -o pid,command
221名無しさん@お腹いっぱい。:2005/05/24(火) 01:29:27
>>209
それって[ ]の中が引数1つだから常に真のような気がするが。
222名無しさん@お腹いっぱい。:2005/05/24(火) 02:02:32
>>221
grep [m]y_command は、my_commandにはマッチさせて
grep自身にはマッチさせないための常套手段。

んでも、grep '[m]y_command' みたいにクォートしないとダメかも。
223名無しさん@お腹いっぱい。:2005/05/24(火) 02:11:09
>>222
そういう話ではない。
224218:2005/05/24(火) 02:11:32
>>222
多分レス番違ってる...

bash はシングルクォートで囲わなくてもオッケーでした
zsh はダメみたい

デフォで囲っておくかエスケープした方が良かったですね
訂正サンクス
225名無しさん@お腹いっぱい。:2005/05/24(火) 19:24:08
zshまで、考える必要はない。
226名無しさん@お腹いっぱい。:2005/05/24(火) 20:32:56
この場合はzshかどうかの問題じゃない。
たまたまカレントディレクトリに、
my_command
という名前のファイルが存在していると、
grep [m]y_command
を実行しても、シェルによって
grep my_command
に展開されてしまい、せっかくの用をなさなくなる。
なので、基本的には常にシングルクォートを使って
grep '[m]y_command'
とするものと覚えた方がいい
227名無しさん@お腹いっぱい。:2005/05/24(火) 20:45:52
>たまたまカレントディレクトリに、

なんでやねん。
アホか。
228名無しさん@お腹いっぱい。:2005/05/24(火) 20:53:50
>>226
おお、なるほど! こういうの、意外に見つけにくい盲点だよな。
作った時は動いたのに、ある日突然動かなくなるシェルスクリプトは、
原因が [m] とかの展開にあったりする。
カレントディレクトリはどこになるかわからないから、
こういう名前のファイルはない、とか、仮定しちゃいけないね。

>>227
あなたの方がアホですね。
229名無しさん@お腹いっぱい。:2005/05/24(火) 21:30:11
grep
file指定がない場合、標準入力からの読み込みのはずだが?
230名無しさん@お腹いっぱい。:2005/05/24(火) 21:34:16
>>229
Hah?
grepが起動される前に、[m]y_commandという文字列が
シェルによって、カレントディレクトリと照合されて
展開されてしまうことを問題にしているわけだが?
頭大丈夫?
231名無しさん@お腹いっぱい。:2005/05/24(火) 21:43:37
話の流れが読めてないよね
232名無しさん@お腹いっぱい。:2005/05/24(火) 21:54:36
[m] という文字列は、
シェルにとってはファイル名展開(ワイルドカードの一種)
grepにとっては正規表現であること、
および、シェルの引数解釈とコマンド実行の順序関係について、

>>227 = >>229 は理解していないと見た。
233名無しさん@お腹いっぱい。:2005/05/24(火) 22:01:15
>>224
間違ってないっしょ。
234名無しさん@お腹いっぱい。:2005/05/24(火) 22:34:42
>>233
ゴミンナサイ
221 は 209 の test コマンドに対して突っ込み入れてるのかと
思ってたけど違うか
235名無しさん@お腹いっぱい。:2005/05/24(火) 22:45:37
説明しよう。

221 は 209 の testコマンドの = の両側にスペースがないことに
突っ込みを入れた。(この突っ込みは正しい)


222 は、221が自分への突っ込みかと誤解した。
しかし、その後、222が [m]y_command の意味について
説明していること自体は正しい。

上記の2つは全然別の話題。
236名無しさん@お腹いっぱい。:2005/05/24(火) 22:53:41
ナルホド、ありがとう。
ちなみに 222 != 218 です。自分が 218, 219 なので。
237221:2005/05/25(水) 00:42:17
>>235
ワロス

全然話が噛み合ってないと思ったらそういうことか。[]が紛らわし
かったのね。
238名無しさん@お腹いっぱい。:2005/05/25(水) 01:56:43
よく読みといたな。バグでも探すみたいだ。
239名無しさん@お腹いっぱい。:2005/05/28(土) 16:08:43
すみません。ちょっとご教授願いたいのですが、

シェルスクリプトで
--------------------------------------
YYYY/MM/dd HH*MM:SS AAAAAAAAA BBBBBBB
CCCCC DDDDD
YYYY/MM/dd HH*MM:SS AAAAAAAAA BBBBBBB
CCCCC DDDDD
--------------------------------------
こういう形のログがある場合に
--------------------------------------
YYYY/MM/dd HH*MM:SS AAAAAAAAA BBBBBBB CCCCC DDDDD
YYYY/MM/dd HH*MM:SS AAAAAAAAA BBBBBBB CCCCC DDDDD
--------------------------------------
こういう風に直したいのですが、どのようにすればいいのですか?
要するに改行を取り除きたいのですが・・・。
240名無しさん@お腹いっぱい。:2005/05/28(土) 16:16:56
>>239
シェルスクリプトでもreadを使えばできるが、
普通はsedを使った方が楽。
よって、sedスレで質問しなさい。

http://pc8.2ch.net/test/read.cgi/unix/1085730992/l50
241名無しさん@お腹いっぱい。:2005/05/28(土) 16:18:13
239はマルチ
242名無しさん@お腹いっぱい。:2005/05/28(土) 16:19:25
>>239
cat log |sed -ne "N; s/\n/ /; p;"
243名無しさん@お腹いっぱい。:2005/05/28(土) 16:20:41
>>239
必ず2行単位で並んでいて、
その改行を取るだけなら、


while read a_line
do
 echo -n "$a_line"
 read b_line
 echo "$b_line"
done
244名無しさん@お腹いっぱい。:2005/05/28(土) 16:26:46
>>241
どことのマルチか書かないと。
245名無しさん@お腹いっぱい。:2005/05/28(土) 16:31:19
すいません、Solarisスレで最初聞いてしまいました。
こちらに誘導されましたので、こちらで質問させていただきました。
>>242殿、>>243殿 ありがとうございました。
246名無しさん@お腹いっぱい。:2005/05/28(土) 16:37:06
>>245
移動したなら元スレにそう書いといてくれよ。
247名無しさん@お腹いっぱい。:2005/05/28(土) 17:58:29
それにしたって、誘導しといてマルチ呼ばわりする必要ないだろ。
礼儀の足りないやつだとでも心の中で思っとけ。
248名無しさん@お腹いっぱい。:2005/06/02(木) 19:50:43
# clear; while :; do echo -n "^[[1;1H"; netstat -nr; sleep 1; done
   (ttp://codezine.jp/a/article.aspx?aid=67 より)
上のスクリプトのechoの部分は、「echo "^[[1;1H"として画面左上隅にカーソルを
移動させる」とあります。
しかし、bash(2.05b)で動かしてみましたが、^[[1;1Hが表示されるだけです。
何が問題なのでしょうか?
249名無しさん@お腹いっぱい。:2005/06/02(木) 20:07:40
>>248
^[ をどうやって打ち込んだか
250名無しさん@お腹いっぱい。:2005/06/02(木) 20:19:10
echo -ne "¥e[1;1H"
251名無しさん@お腹いっぱい。:2005/06/02(木) 22:08:39
tput crまたはecho -e '\r'の方がいいと思われ。
252名無しさん@お腹いっぱい。:2005/06/02(木) 22:09:01
すまん。echo -ne '\r'だった
253251:2005/06/02(木) 22:13:48
さらに、ごめん。出力は1行じゃないのね。じゃあ毎回clearでもい
いと思うが。
254名無しさん@お腹いっぱい。:2005/06/02(木) 22:18:46
>>253
そういう話じゃなくて>>249ってだけだと思うが
255名無しさん@お腹いっぱい。:2005/06/02(木) 22:30:21
>>254
すまん。
256名無しさん@お腹いっぱい。:2005/06/03(金) 14:01:33
tput cup 0 0
257名無しさん@お腹いっぱい。:2005/06/03(金) 17:29:18
OSを特定できないヘテロな環境(POSIXは仮定できる)で
ファイルのサイズを取得するのはどうすればいいのでしょう?

ls -lのサイズのカラムは決まっていないようですし、
-sオプションの振舞いも微妙に異なるので困ってます。
258名無しさん@お腹いっぱい。:2005/06/03(金) 17:35:19
>>257
stat(2)
259257:2005/06/03(金) 17:42:10
>>258
シェルスクリプトの中でcc起動してってことでしょうか?
Cのコードを書くとなると、そこでまたポータビリティに気を
使ったりしなきゃならないので、なるべく避けたいです。

wc呼ぶぐらいなら、Cのコードで行くとは思いますが...
260名無しさん@お腹いっぱい。:2005/06/03(金) 17:45:51
昔のSolarisだとccがついてこなかったような。
261名無しさん@お腹いっぱい。:2005/06/03(金) 18:42:01
stat(1)でいいじゃん
262257:2005/06/03(金) 19:08:53
>>261
stat(1)のない古めのOSもあるんです。

POSIX標準の話を付け加えれば、stat(1)は標準にないようです。
263名無しさん@お腹いっぱい。:2005/06/03(金) 19:21:44
とりあえず進む。ダメな環境にぶち当たった時点で個別に考える。
264名無しさん@お腹いっぱい。:2005/06/03(金) 22:06:44
>>259
なんでwc嫌なの? wcだってfstatしてるだけじゃない。
265名無しさん@お腹いっぱい。:2005/06/04(土) 00:40:25
>264
どのUNIXでも、wc -cはfstatするの?
266265:2005/06/04(土) 00:51:41
Solaris 9 はreadの繰り返し。
Red Hat Linux 9 は fstat64
FreeBSD 4.xはfstat
267名無しさん@お腹いっぱい。:2005/06/04(土) 14:40:08
> wc呼ぶぐらいなら、Cのコードで行くとは思いますが...
じゃあスレ違いなんでどっか行ってください。
268名無しさん@お腹いっぱい。:2005/06/04(土) 17:50:01
ファイルサイズもまともに取れないOSって糞ですね
269名無しさん@お腹いっぱい。:2005/06/04(土) 19:23:01
>>268
必死だなw
270名無しさん@お腹いっぱい。:2005/06/04(土) 23:41:27
関数を呼び出してその戻り値をある変数に入れたいのですがどうやればいいのか分りません。

    VAL=func1()

としただけでは
line 3: syntax error near unexpected token `('
となってしまいます。
271名無しさん@お腹いっぱい。:2005/06/04(土) 23:45:31
func1
VAL=$?
272名無しさん@お腹いっぱい。:2005/06/04(土) 23:49:47
>>271
ありがとうございます。さすがシェルスクリプトですね。ダサすぎますw
PerlやRubyが流行るのも分るような・・・
273名無しさん@お腹いっぱい。:2005/06/04(土) 23:57:14
>>271 で取得出来るのは終了ステータスだが、それで良いのか?
インタラクティブ用途がメインの言語にケチ付けるのもアレだな
274名無しさん@お腹いっぱい。:2005/06/04(土) 23:57:37
関数呼び出しに()はいらないよ
275名無しさん@お腹いっぱい。:2005/06/05(日) 00:10:23
>>273>>274
関数内でreturnした値が得られたみたいです。
$ function hello(){ return 3;};hello;echo $?
3
ただし、returnできる値はunsigned charに限られるようで、
0〜255までの値しか返せませんでした。ここは注意しないとダメっぽいです・・・

あともう一つお願いします。
$ if [ echo ];then echo "true";fi
true
$ if [ echo "abc" ];then echo "true";fi
bash: [: echo: unary operator expected

これはどうしてなんでしょうか?
276名無しさん@お腹いっぱい。:2005/06/05(日) 00:18:39
>>275
>unary operator expected

って書いてある通り
277名無しさん@お腹いっぱい。:2005/06/05(日) 00:39:38
$ if(echo "abc"&&date);then echo "true";fi
abc
Sun Jun 5 00:39:09 JST 2005
true

testをやめて()にしたら、なぜだかいきました。
でも()ってたしかサブシェルの起動だったような・・・よくわからん
278名無しさん@お腹いっぱい。:2005/06/05(日) 00:45:13
if echo "abc";then echo "true";fi
ってどうなるかわかる?
279名無しさん@お腹いっぱい。:2005/06/05(日) 00:55:16
>>277
なんか基本的な部分が分かってない気がする。
とりあえず、man testしてみなさい。
280名無しさん@お腹いっぱい。:2005/06/05(日) 01:08:54
いや、たぶん man sh をじっくり読むべきじゃないかな。
それが bash なら test の説明もあるし。

>>272
Perl や Ruby よりもシェルスクリプトが勝る点は、
どんなアホにもすぐに書き散らかすくらいのことは出来るようになるってこと
だからしょうがないよ。がんばれ。
281名無しさん@お腹いっぱい。:2005/06/05(日) 01:08:59
man sh だろ。
282名無しさん@お腹いっぱい。:2005/06/05(日) 01:09:45
>>279
test(1)の中の記述で、

  (expression) True if expression is true.

というものがあるんですが、これはなんでしょう?

>>278
ifというのは「以下に続くコマンドを実行した、その終了ステータスを
判定する」ということなのですね。
$ if cat /etc/password > /dev/null 2>&1;then echo "true";else echo "false";fi
false
$ if [ -z `cat /etc/password` ];then echo "true";else echo "false";fi
cat: /etc/password: No such file or directory
true

先のif(echo "abc"〜では、起動したサブシェルの終了ステータスを
判定していたということですか。なるほど。
283名無しさん@お腹いっぱい。:2005/06/05(日) 01:11:25
>Perl や Ruby よりもシェルスクリプトが勝る点は、
>どんなアホにもすぐに書き散らかすくらいのことは出来るようになるってこと
〜よりも〜が の用法が逆です。
284名無しさん@お腹いっぱい。:2005/06/05(日) 01:21:54
あと最初に戻って、
$ test echo
$ test ! echo
これらがなんのメッセージも出さないのはちょっと謎です。
まあどうでもいいか。
285名無しさん@お腹いっぱい。:2005/06/05(日) 01:45:59
>>284
うちの man test には以下の記述があります。

s1 True if s1 is not the null string.

なんのメッセージも出さないのは、そもそも echo が実行されないからですね。
286名無しさん@お腹いっぱい。:2005/06/05(日) 03:13:50
>>282
括弧を付けてもいいってこと。まあ普通は付けない
>>284
test echoはtest hogeと同じ
287名無しさん@お腹いっぱい。:2005/06/05(日) 03:48:56
>>265
しない例を挙げてください
288名無しさん@お腹いっぱい。:2005/06/05(日) 04:13:41
(´・ω・`)
289名無しさん@お腹いっぱい。:2005/06/05(日) 13:09:11
>>288 ハゲワロス 壺にハマッタ〜 (゜∀。)ワヒャヒャヒャヒャヒャヒャ
290名無しさん@お腹いっぱい。:2005/06/06(月) 22:14:47
真か偽か、コレの表示出すにはどないしたらええの?
291名無しさん@お腹いっぱい。:2005/06/06(月) 22:17:07
echo 真か偽か
292名無しさん@お腹いっぱい。:2005/06/06(月) 22:40:07
test hoge && echo 真 || echo 偽
293名無しさん@お腹いっぱい。:2005/06/09(木) 23:15:07
/var/qmail/bin/maildir2mbox && exec elm ${1+"$@"}
この ${1+"$@"} ってどういう意味?
294名無しさん@お腹いっぱい。:2005/06/09(木) 23:41:09
本家 Bourne シェルにあったバグを避けるおまじない。
詳しい意味はUNIXプログラミング環境に書いてあった
希ガス
295名無しさん@お腹いっぱい。:2005/06/10(金) 07:25:39
本家Bourne shellの系統と思われるSolaris/SunOSの/bin/shでさえ、
${1+"$@"}と書く必要はなかったよ。
(引数ゼロ個の場合、"$@"は空文字列にならず、完全に消えてくれる)

今時、"$@"でいいんじゃないか?
逆に、${1+"$@"}と本当に書かなきゃならないshが存在するOSを
教えてくれ。
296名無しさん@お腹いっぱい。:2005/06/10(金) 08:24:03
つくればあるもーん
297名無しさん@お腹いっぱい。:2005/06/10(金) 09:42:11
ハッキングから、消防のたわごとまで、これが うにっx クオリティ
298名無しさん@お腹いっぱい。:2005/06/10(金) 22:27:08
sed の d と D の違いを教えてください。
>d
> パターンスペースを削除する。次のサイクルを開始する。
>D
> パターンスペースの最初の改行までを削除する。次のサイクルを開始するが、パターンスペースにまだデータが残っていたら、入力からの読み込みをスキップする。
299名無しさん@お腹いっぱい。:2005/06/10(金) 22:33:39
300名無しさん@お腹いっぱい。:2005/06/14(火) 23:20:41
1時間に10000個のファイルを消そうとしているのですが
forで回してひとつひとつ消すと
時間はかかるけどvmstatで表示されるidが95 をキープする。
forのなかで5個ずつ消すと
時間はかからないけどidが90を切っちゃう。

時間かけず、idを高く保って、大量のファイルを削除する方法ありますきあ?
301名無しさん@お腹いっぱい。:2005/06/14(火) 23:24:24
xargs
302名無しさん@お腹いっぱい。:2005/06/14(火) 23:31:43
>>300
idって何よ。priorityあるいはniceか?どっちにしてもエスパーな質問だな……
303名無しさん@お腹いっぱい。:2005/06/14(火) 23:47:02
>>302
vmstatコマンドを打つとcpuのしたにus,sy,idと表示されますよね?
idleだとおもいます。
304名無しさん@お腹いっぱい。:2005/06/15(水) 00:16:38
思いますじゃなくてmanを嫁。
305名無しさん@お腹いっぱい。:2005/06/15(水) 00:24:48
idle timeだよね
306名無しさん@お腹いっぱい。:2005/06/15(水) 05:12:02
>>300
ファイルを削除ディレクトリに移動してディレクトリごと削除
307名無しさん@お腹いっぱい。:2005/06/15(水) 09:32:12
>>306
移動の時に同じ質問が
時間かけず、idを高く保って、大量のファイルを移動する方法ありますきあ?
308名無しさん@お腹いっぱい。:2005/06/15(水) 10:09:42
そもそも何でそんな馬鹿げた要求が出てきてるのかわからんなぁ。
idle を増やしたいなら、ファイル消すたびに sleep 10 とかしたら?

>forのなかで5個ずつ消すと

rm file1; rm file2; ... と rm file1 file2 ... で
だいぶ違うわけだがどっちよ?
309名無しさん@お腹いっぱい。:2005/06/15(水) 20:21:21
借鯖とかでキャップされてるんじゃないの
310名無しさん@お腹いっぱい。:2005/06/16(木) 00:09:18
>>308

rm file1 file2
でしょ

rm file1; rm file2;
は時間かかるぽい
311名無しさん@お腹いっぱい。:2005/06/16(木) 06:27:49
fork に時間がかかるんでしょ
じぶんで thread で unlink するコマンドを書けば
312名無しさん@お腹いっぱい。:2005/06/16(木) 07:42:19
じぶんで thread で unlink するコマンドを書けるシェルなんてあるのか?

まぁ正解はシェルスクリプトで書くのをあきらめろってとこか。
313名無しさん@お腹いっぱい。:2005/06/16(木) 08:04:16
つ[Java]
314名無しさん@お腹いっぱい。:2005/06/16(木) 20:58:46
基本的なことで悩んでいます。
コマンドラインから
ls -ld /hoge/???/????? | awk "{print $9}"
と実行しますと<結果1>のように動作するのですが、
このコマンドをsh(bash)で実行すると<結果2>のように
エラーが吐かれてしまいます。
どのようにすればshで動作させることが出来るのか教えていただけないでしょうか?

<結果1>
/hoge/aaa/bbbbb
/hoge/aaa/ccccc
/hoge/ddd/eeeee




<結果2>
sh -xf hoge.sh
#ls -ld /hoge/???/?????
/hoge/???/?????は見つかりません。
315名無しさん@お腹いっぱい。:2005/06/16(木) 21:15:14
>>314
ルートにhogeはあるのか?
316314:2005/06/16(木) 21:31:28
>>315さん
ルートにhogeがあります。
補足説明しますと、
今回求めたいディレクトリは
ルート直下のhogeの中に/日付/時間と作られています。
パスの長さは一定なのでワイルドカードの[?]を用いて取得したのですが、
shに組み込むとうまくいかなかったのです。
317名無しさん@お腹いっぱい。:2005/06/16(木) 21:49:28
sh -c 'ls -ld /hoge/???/????? ' してみたらどうなる?
318名無しさん@お腹いっぱい。:2005/06/16(木) 22:26:41
awk '{print $9}'
319名無しさん@お腹いっぱい。:2005/06/16(木) 22:30:34
>>315
sh -xf しちゃ駄目だよ。
f はワイルドカード禁止オプション。
sh -x hoge.sh
でやってみろ。

あと、回答してる香具師、みんなハズシ。
320名無しさん@お腹いっぱい。:2005/06/16(木) 22:46:14
ここってC言語スレより殺伐としてないですね・・・。
321314:2005/06/16(木) 22:56:16
>>317さん、318さん、319さん
回答有難うございます。
只今実行できる環境ではないので報告は明日になると思います。

>-f はワイルドカード禁止オプション。
知りませんでした。。。
322名無しさん@お腹いっぱい。:2005/06/16(木) 23:02:51
知らないオプションむやみにつける癖やめたほうがいいよ。
ディレクトリ消すとき 必ず rm -fr するタイプ?
323名無しさん@お腹いっぱい。:2005/06/16(木) 23:08:08
それがなんかいかんのか?
324名無しさん@お腹いっぱい。:2005/06/16(木) 23:20:13
>>323
美しくない。
325名無しさん@お腹いっぱい。:2005/06/16(木) 23:31:12
わけもわからずperl -wと付けていた時期が俺にもありました
326名無しさん@お腹いっぱい。:2005/06/16(木) 23:34:36
-f 付けるのはCシェルスクリプターだね
327314:2005/06/18(土) 03:08:00
結果報告。
「-f」を外した所無事に出来ました。
有難うございました。
何故「-f」を付けたかというと、手元にあった書籍に書いてあったと認識してたんですけど
再度読み直してみるとそんな事は一言も書かれてませんでした。
凹みました。

>>322さん
するタイプであります・・・
328名無しさん@お腹いっぱい。:2005/06/18(土) 20:07:42
>>324
後学のために美しいやりかたを教えてくれたまえないか
329名無しさん@お腹いっぱい。:2005/06/18(土) 20:51:30
rm -r ですむときは -f は除いたほうがいいし、
rmdir ですむときはそうしろってことじゃないの。
美しい美しくないというより、
rm -fr は危ない。
330名無しさん@お腹いっぱい。:2005/06/18(土) 23:57:02
f なんかなくてもサクっと消えてくれます
331名無しさん@お腹いっぱい。:2005/06/19(日) 18:15:14
おれはmvもrmも-iつきでエイリアスしてるけど、

ワイルドカードや再帰削除の場合はいちいち聞かれるとウザいので
-fつける。でもこういう危険な場合に限って-fつけるんでは、実は
あまり意味が無い気がする

二回ぐらい
rm -f *.jpg
のつもりで
rm -f *>jpg
とtypoして、カレントディレクトリの中身全削除したことある。
シフトキーの入力が甘かったりするとこうなる。
332名無しさん@お腹いっぱい。:2005/06/19(日) 18:22:38
rmはゴミ箱スクリプトにすればよい。
333名無しさん@お腹いっぱい。:2005/06/19(日) 21:21:53
touch ' -i'
334名無しさん@お腹いっぱい。:2005/06/20(月) 00:43:47
>>333
touch ./-i
やってみたが、目からウロコ
335名無しさん@お腹いっぱい。:2005/06/20(月) 08:16:33
336名無しさん@お腹いっぱい。:2005/06/20(月) 18:23:18
ダウンロードしたファイルを、ファイルの作成日ごとに、日付の入ったフォルダを作成して、移動するうまい方法ってありませんか?
もしよろしければ、何か手がかりをください。
337名無しさん@お腹いっぱい。:2005/06/20(月) 19:12:39
m9(^Д^)プギャーーーッ
338名無しさん@お腹いっぱい。:2005/06/20(月) 19:13:00
>>336
まず、「日付の入ったフォルダ名」の名称自体を得るには、
dateコマンドに適当なスイッチをつければよい。厳密には
環境依存だからmanせよ。

つぎに、あるコマンド(例えばdate)の結果(標準出力)を
変数に入れたり、もしくは他のコマンドで利用するには、
backquoteを使う。
value=`...`
とか、
mkdir `....`
ね。これで、目的の名前のフォルダできるだろ。

あとは、適当に移動(mv)せよ。

339名無しさん@お腹いっぱい。:2005/06/20(月) 19:32:17
>>338
ありがとうございます。
340名無しさん@お腹いっぱい。:2005/06/20(月) 19:32:38
>>337
> m9(^Д^)プギャーーーッ

笑わないでください。
341名無しさん@お腹いっぱい。:2005/06/20(月) 20:17:47
任意のリモート・ホストの、任意のディレクトリが存在するか
チェックするにはどのようなすればよいでしょうか?
rshとかtestでがんばってたんですが、挫折しました・・・
342名無しさん@お腹いっぱい。:2005/06/20(月) 20:32:04
>>341
ssh HOST test -d DIR
343名無しさん@お腹いっぱい。:2005/06/20(月) 20:32:36
>>341
ssh 使え。
ssh foo test /foo
echo $?
344名無しさん@お腹いっぱい。:2005/06/21(火) 01:51:02
任意のファイルを先頭n列、後ろからm列を取り除いたファイルに
編集したいんですが、どうすればいいでしょうか?
Cでやるのは避けたいんだけど。。。
345名無しさん@お腹いっぱい。:2005/06/21(火) 01:59:08
>>344
cut
346名無しさん@お腹いっぱい。:2005/06/21(火) 02:05:36
>>345
詳しく
347名無しさん@お腹いっぱい。:2005/06/21(火) 02:07:02
>>346
man cut
348名無しさん@お腹いっぱい。:2005/06/21(火) 02:14:08
質問を間違えてた。
任意のファイルを先頭n行、後ろからm行を取り除いたファイルに
編集したいんですが・・

349名無しさん@お腹いっぱい。:2005/06/21(火) 02:16:08
head, tail
350名無しさん@お腹いっぱい。:2005/06/21(火) 02:18:32
head,tailじゃ指定行の表示しかできないでしょ。
351名無しさん@お腹いっぱい。:2005/06/21(火) 02:20:02
>>350
> WORD
Open file WORD for writing as standard output. If the file does
not exist then it is created. If the file exists, and the CLOBBER
option is unset, this causes an error; otherwise, it is truncated
to zero length.
352名無しさん@お腹いっぱい。:2005/06/21(火) 02:20:56
>>350
単独ではな。
353名無しさん@お腹いっぱい。:2005/06/21(火) 02:28:30
うーんわからんです。
ファイルをcatしてパイプで繋げてheadとかですか?
354348:2005/06/21(火) 02:43:05
tail 先頭n行-ライン行数
head 後ろm行-ライン行数ってのは思いついたが、
ファイル行数が数万とかだと処理遅いよね・・・
355名無しさん@お腹いっぱい。:2005/06/21(火) 02:44:37
全部でw行あるとして
tail +$((n+1)) |head -$((w-m-n))
356名無しさん@お腹いっぱい。:2005/06/21(火) 19:22:40
tail +$((n+1)) file | tail -r | tail +$((m+1)) | tail -r
357名無しさん@お腹いっぱい。:2005/06/21(火) 20:51:21
結局スクリプトを書くのが早くて速い。

awk 'NR>m{a[NR+n]=$0;if(NR in a) print a[NR]}'
358名無しさん@お腹いっぱい。:2005/06/21(火) 21:35:22
>>355
できました。
ありがとうございました。

結局どれがベストかわかんないけど、、、

359名無しさん@お腹いっぱい。:2005/06/21(火) 21:59:30
スクリプト書いちゃうんだったらrubyで書くぞ。

ruby -e 'ARGF.to_a[n..-m].display'
360名無しさん@お腹いっぱい。:2005/06/22(水) 00:31:22
sedとawkはセーフ
361名無しさん@お腹いっぱい。:2005/06/22(水) 00:50:17
awkは高機能過ぎなので禁止。
362名無しさん@お腹いっぱい。:2005/06/22(水) 06:17:16
wget -i URLリストファイル
で複数サイトを取得し、それをindex.html.1 index.html.2・・のように連番をつけて保存したいのですが、
wget -i url_list.txt -O index.html
だとindex.htmlに次々に上書きしてしまいます。
どのように直すべきか教えてください。よろしくお願いいたします。
363名無しさん@お腹いっぱい。:2005/06/22(水) 07:20:50
>>362
-O index.html なしで。
wget の質問ならくだ質行け。
364名無しさん@お腹いっぱい。:2005/06/22(水) 08:16:50
>>363
いや、これは連番のH画像の守備範囲だろ。
365紹介しとくよ:2005/06/22(水) 10:10:46
連番のH画像を一気にダウンロードする
http://pc8.2ch.net/test/read.cgi/unix/979106537/
366名無しさん@お腹いっぱい。:2005/06/22(水) 20:56:56
/bin/sh で環境変数に設定できる文字列長の上限ってあるんでしょうか?
どこを見れば良いんだろ。
367名無しさん@お腹いっぱい。:2005/06/22(水) 21:14:37
>>366
fj.unix.shells の2003年1月の記事。
368名無しさん@お腹いっぱい。:2005/06/22(水) 21:36:02
>>367
そんなドメイン、実在するんですか?
アクセスすると
DNSエントリが見つかりません
のエラーになったんですけど。
369名無しさん@お腹いっぱい。:2005/06/22(水) 21:40:11
>>367
そんなドメイン、実在するんですか?
アクセスすると
DNSエントリが見つかりません
のエラーになったんですけど。
370名無しさん@お腹いっぱい。:2005/06/22(水) 21:43:25
fj ...。
371名無しさん@お腹いっぱい。:2005/06/22(水) 21:47:11
fj を知らなくても
fj.unix.shells 2003 1
でググってみるとすぐわかると思うんだけど。。。
ttp://groups.google.com/[email protected]
372366:2005/06/22(水) 22:02:10
ちなみに、>>368 は質問者ではごじゃいません。
373名無しさん@お腹いっぱい。:2005/06/22(水) 22:36:19
さもありなん
374名無しさん@お腹いっぱい。:2005/06/22(水) 23:32:43
>>373
お前、古典の成績よくなかっただろw
375名無しさん@お腹いっぱい。:2005/06/23(木) 00:36:40
何で古典が関係あんの?
376名無しさん@お腹いっぱい。:2005/06/23(木) 00:51:40
>>374
お前、現国の成績よくなかっただろw
377名無しさん@お腹いっぱい。:2005/06/23(木) 01:53:22
fj. が通じない世代なのね。。。はぁ・・・。
378名無しさん@お腹いっぱい。:2005/06/23(木) 01:59:20
fj世代はいい年こいてゆがんだ性格がまだ直らないようだな
379名無しさん@お腹いっぱい。:2005/06/23(木) 09:52:15
いい年こいてるから直んないんだよ
380名無しさん@お腹いっぱい。:2005/06/23(木) 19:04:30
Musical Baton というチェーンメールの blog 版をもらった。
ファイルシステム内の音楽ファイルの容量を得るスクリプトキボン。
381名無しさん@お腹いっぱい。:2005/06/23(木) 19:19:14
> Musical Baton というチェーンメールの blog 版をもらった。
TrackBack といい、これといい、なんで blog 界の奴らはこんな糞なことしか思い付かないのか。
382名無しさん@お腹いっぱい。:2005/06/23(木) 23:52:08
bashでの質問です

vmstatの出力結果を5秒毎にファイルに記録してます
vmstat 5 > vmstat_log

記録状況を確かめようとtail -fして監視してみたんですが

どうも途中でバッファリングされているのか20行程まとめて出力が一気に記録されます
vmstatのソースをみたんですが、コマンド自体は出力を毎回フラッシュしているようです

バッファリングされずに5秒毎にリアルタイムに記録したいのですが、
方法はあるんでしょうか
383名無しさん@お腹いっぱい。:2005/06/24(金) 00:05:15
>>382
俺のところではそれでちゃんと5秒くらいごとに一行ずつ表示される。
少なくともbashとは何の関係もないな。
システム依存のスレにいったほうがいい。
384名無しさん@お腹いっぱい。:2005/06/24(金) 00:05:41
スレ違い
385名無しさん@お腹いっぱい。:2005/06/24(金) 00:05:52
>>382
フラッシュしてるのにフラッシュされないってどんな環境?
386名無しさん@お腹いっぱい。:2005/06/24(金) 00:41:36
>>382
tailの-fオプションって、入力が標準入力(パイプ)の時は無視されるんちゃう?
FreeBSDやGnu(やLinux)のtailだとmanにそうかいてあるけど。
387386:2005/06/24(金) 00:43:18
>>386
超スマン、これ勘違い。
書き込んだファイルをtail -fしたってことか。
388名無しさん@お腹いっぱい。:2005/06/24(金) 10:37:16
>>386
> 書き込んだファイルをtail -fしたってことか。

それだけじゃなくて、

> tailの-fオプションって、入力が標準入力(パイプ)の時は無視されるんちゃう?

これ、書き方が変だよ。
「入力が標準入力(パイプ)の場合に無視される」んじゃなくて、
「入力(標準入力)がパイプの場合に無視される」でしょ。
例えば「tail -f <vmstat_log」の場合、入力は標準入力だけど、
パイプじゃないから無視されないでしょ。

>>382
OSはなに?
NetBSD で
vmstat 5 >vmstat_log &
tail -f vmstat_log
を実行すると、ちゃんと1行ずつ表示されるよ。
vmstatのソースを読んだOSと、vmstatを実行しているOSが違っていて、
実行している方のOSのvmstatでは、毎行のfflush(stdout)がないん
じゃない?
389382:2005/06/25(土) 01:16:44
みなさん御意見ありがとうございます

>>388
OSはRedHatEL3.0です

ちょっとどこのソースをみていたかを確認してみます

ちなみに今手元に環境がないのでcygwinで試したところ同様の現象が起きました
こちらのソースもみてみます・・・


390名無しさん@お腹いっぱい。:2005/06/26(日) 10:09:57
\n で flush されるから、普通いちいち fflush(stdout) なんてしないでしょ?
391名無しさん@お腹いっぱい。:2005/06/26(日) 12:11:34
>>390
man stdio
392名無しさん@お腹いっぱい。:2005/06/26(日) 13:12:51
出力先がファイルのときは\nでflushされない罠
393名無しさん@お腹いっぱい。:2005/06/26(日) 16:49:12
>>333,334 OSは何?
394名無しさん@お腹いっぱい。:2005/06/27(月) 10:50:08
>>390
つ[APUE 2nd Edition]
395名無しさん@お腹いっぱい。:2005/06/27(月) 11:47:03
下記のスクリプトで、
なぜcutはsortの出力のみを処理するのですか?
どうやってcatの出力とsortの出力を区別しているのですか?

#!/bin/sh
cat a.txt |
if [ "$MAILCHECK" = 10 ]
then
sort b.txt | cut -d, -f1
sed 's/hoge/fuga/'
else
sed 's/foo/bar/'
fi
396名無しさん@お腹いっぱい。:2005/06/27(月) 12:55:31
>>395
区別なんかしてない。標準入力を見ているだけだ。パイプによって
標準入力は sort の出力と結び付けられている
397名無しさん@お腹いっぱい。:2005/06/27(月) 13:40:53
よく分かりません。
パイプによって標準入力はsortの出力と結びつけられている。
さらに、catの出力とも結びつけられている。
というように思えます。
catとsortの出力が混じり合ったものをcutが処理すると
予想していましたが、catの出力がsedに渡っているよう
なので混乱しています。

もしかして
1. cutの標準入力にsortの出力を結びつける
2. その結び付きを解除する
3. sedの標準入力にcatの出力を結び付ける
4. その結び付きを解除する
という手順なのでしょうか?

398名無しさん@お腹いっぱい。:2005/06/27(月) 14:13:37
cutの入力にはsortの出力が設定されている。だからsortの出力を処理する。
sedの行では特に入力は明示されていない。だからcatの出力をそのまま処理する。
399名無しさん@お腹いっぱい。:2005/06/27(月) 16:00:12
なんとなく分かりました
パイプについてもっと勉強します
ありがとうございました
400名無しさん@お腹いっぱい。:2005/06/27(月) 16:26:21
man sh あたりにパイプラインについて書いてない?
401名無しさん@お腹いっぱい。:2005/06/27(月) 18:09:56
デケデケデケデケ
402名無しさん@お腹いっぱい。:2005/06/27(月) 20:08:50
キュッキュッ
403名無しさん@お腹いっぱい。:2005/06/28(火) 17:07:24
AIX の sh だけど特定のファイルのタイムスタンプを取得する良い方法はありますか?
ls の結果を解析すれば取れるだろうけどもそっとスマートなやり方はないかな?
404名無しさん@お腹いっぱい。:2005/06/28(火) 17:16:53
>>403
Linuxだけど stat -c %y <file> で last modified を取得してまつよ
でも、表示が冗長なので他にも方法があれば知りたいところ
405名無しさん@お腹いっぱい。:2005/06/28(火) 17:44:57
perl -e '@stat=stat("/"); print localtime($stat[9]) . "\n";'
406名無しさん@お腹いっぱい。:2005/06/29(水) 14:28:09
>>403
またお前か。
407名無しさん@お腹いっぱい。:2005/06/29(水) 16:06:58
>>406
まるち?
408名無しさん@お腹いっぱい。:2005/07/06(水) 00:00:30
dirA/hoge01_1.txt
dirA/hoge01_2.txt
dirA/hoge01_10.txt
dirA/hoge01_11.txt
があった時に、find . -name "*.txt" して、この順番で表示させたいのですが、
やってみると、FreeBSDのfindだと期待通り表示されますが、cygwin の find
だと

dirA/hoge01_1.txt
dirA/hoge01_10.txt
dirA/hoge01_11.txt
dirA/hoge01_2.txt

と表示されてしまいます。これを上のように表示させる良い方法はないでしょうか?
find の出力を sort -t "_" -k2 とかやってもうまくいきませんでした。
409名無しさん@お腹いっぱい。:2005/07/06(水) 00:12:29
文字列でソートしたら下のようになるよね。lsもそうなる。linux
でfindしたら上になった。
410名無しさん@お腹いっぱい。:2005/07/06(水) 00:12:49
>>408
_と.で区切れ。
411名無しさん@お腹いっぱい。:2005/07/06(水) 00:20:48
find は見つかった順に出力されるから、
同じマシンであってさえ、ファイルの作成した時期とかによって
出力の順番が異なることがありうるぞ。
412408:2005/07/06(水) 00:34:58
>>409-410
どうもです。

とりあえず sort -n -t "_" に通したら、うまくいきますた。

>>411
ということは、>>408の上のように表示されてもそれはたまたま
なので、sort に通した方が良さそうですね。
413名無しさん@お腹いっぱい。:2005/07/06(水) 00:45:35
>>410
sort でセパレータを2つ指定できるの?

>>412
「-k」を指定しないなら「-t」は不要だと思う。
その例なら「-n」だけでうまくいくんだろう。
ただ、「-n」は数値以外のフィールドでソートする場合(今回の場合)、
動作は保証されないと思う。
414名無しさん@お腹いっぱい。:2005/07/06(水) 10:37:35
man見る限りsortのセパレータは正規表現じゃないな
415名無しさん@お腹いっぱい。:2005/07/06(水) 13:10:33
シェルでファイルの拡張子以外の部分(正確にはピリオドより前の部分)
を取得する方法をおしえてくださいませ。

for i in `ls *txt`
do
cat $FILE.txt | 適当な処理 > $FILE.doc
done

みたいなことをしたい。
前もって、foo だけを取得して、$FILE=foo としたい。。。
416名無しさん@お腹いっぱい。:2005/07/06(水) 13:13:55
FOO=`basename $i .txt`
417名無しさん@お腹いっぱい。:2005/07/06(水) 13:15:53
ああ、なんかめちゃくちゃや。。。
訂正。

for in `ls *txt`
do
ここで、$FILE にファイルのピリオドより前の部分を突っ込みたい。
cat $i | 適当な処理 > $FILE.doc
done
418名無しさん@お腹いっぱい。:2005/07/06(水) 13:17:19
>>415
> for i in `ls *txt`
for i in *txt じゃだめなん?
419名無しさん@お腹いっぱい。:2005/07/06(水) 14:24:30
bashなら${i%.???}
http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html#lbAZ

sedなら sed 's/¥.[^¥.][^¥.][^¥.]$//'
420名無しさん@お腹いっぱい。:2005/07/06(水) 14:53:56
>>417
ふつー、basenameだろ。

FILE=`basename "$i" .txt`
cat "$i" | 適当な処理 > "$FILE".doc

さらにいうとcatも要らんな。

FILE=`basename "$i" .txt`
適当な処理 < "$i" > "$FILE".doc

で桶。
ファイルネームが含まれる場合、いつも" "で囲う癖を付けた方がいいよ。
421417:2005/07/06(水) 15:54:41
みなさんありがつ。

basename って初めてしったよ。。。

>>420
ファイルネームが含まれるときは、"" で囲った方がいいのは、
なんでかしらん? ようわからん。。。
422名無しさん@お腹いっぱい。:2005/07/06(水) 16:19:18
シェルが困っちゃうような文字列が含まれてることあるじゃん?
423名無しさん@お腹いっぱい。:2005/07/06(水) 21:49:30
>>421
シェルスクリプトなら、/etc とか /bin の下にあるのを
参考にすると勉強になると思うよ。
424名無しさん@お腹いっぱい。:2005/07/07(木) 23:45:15
時々コマンドをフルパスで書いているスクリプトを見かけるのですが、
何か意味があってそうしてるんでしょうか?
425名無しさん@お腹いっぱい。:2005/07/07(木) 23:53:10
alias 切られてたり、PATH 変数によって意図したコマンドと違う物が起動したら嫌でしょ
426名無しさん@お腹いっぱい。:2005/07/07(木) 23:54:09
PATHをセットするのが面倒だから,とか?

ちがうな。。。。
427名無しさん@お腹いっぱい。:2005/07/07(木) 23:57:08
cron から起動するんだろ。まぁ /bin の下のとかは必要ないが統一性をもたせるためにとか。
428名無しさん@お腹いっぱい。:2005/07/08(金) 00:09:38
秒単位のファイルの更新時刻ってどうやったらわかんの?
ls -lだと分までしかでないんだけど。
429名無しさん@お腹いっぱい。:2005/07/08(金) 00:11:54
stat(3C)
430名無しさん@お腹いっぱい。:2005/07/08(金) 00:35:50
おっけー。
あんがと。
431No Gnus is good news:2005/07/08(金) 00:41:35
>>428
perl -e '@stat=stat("/"); print localtime($stat[9]) . "\n";'
432No gnus is bad news:2005/07/08(金) 00:53:18
foo=/usr/local/bin/emacs
emacs --batch --eval '(princ (format-time-string "%r\n" (nth 5 (file-attributes "'$foo'"))))'
冗談です^^;;
433名無しさん@お腹いっぱい。:2005/07/08(金) 09:30:44
stat にオプションが効かねえええ

と思ったら zsh は stat が builtin なのね orz
434名無しさん@お腹いっぱい。:2005/07/08(金) 09:31:12
つか date -r ./hoge でわかった。
でもお前らいろいろありがとうな。
435名無しさん@お腹いっぱい。:2005/07/08(金) 10:13:57
solaris$ date -r /tmp
date: illegal option -- r

だせぇー。やっぱGNU date必須だな。
436名無しさん@お腹いっぱい。:2005/07/08(金) 10:20:07
FreeBSD% date -r /tmp
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]
437名無しさん@お腹いっぱい。:2005/07/08(金) 10:39:16
% date -r 1000000000
Sun Sep 9 10:46:40 JST 2001

個人的にはこれができる FreeBSD の date の方が GNU date より重宝する。
GNU date でもできなくはないんだけどさ。

% date -d "$(($(date +%s) - 1000000000)) seconds ago"
Sun Sep 9 10:46:40 JST 2001
438名無しさん@お腹いっぱい。:2005/07/08(金) 10:42:40
>>433
どの zsh よ?
439名無しさん@お腹いっぱい。:2005/07/08(金) 14:01:07
>>435
GNU者うざい。
440名無しさん@お腹いっぱい。:2005/07/08(金) 14:13:00
>>439
(゚Д゚)ハァ?
441名無しさん@お腹いっぱい。:2005/07/08(金) 15:55:26
>>437
その目的ならおれはこれでいいや。
perl -e 'print scalar localtime 1000000000'
442名無しさん@お腹いっぱい。:2005/07/09(土) 00:40:44
GNU の ls だったら --full-time が使える。
書式は --time-style で好きなように
443名無しさん@お腹いっぱい。:2005/07/09(土) 01:12:54
bash で質問です。

> cat hoge.txt
20050708 aaa AAA
20050709 bbb BBB
20050710 ccc CCC

っていうファイルがあったとして、感覚的には、

grep 20050709 hoge.txt | read STR1 STR2 STR3

みたいな感じで、
STR1 に 20050709
STR2 に bbb
STR3 に BBB

を入れたいです。

何かうまい手はないでしょうか?
よろしくお願いします。
444名無しさん@お腹いっぱい。:2005/07/09(土) 01:16:47
>>442
GNU者うざい。
445名無しさん@お腹いっぱい。:2005/07/09(土) 01:19:06
>>441
perlのワンライナーをシェルスクリプトに入れるのって
どうなんだろう

そのうちどうせなら全部perlで書いたほうが、はやいし
移植性も高いかも?
とかそんなようなことを思ったりして
446名無しさん@お腹いっぱい。:2005/07/09(土) 01:25:10
>>445
え、漏れは emacs のワンライナーをシェルスクリプトに入れているけど。。。
447名無しさん@お腹いっぱい。:2005/07/09(土) 01:28:25
やりたいことがわからない。
というか、その「感覚的には」のくだり
それそのものがやりたいわけじゃないのよね?

set -- `grep 20050709 hoge.txt` とかいう話でもないだろうし。
448443:2005/07/09(土) 01:41:15
> 447
やりたいことは、
STR1 に 20050709
STR2 に bbb
STR3 に BBB を入れることです。

grep 20050709 hoge.txt | read STR1 STR2 STR3
↑で入ります?

自分の環境だと、STR1,2,3 とも空になってしまうのですが。
449名無しさん@お腹いっぱい。:2005/07/09(土) 01:44:48
ちゃんと ${STR1} で参照してるんだよね?
450443:2005/07/09(土) 02:00:16
>449
はい。ソースを貼り付けられないのが悔しいのですが、
ちゃんと、${STR1} で参照しております。

普通は
grep 20050709 hoge.txt | read STR1 STR2 STR3
で、うまくいくものなのでしょうか?

ちなみに、
read STR1 STR2 STR3 < hoge.txt
だと、
STR1 に 20050708
STR2 に aaa
STR3 に AAA が入ってくれます。
451名無しさん@お腹いっぱい。:2005/07/09(土) 02:03:23
おれんとこもそれできない。
とりあえずファイル経由すれば?
452名無しさん@お腹いっぱい。:2005/07/09(土) 02:11:24
>>450
zsh だと上手くいったけど、bash はダメだった
453名無しさん@お腹いっぱい。:2005/07/09(土) 02:21:24
これは反則? ^^;;
bash-3.00$ read STR1 STR2 STR3 < <(grep 20050709 hoge.txt)
454No Gnus is good news:2005/07/09(土) 02:27:06
If I pipe the output of a command into `read variable', why doesn't
the output show up in $variable when the read command finishes?
http://www.unixguide.net/unix/bash/E4.shtml
455名無しさん@お腹いっぱい。:2005/07/09(土) 02:27:27
>>450
pipeの後に置かれたreadはsubshellで実行されるため、結果の変数は親からは見えません。
>>447のようにgrepをsubshellに回すか、
grep 20050709 hoge.txt | (read STR1 STR2 STR3; echo $STR1 $STR2 $STR3)
subshellの中で完結させるとよいでしょう。
456443:2005/07/09(土) 02:44:28
皆様、アドバイスありがとうございました。
451さんの言う通り、ファイル経由にしようかと思います。

>455
なるほど、勉強になりました。
ありがとうございました。
457名無しさん@お腹いっぱい。:2005/07/09(土) 02:45:56
zsh で成功するのは zsh の拡張機能?
458名無しさん@お腹いっぱい。:2005/07/09(土) 02:56:02
むかしのreadはそもそも
read < file
もできないんじゃなかったっけか
459名無しさん@お腹いっぱい。:2005/07/09(土) 07:37:31
zsh is the shell
460名無しさん@お腹いっぱい。:2005/07/09(土) 07:48:29
grep 20050709 hoge.txt |while read STR1 STR2 STR3; do echo $STR3; done;
にしてみ。
461名無しさん@お腹いっぱい。:2005/07/09(土) 08:55:54
>>460
それ>>455と同じ。
462名無しさん@お腹いっぱい。:2005/07/09(土) 10:20:34
zshを対話的に使うなら分かるが、スクリプトに使う理由がわからん。
463名無しさん@お腹いっぱい。:2005/07/09(土) 14:05:00
よく考えてご覧なさい
464名無しさん@お腹いっぱい。:2005/07/09(土) 14:24:46
>>462
おや、思考停止ですか?
465名無しさん@お腹いっぱい。:2005/07/09(土) 15:22:40
俺もわかんない。
だってzshのスクリプトは、可搬性悪いし、保守性悪いじゃん。

可搬性悪=zshがどこにもインスコされてるわけじゃない
保守性悪=使える(よくわかってる)人の数は sh >>> zsh

これはzsh自体が悪いせいじゃない。でも上の状況を鑑みて、
shが存在するのにshを避けてzshでスクリプト書く理由わからん。
466名無しさん@お腹いっぱい。:2005/07/09(土) 15:41:11
>>465
sh スクリプトと見せかけて、bash スクリプトなんか腐るほどある。
Solaris 使ったことある?
467名無しさん@お腹いっぱい。:2005/07/09(土) 15:42:21
zshが入ってるマシンで自分用に書く場合は?なにも問題なかろう。
468名無しさん@お腹いっぱい。:2005/07/09(土) 15:45:41
>>465
俺の仕事のリーチでは十分可搬性有るし、
状況によって、使える物は何でも使う
469名無しさん@お腹いっぱい。:2005/07/09(土) 15:50:36
    ⊂_ヽ、
      .\\  /⌒\
         \ ( 冫、)  ウンチになぁれ
          > ` ⌒ヽ
         /    へ \
        /    /   \\
        レ  ノ     ヽ_つ
        /  /         ・*.・:
       /  /|          :。 *.・
       ( ( 、           ★。:’*
       |  |、 \        。・.*・; ・
       | / \ ⌒l      ;* ・。;*★ 人・
       | |   ) /      ・ ★・   (_ );; * 。・
      ノ  )   し'        ・ *   (__) * ・。・
     (_/          。*;>>465(●´ー`●)  ★.* ’★
470名無しさん@お腹いっぱい。:2005/07/09(土) 16:29:06
「可搬性」っつってんのに
「zshの入ってるPC」とか
「俺の仕事では」とか
「ウンチになぁれ」とか


バカなのかな?
471名無しさん@お腹いっぱい。:2005/07/09(土) 16:39:19
>>470
同意。

反論するなら
・zsh は可搬性が高いかどうか
・zsh は保守性が高いかどうか
にするべきだろう。

「可搬性や保守性は必要ない」っていう主張は、
「zsh は可搬性や保守性が低い」のは認めているんだよな。
472名無しさん@お腹いっぱい。:2005/07/09(土) 16:39:32
>>468
狭いリーチだな
473名無しさん@お腹いっぱい。:2005/07/09(土) 16:44:13
>>471
可搬性や保守性が高くないと使えないという前提がそもそも
おかしいという主張なんだよ

>>472
仕事柄、古くさい環境は触る必要無いんでね
474名無しさん@お腹いっぱい。:2005/07/09(土) 16:51:11
喧嘩に近い議論にならないようにね。。。
475名無しさん@お腹いっぱい。:2005/07/09(土) 16:51:33
一生 zsh しか使わないとか、
他の人間には触らせずに一生保守し続けるという覚悟があるんだったら
別にいいんじゃないの?

我々普通の人間がとやかく言うことじゃないよ。
476名無しさん@お腹いっぱい。:2005/07/09(土) 16:52:08
珍しく活気付いてると思ったら荒れてるだけかよ
477名無しさん@お腹いっぱい。:2005/07/09(土) 16:54:49
たかがシェルスクリプトで保守性が問題になるって
何万行のスクリプトなんだよ……
478名無しさん@お腹いっぱい。:2005/07/09(土) 16:54:52
結論が出ますた。

(結論1)
zsh は可搬性・保守性が低い

(結論2)
可搬性・保守性が必要ないなら使ってもいいんじゃね?
479名無しさん@お腹いっぱい。:2005/07/09(土) 17:00:19
sh ではできず zsh でしかできないことを実現するのに zsh でスクリプトを書くのは
わからんでもないが、そもそもそんなのが必要になったことがないなぁ。

>>466
Solaris は長いこと使ってるけど、sh スクリプトに見せかけた
bash スクリプトなんてものを見た記憶はない。
ksh スクリプトはたくさんあるけど、sh に見せかけてるわけじゃなく
ちゃんと ksh スクリプトだと名乗ってるし。
480名無しさん@お腹いっぱい。:2005/07/09(土) 17:03:27
Linux の間違いなんじゃないの
Solaris で bash が入ったのって 8 くらいからじゃなかったっけ?
481名無しさん@お腹いっぱい。:2005/07/09(土) 17:04:04
>>479
$(..) を使っているスクリプトや ^ をクォートせずに使っているスクリプトとか見たことない?
482名無しさん@お腹いっぱい。:2005/07/09(土) 17:21:17
^ はイマドキなら/bin/shでもクォートしなくていい。
$( ) とか、export VAR=var とかはやめて欲しいな。
$(( )) は論外。
483名無しさん@お腹いっぱい。:2005/07/09(土) 17:29:47
>>481
ksh や bash スクリプトだと名乗ってるものにそういうのは見たことあるけど。

sh と bash の実体が同じならば、sh に見せかけて
実は bash スクリプトというのはありうるし、それでちゃんと動くけど、
Solaris では sh と bash はまったく違うものなんだから
bash でしか使えない文法を #!/bin/sh のスクリプトで使ったら動かない。
484名無しさん@お腹いっぱい。:2005/07/09(土) 17:31:04
>>482
イマドキの Solaris 9 4/04 でもクォートする必要あるぜ。
485名無しさん@お腹いっぱい。:2005/07/09(土) 17:31:53
[クォート]
次の文字はシェルに対しては特別な意味を持ち、クォートしない (
後述の説明を参照 ) 限りワードの終わりを表します。

; & ( ) | ^ < > 復帰改行 空白文字 タブ
486名無しさん@お腹いっぱい。:2005/07/09(土) 17:45:06
$( も $(( もPOSIXが定義していなshall。
487名無しさん@お腹いっぱい。:2005/07/09(土) 17:47:03
>>485
^ は昔のパイプの意味なんだけど、
少なくともSolaris 2.5あたりの時代にすでにパイプの意味はなくなり、
^ はただの文字として扱われるようになっているはず。
マニュアルの記述が古いだけ。
488名無しさん@お腹いっぱい。:2005/07/09(土) 17:51:41
(゚Д゚)ハァ?
試してから言えよ。
% /bin/sh -c 'echo a^ls'
CHANGES Makefile.in config.guess config.status doc lib named.run
COPYRIGHT README config.h config.sub docutil libtool.m4 version
FAQ acconfig.h config.h.in configure install-sh ltmain.sh win32utils
LOG aclocal.m4 config.h.win32 configure.in isc-config.sh make
Makefile bin config.log contrib isc-config.sh.in mkinstalldirs
489名無しさん@お腹いっぱい。:2005/07/09(土) 17:52:26
>>487
は知ったか決定だな。
490名無しさん@お腹いっぱい。:2005/07/09(土) 17:53:37
>>488
ほほー、そーなるんですか。なるほど。
491名無しさん@お腹いっぱい。:2005/07/09(土) 18:02:56
イマドキ
The application shall quote the following characters if they are to represent themselves:
| & ; < > ( ) $ ` \ " ' <space> <tab> <newline>
492名無しさん@お腹いっぱい。:2005/07/09(土) 18:07:13
000 - 099 みたいな連番を生成する時には zsh 使う

for i in {000..099}; do touch ${i}; done
493名無しさん@お腹いっぱい。:2005/07/09(土) 18:10:44
シェルスクリプトで可搬性だとか保守性だとか言ってるヤツ、
正気かよ
毎回echo()とかいう関数作ってるのか

そういうの気にするぐらいならperlスクリプトでも書いてろよ
シェルスクリプトよりよっぽどポータブルだから
494名無しさん@お腹いっぱい。:2005/07/09(土) 18:11:46
また阿呆が湧いた…
495名無しさん@お腹いっぱい。:2005/07/09(土) 18:11:54
>>492
[連番のH画像を一気にダウンロードする]スレ的なネタだな
zshとwgetの組み合わせはもはや定番であろう
496名無しさん@お腹いっぱい。:2005/07/09(土) 18:13:47
いきなり、流れを絶つことになるけど、
kshで
set -x
としたときの出力を関数の中まで出力できるように(shやbashのように)すればどうすればいいの?
497名無しさん@お腹いっぱい。:2005/07/09(土) 18:14:01
>>492
その程度なら、seq jot printfあるいは頑張ってexprで書けるものを、
可搬性を犠牲にしてまでzshですか。
498名無しさん@お腹いっぱい。:2005/07/09(土) 18:14:37
>>492
 typeset -Z3 i=0
にしてカウントアップすればいいんじゃないか?
499名無しさん@お腹いっぱい。:2005/07/09(土) 18:15:07
可搬性ってなんすか
500名無しさん@お腹いっぱい。:2005/07/09(土) 18:17:09
>>499
PDP-11 上の AT&T UNIX でも正しく動作する事
501名無しさん@お腹いっぱい。:2005/07/09(土) 18:17:12
エロ画像のためにzshをインストールする気はないな。
502名無しさん@お腹いっぱい。:2005/07/09(土) 18:17:52
>>497
seqだのjotだののどこらへんがポータブルなんですか
awkで書けよ
503名無しさん@お腹いっぱい。:2005/07/09(土) 18:18:56
>>501
でもbashとかtcshとかkshとかは入れるんでしょ
504名無しさん@お腹いっぱい。:2005/07/09(土) 18:19:56
>>493はどこらへんが阿呆なの?
505名無しさん@お腹いっぱい。:2005/07/09(土) 18:21:30
>>498
typesetに可搬性はない。

可搬性なら、

for i in `yes '' | cat -n`
が最強かな。あと、ゼロ揃えだけ別処理すること。
506名無しさん@お腹いっぱい。:2005/07/09(土) 18:23:29
507名無しさん@お腹いっぱい。:2005/07/09(土) 18:25:45
zsh=エロ画像専用シェル=じいしぇる
508名無しさん@お腹いっぱい。:2005/07/09(土) 18:29:47
>>493
perlで書くと、起動スクリプトには使えない。
509名無しさん@お腹いっぱい。:2005/07/09(土) 18:32:15
>>504
教えない。
510名無しさん@お腹いっぱい。:2005/07/09(土) 18:32:27
>>508
そんだけかよ。

起動スクリプトなんぞ、ポータビリティが不要な最たるものだと思うが。
ポータブルな起動スクリプトって、何か意味あんのか?
511名無しさん@お腹いっぱい。:2005/07/09(土) 18:34:11
ほんとくだらない
512名無しさん@お腹いっぱい。:2005/07/09(土) 18:35:32
要するにzshを毛嫌いしてるだけなのに
可搬性だとか理論武装してるだけなんだろ?
笑っちゃうって

可搬性気にするぐらいならシェルスクリプトなんぞ書くなっての
513名無しさん@お腹いっぱい。:2005/07/09(土) 18:39:37
シェルスクリプトだからこそ可搬性を気にするなぁ。
可搬性がどーでもいいならCで書くなぁ。
514名無しさん@お腹いっぱい。:2005/07/09(土) 18:40:37
エロ画像に連番振るのも?
515名無しさん@お腹いっぱい。:2005/07/09(土) 18:42:34
>>513
だから、毎回あんたはecho()とかいう関数を定義するわけね

>>514
得ろ画像連番は一回こっきりのワンライナーだからいちいちスクリプトに
落とさんだろ
だからこそのzshなんだよ
516名無しさん@お腹いっぱい。:2005/07/09(土) 18:44:40
無理に会話に入ってこなくてよろしい。
517名無しさん@お腹いっぱい。:2005/07/09(土) 18:48:06
zsh はインタラクティブシェルとして使ってるけど
スクリプトは /bin/sh 互換で書くよ。
それ以上のことしたいときは perl とか使う。

っていう人が多いんじゃないの。
518名無しさん@お腹いっぱい。:2005/07/09(土) 18:49:23
>>513
Cよりシェルのほうがポータブルだと本当に言えるのだろうか。
Cのバイナリは確かにポータブルではないが、ソースレベルならどうか。
519名無しさん@お腹いっぱい。:2005/07/09(土) 18:51:17
>>517
シェルのシンタクス上は/bin/sh互換のスクリプトであるからと言って
使ってるコマンド群の仕様はシステムによっててんでまちまちなんだから、
そのスクリプトがポータブルであるということにはならない。

という話をしているのだが。
echo()とかいう関数、という例は無論そのことを言っている。
520名無しさん@お腹いっぱい。:2005/07/09(土) 18:51:19
>>515
echoの問題なら、関数定義までしなくても、
echo -nやバックスラッシュのエスケープを使わなければ問題ない。

問題になるケースは少ないが、問題な場合は
Solarisだけ場合分けすれば済むケースがほとんど。

あと、複雑なエスケープを使うなら、
echoじゃなく、printfを使う。
521名無しさん@お腹いっぱい。:2005/07/09(土) 18:52:05
>>520
> echo -nやバックスラッシュのエスケープを使わなければ
やだー使いたいー(ジタバタ
522名無しさん@お腹いっぱい。:2005/07/09(土) 18:54:44
>>518
Cのソースが本当にポータブルなら、
なぜ毎回./configureでMakefileを作り直す必要があるのか。
523名無しさん@お腹いっぱい。:2005/07/09(土) 18:56:31
>>522
MakefileはCのソースではないからです。

>>520
>>500によれば、printf(1)はPOSIX.2に含まれていようが含まれていまいが
ポータブルではないそうです。
524名無しさん@お腹いっぱい。:2005/07/09(土) 18:58:57
>>517
君は echo -n も使わないのかね?
525名無しさん@お腹いっぱい。:2005/07/09(土) 19:02:00
>>520
printf ハぽーたぶるなんですか?
526名無しさん@お腹いっぱい。:2005/07/09(土) 19:05:55
>>523
printfのすべての機能を使おうとするとポータブルでないだけであって、
echo -nやechoの\エスケープの代用の範囲のみなら
printfはポータブルと考えて良い。

>>524
そうだよ。
新人がecho -nとか平気で書くのでいつも叱ってるよ。
527名無しさん@お腹いっぱい。:2005/07/09(土) 19:07:49
>>526
むしろecho -nなシステムのほうが今時は少ない気がするんだが
元BSDユーザが新人君に多いの?
528名無しさん@お腹いっぱい。:2005/07/09(土) 19:09:02
>>526
printf(1)って4.3BSD-Reno以降でしょ
>>500的にはポータブルじゃないんだそうです
529名無しさん@お腹いっぱい。:2005/07/09(土) 19:09:31
BSDじゃなくて犬だろ。
bashだとecho -n使える。
530名無しさん@お腹いっぱい。:2005/07/09(土) 19:10:26
俺が新人ならそんなアホは相手にせんな。頭が前世紀で立ち腐れてるよ。
531名無しさん@お腹いっぱい。:2005/07/09(土) 19:13:16
>>530
どんなアホを指しとるんだ

無駄な努力はせずに素直にPerlを使え、と君も言いたいわけだね?
532名無しさん@お腹いっぱい。:2005/07/09(土) 19:13:51
>>529
なるほど
533名無しさん@お腹いっぱい。:2005/07/09(土) 19:14:11
>>523
./configure は config.hとかも作り直すわけだが、
config.hもC言語じゃないのかな?
534名無しさん@お腹いっぱい。:2005/07/09(土) 19:15:08
>>533
まあいいじゃないの、config.hのひとつやふたつ(w

……おれって、くるしい?
535名無しさん@お腹いっぱい。:2005/07/09(土) 19:18:48
結局何もコンパチではない
536名無しさん@お腹いっぱい。:2005/07/09(土) 19:30:37
自分で使う範囲でだけ可搬性があればいいんだよ。
一般論にしちゃうとジジイが時代遅れの話持ってくるから収拾がつかない。
537名無しさん@お腹いっぱい。:2005/07/09(土) 19:34:35
>自分で使う範囲でだけ可搬性
538名無しさん@お腹いっぱい。:2005/07/09(土) 19:37:23
>自分で使う女に可搬性
539名無しさん@お腹いっぱい。:2005/07/09(土) 19:39:31
remshってなんだよこの変態
rshにしろよ

つか、いまどきrshとか使うなよ

とかそういう話?
540名無しさん@お腹いっぱい。:2005/07/09(土) 19:54:14
俺も会社と家のマシンで可搬なら、割りかし気にならないな。
便利機能が存在するのに、使わないのは能率悪い。

もちろん特別な要件が有れば別だけど。
541名無しさん@お腹いっぱい。:2005/07/09(土) 19:54:43
ジジイで思い出した。
"$@" を ${1+"$@"} で書かせるのヤメレ。
イマドキ意味ねー。
542名無しさん@お腹いっぱい。:2005/07/09(土) 20:07:19
>>541
djbってじじいなの?
543名無しさん@お腹いっぱい。:2005/07/09(土) 20:09:18
         ,.. -――‐- 、
       ,. '":::::::::::::::::::::::::::::::ヽ    
      /:::::::::::::::::::::::::;:::ノi、:::::::ヽ 
     .,':::::::::::::::::::::;-ニ'/  ヽ:i::::::::ヽ
     i:::n::;;:'::;;:-',,='"´    ヽi、::::::::l 
     !:::l.}、/          、!:::::l 
    .l:::;;じ'   ''''''   ''''''    ヽ;;!
     、:;;!  (●),   、(●)、.:::::il 
     l::、!     ,,ノ(、_, )ヽ、,, .:::::/ヽ 
    .l;'^ヽ.     -=ニ=- ' .::::::〈,' ! 
    l::、 ゝ.、    `ニニ´ .:::::::;"ノ  
    !::::`ー-.、       .::::/:l:::l 
    .l:::::::;;;;;;i::;;l` - 、   ,..;;';;;l;;:::i::::l  
    i:::::::;;;;;;;':::;;l;;;;;;;;l ` ´l;;;;;;;;;l::::'::::i 
544名無しさん@お腹いっぱい。:2005/07/09(土) 20:32:07
美人が出てきたところで、フレームも終わりだな。
545名無しさん@お腹いっぱい。:2005/07/09(土) 21:10:24
これはフレームが収まるAA?
546名無しさん@お腹いっぱい。:2005/07/09(土) 21:17:46
#!/bin/sh

echo hoge


~$ ./hoge.sh
: bad interpreter:No such file or directory

hogeと表示したいだけなのにやってくれません!(><)
such fileって何のことですか?(><)
547名無しさん@お腹いっぱい。:2005/07/09(土) 21:19:16
サッチというファイル
548名無しさん@お腹いっぱい。:2005/07/09(土) 21:22:22
>>546
Winでエディットしただろ。
#!/bin/sh の後ろに ^M が付いていて、
/bin/sh^M なんてコマンドは知らんと言ってる。
549名無しさん@お腹いっぱい。:2005/07/09(土) 21:38:08
改行コードをlfにしたらできました!(><)
ありがとうございましたm(><)m
550名無しさん@お腹いっぱい。:2005/07/09(土) 22:33:48
(゚Д゚)ハァ?
551名無しさん@お腹いっぱい。:2005/07/09(土) 23:04:18
見えない ^M が見える漢がこのスレに居ると言われている。
552名無しさん@お腹いっぱい。:2005/07/09(土) 23:08:43
^M能力者
553名無しさん@お腹いっぱい。:2005/07/09(土) 23:14:27
^M 能力者、映画化決定
554名無しさん@お腹いっぱい。:2005/07/09(土) 23:23:16
エスパーは本当にいたんだ!
555名無しさん@お腹いっぱい。:2005/07/09(土) 23:24:41
っ[potion of see invisible]
556名無しさん@お腹いっぱい。:2005/07/09(土) 23:26:24
Linuxのbash ja_JP-UTF8環境で、先頭を#!/bin/saofeaoijfeaoiとしたら、
bash: ./jfoeiajosh: /bin/saofeaoijfeaoi: bad interpreter: そのようなファイルやディレクトリはありません
と言われたが、#!/bin/saofeaoijfeaoi^Mにしたら、
: bad interpreter: そのようなファイルやディレクトリはありません
になったので、エスパーではないと思われるが、よくすぐに分かったな。

557名無しさん@お腹いっぱい。:2005/07/09(土) 23:42:15
しかし、こうなってくると >>547 が可哀相だな。
エスパー出現じゃ仕方が無いか。
558名無しさん@お腹いっぱい。:2005/07/10(日) 00:11:27
まあFAQですね。
559名無しさん@お腹いっぱい。:2005/07/10(日) 00:26:01
一瞬天国かと思った、この流れ
560名無しさん@お腹いっぱい。:2005/07/10(日) 02:32:18
>>551-557
プ。FAQだよ、騒ぐな馬鹿ども。
561名無しさん@お腹いっぱい。:2005/07/10(日) 02:34:05
空気読めない馬鹿が一匹
562名無しさん@お腹いっぱい。:2005/07/10(日) 02:42:33
行末の^Mも見えないのに空気が見えるわけがない
563名無しさん@お腹いっぱい。:2005/07/10(日) 04:28:38
つ [ざぶとん]
564名無しさん@お腹いっぱい。:2005/07/10(日) 12:08:06
windowsのcygwinでbashなのですが

dir=(`pwd`);
if [ ! -d "$dir" ];then
  echo "$dirは存在しないかディレクトリではありません";
  exit 1;
fi

というスクリプトで今いるデレクトリが
"C:\Documents and Settings\user\My Documents"というように空白を含む
デレクトリだとうまくいきません. どうすればいいでしょうか?
565名無しさん@お腹いっぱい。:2005/07/10(日) 12:24:26
dir=`pwd` にすれば?
566名無しさん@お腹いっぱい。:2005/07/10(日) 12:27:59
dir="`pwd`"じゃないのか?
567564:2005/07/10(日) 12:38:52
できました. ありがとうございます.
568名無しさん@お腹いっぱい。:2005/07/10(日) 12:41:27
bash ならば何もしなくても $PWD にカレントディレクトリが入ってるはず。
569名無しさん@お腹いっぱい。:2005/07/10(日) 16:07:32
`pwd`を直接代入する場合は" "を付けなくていい。
dir=`pwd`で、スペースもちゃんと保存される。
もちろん、値を使う時は"$dir"で" "が要る。

dir=(`pwd`)の場合は、配列への代入になってしまうので、
配列の要素解釈の際にスペースが解釈されてしまうため、
dir=("`pwd`")とする必要がある。
でも、>>564 は配列とは知らずに=( )を使ったのだろうから、
この書き方は忘れた方がいい。

なお、bashが$PWDをセットするからといって、
こういうのに頼ってはいけない。
570名無しさん@お腹いっぱい。:2005/07/10(日) 16:17:54
>>569
> なお、bashが$PWDをセットするからといって、
> こういうのに頼ってはいけない。

と老害が申しております。。。。
571名無しさん@お腹いっぱい。:2005/07/10(日) 16:18:47
と、知能の発達の遅れた方が申しております。
572名無しさん@お腹いっぱい。:2005/07/10(日) 18:43:22
互換性を考えるなら使わん方がいいけどね。
cygwin なんて互換性を無視していい環境の最たるものだと思うが。
573名無しさん@お腹いっぱい。:2005/07/10(日) 18:51:00
またこいつか。
574123:2005/07/12(火) 02:22:06
誰かリムーバブルディスク(USBストレージ)を自動マウントするスクリプト教えてくれませんか?
575名無しさん@お腹いっぱい。:2005/07/12(火) 02:25:54
OSによって違うだろ。
ここじゃなくて自分が使ってるOSのスレで聞くべし。
576名無しさん@お腹いっぱい。:2005/07/12(火) 02:42:56
#/bin/sh
#自動マウントスクリプト
while true
mount usbストレージ
done
577123:2005/07/12(火) 04:03:07
なんとつかいにくいsolarisです。
大学なんでsuもrootの権限もないんですよね・・・

あのそこのusbストレージ
と二音後で書いてあるところはどうすれば・・・・
578名無しさん@お腹いっぱい。:2005/07/12(火) 04:33:19
素直にそこの管理者にすがるのが吉
579名無しさん@お腹いっぱい。:2005/07/12(火) 07:03:04
>>577
二音語って、
‐・・・ ・‐ ‐・‐ ・‐
みたいに「・」と「‐」の二音で会話する言語のことですか?
580名無しさん@お腹いっぱい。:2005/07/12(火) 07:43:32
>>576
whileループでマウントするのは重杉で非効率。
やむを得ずそれでやるとしても、ループ中に
sleep 1 とか入れれ。

Solarisならvoldとかautomountとかでやるのが
正攻法だろな。いずれにしても、その設定をするために
root権限は要る。設定完了後はrootじゃなくても
自動的にマウントできるようになる。
581名無しさん@お腹いっぱい。:2005/07/12(火) 14:28:26
何かと話題のzshみたいですが、
以前、zshのmanを見ていた時、zshにsocketの機能があるのに
ビックラこきました。
shellでsocketって、何に使うねん。と思ったのですが、
shellでsocketって、メジャーなんでしょうか?
582名無しさん@お腹いっぱい。:2005/07/12(火) 14:34:31
>>581
zftp
583名無しさん@お腹いっぱい。:2005/07/12(火) 19:13:06
zshは使わないけど、netcatはたまに使うな。
584名無しさん@お腹いっぱい。:2005/07/13(水) 14:01:50
俺だったらこう書くぞ!とかあったらお願いします。

***********************************
#!/bin/sh

old_name=$1
num=1
new_name=$old_name$num
while [ -e $new_name ]
do
num=`expr $num + 1`
new_name=$old_name$num
done
****************************
num=
new_name=
を2回も書いてる所とかが気にくわないんですが、どうにかできるものですか?
585名無しさん@お腹いっぱい。:2005/07/13(水) 14:12:22
num=1
while [ -e $1$num ]
do
num=`expr $num + 1`
done
new_name=$1$num
586名無しさん@お腹いっぱい。:2005/07/13(水) 14:16:15
>>584

#!/bin/sh

old_name=$1
num=1
while [ -f "$old_name$num" ]
do
num=`expr $num + 1`
done
new_name=$old_name$num

だな。
new_nameの代入をループ外に出して1行減らした。
Solarisではtest -eが使えないので
test -fに変えた。
あと、引数として使う時は" "で囲む。(直接代入なら囲まなくていい)
587名無しさん@お腹いっぱい。:2005/07/13(水) 14:19:36
linux人でbashですって書き忘れてたーと思ったらもう返信が
>585,586
ありがとうございます。
むー。なんか俺、無駄な事しまくってますね。
588名無しさん@お腹いっぱい。:2005/07/13(水) 14:33:23
bashなら、

old_name=$1
for ((num=1; ; num++)) {
[ ! -e "$old_name$num" ] && break
}
new_name=$old_name$num

と書ける。
589名無しさん@お腹いっぱい。:2005/07/13(水) 14:57:22
>588
++ってシェルスクリプトでも使えるんですね。
やってみたいお年ごろなので一行にまとめてみました。

for ((num=1; ; num++)) { [ ! -e "$1$num" ] && { new_name=$1$num ; break ;} }
590名無しさん@お腹いっぱい。:2005/07/13(水) 15:04:18
妙な書き方認めてるbashうぜぇー
591名無しさん@お腹いっぱい。:2005/07/13(水) 20:28:52
bash だから余所へ逝けとはいわんが,せめて >>2 の □お約束 くらいは読もうぜ
592名無しさん@お腹いっぱい。:2005/07/13(水) 20:33:06
今時Posix shellじゃなくてbourne shell互換スクリプトを書く意味って
何なんだろうか
593名無しさん@お腹いっぱい。:2005/07/13(水) 20:41:53
posixってなんですか。
594名無しさん@お腹いっぱい。:2005/07/13(水) 21:01:55
>>593
ちったぁぐぐったうえで聞けや、この腐れぼんくら
ttp://www.google.com/search?hl=ja&q=posix&btnG=Google+検索&lr=lang_ja
595名無しさん@お腹いっぱい。:2005/07/13(水) 21:04:23
>>594
posixってどこで読めの?
596名無しさん@お腹いっぱい。:2005/07/13(水) 21:22:25
>>592
dejure standard ではなく defact standard を使うのは当然でしょ。
ちゃんと象牙の塔に引き篭もっててください。
597名無しさん@お腹いっぱい。:2005/07/13(水) 21:24:31
Posixなんて机上の空論。
現存の環境で動かなきゃ意味がない。
となると、必然的にBourne互換スクリプトになる。
598名無しさん@お腹いっぱい。:2005/07/13(水) 21:31:07
今時CだってK&Rスタイルじゃ書かねえだろうがよ……
いや、書くか?
それとも、ansi2knr.c?
599名無しさん@お腹いっぱい。:2005/07/13(水) 21:32:16
>>596
dejure standardはなんですか
600名無しさん@お腹いっぱい。:2005/07/13(水) 21:34:19
で、可搬性重視でbourneシェル互換スクリプト書くヤツはecho()とかいう関数を
毎回定義するんだな?
601名無しさん@お腹いっぱい。:2005/07/13(水) 21:37:10
>>600
またお前か。引っ込んでろ。
602名無しさん@お腹いっぱい。:2005/07/13(水) 21:37:12
>>600
何回も書くほど面白いネタじゃないぞ。
603名無しさん@お腹いっぱい。:2005/07/13(水) 21:42:22
>>597
>Posixなんて机上の空論。

ええ?そうなんですか?
少なくともHP-UXの/bin/shはPOSIX準拠だと謳っているから
そう信じてたんですが私は騙されてたんでしょうか?
604名無しさん@お腹いっぱい。:2005/07/13(水) 21:54:41
>>603
今だと/bin/sh-->/usr/bin/sh(shell-posix)なのかな?
昔はそうじゃなかった気がする

http://www.bookshelf.jp/texi/autoconf/autoconf-ja_10.html
あたりが答えなのかねえ
605名無しさん@お腹いっぱい。:2005/07/13(水) 21:57:22
solarisはkshをposix準拠シェルとして扱ってるな。
606603:2005/07/13(水) 22:10:28
>>604
>今だと/bin/sh-->/usr/bin/sh(shell-posix)なのかな?

今、現物を確認できませんが、
たしか/bin/shと/usr/bin/shは両方実体ファイルで、
中身はdiffで比べると同一だったと思います。
それと/sbin/shは違うシェルだったような・・・
607名無しさん@お腹いっぱい。:2005/07/13(水) 22:13:13
ls -l /bin
lrwxrwxrwx 1 root root 9 Aug 23 2004 /bin -> ./usr/bin
608603:2005/07/13(水) 22:22:36
>>607
それはHP-UXの話ですか?
だとしたら盲点ですた・・・
じゃあやっぱりHP-UXの/bin/shはPOSIX準拠なのだと信じて
生きていきます・・・
609名無しさん@お腹いっぱい。:2005/07/13(水) 22:29:17
>>608
いや、Solarisです。
ちなみに、/sbin/sh はスタティックリンク
610603:2005/07/13(水) 22:39:02
>>609
あら。失礼しますた。
やっぱ明日自分で確認してみよう・・・
611名無しさん@お腹いっぱい。:2005/07/13(水) 22:41:11
HP-UXのsh-posixて、行エディットできるからterminfo見てるよな
そういうシェルを/binに置くのって、どうなのよ
612名無しさん@お腹いっぱい。:2005/07/13(水) 22:41:55
>>609
10では/sbin/sh --> /bin/sh
613名無しさん@お腹いっぱい。:2005/07/13(水) 22:45:41
ちょっと話は変わりますが、
Solarisには、/usr/bin/cdとか/usr/bin/umaskとか、
外部コマンド版が存在しますが、
これって意味あるんですか?
実際、実行しても当然期待通り動作しませんが・・
614名無しさん@お腹いっぱい。:2005/07/13(水) 22:46:16
要するに、シェルをパスで指定しないといけないのが悪いんだYO!!
ってことでOK?
/bin/shが何者だかわかりゃしねえ
615名無しさん@お腹いっぱい。:2005/07/13(水) 22:47:44
>>611
rootは/sbin/shを使うから問題ない。んじゃね?
616名無しさん@お腹いっぱい。:2005/07/13(水) 22:52:10
>>612
そこまでいくと、もう…
617名無しさん@お腹いっぱい。:2005/07/13(水) 22:54:49
ttp://www.in-ulm.de/~mascheck/various/shells/
に色々なシステム環境の説明があるな

1)HP-UXでも/bin-->/usr/bin
2)/sbin/shは/usr/bin/sh(sh-posix)のstatic link版
3)昔あったbourne互換シェルは消えた

ってことだ

>>615
てことだから、/sbin/shもterminfo見てるんじゃないかな
618名無しさん@お腹いっぱい。:2005/07/13(水) 23:01:56
>>612
10では、/bin は /usr/bin とは別物なの?
619名無しさん@お腹いっぱい。:2005/07/14(木) 16:55:32
FreeBSDの/bin/shで、コマンドの標準エラー出力を
変数に取り込もうと、

err_message=`hoge 2>&1`

とすると、メッセージが変数に取り込めずに直接表示されてしまいます。
仕方なく、

err_message=`hoge 2>&1 | cat`

と、catをかますとうまくいきます。
これってknown Bugですか?

なお、hoge自体がファイル記述子2に出力していることは確認済みです。
620名無しさん@お腹いっぱい。:2005/07/14(木) 18:03:44
>>619
-current だと以下のように期待通りの動作をしていますけど,
バージョンは?
$ msg=`ls -z 2>&1`
$ echo $msg
ls: illegal option -- z usage: ls [-ABCFGHLPRSTWZabcdfghiklmnopqrstuwx1] [file ...]
$
621名無しさん@お腹いっぱい。:2005/07/14(木) 18:33:50
kshellなんだけど

hoge='ENV_HOGE'

の状態で
環境変数ENV_HOGEにアクセスしたいんだけど
${$hoge} では怒られるんだけど、どう書けばいいのかな、
それともこういうポインタ的なのは_?
622名無しさん@お腹いっぱい。:2005/07/14(木) 18:37:31
>>621
eval でがんばれ。
623名無しさん@お腹いっぱい。:2005/07/14(木) 19:34:29
>>620
$ uname -sr
FreeBSD 5.4-RELEASE
$ err_message=`umask 999 2>&1`
umask: Illegal number: 999$
$ echo "$err_message"

$ err_message=`umask 999 2>&1 | cat`
$ echo "$err_message"
umask: Illegal number: 999
$


つーことで、5.4でもバグってます。
currentでは直ってるんですね?
624名無しさん@お腹いっぱい。:2005/07/14(木) 19:38:29
>>621
eval echo \$$hoge
625620:2005/07/14(木) 22:00:34
>>623
commitlog 漁ってみたけど, それらしき patch はあたっていない.
cvs diff -r RELENG_5_4_0_RELEASE やってみたけど, それらしき差分は見当たらない.
なんで, そんな現象になるんだろ?
626名無しさん@お腹いっぱい。:2005/07/15(金) 00:28:32
umaskがビルトイン関数だからじゃないの?
外部コマンドでそうなる例はある?
627名無しさん@お腹いっぱい。:2005/07/15(金) 00:49:01
つくづくFreeBSDはダメだな。
超致命的バグが発見できないとは。
628名無しさん@お腹いっぱい。:2005/07/15(金) 01:17:53
>>626
いくつか試したところ
ok: cd eval alias
ng: umask pwd dot set
ちなみに"AAA=`(umask 999) 2>&1`"は大丈夫だ
629621:2005/07/15(金) 01:35:08
>622、624氏
どうもっす。
evalでいいのかな``で囲むやつでがんばってみた。
`env $hoge` でなんとかうまくいきますた。
でもなんつか、ちと格好悪いね。
${${hoge}} の方がポインタちっくでいい感じだと
思うんだけど… (´・ω・`)
630名無しさん@お腹いっぱい。:2005/07/15(金) 01:37:51
>>628
(umaskの場合) ashはsubstitution commandがbuiltinだとsubshellをforkせずに
済ませようとするようです。
bashとpdkshは普通にforkし、ksh93はforkしませんがbash/pdkshと同じ結果を返します。
最適化しようとしてenbugしたっぽいですね。
631628:2005/07/15(金) 01:41:09
>>628 cdもevalもサブシェルで実行してたみたいだ。
632名無しさん@お腹いっぱい。:2005/07/15(金) 01:47:11
>>629
要するにPerlのシンボリックリファレンスみたいな機能が欲しかった、と
633名無しさん@お腹いっぱい。:2005/07/15(金) 09:38:24
>>629
> ${${hoge}} の方がポインタちっくでいい感じだと
それって \$$hoge じゃん。
634名無しさん@お腹いっぱい。:2005/07/15(金) 12:04:21
>>629
そう書きたきゃ、
eval echo \${${hoge}}
でできるよ。

あと、 `env $hoge` じゃなくて、
echo `printenv $hoge`
だよね。
635名無しさん@お腹いっぱい。:2005/07/15(金) 12:21:15
>>629
シェルスクリプトにかっこよさを期待されてもな。
636名無しさん@お腹いっぱい。:2005/07/15(金) 13:13:53
ファイルサーバのファイルの世代バックアップのシェルを作らなければならなくて困ってます。

(1)バックアップ作成、ログ取得
# cd /backup   (←作ったDIR)
# tar cvfz backup`date +%Y%m%d`.tar.gz --atime-preserve /home >bulog`date +%Y%m%d`.txt

(2)現在のファイルを取得
# ls -1 | grep backup[0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9] > now_data.txt

(3)7世代までのファイルを取得
# tail -7 now_data.txt >days_data.txt

(4)2つのファイルを比較、削除ファイル抽出
# diff now_data.txt days_data.txt > differ_data.txt

(5)差分を消す        ←今ここ
# ??? differ_data.txt

な感じで考えてみましたが、行き詰ってます。
diffで差分を拾ってきた結果↓から
-----
[root@xxxxx backup]# cat differ_data.txt
1d0
< backup20050709.tar.gz
-----
1d0 とか < とかを省いて「backup????????.tar.gz」の部分だけを拾ってきたリストを作って、
「rm -f < differ_data.txt」みたいに一発で消せる様に出来ないものなのでしょうか。

#もっとスマートな方法が有ったら教えてくだちぃ…。
637名無しさん@お腹いっぱい。:2005/07/15(金) 13:30:01
>>636
そもそもdump(8)を避けた理由は何かあるんでしょうか?

dumpなら普通に世代バックアップできるし。
dump先を普通のファイルにしておけば、そこからrestore -iで取り出す
手間もtarと大差ないし。
638637:2005/07/15(金) 13:31:54
>>637 dump先を普通のファイルにしておけば
これはちょっと勝手に話の先を読みすぎたかも。
関係なかったら無視して。
639名無しさん@お腹いっぱい。:2005/07/15(金) 13:36:26
>>637
早速のレス有り難う御座います。
dumpを避けた理由は…dumpというコマンドを知りませんでした。
手元の「RedHatLinux コマンドリファレンス」に載っていない様で…(汗

とりあえず一旦
man dump
してみます、有り難う御座いましたー!
640名無しさん@お腹いっぱい。:2005/07/15(金) 13:37:44
×コマンドリファレンス
○ポケットリファレンス
(技術評論社)
641名無しさん@お腹いっぱい。:2005/07/15(金) 13:46:58
>>636
diffじゃなくてcommを使う。

rm -f `comm -23 now_data.txt days_data.txt`

で、一発で消せる。

ただし、now_data.txtとかはsort済みのこと。
642名無しさん@お腹いっぱい。:2005/07/15(金) 14:39:55
>>641
行けました!
有り難う御座います!!

#さすがUNIX板(^^*
643名無しさん@お腹いっぱい。:2005/07/15(金) 19:41:12
comm, join, paste あたりはつい忘れちまう
644名無しさん@お腹いっぱい。:2005/07/15(金) 20:13:07
そしてPerlスクリプトを書き捨てる羽目になる。
645名無しさん@お腹いっぱい。:2005/07/15(金) 23:15:19
>>644
スクリプトは本来書き捨てるためのモノでもあり以下略。
646名無しさん@お腹いっぱい。:2005/07/15(金) 23:21:19
旅のスクリプトは書き捨てだよも以下略。
647名無しさん@お腹いっぱい。:2005/07/16(土) 00:16:10
サムッ
648名無しさん@お腹いっぱい。:2005/07/16(土) 01:13:36
grep はパターンにマッチした行があると0を返すのですが、

hoge="aaa"
if echo $hoge | grep -q "aaa"; then
   echo ATARI
fi

とやると ATARI と表示されます。
[]でくくっても同じ。 評価された結果って
何を見てるんでしょうか?わからなくなってきました。
649名無しさん@お腹いっぱい。:2005/07/16(土) 01:22:34
>>648
当然だろ。
650名無しさん@お腹いっぱい。:2005/07/16(土) 01:23:02
だよねー
651名無しさん@お腹いっぱい。:2005/07/16(土) 04:51:04
grepが返すのは終了コード($?)っしょ?

#!/bin/sh
hoge="aaa"
echo $hoge | grep -q "aaa";
if [ $? = 1 ] ; then
echo ATARI
elif [ $? = 0 ] ; then
echo HAZURE
fi
652名無しさん@お腹いっぱい。:2005/07/16(土) 05:16:05
>>648
シェルのifやwhileでは0が真として評価されるんでつよ

って、そういう話じゃなくて?
653名無しさん@お腹いっぱい。:2005/07/16(土) 11:10:13
grep -c
であれば、個数をカウントするから、ヒットしない場合が”0”

って、そういう話じゃなくて?
654名無しさん@お腹いっぱい。:2005/07/16(土) 11:12:13
喜多━━━━━━(゚∀゚)━━━━━━ !!!!
655648:2005/07/16(土) 15:28:17
>>651
やっぱそうやらないと駄目なんすね
>>652-653
いや、正にそういう話です。要するに 0が真として評価されるからなんですね。
例えば、正常終了時のリターンコードが0でないようなコマンドの場合、偽と
判断されるのかな、紛らわしいな…
656名無しさん@お腹いっぱい。:2005/07/16(土) 16:42:56
>>643
>>4のこともたまには思い出してあげて下さい。
657名無しさん@お腹いっぱい。:2005/07/16(土) 17:10:16
>>656
フォー!
658名無しさん@お腹いっぱい。:2005/07/16(土) 18:22:10
> 正常終了時のリターンコードが0でないようなコマンドの場合、偽と
> 判断されるのかな、紛らわしいな…

もしかして、アホですか?
659名無しさん@お腹いっぱい。:2005/07/16(土) 18:35:56
>>658
> もしかして、アホですか?

それを言っちゃだめだって。
660名無しさん@お腹いっぱい。:2005/07/16(土) 18:54:08
>>655
紛らわしいも何も、それが仕様なんだから慣れろ

もっと詳細な制御がしたければ、$?に対して
Case文でも使えばいいだけの話だ
661名無しさん@お腹いっぱい。:2005/07/16(土) 22:46:02
紛らわしいのは、正常終了時のリターンコードが0でないようなコマンドだろう
662名無しさん@お腹いっぱい。:2005/07/16(土) 23:05:21
>>661
そんなコマンドないよ。

>>653
が言ってる grep -c も、
文字列が見つからなかった場合、
「標準出力に」0が表示され、
「終了ステータス」は1になるので、無問題だよ。
663名無しさん@お腹いっぱい。:2005/07/17(日) 12:52:34
シェル中でrootになりたいんだが、どうやればいい?
664名無しさん@お腹いっぱい。:2005/07/17(日) 12:59:06
>>663
シェルスクリプト中でも、ふつうに、
su -c 'hoge1; hoge2'
または
sudo hoge
でいいと思うけど。

あるいはsetuidのスクリプトを呼び出すとか。
665名無しさん@お腹いっぱい。:2005/07/17(日) 13:20:22
setuidのスクリプトってどうなの?
666名無しさん@お腹いっぱい。:2005/07/17(日) 13:28:55
>>665
セキュリティホールになるよ。
ググるとFAQか何かがすぐ出てくると思う。
667名無しさん@お腹いっぱい。:2005/07/17(日) 13:39:56
セキュリティホールになるのを知った上で、
問題がない使い方で使うなら桶。
668名無しさん@お腹いっぱい。:2005/07/17(日) 13:43:55
awkは?
669名無しさん@お腹いっぱい。:2005/07/17(日) 13:48:47
awkはexitコマンドで明示的に終了ステータスを返せるじゃん。
grepとは違って、どういう場合が正常終了なのか、
デフォでは定義されていない(常に真)になっているだけ。
670名無しさん@お腹いっぱい。:2005/07/17(日) 15:55:59
>>599
>>596
×dejure standard, defact standard
○de jure standard, de facto standard

671名無しさん@お腹いっぱい。 :2005/07/17(日) 16:34:57
親切な方だれか回答をば・・・

下のようなsrcがあってbbbだけ抜き出すのは可能ですか?
bbbは変数でgrep bbbは使えません。

---------------------------------------------------------
</td>
<td colspan=3>
<a href=/aaa/aaaa/aaa><b class="sans">テストテスト</b></a>

<br>
<font face=osaka,MS Pゴシック,arial,helvetica size=-1>



bbbbbb


</font>
-------------------------------------------------------
672名無しさん@お腹いっぱい。:2005/07/17(日) 16:39:10
そりゃできるだろうが、条件が分からんよ。
「テストテスト」と「bbbbbb」の違いは何?
grep使えないのはなぜ?宿題だから?
673名無しさん@お腹いっぱい。:2005/07/17(日) 16:39:31
>>671
質問が不明確。
VAR=bbb
grep "$VAR"
ということじゃないよね?
674名無しさん@お腹いっぱい。:2005/07/17(日) 17:05:40
>>671
こうかな?
cat src | tr -d "\n" | sed -e "s,</font>,\n,g" | sed -e "s,.*<font[^>]*>,,"
675名無しさん@お腹いっぱい。:2005/07/17(日) 20:30:47
echo bbb
676名無しさん@お腹いっぱい。:2005/07/17(日) 20:58:37
>>673
あ、コマンドオプションにも変数使えたんですね。
どうもありがとうございました。
677名無しさん@お腹いっぱい。:2005/07/17(日) 21:24:31
工エエェェ(´д`)ェェエエ工

そんなオチかよ!
678名無しさん@お腹いっぱい。:2005/07/18(月) 01:51:18
コマンドラインオプションに変数使えなかったら、どこで使うんだ
よ。。。
679名無しさん@お腹いっぱい。:2005/07/21(木) 13:35:37
拡張子が.shのファイルをWindowsで実行するにはどうすればいいですか?
例えば.shを.batに書き直すようなツールはありますでしょうか。
ぜひ教えてください。

シェルスクリプトもバッチも知識ゼロです。
Windows板で質問したらUNIX板へ帰れって言われました。
UNIX環境の質問ではないのですが、よろしくお願いします。
680名無しさん@お腹いっぱい。:2005/07/21(木) 13:37:03
Cygwin使っている人いますか? その15
http://pc8.2ch.net/test/read.cgi/unix/1119982766/
681名無しさん@お腹いっぱい。:2005/07/21(木) 14:24:39
run.exe
682名無しさん@お腹いっぱい。:2005/07/21(木) 15:04:55
シェルスクリプトとバッチの知識を身につける
683679:2005/07/21(木) 15:56:48
>>680-682
Cygwinインストールしてみました。
Shell Scriptを実行してみたところsyntax errorが出たので、
やはり知識を身につけなければいけないようです。

公式な配布物の中身をいじってないのにErrorが出るのが何でかわかりませんが・・・orz
684名無しさん@お腹いっぱい。:2005/07/21(木) 16:00:26
なにをやろうとしてるの?
685名無しさん@お腹いっぱい。:2005/07/21(木) 17:01:26
改行コードが違ってたり、ってことは配布物いじってないならないか…。
686名無しさん@お腹いっぱい。:2005/07/21(木) 20:20:39
お約束 >>679
「エスパーきぼんぬ」「氏ね」「(゚Д゚)ハァ?」等のレスを貰う八ヶ条。
1. ハードウェア、OSのバージョン等には一字一句触れない。
2. 大切な個人情報が漏れるとまずいので、己の行った操作、変更などは秘密。
3. エラーメッセージの類は決して書かない。「エラーが出るんです」で留める。
  目の前で生じている現象をそのまま具体的に書くなどもっての外。
  事実より俺様の脳内解釈を優先すべし。
4. 独り言文体で必勝。
  「…なんだけど、どうすればいいのかなぁ」「何が悪いんだろう?」
5. 「急いでいます」「困っています」等、自分の都合を全面に押し出す。
6. もう試したことを得意げに指摘してくる奴には、厳しく対応。
  「それが駄目だったから質問してるんです」「それはもう試してみて駄目でした」
  "どう"だめだったのか、本当に実際それを行ったかどうかなんか問題じゃない。
7. ストレートに答えを書かないもったいぶったレスには、逆切れで対応。
  「だからどうすればいいんですか?」「分からないなら引っ込んでろやゴルァ」
  示されたURL等を参照するなんて態度は、回答者を甘やかすことに他ならないので
 絶対に避ける。
8. 情報は小出しに。

「エスパーきぼんぬ」 補足
上の八ヵ条を「一つでも」満たす者は質問者として不適格だということだ。
そのような悪い質問に対して答えられるのは,
質問者の意図をすべて汲み取ることのできるエスパーでもなければムリ,
という意味であって,決して,高度な技術を持つユーザに対する尊称でなはい。
まちがっても「エスパーの方,回答お願いします」
なんて痛い質問するな。つうか氏ね。
687名無しさん@お腹いっぱい。:2005/07/21(木) 20:28:59
windows で sh を実行などというからには
何か勘違いをしてるっぽいので、
詳しく聞きだしてみたい。
688名無しさん@お腹いっぱい。:2005/07/21(木) 20:38:07
>>686
補足は蛇足。コピペ時にはカットよろしこ。
689名無しさん@お腹いっぱい。:2005/07/21(木) 20:59:09
>>686
これ貼るだけでいいよ。
http://myu.daa.jp/osiete/index.html
690名無しさん@お腹いっぱい。:2005/07/21(木) 22:03:52
>>679
ちょとかわいそうなのでマジレス。

シェルの種類は複数あって、拡張子が.shであっても
書式が共通しているとは限らない。
(Cygwin のやつは bash という種類。)

その「公式な配布物」が何なのかを書けば
もう少しまともなレスが得られるかも知れない。
691名無しさん@お腹いっぱい。:2005/07/21(木) 23:01:04
シェルスクリプトファイルの絶対パスをシェルスクリプト自身で
見つけ出すことは出来ますか?

pwdとやってもシェルスクリプトを起動させた時点でのカレント
ディレクトリしか出ないので質問しました。
692名無しさん@お腹いっぱい。:2005/07/21(木) 23:04:28
>>691 $0 とか `dirname $0` とか
693679:2005/07/21(木) 23:22:17
>>684-690
お騒がせしてます;
根本的にはCygwinでbashを使うことで"解決"しております。
アドバイスありがとうございました。

SyntaxErrorは行番号が出ているものの、
その行の記述が間違っていないことがわかったので、
自分が悪いと思って出し辛かった、といいますか
人に聞く前に調べようと思って、あの場では書きませんでした。

エスパーの方,回答お願いします。つうか氏ぬ。

#今回はじめて掲示板のお世話になったのですが、実際>>686のように書かれると嫌になるね。質問1つもちゃんとできない自分が。
694691:2005/07/21(木) 23:23:16
便利なコマンドがあるんですね。
パスが通っている場合や、カレントディレクトリで実行した場合は
絶対パスが出るみたいですが、下のようにディレクトリを指定して実行した場合は
ディレクトリ名しか出ません。つまり、

shtest/shtest.sh

を実行したときは shtest だけが得られる。得られたパスの初めの文字を判定して
/(スラッシュ)でなければ `pwd`/ を付け加えるというようにすればいいと
思うのですが、どうすれば出来るのですか?たびたびすみません。
695名無しさん@お腹いっぱい。:2005/07/21(木) 23:28:21
>>692
$0 いじって呼ばれたらだめだな。
696名無しさん@お腹いっぱい。:2005/07/21(木) 23:57:18
他にも方法はあるけど正規表現を使わない方向で。

#!/bin/bash
if [ "${0#/}" != "$0" ]; then
 path="$0"
elif [ "${0#./}" != "$0" ]; then
 path=`pwd`"${0#.}"
elif [ "${0#../}" != "$0" ]; then
 path=`dirname "$(pwd)"`"${0#..}"
else
 path=`pwd`/"$0"
fi
echo $path
697名無しさん@お腹いっぱい。:2005/07/22(金) 00:36:21
DIR=`dirname $0`
APATH=`cd $DIR; pwd`/`basename $0`
echo $APATH
とか。
698名無しさん@お腹いっぱい。:2005/07/22(金) 00:40:21
699名無しさん@お腹いっぱい。:2005/07/22(金) 00:48:20
本当にFAQですよね。
700名無しさん@お腹いっぱい。:2005/07/22(金) 00:52:12
リンクとかされてることもあるしね。
701名無しさん@お腹いっぱい。:2005/07/22(金) 02:02:40
環境によるとは思うんだけど、$0を入れ換えられてる場合をのぞけば、
shellの中で、

realpath $0
か、
readlink -f $0

が、スマートなんじゃないだろうか?

702名無しさん@お腹いっぱい。:2005/07/22(金) 03:25:52
それがある環境に限れるならね。
703691:2005/07/22(金) 08:39:45
ありがとうございます。いろいろ試してみようかと思います。
704名無しさん@お腹いっぱい。:2005/07/22(金) 08:50:19
パスを書いておけばおk
705名無しさん@お腹いっぱい。:2005/07/22(金) 15:33:00
awkスクリプトをperlスクリプトに変換する
a2pコマンドが吐き出すシェルスクリプトについてですが、
2行目、
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'

のように、"$@"をわざわざ ${1+"$@"}と書く周到ぶりですが、
その反面、$0 を、"$0"じゃなく裸のまま $0 と書いちゃってます。

今はディレクトリ名にスペースを含むこともあったりするし、
ちゃんと "$0" と記述したものを出力するべきじゃないでしょうか。
逆に、$0で桶なら、${1+"$@"}だけ拘っているのが、
クォリティ的にちぐはぐに思います。

識者の意見求む。
706名無しさん@お腹いっぱい。:2005/07/22(金) 21:31:01
今はディレクトリ名にスペースを含むこともあったりするし、
707名無しさん@お腹いっぱい。:2005/07/22(金) 21:36:07
藤岡弘、
708名無しさん@お腹いっぱい。:2005/07/22(金) 21:44:56
確かに「今は」の意味が分からんな
709名無しさん@お腹いっぱい。:2005/07/22(金) 22:21:07
Sambaで共有して、エクスプローラーでフォルダーを作ったりもするから、
"/usr/local/Program Files" の下にシェルスクリプトがあったり
するんじゃないの?
710名無しさん@お腹いっぱい。:2005/07/22(金) 22:41:00
Sambaなんて10年前からあるじゃん
711名無しさん@お腹いっぱい。:2005/07/22(金) 22:42:03
712名無しさん@お腹いっぱい。:2005/07/22(金) 22:44:46
10年前は今じゃないの?
713名無しさん@お腹いっぱい。:2005/07/22(金) 22:50:12
10年前と今の区別がつかない老人がいるスレはここですか?
714名無しさん@お腹いっぱい。:2005/07/22(金) 22:53:05
>>705
a2pのバグと思われ。(s2pもそうかな)
所詮perlのおまけソフトなので、
それがperlクオリティー。
715名無しさん@お腹いっぱい。:2005/07/23(土) 02:08:25
${1+"$@"}の意味がわかりません (><)
716名無しさん@お腹いっぱい。:2005/07/23(土) 07:42:24
>715 >293-
717sasasa:2005/07/23(土) 12:17:12
別のスクリプトをlsという名前に変えた際に正しいlsが表示されるようにするにはどうすればいいのでしょう?
718名無しさん@お腹いっぱい。:2005/07/23(土) 12:18:39
command ls
719名無しさん@お腹いっぱい。:2005/07/23(土) 12:30:13
>>717
その、新しいスクリプトのlsが存在するディレクトリに
先にPATHを通す。

PATH=/home/hoge/bin:$PATH; export PATH

とか。
(csh系は糞なので敢えて説明はしないがrehash等が必要)

>>718 はアフォなので無視。
# commandコマンドの動作を勘違いしてるようだし、
# command自体、Bourneシェルでは使えない

あ、「正しいls」というのが、「元の標準のls」という意味なら、
/bin/ls と、フルパスで実行する。
720名無しさん@お腹いっぱい。:2005/07/23(土) 12:36:58
>>719
(゚Д゚)ハァ?
721名無しさん@お腹いっぱい。:2005/07/23(土) 12:38:58
>>719
(゚Д゚)ハァ?
722名無しさん@お腹いっぱい。:2005/07/23(土) 12:59:06
>>718
lsがシェル関数だとcommand lsで回避できますが、
スクリプトだとだめでした。

>>719
ありがとうございます。
やっぱり絶対PATHしかないんですね。
723sasasa:2005/07/23(土) 13:16:11
あとプロファイルにおいて
"
'
`
の意味って何を意味しているんですか?
724名無しさん@お腹いっぱい。:2005/07/23(土) 13:20:29
>>723
'"` はクォートという。
質問が基本的過ぎるので、
man shして、クォートの欄を読むか、
シェルスクリプトの参考書のクォートの欄を読め。
ここでの質問はもっと具体的なものでよろしこ。
725名無しさん@お腹いっぱい。:2005/07/23(土) 13:30:51
>>723
たとえば、
rm -rf /
は危険なコマンドとして有名だが、
' 'を使って、 'rm -rf /' とすると、
スペースを含めて「rm -rf /」という名前のコマンドとみなされるので、
実行しても、

# 'rm -rf /'
rm -rf /: No such file or directory

と、エラーになるので全く安全。

では練習問題。' 'を ` ` に変えて

# `rm -rf /`

をやってみよう。
726名無しさん@お腹いっぱい。:2005/07/23(土) 13:37:28
>>725
これはひどい練習問題だ。
727名無しさん@お腹いっぱい。:2005/07/23(土) 13:39:38
しかもプロンプトが#でいやらしいぜ
728名無しさん@お腹いっぱい。:2005/07/23(土) 14:03:50
>>725
全く安全というか、意味ねーし
729名無しさん@お腹いっぱい。:2005/07/23(土) 14:04:34
>>728
(゜Д゜)ハァ?
730名無しさん@お腹いっぱい。:2005/07/23(土) 14:37:16
>>725
お前、意地悪だな
731名無しさん@お腹いっぱい。:2005/07/23(土) 14:47:26
>>723
課題の内容をここで聞いてるのか・・・・。
ちなみにきっと俺とお前は同じ大学だろう。
732名無しさん@お腹いっぱい。:2005/07/23(土) 14:54:24
733名無しさん@お腹いっぱい。:2005/07/23(土) 15:43:56
>>725
ぷげら
734名無しさん@お腹いっぱい。:2005/07/25(月) 00:07:31
質問させてください。

特定のディレクトリを次々にバックアップするために、
コピー元 => コピー先
のペアをリスト化してループ処理させたいのですが、
どのように記述すればよいのでしょうか。
735名無しさん@お腹いっぱい。:2005/07/25(月) 00:09:40
なにしたいのかいまいちわからんが
find でがんばる、とか?
736名無しさん@お腹いっぱい。:2005/07/25(月) 00:16:59
>>734
なんだいな?backuplistファイルの内容が
source1 dest1
source2 dest2
...
とかなってたら、
cat backuplist | while read source dest
do
cp $source $dest
done
とかでいいじゃん。cpの代わりにtarなりcpioなり、cp -aなり、好きにして。
737名無しさん@お腹いっぱい。:2005/07/25(月) 00:17:07
>>735
えーと、

list={
. { /hoge/hoge1 => /fugo/fugoA }
. { /hoge/hoge2 => /fugo/fugoB }
. { /hoge/hoge3 => /fugo/fugoC }
}

foreach ( pair in list )
. コピー等の処理 pair[0] , pair[1]

みたいなことをしたいんです。


738名無しさん@お腹いっぱい。:2005/07/25(月) 00:18:04
>>736
まさにそれです^^
ありがとうございました。
739名無しさん@お腹いっぱい。:2005/07/25(月) 00:50:55
joinとpasteの違いってなんですか?
740名無しさん@お腹いっぱい。:2005/07/25(月) 01:00:25
man join
man paste
741名無しさん@お腹いっぱい。:2005/07/25(月) 10:19:39
>>725
そんな餌に釣られるクマー!


linuxが起動しなくなったんですけど(><)
742名無しさん@お腹いっぱい。:2005/07/25(月) 21:08:56
>>741
エラーが出るよ。
743名無しさん@お腹いっぱい。:2005/07/26(火) 01:00:43
すみません、質問があります。
mvコマンドで、一度に移動できるファイル数には上限があるのでしょうか?
最大で99999個のファイルを移動できるのか調査しているのですが・・・・

catコマンドが一度に1000件づつしか処理できないようなのですが。
ご存知の方がおりましたらどうぞよろしくお願いします。
744名無しさん@お腹いっぱい。:2005/07/26(火) 01:22:27
mv自身はintの上限-2個まで移動できると思う
745名無しさん@お腹いっぱい。:2005/07/26(火) 01:41:35
>>743
そんな調査するより xargs を使うべきじゃないの。
746743:2005/07/26(火) 02:21:40
>>744 そうですか、それなら可能ですかね。。。?アドバイスありがとうございます。

>>743 xargsですか。ちょっと知らないコマンドですが、調べてみますね。レス感謝です。
747名無しさん@お腹いっぱい。:2005/07/26(火) 02:21:47
>>743
find /usr/include -name '*.h'|xargs grep ARG_MAX
748名無しさん@お腹いっぱい。:2005/07/26(火) 02:40:21
getconf ARG_MAX
749名無しさん@お腹いっぱい。:2005/07/26(火) 02:46:40
>>743
こういったことの周りの知識を知らないのも問題だが、
知識不足なのにいたずらに限界に挑戦しようとする方も問題。
知識不足なら知識不足なりに秘孔をついてしまわぬよう安全策をとるのが一つの見識。
750名無しさん@お腹いっぱい。:2005/07/26(火) 07:55:30
>>745
確かに xargs -n で引数を分割して実行できるが、
xargsはスペースや改行等を含んだファイル名を
正しく扱えないという、仕様上のバグがあるので、
xargs自体obsolete or deprecated。

xargs -0 (xargs --null)が使えるのはGNU xargsだけなので、
一般には使えないと考えるべき。
751名無しさん@お腹いっぱい。:2005/07/26(火) 09:42:40
逆に、ファイル名に問題あるのが確実にない状況なら十分使える。
でなきゃ GNU の入れりゃいいじゃん。
752名無しさん@お腹いっぱい。:2005/07/26(火) 09:44:18
>>750
だけではない。
753名無しさん@お腹いっぱい。:2005/07/26(火) 09:47:48
>>752
何が?
754名無しさん@お腹いっぱい。:2005/07/26(火) 09:59:11
(xargs -0 (xargs --null)が使えるのはGNU xargs)だけではない。
755名無しさん@お腹いっぱい。:2005/07/26(火) 11:01:49
>>751
「ファイル名に問題ないことが確実」な状況って、
自分の作業用ディレクトリ下で、
書き捨てスクリプトを書く場合くらいしかないぞ。
ユーザー開放のディレクトリ以下を一括処理したい場合、
どういうファイルネームが存在するかの仮定をしちゃいけないし、
GNU物を勝手に入れるのも禁止だから、
結局xargsなんて使えん、のが結論。
756名無しさん@お腹いっぱい。:2005/07/26(火) 11:03:45
>>755
勝手に入れちゃだめならしかるべき手続きを踏めばいいじゃない。
757名無しさん@お腹いっぱい。:2005/07/26(火) 11:11:25
ユーザー開放のディレクトリ以下を一括処理したい、と仮定されました。
758名無しさん@お腹いっぱい。:2005/07/26(火) 12:30:03
まあWindowsユーザは空白含みとか日本語ファイル名は普通に平気で付けるしな
特にSambaサーバにしてるならそういうファイル名は全然珍しくないわな
759名無しさん@お腹いっぱい。:2005/07/26(火) 16:14:40
自分も windows では日本語空白記号なんでも使うな。
760名無しさん@お腹いっぱい。:2005/07/26(火) 16:24:47
そこで、zargs ですよ。
761名無しさん@お腹いっぱい。:2005/07/26(火) 17:55:03
>>750

Solaris 9 だと空白は大丈夫だし、改行も \ でエスケープすれば問題なしですが。

$ /bin/echo 'a b\nc\\\nd' | xargs -L 1 -I '{}' /bin/echo "'{}'"
{a b}
{c
d}
762名無しさん@お腹いっぱい。:2005/07/26(火) 17:56:12
>>761
いまどきSolaris使っている馬鹿ってpupupu−−−
763名無しさん@お腹いっぱい。:2005/07/26(火) 18:23:08
>>762
「Soralis」と書けばよかったのに
764名無しさん@お腹いっぱい。:2005/07/28(木) 08:09:48
>>761

xargsの-L 1オプション使ったら、
1行ごとにコマンド(echo)が実行されてしまうから、
元質問の、「まとめて処理」ができないだろ。

それに、「改行を \ でエスケープ」と言っても、
そう都合良く findで出力できないだろ。

さらに、ファイル名に普通の文字として、
" や ' や \ などが含まれていると
やっぱり駄目だろ。

よって、xargsは使えん。
765名無しさん@お腹いっぱい。:2005/07/28(木) 08:23:23
改行文字がファイル名に含まれてるケースって、そんなにあるか?
基本的にそれは考慮せんでもいいと思うんだが
766名無しさん@お腹いっぱい。:2005/07/28(木) 09:24:00
ファイル名にはヌル文字も使えなかったっけ?
だとしたら xargs -0 も完全な解決策にはならないが。
767名無しさん@お腹いっぱい。:2005/07/28(木) 10:05:15
>>766
ファイル名にnull文字は使えねーよ。
だからxargs -0が最もマトモな解決法なのだが、
Solarisとかで使えないから問題になってるんだよ。
768名無しさん@お腹いっぱい。:2005/07/28(木) 10:10:17
>>765
改行は滅多にないとしても、
ファイル名に ' " \ などが含まれているのは
よくある。
「Don't Cry.mp3」とかね。

xargsが ' " \ を特殊文字扱いするのが問題になる。
769名無しさん@お腹いっぱい。:2005/07/28(木) 11:46:07
>>768
xargsが単純に改行をセパレータとして扱うような
プログラムだったなら、はるかにマシだっただろうね
770名無しさん@お腹いっぱい。:2005/07/28(木) 14:45:33
大学のマシンに xargs が なぜか /usr/local/X11/bin にあったのを思い出した
771名無しさん@お腹いっぱい。:2005/07/28(木) 14:50:42
>770
あっ、そんな記憶ある。
NEWS-OS 4 (3かな?) じゃないかな。
772名無しさん@お腹いっぱい。:2005/07/28(木) 18:31:44
NEWS-OS 4は xargs が付属していないね。
/usr/5binにすらない。
(/usr/5bin/cpioとかならある・・ちなみにunameもない・・)
まあ、xargsは元SysV系ということで、
「使わなくても済むはずのコマンド」の扱いだったのだろう。
773761:2005/07/28(木) 19:56:55
>>764

761 で -L 1 を付けたのは、この例だと 1 行ずつ処理しないと
表示が分かりづらいからです。説明が悪かったですね。

改行の入ったファイル名は (find 的に) 無理ですが、
何とかすれば何とかなります。

$ touch "sp ace"
$ touch "single'quote"
$ touch 'double"quote'
$ touch 'back\slash'
$ find . -type f | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/\(.*\)/"\1"/' | xargs /bin/sh -c 'echo "[$1][$2][$3][$4]"' --
[./sp ace][./single'quote][./double"quote][./back\slash]

ま、そこまでして使いたいかと言えば No ですが。
774名無しさん@お腹いっぱい。:2005/07/28(木) 20:27:47
>>771
たしかにマシンのほとんどはNEWSだった。記憶があやふやだったので
local をつけたけど、やはり/usr/X11/binだったのかな
775771:2005/07/29(金) 00:50:15
>772, 774
記憶違いだったようで、スミマセン。
ひょっとしたら、初心者の私が
「ファイル名が x で始まるのに、どうして/usr/bin/X11にないんだ」
(笑わないでオクレ!)
と思ったのが記憶に残っていたのかもしない。
あっ、 NEWS-OSの X 関係は /usr/bin|lib/X11というのも違うかも。

近くの席にはSUN 3 が有ったなぁ。
776名無しさん@お腹いっぱい。:2005/07/29(金) 03:39:56
>>772
xargs はあった方が良いと思うんだが。
これの代わりをするには、たくさんコマンド組み合わせてやらないといかん希ガス
777名無しさん@お腹いっぱい。:2005/07/29(金) 08:14:57
よくわからんが775は771ではない。772の間違いかな。ただ、X関係の下に
あったという記憶は同じようだけど。NEWSのキーボードのタッチは好きだった。
「~」の位置のせいで痛いミスをしたことがあったが…

xargsはコマンドライン以外で使ったことがないかもしれん。
778名無しさん@お腹いっぱい。:2005/07/29(金) 08:19:04
>>776
xargsは実行時効率とタイプ量減らすためって気がする

たんに機能の話だけで言えば
cmdA | xargs cmdB

cmdA | while read i; do cmdB $i; done
でいいし(後者は効率が悪いがIFSで適切なデリミタを設定することもできる)
779名無しさん@お腹いっぱい。:2005/07/29(金) 08:28:34
いつまで引っ張る気だ。
780名無しさん@お腹いっぱい。:2005/07/29(金) 10:04:04
771=775 です。
随分昔の話なので、私の記憶が間違っていたのかと思いました。

>777
コマンドライン以外で使うxargs って、スクリプトの中に書くという事ですよね。
それとも、使いやすいGUIが有るとか? (そんなGUI 想像つかない)
# スレ違いなんで、このくらいにしておきます。 orz
781名無しさん@お腹いっぱい。:2005/07/29(金) 18:23:59
argument が無限に取れるシェルがあれば
xarg はいらないの?
782名無しさん@お腹いっぱい。:2005/07/29(金) 18:26:25
シェルが取れてもコマンドが取れなければあまりい意味が無い
783名無しさん@お腹いっぱい。:2005/07/29(金) 18:37:57
でもそれは xargs でも解決できないよね。
784名無しさん@お腹いっぱい。:2005/07/30(土) 09:24:10
>>783
xargs -i cmd {} でほぼ解決できる。
パフォーマンスは知らん。
785名無しさん@お腹いっぱい。:2005/07/30(土) 10:19:58
>>784
だからぁー、-iオプション付けると
-l 1も暗黙に付いちゃうから、xargs使う意味がなくなるんだよ。
解決するのはスペースを区切り文字とみなさないことだけであって、
\ とか ' とか " の問題はそのまま未解決。
786名無しさん@お腹いっぱい。:2005/07/30(土) 10:28:10
>だからぁー、-iオプション付けると
>-l 1も暗黙に付いちゃうから、xargs使う意味がなくなるんだよ。
意味不明。
787名無しさん@お腹いっぱい。:2005/07/30(土) 11:01:57
>>785
何を言ってるんだ?w
788名無しさん@お腹いっぱい。:2005/07/30(土) 14:54:36
多数のファイル名を拡張子を付けたファイル名に変換したいのだがrenameはつかえるのかな?

f1 f2 f3 f4 ->f1.jpg f2.jpg f3.jpg f4.jpg
789名無しさん@お腹いっぱい。:2005/07/30(土) 15:00:30
for file in * ; do
 mv $file $file.jpg
done
790名無しさん@お腹いっぱい。:2005/07/31(日) 21:14:35
>>789
rename って言ってるってことはMS-DOSプロンプトなんだろうよ

正解は >>791 よろしく
791名無しさん@お腹いっぱい。:2005/07/31(日) 21:20:03
ちょっくらうんこいってくる。
792名無しさん@お腹いっぱい。:2005/07/31(日) 21:22:19
DOSプロンプトだったら、rename * *.jpg
793名無しさん@お腹いっぱい。:2005/07/31(日) 21:37:19
Linuxだとrenameというコマンドがディス鳥標準で付いていて、一応使える。
ただし一般的ではない。
>>789
はダブルクォート付けていないから、減点だな。
794名無しさん@お腹いっぱい。:2005/07/31(日) 21:45:25
そもそも >>788 は「多数のファイル名を」って言ってるんだから、
* はまずいだろ
795名無しさん@お腹いっぱい。:2005/07/31(日) 22:00:17
>>788 が言う「多数」は4つくらいのようだ。
796名無しさん@お腹いっぱい。:2005/08/01(月) 08:28:05
zsh 使ってるなら zmv も便利
797名無しさん@お腹いっぱい。:2005/08/02(火) 12:42:06
tailの逆、つまり先頭から(ファイル最終のn行前)まで表示するにはどうすれば
いいでしょう?
798名無しさん@お腹いっぱい。:2005/08/02(火) 12:42:33
head
799名無しさん@お腹いっぱい。:2005/08/02(火) 13:38:30
>>797
tail -r
800名無しさん@お腹いっぱい。:2005/08/02(火) 23:45:18
>>799
ひねくれ者め(笑)
801名無しさん@お腹いっぱい。:2005/08/03(水) 00:25:16
liat
802名無しさん@お腹いっぱい。:2005/08/03(水) 00:56:37
ファイル最終の n 行前までって言ってるんだから、
実際のところ head で実現するのは苦しい気がする。
(head で指定できる行数は限りがあったと思うので。)

てことで
 tail -<n> <file_name> > <tmp_file>
 comm -23 <file_name> <tmp_file>
 rm -f <tmp_file>
かな。
803名無しさん@お腹いっぱい。:2005/08/03(水) 02:44:09
ファイル途中にtmp_fileと同一行が出たらおかしくならないか?
804名無しさん@お腹いっぱい。:2005/08/03(水) 03:14:44
comm はソートされたファイルじゃないと使えない
805名無しさん@お腹いっぱい。:2005/08/03(水) 03:32:44
んな、ファイル丸ごと何度も読み書きするくらいだったら、たとえば
last=100
rows=`wc -l file | cut -d ' ' -f 1`
head -n `expr $rows - $last` file
とか。
806名無しさん@お腹いっぱい。:2005/08/03(水) 03:37:55
wc -l file | cut -d ' ' -f 1

wc -l < file
でいいだろ
807名無しさん@お腹いっぱい。:2005/08/03(水) 07:23:57
>>806
??
808名無しさん@お腹いっぱい。:2005/08/03(水) 10:14:37
tail -r | tail +n | tail -r

GNU tail では -r はないようなのでかわりに tac を。
809名無しさん@お腹いっぱい。:2005/08/03(水) 12:55:11
tail -rだと全文をバッファに抱えるプロセスを二つ重ねないといけないので、
あんまり嬉しくないんですよね。

というわけで、こうかなあと。(n=4の場合)
ruby -ne '(q||=[])<<$_;q.size<=4||print(q.shift)' file
810名無しさん@お腹いっぱい。:2005/08/03(水) 13:07:44
echo '1,$-Np' | ed file
811名無しさん@お腹いっぱい。:2005/08/03(水) 17:21:46
質問させてください。
スクリプトを実行したら
login:
名前を打ち込んで
password:
パスを打ち込む(非表示)
パスはファイルにリダイレクト
っていうのを作りたいんですが。バッシュで。
途中で文字列を入力させるやり方が分かりません。
教えてください。おねがいします。
812名無しさん@お腹いっぱい。:2005/08/03(水) 17:37:23
read -p 'login: ' NAME
read -s -p 'password: ' PASS
echo $PASS > file
813名無しさん@お腹いっぱい。:2005/08/03(水) 20:14:02
そんでそんで? 誰のパス盗もうとしてんの?(σ ̄ー ̄)σ>>811
814名無しさん@お腹いっぱい。:2005/08/04(木) 02:44:04
シェルスクリプトで perl -pe chomp と同じことをしたいのですが、
どのようにやればよいでしょうか?
815名無しさん@お腹いっぱい。:2005/08/04(木) 08:57:48
#!/bin/sh
exec perl -pe chomp
816名無しさん@お腹いっぱい。:2005/08/04(木) 13:31:14
readで出来たのか
知らなかった
817名無しさん@お腹いっぱい。:2005/08/04(木) 13:39:59
 cmd1 | cmd2
上記のようなパイプで繋いだコマンドで、cmd1の終了ステータスを拾いたいのですが、
どうしたらよいのでしょうか?
818名無しさん@お腹いっぱい。:2005/08/04(木) 14:25:13
csh -c 'cmd1 | cmd2'
819名無しさん@お腹いっぱい。:2005/08/04(木) 14:45:12
出来ました、ありがとうございます。
820名無しさん@お腹いっぱい。:2005/08/04(木) 14:55:23
(((cmd1; (echo $? >&3)) | cmd2 >&4) 3>&1 | (read x; exit $x)) 4>&1
echo $?

うーん、美しくない。
821名無しさん@お腹いっぱい。:2005/08/04(木) 22:10:15
一瞬lispに見えたw
822名無しさん@お腹いっぱい。:2005/08/04(木) 23:58:53
>>814
tr -d '\n'
823名無しさん@お腹いっぱい。:2005/08/05(金) 00:59:04
>>817
bash の(たぶん)3.0じゃないと使えないと思うけど、
$ echo $PIPESTATUS[0]
とか、出来る。
ちなみに配列だから、
$ echo ${PIPESTATUS[*]}
で、全部見れる。

あと、ちょっと違うけど、
$ set -o pipefail
とかもある。

824823:2005/08/05(金) 01:01:30
PIPESTATUS、bash-2.05bにもあったよ。
pipefailが、3.0からだった。
825名無しさん@お腹いっぱい。:2005/08/05(金) 02:17:49
今/home/.emacsがあるとして、ユーザディレクトリにそれぞれコピーするには
どう書けばいいですか?所有者ももそれぞれのユーザに設定できますか?
826名無しさん@お腹いっぱい。:2005/08/05(金) 02:32:28
>>825
/etc/skel に置いとけ
827名無しさん@お腹いっぱい。:2005/08/05(金) 02:35:58
シェルスクリプトのスレよりもくだ質が似合いの質問者だな。
828名無しさん@お腹いっぱい。:2005/08/05(金) 02:54:40
>>826 >>827
そんなぁ・・・
そこをなんとか・・・
829名無しさん@お腹いっぱい。:2005/08/05(金) 03:15:53
くだ質いけって言われたのになんでここで粘るんだ?
だだこねる相手はママだけにしとけよ。

次の方、どうぞ↓

830名無しさん@お腹いっぱい。:2005/08/05(金) 07:43:52
なんで怒ってるの?
831名無しさん@お腹いっぱい。:2005/08/05(金) 07:47:09
$HOMEに押し着せの.emacsを強制コピーしてくる
シス管が居て、迷惑してるのですが、
これを拒否するにはどうしたらいいでしょうか?

ちなみに、root権限で上書きコピーしてくるため、
一般ユーザーのパーミッション設定では防げません。
あと、.emacsだけじゃなく、$HOME/.profile
$HOME/.xinitrcとかもコピーで潰されるので大迷惑です。
832名無しさん@お腹いっぱい。:2005/08/05(金) 08:17:23
.emacs というディレクトリ作っといたら?
833名無しさん@お腹いっぱい。:2005/08/05(金) 08:34:38
>>831
#!/bin/sh
cat <<EOF | mail root
From: $USER

あなたのホスト管理はクソです。
いますぐ.emacsをroot権限で上書きするというアホな行為をやめてください。
EOF
834名無しさん@お腹いっぱい。:2005/08/05(金) 08:53:27
>>831
自分の.emacs を、.my-emacs とかにかえて、
シェルのalias を使って、
alias emacs="emacs -q -l .my-emacs"
とかしとく。

.profile の方も、同じような考え方で、
bash --norc --noprofile の後、自分のprofileを読み込むようなscriptを書いといて、
毎回、loginし直す。(面倒だけど)

zsh 、ksh、tcsh等、対話的に使うshellを他のにするとかでもいいんじゃん?

.xinitrcは、
export XINITRC=$HOME/.my-xinitrc
を設定しといて、startx。
で、どうよ。

>>833 みたく、管理者に一言いうのが早いかもしんないけど。
835名無しさん@お腹いっぱい。:2005/08/05(金) 11:18:52
ln -s /etc/passwd ~/.emacs
836名無しさん@お腹いっぱい。:2005/08/05(金) 11:36:49
どういうタイミングでどういう手段で何が上書きされるのか。
ログインシェルは何か。自分の権限でcronやchshは使えるか。
などによっていろいろと対抗手段は考えられるけど、情報不足。
837名無しさん@お腹いっぱい。:2005/08/05(金) 11:41:59
>>825 に対する皮肉として書いた釣りなのに、
こんなに釣りにつき合ってくれてありがとう。
838名無しさん@お腹いっぱい。:2005/08/05(金) 11:48:34
釣られすぎだな。
839名無しさん@お腹いっぱい。:2005/08/05(金) 13:03:52
      ∧_∧ハゥッ
   ∧_(Д`; )
  ( ・∀・)玉  つ
  (っ  ≡つて ヽ チーン!
  して_)_ノw (_)
玉を砕くと書いて「玉砕」と言う。
840名無しさん@お腹いっぱい。:2005/08/05(金) 13:12:34
835に1票
841名無しさん@お腹いっぱい。:2005/08/05(金) 13:32:33
>>835 も面白いけど、
ふつー、rm -f してから cpするだろうから効果なし。
842名無しさん@お腹いっぱい。:2005/08/05(金) 16:40:35
そのふつーが期待できる管理者ならユーザの.emacsを上書きしたりなぞしない。
843名無しさん@お腹いっぱい。:2005/08/05(金) 17:32:09
http://makimo.to/2ch/pc5_unix/996/996949546.html
の3の書き込みなんですが、意味は分かるんですが
なぜ {, という書き方なんでしょうか。
そのままぐぐってみてもヒットしないので
展開の書式を解説しているサイトを教えてください。
844名無しさん@お腹いっぱい。:2005/08/05(金) 17:35:55
(zsh)Brace Expansion
13.6 Brace Expansion
====================

A string of the form `FOO{XX,YY,ZZ}BAR' is expanded to the individual
words `FOOXXBAR', `FOOYYBAR' and `FOOZZBAR'. Left-to-right order is
preserved. This construct may be nested. Commas may be quoted in
order to include them literally in a word.
845名無しさん@お腹いっぱい。:2005/08/05(金) 17:42:34
>>844 は答えになっていない英語スパムだな。
>>843 は、空文字列のカンマに付いての質問と思われ。
ブレース展開自体の質問じゃないよ。
846名無しさん@お腹いっぱい。:2005/08/05(金) 17:42:54
>>845
(゚Д゚)ハァ?
847名無しさん@お腹いっぱい。:2005/08/05(金) 17:43:46
>>845
自分の理解力不足を棚にあげて、人を批判とはおめでたい人ですね. :-)
848名無しさん@お腹いっぱい。:2005/08/05(金) 17:44:25
>>845
> ブレース展開自体の質問じゃないよ。
>>843
> 展開の書式を解説しているサイトを教えてください。
849名無しさん@お腹いっぱい。:2005/08/05(金) 17:44:57
>>845
英語が読めないなら、エキサイト翻訳使えよ。
850名無しさん@お腹いっぱい。:2005/08/05(金) 17:52:13
>>844 が言っているのは、展開時に左から右へという順序と、
ネスティング可能なことと、
カンマ自体を普通の文字として使うならクォートしろということだけ。
元質問のコマンドラインでは左から右への順序は関係ないし、
空文字列のカンマも許されることは >>844 には書かれていない。
なので、 >>844 は早とちりの外し回答だと思う。
851名無しさん@お腹いっぱい。:2005/08/05(金) 18:09:45
この、クソチョッパリが!!!!!!!!!!!!!!!!!!!!!!!
百年謝罪しろ!!!!!!!!!!!!!!!!!!!!!!!!!!
852名無しさん@お腹いっぱい。:2005/08/05(金) 20:29:30
>>850
> 空文字列のカンマも許されることは >>844 には書かれていない。
禁止されていないということは許されているということだろ。
853名無しさん@お腹いっぱい。:2005/08/05(金) 20:38:18
>>852
元質問は「 {, とは何か?」と聞いているのだから、
「それはブレース展開の最初の文字列が空文字列になっているものだ」
と答えるのが的確。

>>850 はマトはずれ。
854853:2005/08/05(金) 20:43:42
スマソ。レス番間違えた。>>850 は正解。

>>844 はマト外れ。

855名無しさん@お腹いっぱい。:2005/08/05(金) 21:11:43
別スレで怒られたので、こちらでに移動します。
今/home/.vimrcがあるとして、ユーザディレクトリにそれぞれコピーするには
どう書けばいいですか?所有者ももそれぞれのユーザに設定できますか?
856名無しさん@お腹いっぱい。:2005/08/05(金) 21:12:30
誤爆すみません。逝ってきます。
857名無しさん@お腹いっぱい。:2005/08/05(金) 21:19:51
$HOMEに押し着せの.vimrcを強制コピーしてくる
シス管が居て、迷惑してるのですが、
これを拒否するにはどうしたらいいでしょうか?

ちなみに、root権限で上書きコピーしてくるため、
一般ユーザーのパーミッション設定では防げません。
あと、.vimrcだけじゃなく、$HOME/.xsessionや
$HOME/.cannaとかもコピーで潰されるので大迷惑です。
858名無しさん@お腹いっぱい。:2005/08/05(金) 21:24:00
もういいから。
859名無しさん@お腹いっぱい。:2005/08/05(金) 21:26:37
>>857
コミュニケーション能力を磨くといいよ。
860名無しさん@お腹いっぱい。:2005/08/05(金) 21:34:21
>>859
コミュニケーション能力じゃなくて、
技術的に回避する方法はありませんか?
上司に言っても、
「シス管は彼に任せているから、彼の方針に従ってくれ」
の一点張りで話が進みません。
861名無しさん@お腹いっぱい。:2005/08/05(金) 21:39:23
>>860
> >>859
> 技術的に回避する方法はありませんか?
あるけど、
> 「シス管は彼に任せているから、彼の方針に従ってくれ」
その彼とコミニュケーションはとったの?
862名無しさん@お腹いっぱい。:2005/08/05(金) 21:45:48
もういいから。
863名無しさん@お腹いっぱい。:2005/08/05(金) 21:46:34
>>862
だれも君がどう感じたかなんて聞いていないよ。
864名無しさん@お腹いっぱい。:2005/08/05(金) 21:52:54
>>861
もちろん、とったよ。
「これはシステム管理上必要なことだから」
で話は進まず。
865名無しさん@お腹いっぱい。:2005/08/05(金) 21:56:36
横レスすまそ。
>>861
$HOME/.xsession の場合は回避するの難しくないか?
866名無しさん@お腹いっぱい。:2005/08/05(金) 22:04:22
        _,. -−─−-- 、_
     ,. '´  _ -−ニ二二`ヽ、
    /   /  _,.−'⌒ヽ,ノ``'ミ,、
  ,.'   /  /  ,,イ゙\ /入、ヾ,
. /  / // -‐''"_ ヽ l l′/`_''l}
 '  / ,.イii/ /∠´ `ヾ' l lレ''´ ヾ
   / ,.' ii/u i{,_,,  ゚ }! l li{,_,. ゚ }
.  / /ii i/u uヾく,_,ノ′ l lゞi-rイ
 ,' /-、 i| u    ' ' ` ,__〉〉  |
.  /l 「ヾ'i|   ,.r‐     `'U'U_,ィ}|
 / | ー}.l| /,r 'T"丁 ̄| ̄ | l|'|
 }i iト、}( l! ,イ  |__, ⊥ _|__,l|.ト、
 `i iiiハ `| i l_/       _,ノノ|| \
.  }iij. |. l |Y/      ‐┴''" ||\ \
  ゙l!  | l|. 仁   _,__      ||  \ \
  /   | |l lニレ'´     `ヾ'、  ||   \ \
  /   |. |ヽ 「]、       ヾ>、||     \
/   .|  |. ヽ`「ヽ        }H|\
      |  |  ヽ`「ヽ、、,__,,ノj‐||  ` ー─
   u  |   |  \`'〔`'T''''''T´ ,ノ|
      |   |    \ ` ̄ ̄ ̄ /
       |    |    `−──‐′
867名無しさん@お腹いっぱい。:2005/08/05(金) 22:05:00
>>865
.xsession って #! みてくれたっけ?
868名無しさん@お腹いっぱい。:2005/08/05(金) 22:35:33
>>867
見るかどうかは、/usr/X11R6/lib/X11/xdm/Xsession に
どう書いてあるかによって変わる。デフォルト状態の
Xsessionでも、Xのバージョンによって違ったと思う。

というか、root管理者が /usr/X11R6/lib/X11/xdm/Xsession
を編集して、そもそも$HOME/.xsessionを参照しないようにされてしまうと
一巻の終り。それに気づかない程度のアホ管理者と想像するが・・
869843:2005/08/06(土) 00:40:56
すいません、なんかお礼を書くタイミングを逸してしまって
空文字列という意味なんですね
ありがとうございました
870名無しさん@お腹いっぱい。:2005/08/06(土) 13:29:38
diff -u /etc/hosts{.20050801,}とかよく使いますよ。
871  :2005/08/07(日) 12:53:34
>>857
そのホストとは別に、LinuxなりBSDなりマシン立ち上げて、
そっちの環境で作業すれば〜
872名無しさん@お腹いっぱい。:2005/08/07(日) 13:12:15
(SUM=0;find /lib -maxdepth 1 -type f |xargs ls -lt|grep 'Aug 5'|awk '{print $5}'|while read SIZE;do SUM=`expr $SUM + $SIZE`;echo "$SIZE $SUM";done;echo "SUM=$SUM")

これでなんで最後のSUMがゼロになってしまうんでしょうか?
873名無しさん@お腹いっぱい。:2005/08/07(日) 13:17:40
$find /lib/ -maxdepth 1 -type f -mtime -3|xargs wc -c
やりたいこと自体はこれでOKでした。
874名無しさん@お腹いっぱい。:2005/08/07(日) 13:18:26
>>872
パイプでwhileにつないだ場合、
この部分はさらに別シェルで実行されるから
その次のセミコロン以降の変数には反映されない。
875名無しさん@お腹いっぱい。:2005/08/07(日) 13:22:17
876名無しさん@お腹いっぱい。:2005/08/07(日) 13:39:50
ある数値をパイプで受け取ったとして、それの合計値を出したいときには
どうするのがいいんでしょうか??
877名無しさん@お腹いっぱい。:2005/08/07(日) 13:48:27
878名無しさん@お腹いっぱい。:2005/08/07(日) 13:53:01
>>877
ありがとうございます。これでなんで上手くいくのか分りませんがとにかくそういうもんだと思っておきます。
879名無しさん@お腹いっぱい。:2005/08/07(日) 16:11:32
>>872
シェルによって違う。
bourneとbashはパイプからだとサブシェルになる。
kornとzshはパイプからでもサブシェルにならない。
880名無しさん@お腹いっぱい。:2005/08/08(月) 23:29:21
当方kshを利用しているのですが、whileループを使用して2ファイルを
読み込む処理がうまく行きません。
外側のループが処理されずに抜けてしまいます。
(個人的な推測では内側のループで外側のカーソルも移動している気がします)
どなたか、対処の方法を教えてくだされ。

ソースはこんな感じです。
function funcA
{
while read LINEB
do
処理あれこれ
done <$LINEB
}

while read LINE
do
 funcA
done <$FILEA

881名無しさん@お腹いっぱい。:2005/08/08(月) 23:35:21
>>880
ヒント:リダイレクト、ファイル記述子
882名無しさん@お腹いっぱい。:2005/08/08(月) 23:38:46
$LINEBじは$FILEBの間違いって落ちじゃないよな。
883880:2005/08/08(月) 23:42:58
>>881さん
もうちょっと、ヒントをください。

>>882さん
先ほどのソースは間違ってますが、現実は「FILEB」です。
ご指摘ありがとうございます。
884名無しさん@お腹いっぱい。:2005/08/09(火) 00:04:59
1 #!/bin/ksh
2 FILEB=$0
3 CNT=0
4 function funcA
5 {
6 while read LINEB
7 do
8 echo $LINEB
9 done <$1
10 }

11 while read LINE
12 do
13 echo ------$CNT------
14 funcA $FILEB
15 CNT=`expr $CNT + 1`
16 done <$0

この例だと、同じファイルを読み込んでるけど、ちゃんと動くがなぁ。
885880:2005/08/09(火) 00:34:04
>>884さん
ほ、本当ですか?
自宅にはUNIX環境がないため、確かめることはできないのですが…
なんでだろうか。。
886名無しさん@お腹いっぱい。:2005/08/09(火) 06:20:17
起動したプロセスのプロセスIDをpidファイルに書き込みたいんですが、
どうすればいいでしょうか?
887名無しさん@お腹いっぱい。:2005/08/09(火) 06:35:34
>>886
echo $$ > pid

念のため言っておくけど、複数個起動すれば当然"pid"というファイルの
内容は書き直されちゃうからね。
888名無しさん@お腹いっぱい。:2005/08/09(火) 07:14:42
>>887
あざーっす!
参考になります。
ところで、やはりスクリプト内で別のスクリプトを読んでいる場合は
実プロセスIDではなくてスクリプトを実行しているプロセスのIDになってしまいますよね・・
889名無しさん@お腹いっぱい。:2005/08/09(火) 07:19:22
>>888
スクリプトを実行してるプロセスのIDになりました。
apacheとかはどうやって取得しているんでしょうか・・・
890名無しさん@お腹いっぱい。:2005/08/09(火) 07:23:10
バックグラウンドで起動した子プロセスのPIDなら「$!」
891名無しさん@お腹いっぱい。:2005/08/09(火) 07:55:48
>>890
あざーーっす!!!!
取れました!
1 #!/bin/sh
2
3 echo $$
4 ./test.sh &
5 echo $!

という超簡単なものなら行けたんですが・・・・・
実はtomcatの自動起動スクリプトを書いているんですが、
ソース晒して見てもらってもいいでしょうか?
892名無しさん@お腹いっぱい。:2005/08/09(火) 16:03:39
> あざーーっす!!!!
ってなんだよ?
893名無しさん@お腹いっぱい。:2005/08/09(火) 16:13:01
オヅラさんの挨拶は「おあざーっす」
894名無しさん@お腹いっぱい。:2005/08/09(火) 16:14:21
895名無しさん@お腹いっぱい。:2005/08/09(火) 16:15:07
「ありがとうございます」の発音の弱勢部分を崩したんじゃない?

当たってたら、なんかくれ。
896名無しさん@お腹いっぱい。:2005/08/09(火) 16:59:30
意味不明。
日本語を書くこと。
897名無しさん@お腹いっぱい。:2005/08/09(火) 17:40:18
いあいあとかふんぐるいとかあざーすとか。
898名無しさん@お腹いっぱい。:2005/08/09(火) 21:41:09
うがなぐるふたぐんとか
899名無しさん@お腹いっぱい。:2005/08/09(火) 21:43:31
いあいあはすたー
900名無しさん@お腹いっぱい。:2005/08/10(水) 09:20:00
sedやawkの使い方知らないから、いつもPerlに頼っちゃうんだけど、
こういうのあんまりよくない?
901名無しさん@お腹いっぱい。:2005/08/10(水) 10:18:29
どうでもいいよおもうよ 
902名無しさん@お腹いっぱい。:2005/08/10(水) 10:37:29
>>891
自己レスです。

結局
echo $(ps -ewo "%p %c %u %a" | awk "\$2==\"java\" && /catalina/ && \$3==\"$CATALINA_USER\" {print \$1}" | head -n 1) > $CATALINA_PID
こんな強引なやり方でプロセスID取得しました
903名無しさん@お腹いっぱい。:2005/08/10(水) 12:56:49
そんなことするより、起動スクリプトで echo $$ > pidfile したあと exec すれば?
904名無しさん@お腹いっぱい。:2005/08/10(水) 14:54:23
fifo つくって通信するとか
905名無しさん@お腹いっぱい。:2005/08/10(水) 19:16:47
>>902
Tomcatが8080で待ちうけている場合
/usr/sbin/lsof -t -i TCP:8080 -P

シェルスクリプトじゃないけどね。
906名無しさん@お腹いっぱい。:2005/08/10(水) 19:48:48
>>905
ええー、(環境によっては)lsofをわざわざインスコすんの…。

そりゃあ必要なものは何でもインスコしなきゃならんがの。プロセスidさえ
わかればよいという目的下だと、ちょっとバランスの悪さを感じる。(俺は)
907名無しさん@お腹いっぱい。:2005/08/10(水) 23:15:45
スミマセン、教えてください。
Kシェルで

count=`cat a.txt b.txt | grep ${検索条件} | wc -l`

というコマンドで検索条件に半角スペースを含む文字列を指定したい場合、どうしたら良いですか?
908名無しさん@お腹いっぱい。:2005/08/10(水) 23:23:53
count=`cat a.txt b.txt | grep "${検索条件}" | wc -l`
これじゃあかんの?
909907:2005/08/10(水) 23:39:59
>>908
それだと、なぜかcount=0になっちゃうんですよ。
もちろん、条件には引っ掛かる文字列もあります。
うーん。
910名無しさん@お腹いっぱい。:2005/08/11(木) 01:43:37
>>908
ksh使ってないんで本題はわからんが、grep -c って標準的じゃないの?
スペースの話を別にすれば
count=`grep -c $検索条件 a.txt b.txt`
でよかったんじゃないのかな。

本題も、wc -lを取り払って試せば、なぜなんだかわからないかな。
911名無しさん@お腹いっぱい。:2005/08/11(木) 02:03:08
grep -c -F でどうだろう?
912名無しさん@お腹いっぱい。:2005/08/11(木) 11:13:46
>もちろん、条件には引っ掛かる文字列もあります。

というところからして、検索文字列の正規表現が
おかしくてマッチしないだけというオチじゃなかろうか。
grep を fgrep に変えてみるとか。
913907:2005/08/11(木) 20:04:46
自己解決しました。
検索条件はファイルから読み込んでいるので、
半角スペースに見えているのは特殊文字かと思い、
cat -vしてみたら

行末に^Mの文字が‥
引っ掛からないわけでした。

やさしいunix板の皆様、ありがとうございました。
逝ってきます。
914名無しさん@お腹いっぱい。:2005/08/14(日) 08:45:19
csh使いのアホはいつになったら死滅するんでしょうか?
915名無しさん@お腹いっぱい。:2005/08/14(日) 10:05:52
BSDがあるかぎり何度でも甦るさ
916名無しさん@お腹いっぱい。:2005/08/14(日) 11:04:42
*BSDに関して一つだけ嫌いな点はデフォルトのログインシェルがcshって事だな。
NetBSDにstaticな/bin/bashを突っ込む俺も阿呆だと思うけど。
だってシングルユーザモードでもログインシェルにbashを使いたいんだよもん!
917名無しさん@お腹いっぱい。:2005/08/14(日) 17:35:45
tcshとかもいらない
918名無しさん@お腹いっぱい。:2005/08/14(日) 18:04:12
私も要らないんだけど、入ってないと年寄りが。。。
私はbashかksh。
919名無しさん@お腹いっぱい。:2005/08/14(日) 18:51:36
zsh
920名無しさん@お腹いっぱい。:2005/08/14(日) 19:41:53
ログインシェルの話はどこかよそでやっておくれやす
921名無しさん@お腹いっぱい。:2005/08/14(日) 22:12:16
出た自治厨
922名無しさん@お腹いっぱい。:2005/08/14(日) 23:23:49
>>921
明らかにスレ違いだし。
923名無しさん@お腹いっぱい。:2005/08/22(月) 17:31:43
シェルスクリプトを走らせると

????.sh: xrealloc: cannot reallocate 268435456 bytes (0 bytes allocated)
(????はファイル名)

というエラーがでます。
前同じスクリプトを動かしても何も普通に動いていたのに。。。
パーミッション、ファイルサイズ制限、ログインシェル、メモリ残量
はチェック済みです。。。

このエラーが起きる原因はなんでしょうか?
よろしくお願いします。
924923:2005/08/22(月) 18:14:30
解決できました。すみません(;´ω`)
925名無しさん@お腹いっぱい。
>>924
原因はなんだったんだよ!