1 :
名無しさん@お腹いっぱい。 :
2005/04/17(日) 00:17:17
□シェルスクリプトでよく使うコマンド: 制御・条件判定系: [,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
では、引き続きマターリと逝きましょう。
乙。でも見辛いような気がする。
お約束は
>>1 に置いといた方がよかったんでは。
次スレのテンプレは前スレ準拠がいいな。
8ビット文字を¥xFFとか指定してファイル名に使いたいです どうしますか?
bashを使って、 echo -e "\xFF" で混ぜる。
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'
touch: ゆみさんかわいいよゆみさん: Invalid argument
echo, printならできるが他はダメポだな
ん?できますよ?? > touch ゆみさんかわいいよゆみさん > ls ゆみさんかわいいよゆみさん > touch ゆみさんかわいいよゆみさ > touch ゆみさんかわいいよゆみ > touch ゆみさんかわいいよゆ > touch ゆみさんかわいいよ > ls ゆみさんかわいいよ ゆみさんかわいいよゆみさ ゆみさんかわいいよゆ ゆみさんかわいいよゆみさん ゆみさんかわいいよゆみ > rm ゆみさん* > ls
15 :
名無しさん@お腹いっぱい。 :2005/04/18(月) 21:45:40
touch ゆみさんかわいいよゆみさん はできるけど$'......'の形式がダメ
ゆみさんがかわいくないんじゃなかろうか
17 :
名無しさん@お腹いっぱい。 :2005/04/18(月) 22:20:50
ぎゃふん
cronなどに登録して使う、特定のコマンドが終了していたら再起動するスクリプトが欲しいです。 最初に起動したコマンドのプロセス番号を記録しておけばいいんでしょうか。 一度には一つしか使わないので、psコマンドの出力を適当にgrepして使ってもいいでしょうか。 お知恵をお貸しください。しばらく自分で考えてみます。
daemontools使ったほうが早い。
inittabでactionにrespawn
daemontoolsはDebianの専売特許かと思ってましたが…。 そんなにいいならちょっと見てみますね。
22 :
21 :2005/04/18(月) 23:39:52
ってか最初にMac OS Xだと言わなかったのはうかつでした。ごめんなさい。
23 :
21 :2005/04/18(月) 23:41:45
連投すみません。 ついでに言いますと、root権限がない場合のことも考えておきたいところなんです。
24 :
名無しさん@お腹いっぱい。 :2005/04/18(月) 23:42:37
すみませんが シェルスクリプトでatofに相当するコマンドと使用法を教えてください
25 :
21 :2005/04/18(月) 23:44:31
>>24 型とかないし、そのまま計算に使わないの…?
daemon 監視して落ちてたらroot権限なしで再起動? 一般ユーザでってこと?特別な管理専用ユーザつくるってこと?
一般ユーザです。IRCのボットにしようかと思ってます。
28 :
名無しさん@お腹いっぱい。 :2005/04/18(月) 23:52:10
>>25 どうやら別のとこが悪かったみたいです。
ありがとうございました。
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
無限ループで 終了したら開始するようにしたらダメ?
そういうときの常道としてはPIDファイルを書き出してシェルスクリプトから execすればいい。 で、PIDファイルに対応するプロセスが死んでたらまたexecして、 生きてたらそのまま終了する。これをcronで好きな間隔でまわせばいい。
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なんか使うなというツッコミは無しの方向でお願いします
全部フォアで動かせばいいんちやうの? イマイチ、何をしたいのかが不明だけど。
>>33 > 3 AとBからの戻り値を標準出力から取り込むまで待機する
が意味不明
>>33 は、戻り値の意味を取り違えてるな。
戻り値って終了ステータスのことだよ。
それから、&を付けてバックグラウンドにすると、
戻り値はすべて0になるから、判定不可能になる。
&をやめてフォアグラウンドにしても、
rsh越しだと戻り値を取得できず、
やはりすべて0になって判定不可能になる。
37 :
33 :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が終わったと判断 ひょっとして俺はなにか思い違いをしてます?
> ひょっとして俺はなにか思い違いをしてます? かなりしてそう。 まず、rshとかAとかBとかもちだすからいかんのだ。 時間のかかるコマンドxとyがある。でどうしたい?
うほっ
>>38 >> ひょっとして俺はなにか思い違いをしてます?
>かなりしてそう。
やはりですか
>時間のかかるコマンドxとyがある。でどうしたい?
xとyを非同期に実行させたいわけです
xを実行
(x:実行中)
yを実行
(x:実行中y:実行中)
xとyの完了を待つ(どちらが先に完了するかは不明)
>>33 3 の実現方法がよく分からんのだが、、、ってのは置いといて、
rsh -n servA 'X' > /tmp/a.$$ & とかして、そのファイルの中身をチェックすればいいんでは?
>>36 バックグラウンドでもwaitとかで取れるだろ。
戻り値取得ってsshならOKだけど、rshってNGなん?
rshだと戻り値取得NGだよ。 でも元質問が「rshなんか使うなというツッコミは無しの方向で」 と言ってるからな。
単に x と y を並列に実行させて、両方が終わるまで待ちたいってことだろ? 戻り値なんてどこに出てくる必要があるんだ? x & y & wait
それはすごい。コンビを組んで売り出すべきだ。
そしてトルコへ公演ツアーへ逝くべし
47 :
名無しさん@お腹いっぱい。 :2005/04/23(土) 03:14:33
どなたか前スレ.datを下さi
っ ァ w ぇ っ と ァ w ぇ ww る う う えぇ ぉハ ハ お w w け し の は w k wう
これも、ワーム?
んだ なぜかUNIX板でよく見るのは気がする
53 :
47 :2005/04/23(土) 12:48:33
>48,49 サンクス
>>37 誰もXからの出力を読んでないじゃないか。
for host in servA servB; do
(exit `rsh -n $host 'X'`) &
done
wait
55 :
名無しさん@お腹いっぱい。 :2005/04/26(火) 17:29:16
プログラムはシェルスクリプトが一番頻繁に書かれていると思うのだが。 質問無いね。
すいません。質問です。 ------------------------- [test1] number = 8 hoge = "foo" [test2] rock = 89 scottie = "sharp" again = 123 [test3] number = 998 hoge = "thinking" [test4] ms = "end" ------------------------- こんなiniファイルがあったとして、 「test2」「test4」を消したいんですが、 そんなシェルできるのでしょうか?
完成系 ------------------------- [test1] number = 8 hoge = "foo" [test3] number = 998 hoge = "thinking" -------------------------
さぁ!シェルの作り方についての質問が出ました!
59 :
名無しさん@お腹いっぱい。 :2005/04/26(火) 19:27:24
>>56 cat ini |sed -e "/\[test2\|4\]/,/^$/d;"
sedつこてるやん。 だったらおれもperlつかって cat ini | perl -e '$/="";while(<>){if($_ !~ /\[test[24]\]/){print $_;}}'
え、sed禁止なの?
>>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
¥を\にかえてみて
釣りはそのくらいにしとけ。
にゅうりょくれこーどせぱれーた
>>60 もすこしエレガントに。
cat ini | perl -ne 'BEGIN{$/=""}; /\[test[24]\]/ or print;'
cat ini の存在意義について
Perl使うんなら無いよな
71 :
56 :2005/04/26(火) 23:28:34
すげぇ。。 やっぱ余裕でできるんですね。 もっと勉強します。 ちなみにAIX4.3でperlないっすね・・・
bash のドキュメントの bash.texi ファイルってどうして Command Line Editing と Using Interactive History が入ってないんだろう?ドキュメントを加工するから texi ファイル で全ドキュメントが欲しいんだけど
>>62 ダブルクオートをシングルクオートにかえりゃいいじゃん。
どのシェルでもいけるだろ。
74 :
名無しさん@お腹いっぱい。 :2005/04/26(火) 23:51:40
どっちかと正規表現の類かもしれないですが教えてください egrepを使用して 「先頭にABCまたはDEFを含むが、それ以降文中にGHIを含まない」 処理を行いたいと以下の様にしました egrep "^(ABC|DEF)" | egrep -v "GHI" マッチしない:ABChogeGHI マッチする:DEFhogefoo が、grepを二回呼ぶのはかっちょ悪い気がします うまい事grep一発でマッチさせる方法はあるんでしょうか
かっこなんか気にすんな
76 :
名無しさん@お腹いっぱい。 :2005/04/27(水) 00:39:57
>>74 sed -e '/^\(ABC\|DEF\)/{ /GHI/d; }'
77 :
56 :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
元質問はシェルを作る話だったのに解決してない件
>>77 別にシェルスクリプトにこだわらなくてもいいんじゃないの。
Windowsのreg.exeみたいな単発ユーティリティ作ったら。
shutils と textutils と /bin に入ってるものくらいの外部コマンドは 使ってもいいというルールならどうかな。 内部コマンドだけではつらい。 bashならできるか。
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
gnu coreutils と bash まで OK
84 :
56 :2005/04/27(水) 23:44:33
みなさんありがとうございました。
関数を作って戻り値を取得するにはどうしたら良いでしょう? 以下のようにすると、当然ながら $result に "func" という 文字列が代入されてしまいます・・・ func() { return aaa } result=func
こういう事? % func() { echo aaa} % result=$(func) % echo $result aaa %
>>86 やってみましたが、
bash: fg: %: no such job
bash: fg: %: no such job
:
と表示されてしまいます。
>>87 % はプロンプトだから入力しないで良いよ
sh だとセミコロン無いと実行出来なかった。 ↓これで試してみて。 #!/bin/sh func() { echo aaa ;} res=$(func) echo $res
90 :
名無しさん@お腹いっぱい。 :2005/04/29(金) 09:25:57
`func`
こんなのも。 func() { ret=aaa } result=$ret 戻り値とは言わんけど。
func() { eval $1='aaa'; } func ret echo $ret
94 :
名無しさん@お腹いっぱい。 :2005/04/29(金) 19:39:36
95 :
85 :2005/04/30(土) 06:03:43
なるほど・・・return でなくって echo を使うと、コマンドの出力として 受け取れるわけですね。一般的な sh の処理かどうかは分かりませんが、 とりあえずコレでやってみようと思います。 func() { echo aaa } result=`func`
func(){ echo aaa } func result=$?
97 :
名無しさん@お腹いっぱい。 :2005/05/01(日) 11:10:30
テキストの一番最後の行を切り取って別のテキストに貼り付けたいのですが、 どうやってやるのが一番お勧めですか? perlでなら出来るのですが、処理が大量に発生するので もう少し軽い仕組みが出来ないかなと調べているところです。
tail -1 file1 | cat >>file2
tail -1 FILE
>99 m9(^Д^)プギャー
意味のないcatを余分に入れる香具師、初心者に多いな。
102 :
97 :2005/05/01(日) 13:59:04
tail -1だと元のテキストに最後の一時行が残ってしまいませんか? コピーじゃなくて切り取りをしたいのですがいい手ありますか?
104 :
97 :2005/05/01(日) 14:26:02
m9って何ですか? 検索するとスクリプトとは関係ないものばかりヒットして・・・
> perlでなら出来るのですが、処理が大量に発生するので ならperlで良いんじゃ?
シェルだと、入力ファイルと出力ファイルは必ず別のものにしないといけないから、 一時的にコピーするなり、mvするなりの処理がいる。 結局、読み書きopenのできるperlの方が効率よくなる、はず。
>>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 $?
echo の使い方が誤っています。
111 :
名無しさん@お腹いっぱい。 :2005/05/04(水) 12:34:43
ファイルから何番目の文字、単語を取り出すってのは分かるのですけど、 行毎に取り出すことは出来ないのでしょうか? 例えば file1の1行目を取り出して別の関数に引き渡す 引き渡したら2行目を同様に別の関数へ引き渡す。 この繰り返しで3行目、4行目・・・ いった感じを考えているんですが、 shellでは可能でしょうか?
while read LINE; do 〜; done <file1
>>112 ありがとうございます。
全くの初心者のものなので凄く悩んでしまいました。
もっと勉強します。
wineがよく落ちるので、プロセスを消すコマンド ps ax | grep wine | kill `awk '{print $1}'`
ps ax | grep [w]ine | kill `awk '{print $1}'` こうしようぜ。
pkill
ぴkill kill kill ぴ kill ki〜♪ヽ(゚∀゚)ノ
同じ文字の連続した文字列を作りたいのだが、良い方法は?
>>118 yes "A" | head -n 10 | tr -d "\n"
俺なら ruby -e 'puts("X"*20)' か printf "%020d" 0|tr 0 X
調子こいてもっと聞いちゃいます。 2進数文字列の 00110 01010 のビットAND ORは?
シェルスクリプトでビット演算したい時ってのは思い当たらないが。
${parameter:offset:length}でoffsetに負を与えたとき末尾からのoffsetになってますか? 私のはなりません。 GNU bash, version 2.04.0(1)-release (i386-turbo-linux-gnu)
>>124 負の値をbashで扱いたい時は $((-1)) とするか、明示的に typeset すべき。
127 :
名無しさん@お腹いっぱい。 :2005/05/06(金) 22:21:34
VAL=<<'EOF' aaa bbb EOF とヒアドキュメントの値を変数に格納したいのですが、 どうやっていいのか分りません。あくまでリダイレクトである以上 変数への格納は無理なんでしょうか?
いや、リダイレクトじゃないし。
>>127 $ VAL=`cat << 'EOF'
aaa
bbb
EOF`
$ echo $VAL
aaa bbb
ってことをやりたいの?
# 移植性は未調査だけど
>>128 そうですね、マニュアル見たら全然別物でした。
>>129 そうです、それがやりたかったです。どうもありがとうございました。
あ、シェルの変数には改行文字を格納することはできないのかな。 スペースになってしまいますね。
cat -e で改行文字を$に変換しておいて、後で使う時に'$ 'を 改行コードに変換するのがいいみたいです。お騒がせしました。
set hiduke = `date '+%y%m%d'` 変数に当日の年月日を設定するのは簡単なんですが 前日を設定するにはどうしたらいいでしょうか?
GNUのdateなら、date --date='-1 days'とか。 他の場合はどうするんだろ。
env TZ=JST+15 date
136 :
sage :2005/05/07(土) 01:25:07
なんか答える気にもならんくらいレベル低いな。
なら黙ってていいよ。
シェルスクリプトぐらいでレベルとか言い出す辺りがイタすぎ
>>138 バカはどんなことでも自分が最高レベルと自負してくからこだわらずにいられない(藁
井の中のザコ、大海から逃げる。
140 :
133 :2005/05/07(土) 09:16:40
>>133 ,134
ありがとうございました、と同時に「こんなんでできるんだ」とonzな感じですた
精進します
最高レベルを自負するバカが何か言うてます。 大海から逃げたザコ、井の中で大口。
朱に交われば
>>134 > 他の場合はどうするんだろ。
FreeBSD なら
$ date -v+1d とか。
-r オプションで unix Epoch を設定できるものもある。
strftime(3) が %s を解すなら多分こんな感じ
$ date -r $((`date +%s`+86400))
>>132 IFSという環境変数について調べると幸せになるかもしれない。
IPアドレスを01で表記できるようなスクリプトないっすかね( ゚ー゚)
そんなの簡単だろ 自分で作れよ( ゚ー゚)
どこ見てるの?( ゚ー゚)
IFS="." for i in $1;do echo "ibase=10;obase=2;print $i, \".\""|bc done
$ cat cnv IFS="." for i in $1;do echo "ibase=10;obase=2;print $i, \".\""|bc done $ sh cnv 127.1 1111111.1.$
ibase=10 って常に無意味じゃないか? ibase=A を使え。
つーかパディングできないと。
153 :
名無しさん@お腹いっぱい。 :2005/05/11(水) 00:12:26
ここは為になるインターネッツですね
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
初期の B シェルって関数はサポートされていなかったんだっけ?
さあ。 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列目ってことです)
>>158 sortしてuniqじゃね?
uniqってカラムでなんか指定できたことね?
awk で多次元連想配列使うってのは? Perl/Python 使った方が速そうだが
ちうことで 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] }
現在bourne shで以下のロジックを組もうとしているのですが、 思うように動作しないため、質問させていただきます。 ============================================== 1. 変数Aを用意する。 変数Bに時刻「05:30」と値が格納されている。 変数Cを用意する。 2. AとBを比較します。 (1)Aの方がBよりも時刻が前の場合、Cに"OK"と格納する (2)Aの方がBよりも時刻が後の場合、Cに"NG"と格納する ============================================== このロジックでキモなのは、時刻の比較です。 最初、比較条件を [$A < $B] としておりました。 辞書式のやり方をネットで調べたらありましたので。 ですが、こうすると、変数Bが名前のファイルが出来てしまい、 比較しているのかどうかも怪しいのです。 すみませんが、お知恵を貸してはいただけないでしょうか。 宜しくお願い致します。
時刻を四桁の数字にして比較したらダメなの? $B=`date +%H%M` みたいな感じで。 そしたら普通に数値比較の方法でいけるよ
166 :
名無しさん@お腹いっぱい。 :2005/05/14(土) 00:14:57
>>163 time_tの値を返すコマンドを作れ。
>> 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
>>163 俺も
a=09:39; b=05:30; if [ $((10#${a/:/})) -lt $((10#${b/:/})) ]; then c=OK; else c=NG; fi; echo $c
>>165 の言う通り。
”:”だけ削除するロジックを入れれば、変数文字列の先頭に0が残っていても、数字として比較できる。
>>169 0が残っていると8進数になるんじゃない。
171 :
名無しさん@お腹いっぱい。 :2005/05/14(土) 11:49:13
>158(>159)です。 >160 >161 >162 ありがとうつД`)・゚・。・゚゚・*:.。..。.:*・゚ でけました。 SUBSEPって言うawk変数の存在さえ知らなかったので そこから調べました。ちなみに、キー項目はユーザの 入力項目なので初期値の "@" から変更しようかなとか 思ってます。
いや、今は SUBSEP は知らんでいいと思う。 昔の GNU awk は多次元配列の扱いがタコだったので $1 SUBSEP $2 in a と書かないと動かなかったけど、 最近のは gawk に限らず ($1, $2) in a という書き方ができるので。
あと、SUBSEP のデフォルトは @ じゃないので。
なんかねぼけてるなー。 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 ) を一緒に実行したいってことです(降順と昇順を同時に指定)。 できますか??
宿題を装った釣りも禁止
177 :
163 :2005/05/14(土) 21:59:46
>>164 >>165 >>166 >>167 >>168 >>169 >>170 返事が遅れてしまい、申し訳ありませんでした。
色々考えて下さいまして、ありがとうございました。
あの後、色々当方でも考えましたが、
結局辞書式比較を諦めて、数値比較を行うことにしました。
(その直後に、秒単位まで見ることになってorz)
最初は、時、分、秒とパーツに分け、それぞれで比較を
行ってましたが、すごく馬鹿らしくなってきたので、
>>167 氏のようにsedコマンドで":”を外し、それを
比較していく形にしたら、あっさりと出来てしまいました。
頭の"0"を気にしなくても良かったっぽいです。
肝心なのは、その数値の大小を見る事でしたから。
(余談ですが、このロジックが解決した後、色々悩んでた
問題が次々解決していく状態になりましたw
例えるとチューリップ開きっ放しみたいな感じ。
プログラム組んでる時って、こういう事たまにありますよねw)
>>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;"
うひょー
質問があります。 /work/foo/bar/test のtestだけを取得したいのですが、どのようにすればいいのでしょうか。 情けないがお手上げです・・・ 簡単な質問だと思いますがよろしくお願いいたします。
man basename って basename 知らなくてもどうにでもなるでしょ。
変数なら${foo##*/}とか。
あ、basenameで拾えました。 すいません。。。 ってもうカキコある・・・ ちなみにexprでやろうとがんばってたんですが exprやって取得するにはどうすればよいのでしょうか?
Solaris で man expr すると、そのまま答が載ってたりなんかする。 Example 2: basename(1) をエミュレートします。basename(1) は、$a という パス名の最後の要素を返します。$a が /usr/abc/file か、ただの file のいずれかと等価の場合に、この例は、file を返します。引 数 としての単独の / に注意してください。expr は / を除数演算 子とみなします (後述の「注意事項」を参照)。 example$ expr $a : '.*/\(.*\)' \| $a
185 :
183 :2005/05/18(水) 18:09:19
おぉ ありがとうございます!
環境: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 > \
やはり、viが画面の端っこまで文字が来ると勝手に折り返して、改行コードを入れてしまうのが問題のようです。
\
を使うといいということですか?
回答ありがとう御座います。
入れねぇだろw
>>189 > 入れねぇだろw
やっぱりそうでしたか。何となく気づいてました。
viの設定で何とかしなければいけないようですね。
>Microsoft/Outlook ここか?
>>191 > >Microsoft/Outlook
> ここか?
vimだと、t/Outlookで折り返されてしまうのです。
その状態で保存すると、Microsof t/Outlookという感じでパスが区切られてしますのです。
別のエディタでやれば問題なのです。
viの設定でしょうね。
ところで、スクリプトを書くときはどんなエディタを使っていますか?
>>192 ~/.vimrc あたりで breakat とか設定しとるか?
いずれにせよ無駄レス繰り返すよりも使ってる .vimrc 貼ったほうがなんぼか
確実なレスが付くし,解決も早いはず.
195 :
194 :2005/05/20(金) 19:44:37
ってか,ここってシェルスクリプトスレじゃんかよ
>>192 vimスレ逝け
"Documents\ and\ Settings"とか、"Local\ Settings/Application\ Data" とか邪悪なディレクトリ名を直接スクリプトに書くなんて。。。 OutLookの設定で、データの保存ディレクトリをもっとマシな場所に変えれば済むんじゃないの?
windows 使ってる限り Program Files とか Documents and Settings は 避けて通れないよ。
マイPCしか触らないんならともかく 職業的にWindowsに触れる機会があるんなら 郷に入っては郷に従うべきだろう
200 :
186 :2005/05/21(土) 08:59:30
無駄なレスを食ってします。申し訳ありません。 答えて方々ありがとう御座います。 オライリー「入門vi」を読んで、勉強することにします。 とりあえず、xyzzyで編集してしのいでます。 "Documents\ and\ Settings"とか、"Local\ Settings/Application\ Data" はイヤなんですけど、そこらへんは、どういうわけかあんまり変えたくないのですよ。
>200 いっそのこと Docume~1 とかロングファイルネームを諦めちゃえば?
sshを使って、リモートでマシンの電源を切るスクリプトを作ったのですが、 sshでログインしたところで止まってしまいます。 仕方がないので、ログアウトするためにexitを実行すると、 shutdownコマンドが実行されて、ローカルのマシンの電源が切れてしますのです。 シェルスクリプトでは、リモートのPCを操作して、自動的にログアウトするようなことは、 無理なのでしょうか? コマンド #!/sh/bin ssh hoge@ugo shutdown -s -t 0 exit
ネタなのかマジなのか。。。 1行目はなんじゃ? ちなみに、”shutdown -s -t 0” これってなんていうOSのコマンド?
>>202 ssh hoge@ugo shutdown -s -t 0
ssh hoge@ugo shutdown -s -t 0
>>206 > ssh hoge@ugo shutdown -s -t 0
助かりました。これをスクリプトに保存しておきます。
#!/bin/sh
ssh hoge@ugo shutdown -s -t 0
186の方のように、Windowsを使っています。
>>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
>>209 man sh して、Parameter Expansion の項を参照せよ。
先頭が '.' で始まっているかどうか判別してるんじゃねえの? # expr を使わずに、shell の中だけでやるあたりが。。。
#!/bin/sh for name in *;do echo ${name%${name#?}} echo $name done これを実行するとわかってしまう。
${filename:0:1} ってbash固有なの? /bin/sh がなくって試せないや。
>>214 sh にはないね。Bad substitution エラーになりますた。
${filename:0:1}はbash独自だが、 ${name#?}や${name%xxx}も、 巣の/bin/shでは使えない。 ファイル名の先頭が.かどうかを判断するなら、 case "$filename" in .*) hoge;; esac でやるべきだな。 これなら移植性抜群。
PSコマンドとgrepを利用し、特定のプロセスをkillしたいのですが、 プロセスid(pid)をうまく取得する方法はありますか。 何桁目で取得しているのですが、うまくいかずに困っています。 アドバイスお願いいたしまし。
>>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 読んでね
>>218 スマソ. こっちが正解
ps -ef | grep [m]y_command | while read uidx pidx rest; do kill -9 ${pidx}; done
>>217 ,218,219
ps -o pid,command
>>209 それって[ ]の中が引数1つだから常に真のような気がするが。
>>221 grep [m]y_command は、my_commandにはマッチさせて
grep自身にはマッチさせないための常套手段。
んでも、grep '[m]y_command' みたいにクォートしないとダメかも。
224 :
218 :2005/05/24(火) 02:11:32
>>222 多分レス番違ってる...
bash はシングルクォートで囲わなくてもオッケーでした
zsh はダメみたい
デフォで囲っておくかエスケープした方が良かったですね
訂正サンクス
zshまで、考える必要はない。
この場合はzshかどうかの問題じゃない。 たまたまカレントディレクトリに、 my_command という名前のファイルが存在していると、 grep [m]y_command を実行しても、シェルによって grep my_command に展開されてしまい、せっかくの用をなさなくなる。 なので、基本的には常にシングルクォートを使って grep '[m]y_command' とするものと覚えた方がいい
>たまたまカレントディレクトリに、 なんでやねん。 アホか。
>>226 おお、なるほど! こういうの、意外に見つけにくい盲点だよな。
作った時は動いたのに、ある日突然動かなくなるシェルスクリプトは、
原因が [m] とかの展開にあったりする。
カレントディレクトリはどこになるかわからないから、
こういう名前のファイルはない、とか、仮定しちゃいけないね。
>>227 あなたの方がアホですね。
grep file指定がない場合、標準入力からの読み込みのはずだが?
>>229 Hah?
grepが起動される前に、[m]y_commandという文字列が
シェルによって、カレントディレクトリと照合されて
展開されてしまうことを問題にしているわけだが?
頭大丈夫?
話の流れが読めてないよね
[m] という文字列は、
シェルにとってはファイル名展開(ワイルドカードの一種)
grepにとっては正規表現であること、
および、シェルの引数解釈とコマンド実行の順序関係について、
>>227 =
>>229 は理解していないと見た。
>>233 ゴミンナサイ
221 は 209 の test コマンドに対して突っ込み入れてるのかと
思ってたけど違うか
説明しよう。 221 は 209 の testコマンドの = の両側にスペースがないことに 突っ込みを入れた。(この突っ込みは正しい) 222 は、221が自分への突っ込みかと誤解した。 しかし、その後、222が [m]y_command の意味について 説明していること自体は正しい。 上記の2つは全然別の話題。
ナルホド、ありがとう。 ちなみに 222 != 218 です。自分が 218, 219 なので。
237 :
221 :2005/05/25(水) 00:42:17
>>235 ワロス
全然話が噛み合ってないと思ったらそういうことか。[]が紛らわし
かったのね。
よく読みといたな。バグでも探すみたいだ。
すみません。ちょっとご教授願いたいのですが、 シェルスクリプトで -------------------------------------- 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 -------------------------------------- こういう風に直したいのですが、どのようにすればいいのですか? 要するに改行を取り除きたいのですが・・・。
239はマルチ
>>239 cat log |sed -ne "N; s/\n/ /; p;"
>>239 必ず2行単位で並んでいて、
その改行を取るだけなら、
↓
while read a_line
do
echo -n "$a_line"
read b_line
echo "$b_line"
done
すいません、Solarisスレで最初聞いてしまいました。
こちらに誘導されましたので、こちらで質問させていただきました。
>>242 殿、
>>243 殿 ありがとうございました。
>>245 移動したなら元スレにそう書いといてくれよ。
それにしたって、誘導しといてマルチ呼ばわりする必要ないだろ。 礼儀の足りないやつだとでも心の中で思っとけ。
# 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が表示されるだけです。
何が問題なのでしょうか?
echo -ne "¥e[1;1H"
tput crまたはecho -e '\r'の方がいいと思われ。
すまん。echo -ne '\r'だった
253 :
251 :2005/06/02(木) 22:13:48
さらに、ごめん。出力は1行じゃないのね。じゃあ毎回clearでもい いと思うが。
tput cup 0 0
OSを特定できないヘテロな環境(POSIXは仮定できる)で ファイルのサイズを取得するのはどうすればいいのでしょう? ls -lのサイズのカラムは決まっていないようですし、 -sオプションの振舞いも微妙に異なるので困ってます。
259 :
257 :2005/06/03(金) 17:42:10
>>258 シェルスクリプトの中でcc起動してってことでしょうか?
Cのコードを書くとなると、そこでまたポータビリティに気を
使ったりしなきゃならないので、なるべく避けたいです。
wc呼ぶぐらいなら、Cのコードで行くとは思いますが...
昔のSolarisだとccがついてこなかったような。
stat(1)でいいじゃん
262 :
257 :2005/06/03(金) 19:08:53
>>261 stat(1)のない古めのOSもあるんです。
POSIX標準の話を付け加えれば、stat(1)は標準にないようです。
とりあえず進む。ダメな環境にぶち当たった時点で個別に考える。
>>259 なんでwc嫌なの? wcだってfstatしてるだけじゃない。
>264 どのUNIXでも、wc -cはfstatするの?
266 :
265 :2005/06/04(土) 00:51:41
Solaris 9 はreadの繰り返し。 Red Hat Linux 9 は fstat64 FreeBSD 4.xはfstat
> wc呼ぶぐらいなら、Cのコードで行くとは思いますが... じゃあスレ違いなんでどっか行ってください。
ファイルサイズもまともに取れないOSって糞ですね
270 :
名無しさん@お腹いっぱい。 :2005/06/04(土) 23:41:27
関数を呼び出してその戻り値をある変数に入れたいのですがどうやればいいのか分りません。 VAL=func1() としただけでは line 3: syntax error near unexpected token `(' となってしまいます。
func1 VAL=$?
>>271 ありがとうございます。さすがシェルスクリプトですね。ダサすぎますw
PerlやRubyが流行るのも分るような・・・
>>271 で取得出来るのは終了ステータスだが、それで良いのか?
インタラクティブ用途がメインの言語にケチ付けるのもアレだな
関数呼び出しに()はいらないよ
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
これはどうしてなんでしょうか?
>>275 >unary operator expected
って書いてある通り
$ if(echo "abc"&&date);then echo "true";fi abc Sun Jun 5 00:39:09 JST 2005 true testをやめて()にしたら、なぜだかいきました。 でも()ってたしかサブシェルの起動だったような・・・よくわからん
if echo "abc";then echo "true";fi ってどうなるかわかる?
>>277 なんか基本的な部分が分かってない気がする。
とりあえず、man testしてみなさい。
いや、たぶん man sh をじっくり読むべきじゃないかな。
それが bash なら test の説明もあるし。
>>272 Perl や Ruby よりもシェルスクリプトが勝る点は、
どんなアホにもすぐに書き散らかすくらいのことは出来るようになるってこと
だからしょうがないよ。がんばれ。
man sh だろ。
>>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"〜では、起動したサブシェルの終了ステータスを
判定していたということですか。なるほど。
>Perl や Ruby よりもシェルスクリプトが勝る点は、 >どんなアホにもすぐに書き散らかすくらいのことは出来るようになるってこと 〜よりも〜が の用法が逆です。
あと最初に戻って、 $ test echo $ test ! echo これらがなんのメッセージも出さないのはちょっと謎です。 まあどうでもいいか。
>>284 うちの man test には以下の記述があります。
s1 True if s1 is not the null string.
なんのメッセージも出さないのは、そもそも echo が実行されないからですね。
>>282 括弧を付けてもいいってこと。まあ普通は付けない
>>284 test echoはtest hogeと同じ
(´・ω・`)
>>288 ハゲワロス 壺にハマッタ〜 (゜∀。)ワヒャヒャヒャヒャヒャヒャ
真か偽か、コレの表示出すにはどないしたらええの?
echo 真か偽か
test hoge && echo 真 || echo 偽
293 :
名無しさん@お腹いっぱい。 :2005/06/09(木) 23:15:07
/var/qmail/bin/maildir2mbox && exec elm ${1+"$@"} この ${1+"$@"} ってどういう意味?
本家 Bourne シェルにあったバグを避けるおまじない。 詳しい意味はUNIXプログラミング環境に書いてあった 希ガス
本家Bourne shellの系統と思われるSolaris/SunOSの/bin/shでさえ、 ${1+"$@"}と書く必要はなかったよ。 (引数ゼロ個の場合、"$@"は空文字列にならず、完全に消えてくれる) 今時、"$@"でいいんじゃないか? 逆に、${1+"$@"}と本当に書かなきゃならないshが存在するOSを 教えてくれ。
つくればあるもーん
ハッキングから、消防のたわごとまで、これが うにっx クオリティ
298 :
名無しさん@お腹いっぱい。 :2005/06/10(金) 22:27:08
sed の d と D の違いを教えてください。 >d > パターンスペースを削除する。次のサイクルを開始する。 >D > パターンスペースの最初の改行までを削除する。次のサイクルを開始するが、パターンスペースにまだデータが残っていたら、入力からの読み込みをスキップする。
300 :
名無しさん@お腹いっぱい。 :2005/06/14(火) 23:20:41
1時間に10000個のファイルを消そうとしているのですが forで回してひとつひとつ消すと 時間はかかるけどvmstatで表示されるidが95 をキープする。 forのなかで5個ずつ消すと 時間はかからないけどidが90を切っちゃう。 時間かけず、idを高く保って、大量のファイルを削除する方法ありますきあ?
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だとおもいます。
思いますじゃなくてmanを嫁。
idle timeだよね
>>300 ファイルを削除ディレクトリに移動してディレクトリごと削除
>>306 移動の時に同じ質問が
時間かけず、idを高く保って、大量のファイルを移動する方法ありますきあ?
そもそも何でそんな馬鹿げた要求が出てきてるのかわからんなぁ。 idle を増やしたいなら、ファイル消すたびに sleep 10 とかしたら? >forのなかで5個ずつ消すと rm file1; rm file2; ... と rm file1 file2 ... で だいぶ違うわけだがどっちよ?
借鯖とかでキャップされてるんじゃないの
>>308 rm file1 file2
でしょ
rm file1; rm file2;
は時間かかるぽい
fork に時間がかかるんでしょ じぶんで thread で unlink するコマンドを書けば
じぶんで thread で unlink するコマンドを書けるシェルなんてあるのか? まぁ正解はシェルスクリプトで書くのをあきらめろってとこか。
つ[Java]
基本的なことで悩んでいます。 コマンドラインから 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/???/?????は見つかりません。
316 :
314 :2005/06/16(木) 21:31:28
>>315 さん
ルートにhogeがあります。
補足説明しますと、
今回求めたいディレクトリは
ルート直下のhogeの中に/日付/時間と作られています。
パスの長さは一定なのでワイルドカードの[?]を用いて取得したのですが、
shに組み込むとうまくいかなかったのです。
sh -c 'ls -ld /hoge/???/????? ' してみたらどうなる?
awk '{print $9}'
>>315 sh -xf しちゃ駄目だよ。
f はワイルドカード禁止オプション。
sh -x hoge.sh
でやってみろ。
あと、回答してる香具師、みんなハズシ。
ここってC言語スレより殺伐としてないですね・・・。
321 :
314 :2005/06/16(木) 22:56:16
>>317 さん、318さん、319さん
回答有難うございます。
只今実行できる環境ではないので報告は明日になると思います。
>-f はワイルドカード禁止オプション。
知りませんでした。。。
知らないオプションむやみにつける癖やめたほうがいいよ。 ディレクトリ消すとき 必ず rm -fr するタイプ?
それがなんかいかんのか?
わけもわからずperl -wと付けていた時期が俺にもありました
-f 付けるのはCシェルスクリプターだね
327 :
314 :2005/06/18(土) 03:08:00
結果報告。
「-f」を外した所無事に出来ました。
有難うございました。
何故「-f」を付けたかというと、手元にあった書籍に書いてあったと認識してたんですけど
再度読み直してみるとそんな事は一言も書かれてませんでした。
凹みました。
>>322 さん
するタイプであります・・・
>>324 後学のために美しいやりかたを教えてくれたまえないか
rm -r ですむときは -f は除いたほうがいいし、 rmdir ですむときはそうしろってことじゃないの。 美しい美しくないというより、 rm -fr は危ない。
f なんかなくてもサクっと消えてくれます
おれはmvもrmも-iつきでエイリアスしてるけど、 ワイルドカードや再帰削除の場合はいちいち聞かれるとウザいので -fつける。でもこういう危険な場合に限って-fつけるんでは、実は あまり意味が無い気がする 二回ぐらい rm -f *.jpg のつもりで rm -f *>jpg とtypoして、カレントディレクトリの中身全削除したことある。 シフトキーの入力が甘かったりするとこうなる。
rmはゴミ箱スクリプトにすればよい。
touch ' -i'
>>333 touch ./-i
やってみたが、目からウロコ
ダウンロードしたファイルを、ファイルの作成日ごとに、日付の入ったフォルダを作成して、移動するうまい方法ってありませんか? もしよろしければ、何か手がかりをください。
m9(^Д^)プギャーーーッ
>>336 まず、「日付の入ったフォルダ名」の名称自体を得るには、
dateコマンドに適当なスイッチをつければよい。厳密には
環境依存だからmanせよ。
つぎに、あるコマンド(例えばdate)の結果(標準出力)を
変数に入れたり、もしくは他のコマンドで利用するには、
backquoteを使う。
value=`...`
とか、
mkdir `....`
ね。これで、目的の名前のフォルダできるだろ。
あとは、適当に移動(mv)せよ。
>>337 > m9(^Д^)プギャーーーッ
笑わないでください。
任意のリモート・ホストの、任意のディレクトリが存在するか チェックするにはどのようなすればよいでしょうか? rshとかtestでがんばってたんですが、挫折しました・・・
>>341 ssh HOST test -d DIR
>>341 ssh 使え。
ssh foo test /foo
echo $?
任意のファイルを先頭n列、後ろからm列を取り除いたファイルに 編集したいんですが、どうすればいいでしょうか? Cでやるのは避けたいんだけど。。。
質問を間違えてた。 任意のファイルを先頭n行、後ろからm行を取り除いたファイルに 編集したいんですが・・
head, tail
head,tailじゃ指定行の表示しかできないでしょ。
>>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.
うーんわからんです。 ファイルをcatしてパイプで繋げてheadとかですか?
354 :
348 :2005/06/21(火) 02:43:05
tail 先頭n行-ライン行数 head 後ろm行-ライン行数ってのは思いついたが、 ファイル行数が数万とかだと処理遅いよね・・・
全部でw行あるとして tail +$((n+1)) |head -$((w-m-n))
tail +$((n+1)) file | tail -r | tail +$((m+1)) | tail -r
結局スクリプトを書くのが早くて速い。 awk 'NR>m{a[NR+n]=$0;if(NR in a) print a[NR]}'
>>355 できました。
ありがとうございました。
結局どれがベストかわかんないけど、、、
スクリプト書いちゃうんだったらrubyで書くぞ。 ruby -e 'ARGF.to_a[n..-m].display'
sedとawkはセーフ
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に次々に上書きしてしまいます。 どのように直すべきか教えてください。よろしくお願いいたします。
>>362 -O index.html なしで。
wget の質問ならくだ質行け。
>>363 いや、これは連番のH画像の守備範囲だろ。
366 :
名無しさん@お腹いっぱい。 :2005/06/22(水) 20:56:56
/bin/sh で環境変数に設定できる文字列長の上限ってあるんでしょうか? どこを見れば良いんだろ。
>>366 fj.unix.shells の2003年1月の記事。
>>367 そんなドメイン、実在するんですか?
アクセスすると
DNSエントリが見つかりません
のエラーになったんですけど。
>>367 そんなドメイン、実在するんですか?
アクセスすると
DNSエントリが見つかりません
のエラーになったんですけど。
fj ...。
372 :
366 :2005/06/22(水) 22:02:10
ちなみに、
>>368 は質問者ではごじゃいません。
さもありなん
何で古典が関係あんの?
fj. が通じない世代なのね。。。はぁ・・・。
fj世代はいい年こいてゆがんだ性格がまだ直らないようだな
いい年こいてるから直んないんだよ
Musical Baton というチェーンメールの blog 版をもらった。 ファイルシステム内の音楽ファイルの容量を得るスクリプトキボン。
> Musical Baton というチェーンメールの blog 版をもらった。 TrackBack といい、これといい、なんで blog 界の奴らはこんな糞なことしか思い付かないのか。
382 :
名無しさん@お腹いっぱい。 :2005/06/23(木) 23:52:08
bashでの質問です vmstatの出力結果を5秒毎にファイルに記録してます vmstat 5 > vmstat_log 記録状況を確かめようとtail -fして監視してみたんですが どうも途中でバッファリングされているのか20行程まとめて出力が一気に記録されます vmstatのソースをみたんですが、コマンド自体は出力を毎回フラッシュしているようです バッファリングされずに5秒毎にリアルタイムに記録したいのですが、 方法はあるんでしょうか
>>382 俺のところではそれでちゃんと5秒くらいごとに一行ずつ表示される。
少なくともbashとは何の関係もないな。
システム依存のスレにいったほうがいい。
スレ違い
>>382 フラッシュしてるのにフラッシュされないってどんな環境?
>>382 tailの-fオプションって、入力が標準入力(パイプ)の時は無視されるんちゃう?
FreeBSDやGnu(やLinux)のtailだとmanにそうかいてあるけど。
387 :
386 :2005/06/24(金) 00:43:18
>>386 超スマン、これ勘違い。
書き込んだファイルをtail -fしたってことか。
>>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)がないん
じゃない?
389 :
382 :2005/06/25(土) 01:16:44
みなさん御意見ありがとうございます
>>388 OSはRedHatEL3.0です
ちょっとどこのソースをみていたかを確認してみます
ちなみに今手元に環境がないのでcygwinで試したところ同様の現象が起きました
こちらのソースもみてみます・・・
\n で flush されるから、普通いちいち fflush(stdout) なんてしないでしょ?
出力先がファイルのときは\nでflushされない罠
>>390 つ[APUE 2nd Edition]
下記のスクリプトで、 なぜ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
>>395 区別なんかしてない。標準入力を見ているだけだ。パイプによって
標準入力は sort の出力と結び付けられている
よく分かりません。 パイプによって標準入力はsortの出力と結びつけられている。 さらに、catの出力とも結びつけられている。 というように思えます。 catとsortの出力が混じり合ったものをcutが処理すると 予想していましたが、catの出力がsedに渡っているよう なので混乱しています。 もしかして 1. cutの標準入力にsortの出力を結びつける 2. その結び付きを解除する 3. sedの標準入力にcatの出力を結び付ける 4. その結び付きを解除する という手順なのでしょうか?
cutの入力にはsortの出力が設定されている。だからsortの出力を処理する。 sedの行では特に入力は明示されていない。だからcatの出力をそのまま処理する。
なんとなく分かりました パイプについてもっと勉強します ありがとうございました
man sh あたりにパイプラインについて書いてない?
デケデケデケデケ
キュッキュッ
403 :
名無しさん@お腹いっぱい。 :2005/06/28(火) 17:07:24
AIX の sh だけど特定のファイルのタイムスタンプを取得する良い方法はありますか? ls の結果を解析すれば取れるだろうけどもそっとスマートなやり方はないかな?
>>403 Linuxだけど stat -c %y <file> で last modified を取得してまつよ
でも、表示が冗長なので他にも方法があれば知りたいところ
perl -e '@stat=stat("/"); print localtime($stat[9]) . "\n";'
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 とかやってもうまくいきませんでした。
文字列でソートしたら下のようになるよね。lsもそうなる。linux でfindしたら上になった。
find は見つかった順に出力されるから、 同じマシンであってさえ、ファイルの作成した時期とかによって 出力の順番が異なることがありうるぞ。
412 :
408 :2005/07/06(水) 00:34:58
>>409-410 どうもです。
とりあえず sort -n -t "_" に通したら、うまくいきますた。
>>411 ということは、
>>408 の上のように表示されてもそれはたまたま
なので、sort に通した方が良さそうですね。
>>410 sort でセパレータを2つ指定できるの?
>>412 「-k」を指定しないなら「-t」は不要だと思う。
その例なら「-n」だけでうまくいくんだろう。
ただ、「-n」は数値以外のフィールドでソートする場合(今回の場合)、
動作は保証されないと思う。
man見る限りsortのセパレータは正規表現じゃないな
シェルでファイルの拡張子以外の部分(正確にはピリオドより前の部分) を取得する方法をおしえてくださいませ。 for i in `ls *txt` do cat $FILE.txt | 適当な処理 > $FILE.doc done みたいなことをしたい。 前もって、foo だけを取得して、$FILE=foo としたい。。。
FOO=`basename $i .txt`
ああ、なんかめちゃくちゃや。。。 訂正。 for in `ls *txt` do ここで、$FILE にファイルのピリオドより前の部分を突っ込みたい。 cat $i | 適当な処理 > $FILE.doc done
>>415 > for i in `ls *txt`
for i in *txt じゃだめなん?
>>417 ふつー、basenameだろ。
FILE=`basename "$i" .txt`
cat "$i" | 適当な処理 > "$FILE".doc
さらにいうとcatも要らんな。
FILE=`basename "$i" .txt`
適当な処理 < "$i" > "$FILE".doc
で桶。
ファイルネームが含まれる場合、いつも" "で囲う癖を付けた方がいいよ。
421 :
417 :2005/07/06(水) 15:54:41
みなさんありがつ。
basename って初めてしったよ。。。
>>420 ファイルネームが含まれるときは、"" で囲った方がいいのは、
なんでかしらん? ようわからん。。。
シェルが困っちゃうような文字列が含まれてることあるじゃん?
>>421 シェルスクリプトなら、/etc とか /bin の下にあるのを
参考にすると勉強になると思うよ。
424 :
名無しさん@お腹いっぱい。 :2005/07/07(木) 23:45:15
時々コマンドをフルパスで書いているスクリプトを見かけるのですが、 何か意味があってそうしてるんでしょうか?
alias 切られてたり、PATH 変数によって意図したコマンドと違う物が起動したら嫌でしょ
PATHをセットするのが面倒だから,とか? ちがうな。。。。
cron から起動するんだろ。まぁ /bin の下のとかは必要ないが統一性をもたせるためにとか。
秒単位のファイルの更新時刻ってどうやったらわかんの? ls -lだと分までしかでないんだけど。
stat(3C)
おっけー。 あんがと。
>>428 perl -e '@stat=stat("/"); print localtime($stat[9]) . "\n";'
foo=/usr/local/bin/emacs emacs --batch --eval '(princ (format-time-string "%r\n" (nth 5 (file-attributes "'$foo'"))))' 冗談です^^;;
stat にオプションが効かねえええ と思ったら zsh は stat が builtin なのね orz
つか date -r ./hoge でわかった。 でもお前らいろいろありがとうな。
solaris$ date -r /tmp date: illegal option -- r だせぇー。やっぱGNU date必須だな。
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]
% 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
>>437 その目的ならおれはこれでいいや。
perl -e 'print scalar localtime 1000000000'
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 を入れたいです。 何かうまい手はないでしょうか? よろしくお願いします。
>>441 perlのワンライナーをシェルスクリプトに入れるのって
どうなんだろう
そのうちどうせなら全部perlで書いたほうが、はやいし
移植性も高いかも?
とかそんなようなことを思ったりして
>>445 え、漏れは emacs のワンライナーをシェルスクリプトに入れているけど。。。
やりたいことがわからない。 というか、その「感覚的には」のくだり それそのものがやりたいわけじゃないのよね? set -- `grep 20050709 hoge.txt` とかいう話でもないだろうし。
448 :
443 :2005/07/09(土) 01:41:15
> 447 やりたいことは、 STR1 に 20050709 STR2 に bbb STR3 に BBB を入れることです。 grep 20050709 hoge.txt | read STR1 STR2 STR3 ↑で入ります? 自分の環境だと、STR1,2,3 とも空になってしまうのですが。
ちゃんと ${STR1} で参照してるんだよね?
450 :
443 :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 が入ってくれます。
おれんとこもそれできない。 とりあえずファイル経由すれば?
>>450 zsh だと上手くいったけど、bash はダメだった
これは反則? ^^;; bash-3.00$ read STR1 STR2 STR3 < <(grep 20050709 hoge.txt)
>>450 pipeの後に置かれたreadはsubshellで実行されるため、結果の変数は親からは見えません。
>>447 のようにgrepをsubshellに回すか、
grep 20050709 hoge.txt | (read STR1 STR2 STR3; echo $STR1 $STR2 $STR3)
subshellの中で完結させるとよいでしょう。
456 :
443 :2005/07/09(土) 02:44:28
皆様、アドバイスありがとうございました。 451さんの言う通り、ファイル経由にしようかと思います。 >455 なるほど、勉強になりました。 ありがとうございました。
zsh で成功するのは zsh の拡張機能?
むかしのreadはそもそも read < file もできないんじゃなかったっけか
zsh is the shell
grep 20050709 hoge.txt |while read STR1 STR2 STR3; do echo $STR3; done; にしてみ。
zshを対話的に使うなら分かるが、スクリプトに使う理由がわからん。
よく考えてご覧なさい
俺もわかんない。 だってzshのスクリプトは、可搬性悪いし、保守性悪いじゃん。 可搬性悪=zshがどこにもインスコされてるわけじゃない 保守性悪=使える(よくわかってる)人の数は sh >>> zsh これはzsh自体が悪いせいじゃない。でも上の状況を鑑みて、 shが存在するのにshを避けてzshでスクリプト書く理由わからん。
>>465 sh スクリプトと見せかけて、bash スクリプトなんか腐るほどある。
Solaris 使ったことある?
zshが入ってるマシンで自分用に書く場合は?なにも問題なかろう。
>>465 俺の仕事のリーチでは十分可搬性有るし、
状況によって、使える物は何でも使う
⊂_ヽ、
.\\ /⌒\
\ ( 冫、) ウンチになぁれ
> ` ⌒ヽ
/ へ \
/ / \\
レ ノ ヽ_つ
/ / ・*.・:
/ /| :。 *.・
( ( 、 ★。:’*
| |、 \ 。・.*・; ・
| / \ ⌒l ;* ・。;*★ 人・
| | ) / ・ ★・ (_ );; * 。・
ノ ) し' ・ * (__) * ・。・
(_/ 。*;
>>465 (●´ー`●) ★.* ’★
「可搬性」っつってんのに 「zshの入ってるPC」とか 「俺の仕事では」とか 「ウンチになぁれ」とか バカなのかな?
>>470 同意。
反論するなら
・zsh は可搬性が高いかどうか
・zsh は保守性が高いかどうか
にするべきだろう。
「可搬性や保守性は必要ない」っていう主張は、
「zsh は可搬性や保守性が低い」のは認めているんだよな。
>>471 可搬性や保守性が高くないと使えないという前提がそもそも
おかしいという主張なんだよ
>>472 仕事柄、古くさい環境は触る必要無いんでね
喧嘩に近い議論にならないようにね。。。
一生 zsh しか使わないとか、 他の人間には触らせずに一生保守し続けるという覚悟があるんだったら 別にいいんじゃないの? 我々普通の人間がとやかく言うことじゃないよ。
珍しく活気付いてると思ったら荒れてるだけかよ
たかがシェルスクリプトで保守性が問題になるって 何万行のスクリプトなんだよ……
結論が出ますた。 (結論1) zsh は可搬性・保守性が低い (結論2) 可搬性・保守性が必要ないなら使ってもいいんじゃね?
sh ではできず zsh でしかできないことを実現するのに zsh でスクリプトを書くのは
わからんでもないが、そもそもそんなのが必要になったことがないなぁ。
>>466 Solaris は長いこと使ってるけど、sh スクリプトに見せかけた
bash スクリプトなんてものを見た記憶はない。
ksh スクリプトはたくさんあるけど、sh に見せかけてるわけじゃなく
ちゃんと ksh スクリプトだと名乗ってるし。
Linux の間違いなんじゃないの Solaris で bash が入ったのって 8 くらいからじゃなかったっけ?
>>479 $(..) を使っているスクリプトや ^ をクォートせずに使っているスクリプトとか見たことない?
^ はイマドキなら/bin/shでもクォートしなくていい。 $( ) とか、export VAR=var とかはやめて欲しいな。 $(( )) は論外。
>>481 ksh や bash スクリプトだと名乗ってるものにそういうのは見たことあるけど。
sh と bash の実体が同じならば、sh に見せかけて
実は bash スクリプトというのはありうるし、それでちゃんと動くけど、
Solaris では sh と bash はまったく違うものなんだから
bash でしか使えない文法を #!/bin/sh のスクリプトで使ったら動かない。
>>482 イマドキの Solaris 9 4/04 でもクォートする必要あるぜ。
[クォート] 次の文字はシェルに対しては特別な意味を持ち、クォートしない ( 後述の説明を参照 ) 限りワードの終わりを表します。 ; & ( ) | ^ < > 復帰改行 空白文字 タブ
$( も $(( もPOSIXが定義していなshall。
>>485 ^ は昔のパイプの意味なんだけど、
少なくともSolaris 2.5あたりの時代にすでにパイプの意味はなくなり、
^ はただの文字として扱われるようになっているはず。
マニュアルの記述が古いだけ。
(゚Д゚)ハァ? 試してから言えよ。 % /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
イマドキ The application shall quote the following characters if they are to represent themselves: | & ; < > ( ) $ ` \ " ' <space> <tab> <newline>
000 - 099 みたいな連番を生成する時には zsh 使う for i in {000..099}; do touch ${i}; done
シェルスクリプトで可搬性だとか保守性だとか言ってるヤツ、 正気かよ 毎回echo()とかいう関数作ってるのか そういうの気にするぐらいならperlスクリプトでも書いてろよ シェルスクリプトよりよっぽどポータブルだから
また阿呆が湧いた…
>>492 [連番のH画像を一気にダウンロードする]スレ的なネタだな
zshとwgetの組み合わせはもはや定番であろう
いきなり、流れを絶つことになるけど、 kshで set -x としたときの出力を関数の中まで出力できるように(shやbashのように)すればどうすればいいの?
>>492 その程度なら、seq jot printfあるいは頑張ってexprで書けるものを、
可搬性を犠牲にしてまでzshですか。
>>492 typeset -Z3 i=0
にしてカウントアップすればいいんじゃないか?
可搬性ってなんすか
>>499 PDP-11 上の AT&T UNIX でも正しく動作する事
エロ画像のためにzshをインストールする気はないな。
>>497 seqだのjotだののどこらへんがポータブルなんですか
awkで書けよ
>>501 でもbashとかtcshとかkshとかは入れるんでしょ
>>498 typesetに可搬性はない。
可搬性なら、
for i in `yes '' | cat -n`
が最強かな。あと、ゼロ揃えだけ別処理すること。
zsh=エロ画像専用シェル=じいしぇる
>>493 perlで書くと、起動スクリプトには使えない。
>>508 そんだけかよ。
起動スクリプトなんぞ、ポータビリティが不要な最たるものだと思うが。
ポータブルな起動スクリプトって、何か意味あんのか?
ほんとくだらない
要するにzshを毛嫌いしてるだけなのに 可搬性だとか理論武装してるだけなんだろ? 笑っちゃうって 可搬性気にするぐらいならシェルスクリプトなんぞ書くなっての
シェルスクリプトだからこそ可搬性を気にするなぁ。 可搬性がどーでもいいならCで書くなぁ。
エロ画像に連番振るのも?
>>513 だから、毎回あんたはecho()とかいう関数を定義するわけね
>>514 得ろ画像連番は一回こっきりのワンライナーだからいちいちスクリプトに
落とさんだろ
だからこそのzshなんだよ
無理に会話に入ってこなくてよろしい。
zsh はインタラクティブシェルとして使ってるけど スクリプトは /bin/sh 互換で書くよ。 それ以上のことしたいときは perl とか使う。 っていう人が多いんじゃないの。
>>513 Cよりシェルのほうがポータブルだと本当に言えるのだろうか。
Cのバイナリは確かにポータブルではないが、ソースレベルならどうか。
>>517 シェルのシンタクス上は/bin/sh互換のスクリプトであるからと言って
使ってるコマンド群の仕様はシステムによっててんでまちまちなんだから、
そのスクリプトがポータブルであるということにはならない。
という話をしているのだが。
echo()とかいう関数、という例は無論そのことを言っている。
>>515 echoの問題なら、関数定義までしなくても、
echo -nやバックスラッシュのエスケープを使わなければ問題ない。
問題になるケースは少ないが、問題な場合は
Solarisだけ場合分けすれば済むケースがほとんど。
あと、複雑なエスケープを使うなら、
echoじゃなく、printfを使う。
>>520 > echo -nやバックスラッシュのエスケープを使わなければ
やだー使いたいー(ジタバタ
>>518 Cのソースが本当にポータブルなら、
なぜ毎回./configureでMakefileを作り直す必要があるのか。
>>522 MakefileはCのソースではないからです。
>>520 >>500 によれば、printf(1)はPOSIX.2に含まれていようが含まれていまいが
ポータブルではないそうです。
>>517 君は echo -n も使わないのかね?
>>520 printf ハぽーたぶるなんですか?
>>523 printfのすべての機能を使おうとするとポータブルでないだけであって、
echo -nやechoの\エスケープの代用の範囲のみなら
printfはポータブルと考えて良い。
>>524 そうだよ。
新人がecho -nとか平気で書くのでいつも叱ってるよ。
>>526 むしろecho -nなシステムのほうが今時は少ない気がするんだが
元BSDユーザが新人君に多いの?
>>526 printf(1)って4.3BSD-Reno以降でしょ
>>500 的にはポータブルじゃないんだそうです
BSDじゃなくて犬だろ。 bashだとecho -n使える。
俺が新人ならそんなアホは相手にせんな。頭が前世紀で立ち腐れてるよ。
>>530 どんなアホを指しとるんだ
無駄な努力はせずに素直にPerlを使え、と君も言いたいわけだね?
>>523 ./configure は config.hとかも作り直すわけだが、
config.hもC言語じゃないのかな?
>>533 まあいいじゃないの、config.hのひとつやふたつ(w
……おれって、くるしい?
結局何もコンパチではない
自分で使う範囲でだけ可搬性があればいいんだよ。 一般論にしちゃうとジジイが時代遅れの話持ってくるから収拾がつかない。
>自分で使う範囲でだけ可搬性
>自分で使う女に可搬性
remshってなんだよこの変態 rshにしろよ つか、いまどきrshとか使うなよ とかそういう話?
俺も会社と家のマシンで可搬なら、割りかし気にならないな。 便利機能が存在するのに、使わないのは能率悪い。 もちろん特別な要件が有れば別だけど。
ジジイで思い出した。 "$@" を ${1+"$@"} で書かせるのヤメレ。 イマドキ意味ねー。
,.. -――‐- 、 ,. '":::::::::::::::::::::::::::::::ヽ /:::::::::::::::::::::::::;:::ノ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
美人が出てきたところで、フレームも終わりだな。
これはフレームが収まるAA?
#!/bin/sh echo hoge ~$ ./hoge.sh : bad interpreter:No such file or directory hogeと表示したいだけなのにやってくれません!(><) such fileって何のことですか?(><)
サッチというファイル
>>546 Winでエディットしただろ。
#!/bin/sh の後ろに ^M が付いていて、
/bin/sh^M なんてコマンドは知らんと言ってる。
改行コードをlfにしたらできました!(><) ありがとうございましたm(><)m
(゚Д゚)ハァ?
見えない ^M が見える漢がこのスレに居ると言われている。
^M能力者
^M 能力者、映画化決定
エスパーは本当にいたんだ!
っ[potion of see invisible]
Linuxのbash ja_JP-UTF8環境で、先頭を#!/bin/saofeaoijfeaoiとしたら、 bash: ./jfoeiajosh: /bin/saofeaoijfeaoi: bad interpreter: そのようなファイルやディレクトリはありません と言われたが、#!/bin/saofeaoijfeaoi^Mにしたら、 : bad interpreter: そのようなファイルやディレクトリはありません になったので、エスパーではないと思われるが、よくすぐに分かったな。
しかし、こうなってくると
>>547 が可哀相だな。
エスパー出現じゃ仕方が無いか。
まあFAQですね。
一瞬天国かと思った、この流れ
空気読めない馬鹿が一匹
行末の^Mも見えないのに空気が見えるわけがない
つ [ざぶとん]
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"というように空白を含む デレクトリだとうまくいきません. どうすればいいでしょうか?
dir=`pwd` にすれば?
dir="`pwd`"じゃないのか?
567 :
564 :2005/07/10(日) 12:38:52
できました. ありがとうございます.
bash ならば何もしなくても $PWD にカレントディレクトリが入ってるはず。
`pwd`を直接代入する場合は" "を付けなくていい。
dir=`pwd`で、スペースもちゃんと保存される。
もちろん、値を使う時は"$dir"で" "が要る。
dir=(`pwd`)の場合は、配列への代入になってしまうので、
配列の要素解釈の際にスペースが解釈されてしまうため、
dir=("`pwd`")とする必要がある。
でも、
>>564 は配列とは知らずに=( )を使ったのだろうから、
この書き方は忘れた方がいい。
なお、bashが$PWDをセットするからといって、
こういうのに頼ってはいけない。
>>569 > なお、bashが$PWDをセットするからといって、
> こういうのに頼ってはいけない。
と老害が申しております。。。。
と、知能の発達の遅れた方が申しております。
互換性を考えるなら使わん方がいいけどね。 cygwin なんて互換性を無視していい環境の最たるものだと思うが。
またこいつか。
574 :
123 :2005/07/12(火) 02:22:06
誰かリムーバブルディスク(USBストレージ)を自動マウントするスクリプト教えてくれませんか?
OSによって違うだろ。 ここじゃなくて自分が使ってるOSのスレで聞くべし。
#/bin/sh #自動マウントスクリプト while true mount usbストレージ done
577 :
123 :2005/07/12(火) 04:03:07
なんとつかいにくいsolarisです。 大学なんでsuもrootの権限もないんですよね・・・ あのそこのusbストレージ と二音後で書いてあるところはどうすれば・・・・
素直にそこの管理者にすがるのが吉
>>577 二音語って、
‐・・・ ・‐ ‐・‐ ・‐
みたいに「・」と「‐」の二音で会話する言語のことですか?
>>576 whileループでマウントするのは重杉で非効率。
やむを得ずそれでやるとしても、ループ中に
sleep 1 とか入れれ。
Solarisならvoldとかautomountとかでやるのが
正攻法だろな。いずれにしても、その設定をするために
root権限は要る。設定完了後はrootじゃなくても
自動的にマウントできるようになる。
何かと話題のzshみたいですが、 以前、zshのmanを見ていた時、zshにsocketの機能があるのに ビックラこきました。 shellでsocketって、何に使うねん。と思ったのですが、 shellでsocketって、メジャーなんでしょうか?
zshは使わないけど、netcatはたまに使うな。
俺だったらこう書くぞ!とかあったらお願いします。 *********************************** #!/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回も書いてる所とかが気にくわないんですが、どうにかできるものですか?
num=1 while [ -e $1$num ] do num=`expr $num + 1` done new_name=$1$num
>>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に変えた。
あと、引数として使う時は" "で囲む。(直接代入なら囲まなくていい)
linux人でbashですって書き忘れてたーと思ったらもう返信が >585,586 ありがとうございます。 むー。なんか俺、無駄な事しまくってますね。
bashなら、 old_name=$1 for ((num=1; ; num++)) { [ ! -e "$old_name$num" ] && break } new_name=$old_name$num と書ける。
>588 ++ってシェルスクリプトでも使えるんですね。 やってみたいお年ごろなので一行にまとめてみました。 for ((num=1; ; num++)) { [ ! -e "$1$num" ] && { new_name=$1$num ; break ;} }
妙な書き方認めてるbashうぜぇー
bash だから余所へ逝けとはいわんが,せめて
>>2 の □お約束 くらいは読もうぜ
今時Posix shellじゃなくてbourne shell互換スクリプトを書く意味って 何なんだろうか
posixってなんですか。
>>592 dejure standard ではなく defact standard を使うのは当然でしょ。
ちゃんと象牙の塔に引き篭もっててください。
Posixなんて机上の空論。 現存の環境で動かなきゃ意味がない。 となると、必然的にBourne互換スクリプトになる。
今時CだってK&Rスタイルじゃ書かねえだろうがよ…… いや、書くか? それとも、ansi2knr.c?
>>596 dejure standardはなんですか
で、可搬性重視でbourneシェル互換スクリプト書くヤツはecho()とかいう関数を 毎回定義するんだな?
>>597 >Posixなんて机上の空論。
ええ?そうなんですか?
少なくともHP-UXの/bin/shはPOSIX準拠だと謳っているから
そう信じてたんですが私は騙されてたんでしょうか?
solarisはkshをposix準拠シェルとして扱ってるな。
606 :
603 :2005/07/13(水) 22:10:28
>>604 >今だと/bin/sh-->/usr/bin/sh(shell-posix)なのかな?
今、現物を確認できませんが、
たしか/bin/shと/usr/bin/shは両方実体ファイルで、
中身はdiffで比べると同一だったと思います。
それと/sbin/shは違うシェルだったような・・・
ls -l /bin lrwxrwxrwx 1 root root 9 Aug 23 2004 /bin -> ./usr/bin
608 :
603 :2005/07/13(水) 22:22:36
>>607 それはHP-UXの話ですか?
だとしたら盲点ですた・・・
じゃあやっぱりHP-UXの/bin/shはPOSIX準拠なのだと信じて
生きていきます・・・
>>608 いや、Solarisです。
ちなみに、/sbin/sh はスタティックリンク
610 :
603 :2005/07/13(水) 22:39:02
>>609 あら。失礼しますた。
やっぱ明日自分で確認してみよう・・・
HP-UXのsh-posixて、行エディットできるからterminfo見てるよな そういうシェルを/binに置くのって、どうなのよ
>>609 10では/sbin/sh --> /bin/sh
ちょっと話は変わりますが、 Solarisには、/usr/bin/cdとか/usr/bin/umaskとか、 外部コマンド版が存在しますが、 これって意味あるんですか? 実際、実行しても当然期待通り動作しませんが・・
要するに、シェルをパスで指定しないといけないのが悪いんだYO!! ってことでOK? /bin/shが何者だかわかりゃしねえ
>>611 rootは/sbin/shを使うから問題ない。んじゃね?
>>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に出力していることは確認済みです。
>>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} では怒られるんだけど、どう書けばいいのかな、 それともこういうポインタ的なのは_?
>>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では直ってるんですね?
625 :
620 :2005/07/14(木) 22:00:34
>>623 commitlog 漁ってみたけど, それらしき patch はあたっていない.
cvs diff -r RELENG_5_4_0_RELEASE やってみたけど, それらしき差分は見当たらない.
なんで, そんな現象になるんだろ?
umaskがビルトイン関数だからじゃないの? 外部コマンドでそうなる例はある?
つくづくFreeBSDはダメだな。 超致命的バグが発見できないとは。
>>626 いくつか試したところ
ok: cd eval alias
ng: umask pwd dot set
ちなみに"AAA=`(umask 999) 2>&1`"は大丈夫だ
629 :
621 :2005/07/15(金) 01:35:08
>622、624氏 どうもっす。 evalでいいのかな``で囲むやつでがんばってみた。 `env $hoge` でなんとかうまくいきますた。 でもなんつか、ちと格好悪いね。 ${${hoge}} の方がポインタちっくでいい感じだと 思うんだけど… (´・ω・`)
>>628 (umaskの場合) ashはsubstitution commandがbuiltinだとsubshellをforkせずに
済ませようとするようです。
bashとpdkshは普通にforkし、ksh93はforkしませんがbash/pdkshと同じ結果を返します。
最適化しようとしてenbugしたっぽいですね。
631 :
628 :2005/07/15(金) 01:41:09
>>628 cdもevalもサブシェルで実行してたみたいだ。
>>629 要するにPerlのシンボリックリファレンスみたいな機能が欲しかった、と
>>629 > ${${hoge}} の方がポインタちっくでいい感じだと
それって \$$hoge じゃん。
>>629 そう書きたきゃ、
eval echo \${${hoge}}
でできるよ。
あと、 `env $hoge` じゃなくて、
echo `printenv $hoge`
だよね。
>>629 シェルスクリプトにかっこよさを期待されてもな。
ファイルサーバのファイルの世代バックアップのシェルを作らなければならなくて困ってます。 (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」みたいに一発で消せる様に出来ないものなのでしょうか。 #もっとスマートな方法が有ったら教えてくだちぃ…。
>>636 そもそもdump(8)を避けた理由は何かあるんでしょうか?
dumpなら普通に世代バックアップできるし。
dump先を普通のファイルにしておけば、そこからrestore -iで取り出す
手間もtarと大差ないし。
638 :
637 :2005/07/15(金) 13:31:54
>>637 dump先を普通のファイルにしておけば
これはちょっと勝手に話の先を読みすぎたかも。
関係なかったら無視して。
>>637 早速のレス有り難う御座います。
dumpを避けた理由は…dumpというコマンドを知りませんでした。
手元の「RedHatLinux コマンドリファレンス」に載っていない様で…(汗
とりあえず一旦
man dump
してみます、有り難う御座いましたー!
×コマンドリファレンス ○ポケットリファレンス (技術評論社)
>>636 diffじゃなくてcommを使う。
rm -f `comm -23 now_data.txt days_data.txt`
で、一発で消せる。
ただし、now_data.txtとかはsort済みのこと。
>>641 行けました!
有り難う御座います!!
#さすがUNIX板(^^*
comm, join, paste あたりはつい忘れちまう
そしてPerlスクリプトを書き捨てる羽目になる。
>>644 スクリプトは本来書き捨てるためのモノでもあり以下略。
旅のスクリプトは書き捨てだよも以下略。
サムッ
grep はパターンにマッチした行があると0を返すのですが、 hoge="aaa" if echo $hoge | grep -q "aaa"; then echo ATARI fi とやると ATARI と表示されます。 []でくくっても同じ。 評価された結果って 何を見てるんでしょうか?わからなくなってきました。
だよねー
grepが返すのは終了コード($?)っしょ? #!/bin/sh hoge="aaa" echo $hoge | grep -q "aaa"; if [ $? = 1 ] ; then echo ATARI elif [ $? = 0 ] ; then echo HAZURE fi
>>648 シェルのifやwhileでは0が真として評価されるんでつよ
って、そういう話じゃなくて?
grep -c であれば、個数をカウントするから、ヒットしない場合が”0” って、そういう話じゃなくて?
喜多━━━━━━(゚∀゚)━━━━━━ !!!!
655 :
648 :2005/07/16(土) 15:28:17
>>651 やっぱそうやらないと駄目なんすね
>>652-653 いや、正にそういう話です。要するに 0が真として評価されるからなんですね。
例えば、正常終了時のリターンコードが0でないようなコマンドの場合、偽と
判断されるのかな、紛らわしいな…
> 正常終了時のリターンコードが0でないようなコマンドの場合、偽と > 判断されるのかな、紛らわしいな… もしかして、アホですか?
>>658 > もしかして、アホですか?
それを言っちゃだめだって。
>>655 紛らわしいも何も、それが仕様なんだから慣れろ
もっと詳細な制御がしたければ、$?に対して
Case文でも使えばいいだけの話だ
紛らわしいのは、正常終了時のリターンコードが0でないようなコマンドだろう
>>661 そんなコマンドないよ。
>>653 が言ってる grep -c も、
文字列が見つからなかった場合、
「標準出力に」0が表示され、
「終了ステータス」は1になるので、無問題だよ。
663 :
名無しさん@お腹いっぱい。 :2005/07/17(日) 12:52:34
シェル中でrootになりたいんだが、どうやればいい?
>>663 シェルスクリプト中でも、ふつうに、
su -c 'hoge1; hoge2'
または
sudo hoge
でいいと思うけど。
あるいはsetuidのスクリプトを呼び出すとか。
setuidのスクリプトってどうなの?
>>665 セキュリティホールになるよ。
ググるとFAQか何かがすぐ出てくると思う。
セキュリティホールになるのを知った上で、 問題がない使い方で使うなら桶。
awkは?
awkはexitコマンドで明示的に終了ステータスを返せるじゃん。 grepとは違って、どういう場合が正常終了なのか、 デフォでは定義されていない(常に真)になっているだけ。
>>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> -------------------------------------------------------
そりゃできるだろうが、条件が分からんよ。 「テストテスト」と「bbbbbb」の違いは何? grep使えないのはなぜ?宿題だから?
>>671 質問が不明確。
VAR=bbb
grep "$VAR"
ということじゃないよね?
>>671 こうかな?
cat src | tr -d "\n" | sed -e "s,</font>,\n,g" | sed -e "s,.*<font[^>]*>,,"
echo bbb
>>673 あ、コマンドオプションにも変数使えたんですね。
どうもありがとうございました。
工エエェェ(´д`)ェェエエ工 そんなオチかよ!
コマンドラインオプションに変数使えなかったら、どこで使うんだ よ。。。
拡張子が.shのファイルをWindowsで実行するにはどうすればいいですか? 例えば.shを.batに書き直すようなツールはありますでしょうか。 ぜひ教えてください。 シェルスクリプトもバッチも知識ゼロです。 Windows板で質問したらUNIX板へ帰れって言われました。 UNIX環境の質問ではないのですが、よろしくお願いします。
run.exe
シェルスクリプトとバッチの知識を身につける
683 :
679 :2005/07/21(木) 15:56:48
>>680-682 Cygwinインストールしてみました。
Shell Scriptを実行してみたところsyntax errorが出たので、
やはり知識を身につけなければいけないようです。
公式な配布物の中身をいじってないのにErrorが出るのが何でかわかりませんが・・・orz
なにをやろうとしてるの?
改行コードが違ってたり、ってことは配布物いじってないならないか…。
お約束
>>679 「エスパーきぼんぬ」「氏ね」「(゚Д゚)ハァ?」等のレスを貰う八ヶ条。
1. ハードウェア、OSのバージョン等には一字一句触れない。
2. 大切な個人情報が漏れるとまずいので、己の行った操作、変更などは秘密。
3. エラーメッセージの類は決して書かない。「エラーが出るんです」で留める。
目の前で生じている現象をそのまま具体的に書くなどもっての外。
事実より俺様の脳内解釈を優先すべし。
4. 独り言文体で必勝。
「…なんだけど、どうすればいいのかなぁ」「何が悪いんだろう?」
5. 「急いでいます」「困っています」等、自分の都合を全面に押し出す。
6. もう試したことを得意げに指摘してくる奴には、厳しく対応。
「それが駄目だったから質問してるんです」「それはもう試してみて駄目でした」
"どう"だめだったのか、本当に実際それを行ったかどうかなんか問題じゃない。
7. ストレートに答えを書かないもったいぶったレスには、逆切れで対応。
「だからどうすればいいんですか?」「分からないなら引っ込んでろやゴルァ」
示されたURL等を参照するなんて態度は、回答者を甘やかすことに他ならないので
絶対に避ける。
8. 情報は小出しに。
「エスパーきぼんぬ」 補足
上の八ヵ条を「一つでも」満たす者は質問者として不適格だということだ。
そのような悪い質問に対して答えられるのは,
質問者の意図をすべて汲み取ることのできるエスパーでもなければムリ,
という意味であって,決して,高度な技術を持つユーザに対する尊称でなはい。
まちがっても「エスパーの方,回答お願いします」
なんて痛い質問するな。つうか氏ね。
windows で sh を実行などというからには 何か勘違いをしてるっぽいので、 詳しく聞きだしてみたい。
>>686 補足は蛇足。コピペ時にはカットよろしこ。
>>679 ちょとかわいそうなのでマジレス。
シェルの種類は複数あって、拡張子が.shであっても
書式が共通しているとは限らない。
(Cygwin のやつは bash という種類。)
その「公式な配布物」が何なのかを書けば
もう少しまともなレスが得られるかも知れない。
シェルスクリプトファイルの絶対パスをシェルスクリプト自身で 見つけ出すことは出来ますか? pwdとやってもシェルスクリプトを起動させた時点でのカレント ディレクトリしか出ないので質問しました。
>>691 $0 とか `dirname $0` とか
693 :
679 :2005/07/21(木) 23:22:17
>>684-690 お騒がせしてます;
根本的にはCygwinでbashを使うことで"解決"しております。
アドバイスありがとうございました。
SyntaxErrorは行番号が出ているものの、
その行の記述が間違っていないことがわかったので、
自分が悪いと思って出し辛かった、といいますか
人に聞く前に調べようと思って、あの場では書きませんでした。
エスパーの方,回答お願いします。つうか氏ぬ。
#今回はじめて掲示板のお世話になったのですが、実際
>>686 のように書かれると嫌になるね。質問1つもちゃんとできない自分が。
694 :
691 :2005/07/21(木) 23:23:16
便利なコマンドがあるんですね。 パスが通っている場合や、カレントディレクトリで実行した場合は 絶対パスが出るみたいですが、下のようにディレクトリを指定して実行した場合は ディレクトリ名しか出ません。つまり、 shtest/shtest.sh を実行したときは shtest だけが得られる。得られたパスの初めの文字を判定して /(スラッシュ)でなければ `pwd`/ を付け加えるというようにすればいいと 思うのですが、どうすれば出来るのですか?たびたびすみません。
他にも方法はあるけど正規表現を使わない方向で。 #!/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
DIR=`dirname $0` APATH=`cd $DIR; pwd`/`basename $0` echo $APATH とか。
本当にFAQですよね。
リンクとかされてることもあるしね。
環境によるとは思うんだけど、$0を入れ換えられてる場合をのぞけば、 shellの中で、 realpath $0 か、 readlink -f $0 が、スマートなんじゃないだろうか?
それがある環境に限れるならね。
703 :
691 :2005/07/22(金) 08:39:45
ありがとうございます。いろいろ試してみようかと思います。
パスを書いておけばお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
今はディレクトリ名にスペースを含むこともあったりするし、
藤岡弘、
確かに「今は」の意味が分からんな
Sambaで共有して、エクスプローラーでフォルダーを作ったりもするから、 "/usr/local/Program Files" の下にシェルスクリプトがあったり するんじゃないの?
Sambaなんて10年前からあるじゃん
711 :
名無しさん@お腹いっぱい。 :2005/07/22(金) 22:42:03
10年前は今じゃないの?
10年前と今の区別がつかない老人がいるスレはここですか?
>>705 a2pのバグと思われ。(s2pもそうかな)
所詮perlのおまけソフトなので、
それがperlクオリティー。
${1+"$@"}の意味がわかりません (><)
>715 >293-
717 :
sasasa :2005/07/23(土) 12:17:12
別のスクリプトをlsという名前に変えた際に正しいlsが表示されるようにするにはどうすればいいのでしょう?
command ls
>>717 その、新しいスクリプトのlsが存在するディレクトリに
先にPATHを通す。
PATH=/home/hoge/bin:$PATH; export PATH
とか。
(csh系は糞なので敢えて説明はしないがrehash等が必要)
>>718 はアフォなので無視。
# commandコマンドの動作を勘違いしてるようだし、
# command自体、Bourneシェルでは使えない
あ、「正しいls」というのが、「元の標準のls」という意味なら、
/bin/ls と、フルパスで実行する。
>>718 lsがシェル関数だとcommand lsで回避できますが、
スクリプトだとだめでした。
>>719 ありがとうございます。
やっぱり絶対PATHしかないんですね。
723 :
sasasa :2005/07/23(土) 13:16:11
あとプロファイルにおいて " ' ` の意味って何を意味しているんですか?
>>723 '"` はクォートという。
質問が基本的過ぎるので、
man shして、クォートの欄を読むか、
シェルスクリプトの参考書のクォートの欄を読め。
ここでの質問はもっと具体的なものでよろしこ。
>>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
しかもプロンプトが#でいやらしいぜ
731 :
名無しさん@お腹いっぱい。 :2005/07/23(土) 14:47:26
>>723 課題の内容をここで聞いてるのか・・・・。
ちなみにきっと俺とお前は同じ大学だろう。
734 :
名無しさん@お腹いっぱい。 :2005/07/25(月) 00:07:31
質問させてください。 特定のディレクトリを次々にバックアップするために、 コピー元 => コピー先 のペアをリスト化してループ処理させたいのですが、 どのように記述すればよいのでしょうか。
なにしたいのかいまいちわからんが find でがんばる、とか?
>>734 なんだいな?backuplistファイルの内容が
source1 dest1
source2 dest2
...
とかなってたら、
cat backuplist | while read source dest
do
cp $source $dest
done
とかでいいじゃん。cpの代わりにtarなりcpioなり、cp -aなり、好きにして。
>>735 えーと、
list={
. { /hoge/hoge1 => /fugo/fugoA }
. { /hoge/hoge2 => /fugo/fugoB }
. { /hoge/hoge3 => /fugo/fugoC }
}
foreach ( pair in list )
. コピー等の処理 pair[0] , pair[1]
みたいなことをしたいんです。
>>736 まさにそれです^^
ありがとうございました。
joinとpasteの違いってなんですか?
man join man paste
>>725 そんな餌に釣られるクマー!
linuxが起動しなくなったんですけど(><)
743 :
名無しさん@お腹いっぱい。 :2005/07/26(火) 01:00:43
すみません、質問があります。 mvコマンドで、一度に移動できるファイル数には上限があるのでしょうか? 最大で99999個のファイルを移動できるのか調査しているのですが・・・・ catコマンドが一度に1000件づつしか処理できないようなのですが。 ご存知の方がおりましたらどうぞよろしくお願いします。
mv自身はintの上限-2個まで移動できると思う
>>743 そんな調査するより xargs を使うべきじゃないの。
746 :
743 :2005/07/26(火) 02:21:40
>>744 そうですか、それなら可能ですかね。。。?アドバイスありがとうございます。
>>743 xargsですか。ちょっと知らないコマンドですが、調べてみますね。レス感謝です。
>>743 find /usr/include -name '*.h'|xargs grep ARG_MAX
getconf ARG_MAX
>>743 こういったことの周りの知識を知らないのも問題だが、
知識不足なのにいたずらに限界に挑戦しようとする方も問題。
知識不足なら知識不足なりに秘孔をついてしまわぬよう安全策をとるのが一つの見識。
>>745 確かに xargs -n で引数を分割して実行できるが、
xargsはスペースや改行等を含んだファイル名を
正しく扱えないという、仕様上のバグがあるので、
xargs自体obsolete or deprecated。
xargs -0 (xargs --null)が使えるのはGNU xargsだけなので、
一般には使えないと考えるべき。
逆に、ファイル名に問題あるのが確実にない状況なら十分使える。 でなきゃ GNU の入れりゃいいじゃん。
(xargs -0 (xargs --null)が使えるのはGNU xargs)だけではない。
>>751 「ファイル名に問題ないことが確実」な状況って、
自分の作業用ディレクトリ下で、
書き捨てスクリプトを書く場合くらいしかないぞ。
ユーザー開放のディレクトリ以下を一括処理したい場合、
どういうファイルネームが存在するかの仮定をしちゃいけないし、
GNU物を勝手に入れるのも禁止だから、
結局xargsなんて使えん、のが結論。
>>755 勝手に入れちゃだめならしかるべき手続きを踏めばいいじゃない。
ユーザー開放のディレクトリ以下を一括処理したい、と仮定されました。
まあWindowsユーザは空白含みとか日本語ファイル名は普通に平気で付けるしな 特にSambaサーバにしてるならそういうファイル名は全然珍しくないわな
自分も windows では日本語空白記号なんでも使うな。
そこで、zargs ですよ。
>>750 Solaris 9 だと空白は大丈夫だし、改行も \ でエスケープすれば問題なしですが。
$ /bin/echo 'a b\nc\\\nd' | xargs -L 1 -I '{}' /bin/echo "'{}'"
{a b}
{c
d}
>>761 いまどきSolaris使っている馬鹿ってpupupu−−−
>>762 「Soralis」と書けばよかったのに
764 :
名無しさん@お腹いっぱい。 :2005/07/28(木) 08:09:48
>>761 xargsの-L 1オプション使ったら、
1行ごとにコマンド(echo)が実行されてしまうから、
元質問の、「まとめて処理」ができないだろ。
それに、「改行を \ でエスケープ」と言っても、
そう都合良く findで出力できないだろ。
さらに、ファイル名に普通の文字として、
" や ' や \ などが含まれていると
やっぱり駄目だろ。
よって、xargsは使えん。
改行文字がファイル名に含まれてるケースって、そんなにあるか? 基本的にそれは考慮せんでもいいと思うんだが
ファイル名にはヌル文字も使えなかったっけ? だとしたら xargs -0 も完全な解決策にはならないが。
767 :
名無しさん@お腹いっぱい。 :2005/07/28(木) 10:05:15
>>766 ファイル名にnull文字は使えねーよ。
だからxargs -0が最もマトモな解決法なのだが、
Solarisとかで使えないから問題になってるんだよ。
>>765 改行は滅多にないとしても、
ファイル名に ' " \ などが含まれているのは
よくある。
「Don't Cry.mp3」とかね。
xargsが ' " \ を特殊文字扱いするのが問題になる。
>>768 xargsが単純に改行をセパレータとして扱うような
プログラムだったなら、はるかにマシだっただろうね
大学のマシンに xargs が なぜか /usr/local/X11/bin にあったのを思い出した
>770 あっ、そんな記憶ある。 NEWS-OS 4 (3かな?) じゃないかな。
NEWS-OS 4は xargs が付属していないね。 /usr/5binにすらない。 (/usr/5bin/cpioとかならある・・ちなみにunameもない・・) まあ、xargsは元SysV系ということで、 「使わなくても済むはずのコマンド」の扱いだったのだろう。
773 :
761 :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 ですが。
>>771 たしかにマシンのほとんどはNEWSだった。記憶があやふやだったので
local をつけたけど、やはり/usr/X11/binだったのかな
775 :
771 :2005/07/29(金) 00:50:15
>772, 774 記憶違いだったようで、スミマセン。 ひょっとしたら、初心者の私が 「ファイル名が x で始まるのに、どうして/usr/bin/X11にないんだ」 (笑わないでオクレ!) と思ったのが記憶に残っていたのかもしない。 あっ、 NEWS-OSの X 関係は /usr/bin|lib/X11というのも違うかも。 近くの席にはSUN 3 が有ったなぁ。
>>772 xargs はあった方が良いと思うんだが。
これの代わりをするには、たくさんコマンド組み合わせてやらないといかん希ガス
よくわからんが775は771ではない。772の間違いかな。ただ、X関係の下に あったという記憶は同じようだけど。NEWSのキーボードのタッチは好きだった。 「~」の位置のせいで痛いミスをしたことがあったが… xargsはコマンドライン以外で使ったことがないかもしれん。
>>776 xargsは実行時効率とタイプ量減らすためって気がする
たんに機能の話だけで言えば
cmdA | xargs cmdB
は
cmdA | while read i; do cmdB $i; done
でいいし(後者は効率が悪いがIFSで適切なデリミタを設定することもできる)
いつまで引っ張る気だ。
771=775 です。 随分昔の話なので、私の記憶が間違っていたのかと思いました。 >777 コマンドライン以外で使うxargs って、スクリプトの中に書くという事ですよね。 それとも、使いやすいGUIが有るとか? (そんなGUI 想像つかない) # スレ違いなんで、このくらいにしておきます。 orz
argument が無限に取れるシェルがあれば xarg はいらないの?
シェルが取れてもコマンドが取れなければあまりい意味が無い
でもそれは xargs でも解決できないよね。
>>783 xargs -i cmd {} でほぼ解決できる。
パフォーマンスは知らん。
785 :
名無しさん@お腹いっぱい。 :2005/07/30(土) 10:19:58
>>784 だからぁー、-iオプション付けると
-l 1も暗黙に付いちゃうから、xargs使う意味がなくなるんだよ。
解決するのはスペースを区切り文字とみなさないことだけであって、
\ とか ' とか " の問題はそのまま未解決。
>だからぁー、-iオプション付けると >-l 1も暗黙に付いちゃうから、xargs使う意味がなくなるんだよ。 意味不明。
多数のファイル名を拡張子を付けたファイル名に変換したいのだがrenameはつかえるのかな? f1 f2 f3 f4 ->f1.jpg f2.jpg f3.jpg f4.jpg
for file in * ; do mv $file $file.jpg done
>>789 rename って言ってるってことはMS-DOSプロンプトなんだろうよ
正解は
>>791 よろしく
ちょっくらうんこいってくる。
DOSプロンプトだったら、rename * *.jpg
Linuxだとrenameというコマンドがディス鳥標準で付いていて、一応使える。
ただし一般的ではない。
>>789 はダブルクォート付けていないから、減点だな。
そもそも
>>788 は「多数のファイル名を」って言ってるんだから、
* はまずいだろ
zsh 使ってるなら zmv も便利
tailの逆、つまり先頭から(ファイル最終のn行前)まで表示するにはどうすれば いいでしょう?
head
liat
ファイル最終の n 行前までって言ってるんだから、 実際のところ head で実現するのは苦しい気がする。 (head で指定できる行数は限りがあったと思うので。) てことで tail -<n> <file_name> > <tmp_file> comm -23 <file_name> <tmp_file> rm -f <tmp_file> かな。
ファイル途中にtmp_fileと同一行が出たらおかしくならないか?
comm はソートされたファイルじゃないと使えない
んな、ファイル丸ごと何度も読み書きするくらいだったら、たとえば last=100 rows=`wc -l file | cut -d ' ' -f 1` head -n `expr $rows - $last` file とか。
wc -l file | cut -d ' ' -f 1 は wc -l < file でいいだろ
tail -r | tail +n | tail -r GNU tail では -r はないようなのでかわりに tac を。
tail -rだと全文をバッファに抱えるプロセスを二つ重ねないといけないので、 あんまり嬉しくないんですよね。 というわけで、こうかなあと。(n=4の場合) ruby -ne '(q||=[])<<$_;q.size<=4||print(q.shift)' file
echo '1,$-Np' | ed file
811 :
名無しさん@お腹いっぱい。 :2005/08/03(水) 17:21:46
質問させてください。 スクリプトを実行したら login: 名前を打ち込んで password: パスを打ち込む(非表示) パスはファイルにリダイレクト っていうのを作りたいんですが。バッシュで。 途中で文字列を入力させるやり方が分かりません。 教えてください。おねがいします。
read -p 'login: ' NAME read -s -p 'password: ' PASS echo $PASS > file
そんでそんで? 誰のパス盗もうとしてんの?(σ ̄ー ̄)σ
>>811
814 :
名無しさん@お腹いっぱい。 :2005/08/04(木) 02:44:04
シェルスクリプトで perl -pe chomp と同じことをしたいのですが、 どのようにやればよいでしょうか?
#!/bin/sh exec perl -pe chomp
readで出来たのか 知らなかった
cmd1 | cmd2 上記のようなパイプで繋いだコマンドで、cmd1の終了ステータスを拾いたいのですが、 どうしたらよいのでしょうか?
csh -c 'cmd1 | cmd2'
出来ました、ありがとうございます。
(((cmd1; (echo $? >&3)) | cmd2 >&4) 3>&1 | (read x; exit $x)) 4>&1 echo $? うーん、美しくない。
一瞬lispに見えたw
>>817 bash の(たぶん)3.0じゃないと使えないと思うけど、
$ echo $PIPESTATUS[0]
とか、出来る。
ちなみに配列だから、
$ echo ${PIPESTATUS[*]}
で、全部見れる。
あと、ちょっと違うけど、
$ set -o pipefail
とかもある。
824 :
823 :2005/08/05(金) 01:01:30
PIPESTATUS、bash-2.05bにもあったよ。 pipefailが、3.0からだった。
今/home/.emacsがあるとして、ユーザディレクトリにそれぞれコピーするには どう書けばいいですか?所有者ももそれぞれのユーザに設定できますか?
シェルスクリプトのスレよりもくだ質が似合いの質問者だな。
くだ質いけって言われたのになんでここで粘るんだ? だだこねる相手はママだけにしとけよ。 次の方、どうぞ↓
なんで怒ってるの?
831 :
名無しさん@お腹いっぱい。 :2005/08/05(金) 07:47:09
$HOMEに押し着せの.emacsを強制コピーしてくる シス管が居て、迷惑してるのですが、 これを拒否するにはどうしたらいいでしょうか? ちなみに、root権限で上書きコピーしてくるため、 一般ユーザーのパーミッション設定では防げません。 あと、.emacsだけじゃなく、$HOME/.profile $HOME/.xinitrcとかもコピーで潰されるので大迷惑です。
.emacs というディレクトリ作っといたら?
>>831 #!/bin/sh
cat <<EOF | mail root
From: $USER
あなたのホスト管理はクソです。
いますぐ.emacsをroot権限で上書きするというアホな行為をやめてください。
EOF
>>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 みたく、管理者に一言いうのが早いかもしんないけど。
ln -s /etc/passwd ~/.emacs
どういうタイミングでどういう手段で何が上書きされるのか。 ログインシェルは何か。自分の権限でcronやchshは使えるか。 などによっていろいろと対抗手段は考えられるけど、情報不足。
>>825 に対する皮肉として書いた釣りなのに、
こんなに釣りにつき合ってくれてありがとう。
釣られすぎだな。
∧_∧ハゥッ ∧_(Д`; ) ( ・∀・)玉 つ (っ ≡つて ヽ チーン! して_)_ノw (_) 玉を砕くと書いて「玉砕」と言う。
835に1票
>>835 も面白いけど、
ふつー、rm -f してから cpするだろうから効果なし。
そのふつーが期待できる管理者ならユーザの.emacsを上書きしたりなぞしない。
(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.
>>844 は答えになっていない英語スパムだな。
>>843 は、空文字列のカンマに付いての質問と思われ。
ブレース展開自体の質問じゃないよ。
>>845 自分の理解力不足を棚にあげて、人を批判とはおめでたい人ですね. :-)
>>845 > ブレース展開自体の質問じゃないよ。
>>843 > 展開の書式を解説しているサイトを教えてください。
>>845 英語が読めないなら、エキサイト翻訳使えよ。
>>844 が言っているのは、展開時に左から右へという順序と、
ネスティング可能なことと、
カンマ自体を普通の文字として使うならクォートしろということだけ。
元質問のコマンドラインでは左から右への順序は関係ないし、
空文字列のカンマも許されることは
>>844 には書かれていない。
なので、
>>844 は早とちりの外し回答だと思う。
この、クソチョッパリが!!!!!!!!!!!!!!!!!!!!!!! 百年謝罪しろ!!!!!!!!!!!!!!!!!!!!!!!!!!
>>850 > 空文字列のカンマも許されることは
>>844 には書かれていない。
禁止されていないということは許されているということだろ。
>>852 元質問は「 {, とは何か?」と聞いているのだから、
「それはブレース展開の最初の文字列が空文字列になっているものだ」
と答えるのが的確。
>>850 はマトはずれ。
854 :
853 :2005/08/05(金) 20:43:42
855 :
名無しさん@お腹いっぱい。 :2005/08/05(金) 21:11:43
別スレで怒られたので、こちらでに移動します。 今/home/.vimrcがあるとして、ユーザディレクトリにそれぞれコピーするには どう書けばいいですか?所有者ももそれぞれのユーザに設定できますか?
誤爆すみません。逝ってきます。
$HOMEに押し着せの.vimrcを強制コピーしてくる シス管が居て、迷惑してるのですが、 これを拒否するにはどうしたらいいでしょうか? ちなみに、root権限で上書きコピーしてくるため、 一般ユーザーのパーミッション設定では防げません。 あと、.vimrcだけじゃなく、$HOME/.xsessionや $HOME/.cannaとかもコピーで潰されるので大迷惑です。
もういいから。
>>857 コミュニケーション能力を磨くといいよ。
>>859 コミュニケーション能力じゃなくて、
技術的に回避する方法はありませんか?
上司に言っても、
「シス管は彼に任せているから、彼の方針に従ってくれ」
の一点張りで話が進みません。
>>860 >
>>859 > 技術的に回避する方法はありませんか?
あるけど、
> 「シス管は彼に任せているから、彼の方針に従ってくれ」
その彼とコミニュケーションはとったの?
もういいから。
>>862 だれも君がどう感じたかなんて聞いていないよ。
>>861 もちろん、とったよ。
「これはシステム管理上必要なことだから」
で話は進まず。
横レスすまそ。
>>861 $HOME/.xsession の場合は回避するの難しくないか?
_,. -−─−-- 、_ ,. '´ _ -−ニ二二`ヽ、 / / _,.−'⌒ヽ,ノ``'ミ,、 ,.' / / ,,イ゙\ /入、ヾ, . / / // -‐''"_ ヽ 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´ ,ノ| | | \ ` ̄ ̄ ̄ / | | `−──‐′
>>865 .xsession って #! みてくれたっけ?
>>867 見るかどうかは、/usr/X11R6/lib/X11/xdm/Xsession に
どう書いてあるかによって変わる。デフォルト状態の
Xsessionでも、Xのバージョンによって違ったと思う。
というか、root管理者が /usr/X11R6/lib/X11/xdm/Xsession
を編集して、そもそも$HOME/.xsessionを参照しないようにされてしまうと
一巻の終り。それに気づかない程度のアホ管理者と想像するが・・
869 :
843 :2005/08/06(土) 00:40:56
すいません、なんかお礼を書くタイミングを逸してしまって 空文字列という意味なんですね ありがとうございました
diff -u /etc/hosts{.20050801,}とかよく使いますよ。
871 :
:2005/08/07(日) 12:53:34
>>857 そのホストとは別に、LinuxなりBSDなりマシン立ち上げて、
そっちの環境で作業すれば〜
(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がゼロになってしまうんでしょうか?
$find /lib/ -maxdepth 1 -type f -mtime -3|xargs wc -c やりたいこと自体はこれでOKでした。
>>872 パイプでwhileにつないだ場合、
この部分はさらに別シェルで実行されるから
その次のセミコロン以降の変数には反映されない。
ある数値をパイプで受け取ったとして、それの合計値を出したいときには どうするのがいいんでしょうか??
>>877 ありがとうございます。これでなんで上手くいくのか分りませんがとにかくそういうもんだと思っておきます。
>>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
$LINEBじは$FILEBの間違いって落ちじゃないよな。
883 :
880 :2005/08/08(月) 23:42:58
>>881 さん
もうちょっと、ヒントをください。
>>882 さん
先ほどのソースは間違ってますが、現実は「FILEB」です。
ご指摘ありがとうございます。
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 この例だと、同じファイルを読み込んでるけど、ちゃんと動くがなぁ。
885 :
880 :2005/08/09(火) 00:34:04
>>884 さん
ほ、本当ですか?
自宅にはUNIX環境がないため、確かめることはできないのですが…
なんでだろうか。。
起動したプロセスのプロセスIDをpidファイルに書き込みたいんですが、 どうすればいいでしょうか?
>>886 echo $$ > pid
念のため言っておくけど、複数個起動すれば当然"pid"というファイルの
内容は書き直されちゃうからね。
>>887 あざーっす!
参考になります。
ところで、やはりスクリプト内で別のスクリプトを読んでいる場合は
実プロセスIDではなくてスクリプトを実行しているプロセスのIDになってしまいますよね・・
889 :
名無しさん@お腹いっぱい。 :2005/08/09(火) 07:19:22
>>888 スクリプトを実行してるプロセスのIDになりました。
apacheとかはどうやって取得しているんでしょうか・・・
バックグラウンドで起動した子プロセスのPIDなら「$!」
>>890 あざーーっす!!!!
取れました!
1 #!/bin/sh
2
3 echo $$
4 ./test.sh &
5 echo $!
という超簡単なものなら行けたんですが・・・・・
実はtomcatの自動起動スクリプトを書いているんですが、
ソース晒して見てもらってもいいでしょうか?
> あざーーっす!!!! ってなんだよ?
オヅラさんの挨拶は「おあざーっす」
「ありがとうございます」の発音の弱勢部分を崩したんじゃない? 当たってたら、なんかくれ。
意味不明。 日本語を書くこと。
いあいあとかふんぐるいとかあざーすとか。
うがなぐるふたぐんとか
いあいあはすたー
sedやawkの使い方知らないから、いつもPerlに頼っちゃうんだけど、 こういうのあんまりよくない?
どうでもいいよおもうよ
>>891 自己レスです。
結局
echo $(ps -ewo "%p %c %u %a" | awk "\$2==\"java\" && /catalina/ && \$3==\"$CATALINA_USER\" {print \$1}" | head -n 1) > $CATALINA_PID
こんな強引なやり方でプロセスID取得しました
そんなことするより、起動スクリプトで echo $$ > pidfile したあと exec すれば?
fifo つくって通信するとか
>>902 Tomcatが8080で待ちうけている場合
/usr/sbin/lsof -t -i TCP:8080 -P
シェルスクリプトじゃないけどね。
>>905 ええー、(環境によっては)lsofをわざわざインスコすんの…。
そりゃあ必要なものは何でもインスコしなきゃならんがの。プロセスidさえ
わかればよいという目的下だと、ちょっとバランスの悪さを感じる。(俺は)
907 :
名無しさん@お腹いっぱい。 :2005/08/10(水) 23:15:45
スミマセン、教えてください。 Kシェルで count=`cat a.txt b.txt | grep ${検索条件} | wc -l` というコマンドで検索条件に半角スペースを含む文字列を指定したい場合、どうしたら良いですか?
count=`cat a.txt b.txt | grep "${検索条件}" | wc -l` これじゃあかんの?
909 :
907 :2005/08/10(水) 23:39:59
>>908 それだと、なぜかcount=0になっちゃうんですよ。
もちろん、条件には引っ掛かる文字列もあります。
うーん。
>>908 ksh使ってないんで本題はわからんが、grep -c って標準的じゃないの?
スペースの話を別にすれば
count=`grep -c $検索条件 a.txt b.txt`
でよかったんじゃないのかな。
本題も、wc -lを取り払って試せば、なぜなんだかわからないかな。
grep -c -F でどうだろう?
>もちろん、条件には引っ掛かる文字列もあります。 というところからして、検索文字列の正規表現が おかしくてマッチしないだけというオチじゃなかろうか。 grep を fgrep に変えてみるとか。
913 :
907 :2005/08/11(木) 20:04:46
自己解決しました。 検索条件はファイルから読み込んでいるので、 半角スペースに見えているのは特殊文字かと思い、 cat -vしてみたら 行末に^Mの文字が‥ 引っ掛からないわけでした。 やさしいunix板の皆様、ありがとうございました。 逝ってきます。
914 :
名無しさん@お腹いっぱい。 :2005/08/14(日) 08:45:19
csh使いのアホはいつになったら死滅するんでしょうか?
BSDがあるかぎり何度でも甦るさ
*BSDに関して一つだけ嫌いな点はデフォルトのログインシェルがcshって事だな。 NetBSDにstaticな/bin/bashを突っ込む俺も阿呆だと思うけど。 だってシングルユーザモードでもログインシェルにbashを使いたいんだよもん!
tcshとかもいらない
私も要らないんだけど、入ってないと年寄りが。。。 私はbashかksh。
919 :
名無しさん@お腹いっぱい。 :2005/08/14(日) 18:51:36
zsh
ログインシェルの話はどこかよそでやっておくれやす
出た自治厨
シェルスクリプトを走らせると ????.sh: xrealloc: cannot reallocate 268435456 bytes (0 bytes allocated) (????はファイル名) というエラーがでます。 前同じスクリプトを動かしても何も普通に動いていたのに。。。 パーミッション、ファイルサイズ制限、ログインシェル、メモリ残量 はチェック済みです。。。 このエラーが起きる原因はなんでしょうか? よろしくお願いします。
924 :
923 :2005/08/22(月) 18:14:30
解決できました。すみません(;´ω`)