[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 04/21 15:11 / Filesize : 233 KB / Number-of Response : 926
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:名無しさん@お腹いっぱい。 [2009/07/01(水) 09:42:48 ]
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。

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

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

前スレ
シェルスクリプト総合 その14
pc12.2ch.net/test/read.cgi/unix/1233179688/

554 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 22:17:39 ]
>>552
whileループはC言語で書いてるんだろ。(プログラムは出てるじゃん)

コマンドラインで直接 ./play を実行すると1秒毎に処理されるのに、
>>551 のシェルスクリプト経由で ./play を実行すると1秒待たずにループする、
という話だろ。

555 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 22:20:28 ]
で、答えは?

556 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 22:20:58 ]
>>551
sleep()関数はシグナルで中断される可能性がある。
シグナルが到着すればsleep(1)は1秒未満で終了する。
代わりにnanosleep()使え。

たぶん、シェルスクリプト経由の時だけシグナルが発生するような
別の条件が加わってるんだろ。

557 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 22:36:54 ]
>>551
play コマンド側は特に何もせずシェルスクリプト側で sleep 1; すればいいんじゃね?


558 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 22:58:35 ]
>>556
ありがとうございます。
試してみましたが同じ状態になりました。

説明が不足していてすみません
GNU Chessを改造していたので、その部分のコードを切り抜いても分かりづらいので自分なりに説明したのですが、説明力がなくてすみません。

ファイルの読み込み部分の処理は

while(true){
sleep(1);
if(rlogfp=fopen("./black.log","r")){
fgets(inp, MAXSTR, rlogfp);
fclose(rlogfp);
remove("./black.log");
break;
}
}


black.logというのは次の手を指定した文字列が収められているファイルです。
C言語で書くのもうまくないので下手なコードですが、ご了承ください。

559 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 23:01:09 ]
>>557
whileで監視しているのでsleep(1)がないとファイル作成時に読み込みが実行されるのか、うまくデータが受け取れないので
sleep(1)を追加している次第です。

560 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 23:39:32 ]
後からこんなことを追加するのはすみませんが

どうやら監視しているファイルが存在しないのに、ファイルがあるように動いているみたいで、
ファイル読み込む→whileを抜け出す→間違った手だと解釈→whileに入りファイルを読み込む
を繰り返すようになっているみたいです。
シェルスクリプトではなくターム上で実行するとうまくいくのに
スクリプトだとこの現象がおこるのはどういったわけでしょうか?

561 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/26(月) 23:56:55 ]
>>560
シェルスクリプトの cd $DIR/file あたりがうまく行ってないとか。
別のディレクトリの black.logを読んでループしてるとか。

562 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 00:11:19 ]
>>561 レスありがとうございます
他のディレクトリではblack.logは生成していないのでそのケースはないかと思います
ディレクトリの場所も間違いはないです



563 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 00:23:15 ]
sleepはループの先頭なの?それなら確実に1秒待つでしょ?
説明に一貫性がないと回答者も混乱するし、いいことないよ。
あとは、fgets, fclose, removeの戻り値をちゃんとチェックしてみる。

564 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 00:30:07 ]
ぱおーん

ってそれはエレファント

565 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 00:40:24 ]
>>551
>シェルスクリプトで実行すると1秒待たずにwhileループが回っている

これはどうやって確認したの?

原因を切り分ける為に、問題を再現出来る最小限の
プログラムを作ってみると良いと思うよ。

566 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 00:46:46 ]
>>563,565
アドバイス通り明日調べてみます。


567 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 08:05:15 ]
>>559
> whileで監視しているのでsleep(1)がないと
> ファイル作成時に読み込みが実行されるのか、
> うまくデータが受け取れないので

busy waitになるだけでちゃんと動くはずだろ。
だから動かないのは、sleep()以外のところがおかしい。



568 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 11:08:26 ]
そのファイル、NFS かなんかの領域に置いてないか?
おかしなキャッシュが効いてるような気がする。

569 名前:名無しさん@お腹いっぱい。 [2009/10/27(火) 11:38:40 ]
>>568
特に変わった場所には置いてません。

とりあえずthreadやwhileループとファイルの読み込みの部分だけ同じ形でtestファイルを作ってみたのですが
直接実行、シェルスクリプトで実行で共に問題がなかったので、もっと別の場所だと分かりました。
もう少し試行錯誤してみたいと思います。

570 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 12:26:31 ]
ちょっと説明が長くなるのでアップロードしてみました。
お手数をおかけしてもうしわけありません。
DLkey:unix

www1.axfc.net/uploader/Sc/so/49655.txt

571 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 13:04:39 ]
input_threadが動き出す前にwait_for_inputに入ると、
input_statusが初期値(INPUT_NONE)のままなので、whileを抜けてしまう。

572 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 21:14:09 ]
test が表示されないという現象はウチでは一度も再現しませんでした。
Dual Core の Mac です。

外してたらスマソ。

test.sh を実行する
Ctrl-C で test.sh を止める
a.out のプロセスは残ったまま

とかじゃないよね?

まあそれでも test が表示されない理由にはなりませんけど。



573 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/27(火) 21:50:45 ]
一度目がその症状があって
もう一度試したら治っていました

>>571
どのように記述すれば回避できるのでしょうか?
丸投げのようですみません^^;

574 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 00:03:20 ]
以前動作していたスクリプトが動かなくなってしまいました…
ここ最近kshのアップデートを行ったのが原因なのでしょうか…

何か情報をお持ちの方いらっしゃいましたらご教授願います。

<事象>
特に問題なく見えるkshがsyntax Error `(' unexpectedで異常終了
コメント内のスペースを1つ削除or2つ追加すると正常に動作する

<やったこと>
kshとbashのアップデート
ksh 20060214-1.4 → 20080202-14.el5
bash bash3.1-16.1 → bash3.2-21.el5

<環境>
redhat Linux 5.1
uname -a結果
Linuc 2.6.18-53.el5 #1 SMP Wed Oct 10 16:34:19 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux

<備考>
ksh -nで構文チェックをかけると、構文エラー以外に「" quote may be missing」という警告が必ずついてきます。
コメントを弄ってエラーを抑止するとこの警告も発生しなくなります。

575 名前:551 mailto:sage [2009/10/28(水) 00:05:16 ]
. play.shで実行したらうまく動きました。
結局原因はわかりませんでしたが、サブシェルだと何か環境とちがったのかな?と素人ながら思います。
お騒がせしてすみませんでした。

576 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 00:59:40 ]
それたまたまだから

577 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 01:16:52 ]
while(true)なんてしないで、openの返り値でなんとかならんの?

578 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 07:06:37 ]
>>574
おいおい、redhat 5.1というのは10年くらい前のOSで、
カーネルは2.0の時代のもの。(libc5からやっとglibc2に変わった時代)
カーネル2.6で動くわけがない。

579 名前:574 mailto:sage [2009/10/28(水) 11:18:44 ]
>>578
今確認したところ、redhat 5.1ではなく
RHEL 5.1でした

redhatLINUXとRHELを混同していました
申し訳ありません


580 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 11:43:19 ]
>>574
スクリプト晒せ

581 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 11:44:15 ]
libc5なつかしいな。
glibc2(libc6)になってようやくLANG関係がマトモになったんだっけ

582 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 11:44:22 ]
どうせShift_JISのコメントだろ。



583 名前:574 mailto:sage [2009/10/28(水) 23:54:47 ]
>>580
手元にスクリプトがない上に動く動かないの条件がよく分からないので再現できず…
申し訳ないです。

>>582
コメント等もう一度文字コードを見直しましたが、すべてUTF-8でした。

584 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 23:56:51 ]
手元にスクリプトがないのにコメント等見直した?意味が分からんのだが

585 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/28(水) 23:57:32 ]
不思議な話だなw

586 名前:名無しさん@お腹いっぱい。 [2009/10/29(木) 22:50:29 ]
LOTO6用の数字列を生成する

for x in $(seq 1 5); do echo $(seq 1 43 | shuf | head -6 | sort -n); done


587 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/10/30(金) 23:17:20 ]
>>586
for((i=0;i++<5;)){ echo `shuf -i 1-43 -n 6 | sort`; }

↑の方が簡単

588 名前:名無しさん@お腹いっぱい。 [2009/11/10(火) 09:10:20 ]
質問です。記法1と2では違いがありますか?どちらが正しいとか…
doの後に改行入れるべきかどうなのか,ということですが。

記法1
for i in *
do
echo $i
done

記法2
for i in *
do \
echo $i
done


589 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/10(火) 09:48:42 ]
>>588
記法2は間違いではないがバックスラッシュが余分。
もともと do の直後には、空白、タブまたは改行の区切り文字があればなんでも良い。
「行の継続」をする必要はないので、バックスラッシュは不要。

590 名前:588 mailto:sage [2009/11/10(火) 11:02:41 ]
>>589
ありがとうございました。

591 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/10(火) 11:33:58 ]
今のトレンドは↓の書き方。
bash依存じゃないぞ。純正シェルでもちゃんと動くから安心して使え。

for i in *
{
echo $i
}

592 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/10(火) 11:37:50 ]
どこのトレンドだよwwwww



593 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/10(火) 11:43:46 ]
for は { ... } でもいいけど、
while は do ... done じゃないといかんというのがアレ。


594 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/12(木) 08:07:11 ]
kshで標準出力と標準エラーをデフォルトでファイル&画面に出力するやり方はありますか?
毎行、| tee -a hoge.log を書くのが大変なので。

595 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/12(木) 08:19:07 ]
>>594

(
command1
command2
command3
:

) 2>&1 | tee -a hoge.log

596 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/12(木) 08:41:02 ]
>>594
scriptコマンドは?

597 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/12(木) 08:58:07 ]
俺はそういうとき
telnet localhost | tee hoge.log
ってやってる

598 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/12(木) 09:27:34 ]
正解(>>595)が出た後にボケ回答(>>596-597)が出てくる、の法則

599 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/13(金) 19:18:09 ]
自分よりいい答えが出たのがそんなに悔しかったのか

600 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/13(金) 19:57:03 ]
> 毎行、| tee -a hoge.log を書くのが大変なので。
毎行と言っているし、ここはシェルスクリプトスレなのでスクリプトの中での記述に
関しての質問だと言う事が容易に予想できる。

スクリプトに関しての質問にscript使えだの、telnetをリダイレクトしろだの、
ボケまくりの回答してる奴らは何なのだろう?
匿名掲示板だからボケ回答も恥ずかしくないのだろうか?

601 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/14(土) 03:03:51 ]
必死だなw

602 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/20(金) 10:11:52 ]
>>599
只の知ったかだろ
半角数字とか学生の分際で早くも理系気取りかよ



603 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/20(金) 10:44:29 ]
>>602
日本語で頼むわ……

604 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/20(金) 20:00:12 ]
> 半角数字とか学生の分際で早くも理系気取りかよ

これは新コピペになりそうな気がする

605 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 01:23:51 ]
>>604
新コピペとか学生の分際で早くも理系気取りかよ
…こんな感じ?

606 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 02:02:27 ]
bashを使用しています。
数字が入っている変数に3桁毎にカンマを入れる方法が分かりません。
どうやれば3桁毎にカンマを入れれるようになりますか?

607 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 12:27:50 ]
>>606
printf "%'d" "$var"

608 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 22:05:46 ]
>>607
これはいいことを聞いたと、試してみたができないぞ?
$ bash --version
GNU bash, version 4.0.28(2)-release (i686-pc-linux-gnu)

609 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 22:13:00 ]
>>608
varの中にちゃんと数字入れてるか?

610 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/21(土) 22:17:56 ]
>>607 では printfの書式に改行が入ってないから、
シェルのプロンプト設定によってはprintfの出力をプロンプトが上書きしてしまう
とエスパー。

それとは別に、zshの内蔵printfでは動作しないね。

611 名前:606 mailto:sage [2009/11/21(土) 23:23:18 ]
>>607さん
有難うございました。ウチの環境ではうまくいきました。

612 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/22(日) 14:57:44 ]
$ printf "%'d\n" "123456"
123456
$ var="12345667"
$ printf "%'d\n" "$var"
12345667

なにがいけないのかねー



613 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/22(日) 17:20:06 ]
$ printf "%aqd\n" "123456"

614 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/22(日) 17:29:35 ]
>>612
localeの設定じゃない?
printf(3)によると、

>>printf("%'.2f", 1234567.89);
>>results in '1234567.89' in the POSIX locale, in '1234567,89' in the nl_NL locale,
>>and in '1.234.567,89' in the da_DK locale.

615 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 00:52:46 ]
>>614
ロケールの問題でした。ありがとう。
ちょっと気になるのは、printfコマンドする時に
LC_ALLを明示的に与えても上手く動作しなかったんですよね
組み込みコマンドだと伝わらないのかな?

$ locale
LANG=ja_JP.eucJP
LC_CTYPE="ja_JP.eucJP"
LC_NUMERIC=C
LC_TIME=C
LC_COLLATE="ja_JP.eucJP"
LC_MONETARY="ja_JP.eucJP"
LC_MESSAGES=C
LC_PAPER="ja_JP.eucJP"
LC_NAME="ja_JP.eucJP"
LC_ADDRESS="ja_JP.eucJP"
LC_TELEPHONE="ja_JP.eucJP"
LC_MEASUREMENT="ja_JP.eucJP"
LC_IDENTIFICATION="ja_JP.eucJP"
LC_ALL=
$ LC_ALL=da_DK printf "%'d\n" "123456789"
123456789
$ LC_ALL=da_DK bash
$ locale
LANG=ja_JP.eucJP
LC_CTYPE="da_DK"
(省略)
LC_ALL=da_DK
$ printf "%'d\n" "123456789"
123.456.789

616 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 06:55:47 ]
$ printf "%'d" "123456789"
printf: %': invalid directive

617 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 13:08:26 ]
>>615
>>$ LC_ALL=da_DK printf "%'d\n" "123456789"

LC_ALL を LC_NUMERIC にしてもダメ?

618 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 15:32:07 ]
(優先される)強さは、
強 LC_ALL > LC_個別 > LANG 弱
のはずだから、LC_ALL があってダメなら LC_NUMERIC でもダメな希ガス。



619 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 15:44:54 ]
>>617
ダメでした。
というかlocale(7)に書いてあるロケールの決定順序を見る限り
$ LC_ALL=da_DK printf "%'d\n" "123456789"
で動かなければ、LC_NUMERICを使っても同じなのではないかと。

ところで、
$ LC_ALL=da_DK locale
の結果は$ LC_ALL=da_DK bashで作ったシェル上でlocaleした
(参考>>615の2個目のlocale)のと同じ結果になります。
(つまりLC_ALLも、LC_NUMERICもda_DK)

その癖に、
$ LC_ALL=da_DK printf "%s\n" "$LC_NUMERIC" と
$ LC_ALL=da_DK echo "$LC_NUMERIC" はどちらも「C」が出力
(参考>>615の1個目のlocale)になるんですよね。LC_ALLはもちろん、改行のみです。
環境変数の伝わり方が変ですよね?

つまり、
localeだとLC_ALL(もしくはLC_NUMERIC)がexportされてて、
printfとechoはexportされない。

それと、
>>615で「組み込みコマンドだと・・・」といいましたが、
$ type -a echo したら、builtinと/bin/echoの2つのエントリがあったので、
どちらも試してみましたが、exportされませんでした。
どういうメカニズムでこうなっちゃうんでしょう。

620 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 15:54:16 ]
>>618 とレスが一部被ってしまった

連レスですみませんが、
コマンドの前に環境変数定義をつけるシンタックスって
なんという名前で呼ばれていますか?

そもそもどういうものなのかを調べたいのですが、ググりづらくて。

621 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 16:04:31 ]
>>620
shじゃなくてbashのマニュアルで申し訳ないが、
A simple command is a sequence of optional variable assignments
followed by blank-separated words and redirections, and terminated
by a control operator.
だそうな。
optional variable assignments (省略可能な変数代入)


622 名前:608,612,615,619 mailto:sage [2009/11/23(月) 18:22:28 ]
>>621 ありがとう。man bash読みました。
組み込みコマンドでの、optional variable assignmentの挙動についてまとめてみました。

COMMAND EXECUTION ENVIRONMENT節に以下の記述があります。
When a simple command other than a builtin or shell function is to be
executed, it is invoked in a separate execution environment

つまり組み込みコマンドはseparate execution environmentで呼び出されない。
これは当たり前のことで、組み込みコマンドは別シェルで実行されないということですよね。
そして個人的に新たに知ったのは、optional variable assignmentは別シェルにしか
伝えられないということです。(現在のシェル変数には代入されない)
だから、>>615で $ LC_ALL=da_DK printf "%'d\n" "123456789"
がコンマ区切りにならなかったんですね。

だったら、敢えてシェル変数を伝えられた実行環境を作って、printfするとどうなるか。
#include <stdlib.h>
int main()
{
 system("printf \"%s\n\" \"$LC_NUMERIC\"");
 system("printf \"%'d\n\" \"123456789\"");
 return 0;
}
をコンパイルしたa.outに対して試してみました。
(a.outは組み込みコマンドではないので別シェルで実行され、
optional variable assignmentが伝えられる)



623 名前:608,612,615,619,622 mailto:sage [2009/11/23(月) 18:25:17 ]
$ ./a.out
C
123456789
$ LC_NUMERIC=da_DK ./a.out
da_DK
123.456.789
$ LC_ALL=da_DK ./a.out
C
123.456.789
となりました。

>>615の後半のようにLC_ALL=da_DK bashで環境作ってからやる方が楽なので、
本末転倒になりましたが。。。


ところで、これで興味深いのは、LC_ALLはLC_NUMERICに影響を及ぼさないことです。
>>615では LC_ALL=da_DK bash 後にlocaleすると、LC_ALL=LC_NUMERIC=da_DKになりますが、
bashの初期化処理でLC_ALLの値をLC_NUMERICにコピーしているのかも?


最後に。619の訂正。
SIMPLE COMMAND EXPANSIONの節の 4.にあるように、
parameter expansionされてからコマンドが実行されるようなので、
$ LC_NUMERIC=da_DK printf "%s\n" "$LC_NUMERIC"
はコマンドが実行される前に引数の$LC_NUMERICが「C」(参考>>615)と展開される。
そのため、Cが表示される。


長文失礼しました。

624 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 18:52:34 ]
組み込みコマンドがseparate execution environmentで呼び出されないのは
bashの場合の話。

kshでは組み込みコマンドでもseparate execution environmentで動作する。

625 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 19:12:34 ]
やはり、sh系といえども、何を使っているかは明示すべきなんだな。


626 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/23(月) 19:17:36 ]
確かにその通りですね。
上は全部>>608の環境で試してた。

627 名前:名無しさん@お腹いっぱい。 [2009/11/26(木) 14:47:50 ]
"aa-1125.txt" "aa-0001.txt"
"aa bb-1125.txt" "aa bb-0001.txt"
"aa bb cc-1125.txt" "aa bb cc-0001.txt"
同じディレクトリにこの6ファイルがあるとします。
この中から「aa bb-????.txt」の形式で且つ最も新しいファイルを
探したいんですが、
(当然のことですが)ls -ltr "aa bb-????.txt"|tail -1とやるとエラーになってしまいます。
どうすればいいでしょうか?シェルはbashです。

628 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 15:01:32 ]
ls -ltr (ここに6個のファイル名を羅列)|tail -1

629 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 15:01:41 ]
ls -lt aa\ bb-????.txt | head -1

630 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 15:14:14 ]
bbの無いファイルもあるぞ

631 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 15:28:45 ]
あるよ
だから?

632 名前:名無しさん@お腹いっぱい。 [2009/11/26(木) 15:49:56 ]
申し遅れましたが、
実際にはファイル数、ハイフンより前の部分のファイル名は不定です。
>>627は単純化した例です。
>>627の時点で知りたかったことは自動でエスケイプする方法もしくはそのコマンドです。



633 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 16:00:11 ]
一体何がしたいんだよ
何とマッチさせたいんだ?

634 名前:名無しさん@お腹いっぱい。 [2009/11/26(木) 16:07:04 ]
>>627の下から2行めをエスケイプしたものが
>>629なわけですが、(実質的に)
そのようなことをスクリプト内で自動でおこないたいということです。
sed,awkを使うのかなと思いますが、インタラクティブだと[tab]キーを押すと
できるようなことなので、bash内部でも出来ないかなとも思います。

635 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 16:13:40 ]
ハイフンより前にスペースが含まれていようがいまいが
*-????.txt で>>627の6ファイル全てにマッチするんだけど
それで何か困るのか

636 名前:名無しさん@お腹いっぱい。 [2009/11/26(木) 17:03:15 ]
unix超ど素人です。
本を参照しても見つからないので、
質問させてください。
ちなみにここで推奨されてないcshを使っています。

例えば80.0というように小数点がある数字を
80といった整数に書き直すスクリプトをつくりたいのですが、
うまくいきません。

#!/bin/csh
set y_info = 80.0
echo int($y_info) > aaa.dat
どうすれば解決できますでしょうか?

637 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 17:23:05 ]
解決の第一歩は、cshを捨てる事だ。

638 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 17:24:52 ]
>>627
スペースだけをクォートすればいい。シングルクォートの方がお勧め

ls -ltr ??' '??-????.txt | tail -1

639 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 17:30:24 ]
>>636
cshは捨てさせていただくので、shでどうぞ。

#!/bin/sh
y_info=80.0
printf '%.0f¥n' $y_info

640 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:10:12 ]
>>636
cshなら拡張子を削る機能が組み込まれてるので、
悪くないチョイスだよ

#!/bin/csh
set y_info=80.0
echo $y_inf:r > aaa.dat

なんと :r を付けるだけで小数点以下を削れるんだぜ

641 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:11:11 ]
echo $y_info:r > aaa.dat
のミス

642 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:13:04 ]
あと、csh スクリプトは
#!/bin/csh -f
にした方がなにかと幸せ



643 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:30:51 ]
>>640
それだと、 .5 みたいに頭の 0が省略されてる小数で誤動作する。

644 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 20:34:08 ]
>>640
(数値じゃなく)拡張子とみなして削る方式なら shでもできる。

#!/bin/sh
y_info=80.0
echo ${y_info%.*}


csh(笑)の出番なし。

645 名前:636 mailto:sage [2009/11/26(木) 21:13:03 ]
>>640
うまくいきました
トンクス

他の方もレスありがとうございます

シミュレーションで得られたデータを出力する際にスクリプトを使用しています。
周りがcsh使ってたので、それを使ってましたが、
shの方が問題点が少なそうなので、
そっちにシフトしてみようと思います。




646 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 21:16:33 ]
半導体屋か? あいつら何でcsh好きなんだ?

647 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/26(木) 21:19:13 ]
>>640 だと四捨五入されない。>>639 がお勧め。

648 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 11:45:22 ]
以前にcshで作って、それですんでりゃそうなるだろう。

649 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 12:14:17 ]
tcsh以外に便利なインタラクティブシェルがなかった時代の負債といえようか

650 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 12:33:23 ]
ちょっとしたスクリプトの場合、cshの方が書きやすい場合もある。
四則演算が出来るとか配列が使えるとか、要はケースバイケース

651 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 12:38:06 ]
>>650
四則演算も配列も、今時のsh(系)でできる。

652 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 12:46:50 ]
ケースバイケースでcshスクリプトなんて混ぜられちゃ迷惑だ



653 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 13:18:36 ]
コピペで数千行を超えるのcshスクリプト作るんだぜ。
ちょっとしたを遥かに超越している。

654 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/11/28(土) 13:23:31 ]
実績があります、とか言ったりなんかしちゃったりして






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<233KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef