シェルスクリプト総合 その10at UNIX
シェルスクリプト総合 その10 - 暇つぶし2ch489:名無しさん@お腹いっぱい。
08/03/31 03:21:23
expectスクリプト

490:名無しさん@お腹いっぱい。
08/03/31 04:11:10
expect以外のよい方法ってないでしょうか?
パスワード遮蔽のみのために
expectを用いるのは結構つらいと感じましたので。。。。
すいません。。。。

491:名無しさん@お腹いっぱい。
08/03/31 06:29:31
原則としてコマンドライン引数にパスワードを直接書くのはダメ。
mysqldumpの仕様によるのでここではなくMySQLのスレ(データベース板?)できくべきだが
・パスワードをファイルに保存してそれを引数に与える
・コマンドが読む設定ファイルにパスワードを書く
・環境変数でパスワードを与える
などコマンドラインで暴露しない方法が必ずある筈。調べてみて。

492:名無しさん@お腹いっぱい。
08/03/31 07:03:12
正常化したかと思ったらスレ違いネタ,,

493:名無しさん@お腹いっぱい。
08/03/31 08:14:21
>>490
バックアップ専用のユーザを作って、そのユーザで実行すれば他のユーザからは隠蔽される。
他のユーザから見えてしまうような環境なら、別マシンで実行すべし。

494:名無しさん@お腹いっぱい。
08/03/31 08:19:50
はぁ?

495:名無しさん@お腹いっぱい。
08/03/31 10:21:08
> ・環境変数でパスワードを与える
嘘を教えないように。

496:名無しさん@お腹いっぱい。
08/03/31 10:29:56
おそらく、環境変数をコマンドラインで展開せずに、
実行コマンドが直接 getenv()とかで環境変数を読めば問題ないと
勘違いしたんだろうが、環境変数にパスワードを設定するのは論外。

ps e すれば環境変数の内容は丸見え。

497:名無しさん@お腹いっぱい。
08/03/31 10:33:59
>>495
嘘じゃなくて推測でしょ。

498:名無しさん@お腹いっぱい。
08/03/31 10:51:36
うそ【嘘】
2 正しくないこと。誤り。

499:名無しさん@お腹いっぱい。
08/03/31 10:52:41
正しい方法知ってるなら教えてあげたら?

500:名無しさん@お腹いっぱい。
08/03/31 11:07:28
お前自分で書いてるだろ。
> mysqldumpの仕様によるのでここではなくMySQLのスレ(データベース板?)できくべきだが

このスレでは、コマンドラインで暴露しない方法として「環境変数でパスワード渡す」は真っ赤な嘘。
という事を指摘すればよい。

お前、プライド(ぷぷっ)に実力が追いついてないぞ。

501:名無しさん@お腹いっぱい。
08/03/31 11:21:38
APOPみたいにチャレンジからMD5で計算して渡すように
仕様変更すればいいんだよw

502:名無しさん@お腹いっぱい。
08/03/31 11:29:22
引数に渡すときに?
いずれにせよ、どこかで生パスワードが必要じゃん。

503:名無しさん@お腹いっぱい。
08/03/31 11:41:46
>>502
だからAPOPみたいにって言ってるだろ。
APOPの結果を引数に付けて丸見えになっても無問題。

504:名無しさん@お腹いっぱい。
08/03/31 11:50:52
そのAPOPの結果を求めるコマンドにはどうやってパスワードを...

505:名無しさん@お腹いっぱい。
08/03/31 11:54:44
環境変数で渡すんだよ!

506:名無しさん@お腹いっぱい。
08/03/31 11:59:34
最初のコマンドはexpectスクリプト使えば(以下無限ループ

507:名無しさん@お腹いっぱい。
08/03/31 12:04:33
>>504
結果を求めるコマンドが、別ファイルからパスワードを読めばいいだけ。
頭使えw

508:名無しさん@お腹いっぱい。
08/03/31 12:18:34
>>507
つまらんな。仕様変更するならパスワード不要の方法に変更しろ。

509:名無しさん@お腹いっぱい。
08/03/31 12:24:29
というか、仕様変更するなら最初からファイルからパスワードを読むように
仕様変更すればいいだけ

510:名無しさん@お腹いっぱい。
08/03/31 12:35:12
expectが大きすぎるならttyrec/ttyplayだね。
本人登場しないし、この話題はもういいんじゃない?

511:名無しさん@お腹いっぱい。
08/03/31 13:27:19
>>510
ttyrec/ttyplayでどうやるの?

512:510
08/03/31 14:04:25
そこまでやるのはスレ違いだからマニュアル読んで。

513:名無しさん@お腹いっぱい。
08/03/31 14:10:20
>>512
man ttyrec 読んだけど >>488 に使えそうな機能見あたらないよ。
どの辺に書いてあるの?

514:名無しさん@お腹いっぱい。
08/03/31 14:12:46
見つけられないなら仕方ないですねw

515:名無しさん@お腹いっぱい。
08/03/31 14:35:22
>>496
君の使ってるOSだとpsで他ユーザのプロセスも環境変数が見えるの?
見えるとしたらそれ、脆弱性だから。
Solarisでもパッチ出てるだろ。

516:名無しさん@お腹いっぱい。
08/03/31 14:53:58
MySQL 6.0の公式リファレンスでは
(5.5.6. Keeping Your Password Secure
URLリンク(dev.mysql.com))
-pオプションはインセキュアであるとして、セキュアな方法として
* Store your password in an option file.
* Store your password in the MYSQL_PWD environment variable.
を挙げてるな。
環境変数が問題だというならMySQLの公式リファレンスも直させなきゃな。
まあ、頑張れw

517:名無しさん@お腹いっぱい。
08/03/31 14:57:01
裏も取らずにテキトーなこと言うやつが多過ぎるな。

518:名無しさん@お腹いっぱい。
08/03/31 15:33:42
Solarisのはこれか。
URLリンク(sunsolve.sun.com)

Solution Type Sun Alert
Solution 200448 : Security Vulnerability With The "/usr/ucb/ps" Command

Impact
A security vulnerability in the "/usr/ucb/ps" (see ps(1B)) command may allow unprivileged local users the ability to see environment variables and their values for processes which belong to other users.

519:名無しさん@お腹いっぱい。
08/03/31 16:35:03
>>517
そりゃ、不適当なこと言っちゃダメだろ

520:名無しさん@お腹いっぱい。
08/03/31 21:49:36
security.bsd.see_other_uids=0

で良いのでは無いか?

他のOSの事は知らないけど。

521:名無しさん@お腹いっぱい。
08/03/31 22:12:21
>>516
おいおい、自分の厨房っぷりを隠そうと嘘を嘘で上塗するのか?
続きに「極端にインセキュアと考えなければならなくて、使用すべきでない」と
書いてあるじゃないか。
それとも本物の中学生か? 英語読めるようになってから出直しておいで。

Section 4.2.2.2, 懼Using Option Files懼�, discusses option files in more detail.

Store your password in the MYSQL_PWD environment variable. This method of specifying
your MySQL password must be considered extremely insecure and should not be used.
Some versions of ps include an option to display the environment of running processes.
If you set MYSQL_PWD, your password is exposed to any other user who runs ps. Even on
systems without such a version of ps, it is unwise to assume that there are no other
methods by which users can examine process environments. See Section 2.14, 懼Environment Variables懼�.

522:名無しさん@お腹いっぱい。
08/03/31 23:48:17
文字化けしてるな。>>516はさすがに逃亡だろうな。だから恥ずかしいなら黙っていろと...
環境変数でパスワード渡していいのは小学生までという結論でいいか?

URLリンク(dev.mysql.com)
Store your password in the MYSQL_PWD environment variable. This method of specifying
your MySQL password must be considered extremely insecure and should not be used.
Some versions of ps include an option to display the environment of running processes.
If you set MYSQL_PWD, your password is exposed to any other user who runs ps.
Even on systems without such a version of ps, it is unwise to assume that there are
no other methods by which users can examine process environments.
See Section 2.14, "Environment Variables".

523:名無しさん@お腹いっぱい。
08/04/01 00:14:26
mysql*についてはmy.cnfに書いとけ、そして600にしとけ、でいいんでは?

524:名無しさん@お腹いっぱい。
08/04/01 00:31:31
psで環境変数が他人にばれるOSってどれ?

525:名無しさん@お腹いっぱい。
08/04/01 00:51:39
>>524
KKCに匹敵する恥晒しといてまだ粘着してるの? 恥ずかしいなら黙っていればいいのに。

> Even on systems without such a version of ps, it is unwise to assume that there are
> no other methods by which users can examine process environments.
たとえ、そのようなpsが無いシステム上でも、ユーザーがプロセスの環境変数を調べる他の方法が
無いと仮定するのは賢くありません。

526:488
08/04/01 02:06:50
・パスワードをファイルに保存してそれを引数に与える

とのことですが、
password.txt にpasswordを入力して
mysqldump -u root -p < password.txt
をしてみましたが、うまく動きませんでした。
なんとなくリダイレクト(の逆?)の使い方を間違っている気はします。
特にmysqldumpに限らず、
-pオプションが使えるその他のコマンドなどでも
共通で使えるセキュアな方法を取りたいのですが、
具体的にどんな記述にすればよかとでしょうか?

527:名無しさん@お腹いっぱい。
08/04/01 04:02:15
>>523


528:名無しさん@お腹いっぱい。
08/04/01 07:27:08
>>524
>>518 が言ってる通りSolarisだろな。patchも割りと最近のものだし。
そう頻繁にpatch当てられない環境とか、あえて古いバージョンのまま使わなければ
ならない環境とかありそうだし、古いpsは結構残っているのでは。

529:名無しさん@お腹いっぱい。
08/04/01 07:36:05
ucbにあるやつでは一番使うコマンドだな。


530:名無しさん@お腹いっぱい。
08/04/01 10:02:05
>>526
通常、パスワードは/dev/ttyをオープンしてそこから読むので、リダイレクトしても駄目。
他のコマンドでも共通で使えるセキュアな方法はexpect(もしくはそれに類する、擬似端末
から流し込める)コマンド。

>>528
自称セキュリティ研究者の厨房が騒ぎ立てるまでは、環境変数が読めるのが仕様だった。
今でも*BSDは厨房の戯言として相手にしていない。
こんな基本的なことも知らないのが複数人いるはず無いので、自演の可能性9割だな。
自演までして恥ずかしくないの?
しかもpsだけの問題じゃないという事も指摘されてるのに、恥ずかしいなら引っ込んでなよ。

531:名無しさん@お腹いっぱい。
08/04/01 13:05:06
>>530
>>523

すでに別の最適解が示されてるのに、話戻して expectはないだろw 流れ欲嫁。

532:名無しさん@お腹いっぱい。
08/04/01 13:14:32
>>530
FreeBSDでは ps e で、自分以外のプロセスの環境変数は表示しないようになってるよ。
嘘書くんじゃない。

533:名無しさん@お腹いっぱい。
08/04/01 13:15:56
>>531
恥ずかしいなら黙ってればいいのに。
my.cnfはその他のコマンドで共通に使えるのか?

>>526
> -pオプションが使えるその他のコマンドなどでも
> 共通で使えるセキュアな方法を取りたいのですが、

534:名無しさん@お腹いっぱい。
08/04/01 13:17:32
>>533

>>490
>expect以外のよい方法ってないでしょうか?

535:名無しさん@お腹いっぱい。
08/04/01 13:42:07
FreeBSDのpsが自分以外の環境変数を表示してたのは前世紀の話。変更は1999年。

536:名無しさん@お腹いっぱい。
08/04/01 14:07:07
「恥ずかしいなら引っ込んでなよ」が口癖の
>>530 氏の発言録:

(ps が他人のプロセスの環境変数を表示してしまう問題について)
>自称セキュリティ研究者の厨房が騒ぎ立てるまでは、環境変数が読めるのが仕様だった。
>今でも*BSDは厨房の戯言として相手にしていない。


要約すると、
「*BSDでは、psで他人のプロセスの環境変数を表示できても、それは仕様であって
それを問題視するのは自称セキュリティ研究者の戯言。
今でも*BSDではpsで他人のプロセスの環境変数を表示できる」


恥ずかしいですかwww

537:名無しさん@お腹いっぱい。
08/04/01 14:13:09
>>530は取り下げよう。俺は恥は知っているからな。

538:名無しさん@お腹いっぱい。
08/04/01 14:26:28
>>536
この人にとっての今はだいたい10年前と思うと辻褄が合う気がする。

>>537
> psだけの問題じゃない
も取り下げということでいいのか?

psのsetuidを落とすのがworkaroundということは普通に考えれば
ps固有の問題ということになると思うのだが。
違うなら違うでいいので具体例を出すなりして立証してくれ。
まさか引用した箇所にそう書いてあるからそうなんだとか言わんよな。

539:名無しさん@お腹いっぱい。
08/04/01 14:30:05
psがsetuidで動作していたのっていつの時代? それも10年前かw

540:名無しさん@お腹いっぱい。
08/04/01 14:55:01
平ユーザが ps e で他ユーザの環境変数が見えない OS でも、
実行したのが root なのであれば見えるでしょ。
別ホストで動いている mysql に接続しようとしていて、
そのホストの root がその mysql の権限を持ってないのであれば、
mysql のパスワードは root に知られちゃマズいわけで、
やっぱり環境変数でパスワードを渡すのはよろしくない。
もっとも、それをいったら chmod 600 my.cnf も同じだけどな。


541:名無しさん@お腹いっぱい。
08/04/01 14:58:03
>>538
> psだけの問題じゃない
これはmysqlが言っていること、

URLリンク(www.google.com)
これらが安全だと示してくれればオレは取り下げる。もしくは「環境変数は安全」という仕様でもよい。

542:名無しさん@お腹いっぱい。
08/04/01 15:02:51
>>541
> オレは取り下げる
というのは「オレが(も)主張する」が前提だよな。当然その立証が先。

543:名無しさん@お腹いっぱい。
08/04/01 15:05:17
途中で送ってしまった。

>>541
> オレは取り下げる
というのは「オレが(も)主張する」が前提だよな。当然その立証が先。
それができなきゃ取り下げざるを得ないのであって、安全だと示してくれれば
などと条件をつけられる立場ではない。

544:名無しさん@お腹いっぱい。
08/04/01 18:32:47
>>543
話そらすなよ。
名無しのお前が環境変数は安全だと主張している。
mysqlの公式ドキュメントは安全だと考えていない。

権威の無いお前が安全だと立証しろ。

545:名無しさん@お腹いっぱい。
08/04/01 23:15:20
>>540
rootが信用できないマシンに重要な情報を置くな。
(環境変数以前の問題でしょ?)

546:名無しさん@お腹いっぱい。
08/04/02 01:32:52
>>539
かなり昔前からkmemグループによる管理だぞ。
もう20年近く立っているはず。

最近/procがいい加減なことが多いが。

547:名無しさん@お腹いっぱい。
08/04/02 06:59:36
>>546
psがkmemグループ(setgid)で動作していたのっていつの時代? それも10年前かw

548:名無しさん@お腹いっぱい。
08/04/02 08:12:22
>>544
自分で証明できないものだから権威とやらに頼るとは、まさしくこれだな

>>538
> まさか引用した箇所にそう書いてあるからそうなんだとか言わんよな。

話をそらしているというか露骨に逃げてるのは君の方だ。
この議論において根拠を提示できないなら意味がない。
恥を知っているというのは口先だけだったな。

549:名無しさん@お腹いっぱい。
08/04/02 11:12:51
>>548
多くの人がレビューした文書と、名無しのお前の主張じゃぶっちぎりでお前のほうが信憑性が低い。
お前が立証しろ。当たり前だ。

550:名無しさん@お腹いっぱい。
08/04/02 13:16:10
議論というのは発言者が誰であれ根拠に基づいて行うのが当たり前。
勝負あったな。

551:名無しさん@お腹いっぱい。
08/04/02 13:33:58
つか本人が言ってたよね。

> 自称セキュリティ研究者の厨房が騒ぎ立てるまでは、環境変数が読めるのが仕様だった。

それが脆弱性としてアドバイザリまで出されてるってことは
今(10年前ではないw)は他人の環境変数は読めないのが仕様ってことでしょ。
違うというなら仕様として他人の環境変数読めるものを出してみろと。

552:名無しさん@お腹いっぱい。
08/04/02 13:36:36
psに限らず、が抜けてた。

553:名無しさん@お腹いっぱい。
08/04/02 15:17:59
質問があります。

shまたは、bashで、makeのように、
2つのファイルを比較して、新しいファイルが生成されている
時だけ処理をしたいのですが、shellへの理解が足りない
ためにうまく動かないので、教えてもらえると助かります。

こんな感じです。

do_iconv(){
echo "mv ${i} ${i}.old"
echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}"
}

for i in *.html
if [ -e ${i}.old ]
then
if [[ ${i} -nt ${i}.old ]]
then
do_iconv
fi
else
do_iconv
fi
done

554:名無しさん@お腹いっぱい。
08/04/02 15:31:28
>>553
> echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}"
した時点で、${i}の方が常に${i}.oldより新しくなるじゃないか。

本当は何がしたいんだ?

555:名無しさん@お腹いっぱい。
08/04/02 15:53:19
>>554
それより前に if [[ ${i} -nt ${i}.old ]] で比較してるだろ。
わからないなら黙ってろ。

556:名無しさん@お腹いっぱい。
08/04/02 15:54:56
>>553
for i in *.html
の次の行に
do
が抜けてる。

557:553
08/04/02 15:55:02
>> 554
本当は、上記に書いてますがシェルスクリプトでmake
みたいなことがしたいです。

ちなみに、
>> echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}"
>した時点で、${i}の方が常に${i}.oldより新しくなるじゃないか。
で、ハッとして touch ${i}.old をiconvの後にしてみましたが
変わりません。

$ ls -la --time=ctime *.html
-rw-r--r-- 1 foo bar 5388 2008-04-02 14:23 SandBox.html
-rw-r--r-- 1 foo bar 4323 2008-04-02 14:06 Travel.html

$ ls -la --time=ctime *.old
-rw-r--r-- 1 foo bar 5374 2008-04-02 14:06 SandBox.html.old
-rw-r--r-- 1 foo bar 3334 2008-04-02 14:06 Travel.html.old

のようなときに、SandBox.htmlだけ iconv 処理をしたいのです。


558:名無しさん@お腹いっぱい。
08/04/02 15:56:54
>>553

とりあえずforにはdoつけろな。


559:553
08/04/02 15:58:24
>> 556
御指摘ども、本当のスクリプトには入れてます。

いまは要点だけ抜き出すと、下記のような感じにしています。

do_iconv(){
echo "mv ${i} ${i}.old"
echo "iconv -f euc-jp -t utf-8 < ${i}.old > ${i}"
echo "touch ${i}.old"
}

for i in *.html
do
if [ -e ${i}.old ]
then
if [[ ${i} -nt ${i}.old ]]
then
do_iconv
fi
else
do_iconv
fi
done


560:名無しさん@お腹いっぱい。
08/04/02 16:01:10
>>557
おい、--time=ctime かよ。mtimeじゃなくて。

シェルの[[ ]] の -nt では、ctimeでの比較はできない。
mtimeのみ。
本当にctimeでやりたいんなら無理。

561:名無しさん@お腹いっぱい。
08/04/02 16:06:09
えっと、次は、
> うまく動かない
の中身プリーズ。


562:名無しさん@お腹いっぱい。
08/04/02 16:06:49
>>561
>>560

563:553
08/04/02 16:22:10
>> 561

うまくいかないの、ココロは、意図は、SandBox.htmlだけ iconv したい
のですが、プログラムは SandBox.html および Travel.html の
両方を iconv しようとします。

>> 560

ctimeはダメですか。リダイレクトでファイルを作るから、ctimeでないと
ファイルの作成時刻を比較できないと思ってました。がーん、他の方法
を考えなくては


564:名無しさん@お腹いっぱい。
08/04/02 16:24:32
makeを使えばいいんじゃないか?

565:553
08/04/02 16:27:05
>> 564
はい。makeを使うことを考えます。
ありがとうございました>みなさん

566:名無しさん@お腹いっぱい。
08/04/02 16:31:00
>>564-565
アフォか。
makeだって mtimeで比較するよ。
ctimeでの比較が必須なら make使ったって問題は解決しない。

(ctimeの意味を誤解していて、実はmtimeでもOKなら話は別だが)


567:名無しさん@お腹いっぱい。
08/04/02 16:37:06
>>563
>リダイレクトでファイルを作るから、ctimeでないと
>ファイルの作成時刻を比較できない

は誤解してるようだね。

だとすると mtimeで比較して問題ないことになる。
とすると、>>559 のスクリプトでうまく動いているはず。
うまく動いているのに、>>557 で --time=ctime で見ているもんだから、
うまく動いていないと思い込んでいるだけ、というオチ。


568:名無しさん@お腹いっぱい。
08/04/02 16:39:24
汚いシェル関数だなぁ。echo消せ。引数使え。

569:名無しさん@お腹いっぱい。
08/04/02 16:50:19
[ ] と [[ ]] が同居するスクリプトを初めて見た。どっちかに統一しろよ。
[ ] の方推奨だが。
testの -nt は純正シェルでは使えない。
${i} なんて書くくらいなら "$i" って書け。
{ } 付けただけじゃスペース入りファイル名とかの問題回避できないぞ。

570:名無しさん@お腹いっぱい。
08/04/02 17:28:49
純正シェル(笑)

571:553
08/04/02 17:52:14
>> 567
誤解してました。
>> 568
shell関数まで添削してもらえるとは恐縮です。
>> 569
ありがとう。[[ ]]ではなく[ ] を使います。

あと、"$i"の記法はshellの本を注意深く読んだらちゃんと書いてありました。
下記のように直して、実行したら意図どおりに動いてます。m(_"_)m
==========================================
#/bin/bash -x
do_iconv(){
mv $1 "$1".old
/usr/bin/iconv -f euc-jp -t utf-8 < "$1".old > $1
touch "$1".old
}
for i in *.html
do
if [ -e "$i".old ]
then
if [ "$i" -nt "$i".old ]
then
do_iconv "$i"
fi
else
do_iconv "$i"
fi
done
======================================


572:553
08/04/02 17:52:54
bash -x の実行例
+ for i in '*.html'
+ '[' -e SandBox.html.old ']'
+ '[' SandBox.html -nt SandBox.html.old ']'
+ do_iconv SandBox.html
+ mv SandBox.html SandBox.html.old
+ /usr/bin/iconv -f euc-jp -t utf-8
+ touch SandBox.html.old
+ for i in '*.html'
+ '[' -e Travel.html.old ']'
+ '[' Travel.html -nt Travel.html.old ']'
+ for i in '*.html'


573:名無しさん@お腹いっぱい。
08/04/02 19:12:56
>>554の言うように、
"$i".oldの方を編集しない限り、
必ず"$i"の方が新しいのに、(iconvの結果)
> if [ "$i" -nt "$i".old ]
してる。逆に"$i".oldを編集したら何も行われない。

仕様を日本語で書いたらどうか?

たぶん.iconvedを作って、
"$i"と時間比較して新しいものだけiconv、
最後に必ずtouch .iconved、
これでやりたいことに合うんじゃないか?


574:名無しさん@お腹いっぱい。
08/04/02 19:43:56
>>573
その問題は、

>>557
>touch ${i}.old をiconvの後にしてみましたが

で解決済。

というか、>>571 で、「実行したら意図どおりに動いてます。」
ですべて解決済なんだから、これ以上言うことはない。


575:名無しさん@お腹いっぱい。
08/04/02 20:00:06
カレントディレクトリが
/abc/def/ghi/jkl/mno/pqr/stu/
とフルパスであったときに一番最後の部分(stu)を取り出したいのですが
どのように書けばよいのですか


576:名無しさん@お腹いっぱい。
08/04/02 20:18:40
basename /abc/def/ghi/jkl/mno/pqr/stu/

577:名無しさん@お腹いっぱい。
08/04/02 20:19:16
basename `pwd`

578:名無しさん@お腹いっぱい。
08/04/02 21:33:15
>>551
はいはい、それがお前が出した唯一の根拠ね。
で、それが何かの標準になってるのか?

ところで、>>516ので試みた捏造に関しての弁明はどうした?

579:名無しさん@お腹いっぱい。
08/04/02 21:49:00
まだやってんのかw

580:sage
08/04/05 16:40:16
リナックス等の研究やってます。
URLリンク(www.ine.sie.dendai.ac.jp)
URLリンク(www.ine.sie.dendai.ac.jp)

581:名無しさん@お腹いっぱい。
08/04/10 07:37:45
シェルスクリプトから以下のようなテキストを呼びだして、
環境変数を展開した上で、位置変数に set したいのですが、
お知恵を拝借したく、どうかよろしくお願いします。

$ cat test.txt
$HOME/doc/

いまは、シェルスクリプト内部で、 sed -e 's/\$HOME/$HOME/g' のようにしています。


582:名無しさん@お腹いっぱい。
08/04/10 07:40:42
>>581
eval set `cat < test.txt`

583:581
08/04/10 08:20:51
>>582
どうもありがとうございます!

eval を使ってもう一度、$HOMEを変数展開をするのですね。
独力では全く思いつきませんでした。
本当にありがとうございました。


584:名無しさん@お腹いっぱい。
08/04/10 08:25:30
>>582
catが無駄です。

585:名無しさん@お腹いっぱい。
08/04/10 08:28:30
>>584
catなしでどう書くの?

586:名無しさん@お腹いっぱい。
08/04/10 08:29:07
eval set `< test.txt`

587:名無しさん@お腹いっぱい。
08/04/10 09:30:12
はいはい。bash依存。

588:名無しさん@お腹いっぱい。
08/04/11 08:28:49
質問です!
timeコマンドの結果をファイルに出力したいのですが、
どうやっても0バイトで出力されます。

以下、やってみたことを記載します。
$ time sleep 1
real 0m1.004s
user 0m0.000s
sys 0m0.001s
$ time sleep 1 > hoge.dat
real 0m1.439s
user 0m0.000s
sys 0m0.001s
$ cat hoge.dat
$ time sleep 1 > hoge.dat 2>&1
real 0m1.009s
user 0m0.000s
sys 0m0.001s
$ cat hoge.dat

やってみたこと以上です。

なぜ出力されないのでしょうか?どのようにすれば出力されますでしょうか?


589:名無しさん@お腹いっぱい。
08/04/11 08:32:44
>>588
bash使ってるだろ。
timeはbashの特殊な内部コマンドで、リダイレクトできない。
解決するには一旦サブシェルを通す。

$ (time sleep 1) 2> hoge.dat

590:名無しさん@お腹いっぱい。
08/04/11 11:19:02
>>588
/usr/bin/timeならファイルに出力できるよ。

591:名無しさん@お腹いっぱい。
08/04/11 11:37:22
>>590
>>589

/usr/bin/time は表示書式が違う

592:名無しさん@お腹いっぱい。
08/04/11 14:39:52
\time


593:名無しさん@お腹いっぱい。
08/04/11 14:40:30
bashってtimeが内部コマンドなのかw


594:名無しさん@お腹いっぱい。
08/04/11 14:44:15
正確には shell keyword

595:名無しさん@お腹いっぱい。
08/04/11 14:50:22
あれ?
マニュアルではtimeじゃなくて、timesになっているけど?

596:名無しさん@お腹いっぱい。
08/04/11 14:51:30
>>595
ぉぃぉぃ、timesとtimeは全く別のコマンド

597:名無しさん@お腹いっぱい。
08/04/11 14:58:21
times Print the accumulated user and system times for the shell and
for processes run from the shell. The return status is 0.

ごめん。マニュアル読んだだけでは何が違うのか分からん。
それに、timeの項目自体が見つからんし。


598:名無しさん@お腹いっぱい。
08/04/11 15:05:56
bash なら help time

599:名無しさん@お腹いっぱい。
08/04/11 15:06:37
man bash なら Pipelines の節。

600:名無しさん@お腹いっぱい。
08/04/12 00:11:45
しぇるすぷりくとでHTML書いて
ボタン押したらhoge.shを実行したい

ヒントください><;

601:名無しさん@お腹いっぱい。
08/04/12 01:02:36
>>600
実行環境を限定しなさい。
OSは? httpサーバは? 使用可能なCGIは? CGI実行時のセキュリティ要件は?

602:名無しさん@お腹いっぱい。
08/04/12 01:29:51
OS: FreeBSD 6.3-RELEASE-p1
http: Apache HTTP Server 2.2.8
CGI: This is perl, v5.8.8 built for i386-freebsd-64int
セキュリティ要件: 無し

603:名無しさん@お腹いっぱい。
08/04/12 01:40:48
>>600
すみません、日本語でお願いします。

604:名無しさん@お腹いっぱい。
08/04/12 02:00:52
日本語で書いたつもりなのに文字化けしてるんですか?><

605:>>588
08/04/12 06:09:32
>>589
ありがとうございます。


606:名無しさん@お腹いっぱい。
08/04/12 06:21:07
これシェルスクリプトの話か・・・?

607:名無しさん@お腹いっぱい。
08/04/12 07:16:24
>>601
答えられないくせに実行環境だけ聞くなよ。
実行環境あまり関係ないだろ。

608:名無しさん@お腹いっぱい。
08/04/12 07:24:57
>>600
エスパーすると、Webのフォーム入力でシェルスクリプトを入力して
[送信]ボタンを押すと、そのシェルスクリプトが実行されて、
実行結果がWeb上に表示される、って感じのものを作りたいのかな?

609:名無しさん@お腹いっぱい。
08/04/12 09:21:01
エスパーじゃなくてもシェルスクリプトでCGIプログラム作りたいという事はわかる、>>601が無能なだけ。
>使用可能なCGIは?
この質問に至っては噴飯ものだ。 CGI/1.1と答えればいいのだろうか?

>>600
CGIというサーバー上でプログラムを動かす仕組みがあるから、検索してわからない事があったらまた来なさい。

610:名無しさん@お腹いっぱい。
08/04/12 09:52:37
>>609
「シェルスクリプトでCGIプログラム作りたい」のじゃなくて、(さすがにそれは知ってるだろ)
ユーザーがWeb上で入力したシェルスクリプトを実行してくれるような
CGIを作りたいんじゃないのか?

611:名無しさん@お腹いっぱい。
08/04/12 10:26:00
まぁまぁ、ここは有能な>>609に任せておいたらどうだ

612:名無しさん@お腹いっぱい。
08/04/12 10:38:47
>>610
>>600からそこまで読み取れるなんて想像力がたくましいな。
でも俺に聞かれても困る。元質問者に聞いてくれ(そして、板違いだからwebprog行け)
それとも「CGIを作る? CGI/1.2とかいう新しい規約でも作りたいのか?」と突っ込んで欲しいのか?

>>611 == >>601だな。無能という事実を突きつけられて悔しかったのか?
> 使用可能なCGIは?
この質問で意図した事を答えてみろ。

613:名無しさん@お腹いっぱい。
08/04/12 10:43:06
hoge.sh は実在します。例示には example.com 等を使いましょう。

614:名無しさん@お腹いっぱい。
08/04/12 10:51:55
>>612
> >>611 == >>601だな。
違うよ。

615:名無しさん@お腹いっぱい。
08/04/12 11:11:59
>>602 読むと、CGI自体はperlで作るらしいから、
>>610 の解釈が正しそうだな

616:名無しさん@お腹いっぱい。
08/04/12 11:53:43
saryのように高速でかつgrep並みの正規表現検索ができるユーティリティってありませんかね?
libstreeとか使って誰か作ってそうな気がするんですが、ぜんぜん見つかりません

617:名無しさん@お腹いっぱい。
08/04/12 21:54:43
hoge.sh はドメインじゃなくて スクリプト名では・・・

618:名無しさん@お腹いっぱい。
08/04/12 22:01:28
ネタにマジレス

619:名無しさん@お腹いっぱい。
08/04/12 23:54:44
実際にwhoisしてみると、空いているらしい。>hoge.sh


620:600
08/04/13 00:33:33
>>602
|しぇるすぷりくとでHTML書いて
$create.sh > /usr/local/www/html.html

$cat create.sh
#!/bin/sh
echo \<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\>
echo \<HTML LANG=ja\>
echo \<HEAD\>
echo \<meta http-equiv=\"content-style-type\" content=\"text/css\"\>
echo \<META HTTP-EQUIV=Content-Type CONTENT=\"text/html\; charset=EUC-JP\"\>
echo \<META name=\"generator\" content=\"shell script\"\>
echo \<LINK REV=made HREF=\"mailto:yourmailaddress@your.mail.domain.com\"\>
echo \<LINK REL=contents HREF=\"./index.htm\"\>
echo \<LINK REL=stylesheet HREF=\"./default.css\" TYPE=\"text/css\" TITLE=\"./default.css\" MEDIA=\"screen,tv\"\>
echo \<TITLE\>sample\</TITLE\>
echo \</HEAD\>
echo \<BODY\>
echo \<FORM ACTION=\"/cgi-bin/hoge.cgi\" METHOD=\"POST\" ENCTYPE=\"text/plain\" LANG=\"ja\"\>
echo \<div\>\<INPUT TYPE=\"submit\" TABINDEX=\"0\" ACCESSKEY=\"S\"\>\</div\>
echo \</FORM\>
echo \</BODY\>
echo \</HTML\>

|ボタン押したらhoge.shを実行したい
セキュリティ要件:なしなら、perlスクリプト内に以下のように書けば...
$list[0] = "hoge.sh"
system "/bin/sh", @list;


621:名無しさん@お腹いっぱい。
08/04/13 07:32:30
>>620
お前 >>600 じゃなくて >>601 だろ。
echoが無駄です。echoは1個だけでできます。
perlのsystemでも、一旦listに入れるのが無駄です。
あと、そもそも >>600 の質問意図とは違うと思います。

622:名無しさん@お腹いっぱい。
08/04/13 10:30:33
echo1つで済むつーか、catとヒアドキュメントの出番じゃね?


623:名無しさん@お腹いっぱい。
08/04/13 10:37:58
ヒアドキュメントはテンポラ作るから嫌い。echo 1つがスマート。

624:名無しさん@お腹いっぱい。
08/04/13 11:44:04
テンポラリ作るとまずいことでもあるんですか?

625:名無しさん@お腹いっぱい。
08/04/13 11:51:04
>>623
どこにできるんだ?

626:名無しさん@お腹いっぱい。
08/04/13 12:16:26
>>624
意味もなくHDDに書き込むのが無駄。

>>625
教えて欲しければ「教えてください」と家。
普通は /tmpにできる。シェル側からすぐに unlinkされるから
lsでは見えないけど。トレースすればわかる。

627:名無しさん@お腹いっぱい。
08/04/13 12:57:52
>626
実装による?

Linuxのzshとbashで
strace cat <<HOGE
hoge
HOGE
としてみたけど別にテンポラリファイル作ってなかった。
fd3番以降を開いてるのは共有ライブラリのリンク時くらい。
"hoge¥n"のreadは0から。
dupとかなかったから、ファイル開いてリダイレクト処理をしたわけでもないな。


628:名無しさん@お腹いっぱい。
08/04/13 13:18:32
>>627
トレースが下手だな

catをstraceしてもしょうがないだろ。
bashやzshをstraceすること。
catに渡される時にはすでにunlinkされてるから、
catをstraceしても見つからないはず。

629:名無しさん@お腹いっぱい。
08/04/13 13:35:53
(bashの場合)

$ strace -f bash -c 'cat << EOF
hoge
EOF
'

(中略)
:
[pid 11486] open("/tmp/sh-thd-1208089889", O_RDONLY|O_LARGEFILE) = 4
[pid 11486] unlink("/tmp/sh-thd-1208089889") = 0

テンポラリファイル作ってるね。


(zshの場合)
$ strace -f zsh -c 'cat << EOF
hoge
EOF
'

(中略)
:
open("/tmp/zsh6MaAd3", O_RDONLY|O_NOCTTY|O_LARGEFILE) = 3
unlink("/tmp/zsh6MaAd3") = 0

テンポラリファイル作ってるね。

630:名無しさん@お腹いっぱい。
08/04/13 13:36:32
$ strace -o bash.log bash
bash-3.1$ cat <<HOGE
> hoge
> HOGE
hoge
bash-3.1$ exit
$ egrep '(creat|unlink)' bash.log
(なにもなし)

だめか。どうやって確認すればいいか、正しいやり方を教えてけろ。


631:名無しさん@お腹いっぱい。
08/04/13 13:37:09
あああ、-fか。理解。



632:名無しさん@お腹いっぱい。
08/04/13 16:38:06
/tmpの日付見ればいいんじゃないの?

633:名無しさん@お腹いっぱい。
08/04/13 16:59:54
catだとすぐ終了しちゃうから、tail -fを使うと良い。

$ tail -f << EOF
hoge
EOF

ってやっておいて、別のxtermから、

$ lsof | grep tail

ってやると、(deleted)って表示されてる /tmp以下の一時ファイルがあるのがわかる。

634:名無しさん@お腹いっぱい。
08/04/13 17:23:23
>>632
それだけだと、無関係のプロセスが/tmpをいじくった可能性が残る。


635:名無しさん@お腹いっぱい。
08/04/13 17:33:54
忙しくないマシンで何回かやれば可能性は実用上0になるだろ

636:名無しさん@お腹いっぱい。
08/04/13 17:36:00
それで満足ならいいんじゃね?


637:名無しさん@お腹いっぱい。
08/04/13 17:59:36
>>633 がもっといい方法示してるじゃないか。

638:名無しさん@お腹いっぱい。
08/04/13 19:53:17
>>626
礼儀知らずで申し分けありませんでした。テンポラリファイルを作るというこ
とは、シングルユーザーモードなどで、リードオンリーファイルシステムだと
here doc を使ったシェルスクリプトは動かないということでしょうか?


639:名無しさん@お腹いっぱい。
08/04/13 20:15:12
エディタの置き換えでも出来る事なのですが良ければ教えてください

わるs
わるk
わるi
わりこn
わりこm
わりあt
じょうち
じょうちょう
じょうなん
のように語尾にアルファベットが付いているのと付いてないのがあるんですけど
アルファベットを削除する方法とかってSEDではどのようにするのでしょうか?


640:名無しさん@お腹いっぱい。
08/04/13 20:20:09
>>639
sed 's/[a-z]$//'

641:名無しさん@お腹いっぱい。
08/04/13 20:56:04
>>586-587
bash依存じゃないだろ。kshでも使えるから、標準で使っていいんじゃないの?

642:名無しさん@お腹いっぱい。
08/04/14 02:04:22
>>641
読まずにりぷらい、まあ、もちつけ共通拡張かも知れないだろ。
POSIXに規定されているか読みなおすんだ。

643:名無しさん@お腹いっぱい。
08/04/14 13:18:12
配列の値の設定ってバックスラッシュか何かで
複数行にまたがって書くことはできないのでしょうか?

644:名無しさん@お腹いっぱい。
08/04/14 13:36:12
>>643
できる。シングルクォートを使うのがいい。

$ hoge=('aaa
aaa
aaa'
'bbb
bbb
bbb')
$ echo "${hoge[0]}"
aaa
aaa
aaa
$ echo "${hoge[1]}"
bbb
bbb
bbb


645:名無しさん@お腹いっぱい。
08/04/14 14:56:04
>>644
どうもありがとうです

646:名無しさん@お腹いっぱい。
08/04/14 15:00:53
はいはい、バッシュ依存。

647:名無しさん@お腹いっぱい。
08/04/14 21:22:58
kshでも使えるからデファクトだろ?

648:名無しさん@お腹いっぱい。
08/04/15 13:24:12
Solaris8上でBourne Shellを用いてスクリプトを書いています。
dateコマンドを整形する際にシングルクォートで括りますが、
$ echo `date '+%H%M`
などとしても通ってしまうのは何故なんでしょうか?

649:名無しさん@お腹いっぱい。
08/04/15 13:54:55
>>648
Solarisのバグです。シングルクォートはちゃんと閉じましょう。

650:名無しさん@お腹いっぱい。
08/04/15 20:40:12
シェルを始めたのですが、変数でいきなり詰まりました ><
$i = 123;
=: command not found
もしかしてシェルでは = は外部コマンドなんでしょうか?

651:名無しさん@お腹いっぱい。
08/04/15 20:47:30
何シェルかくらいかこうぜ・・・

i=123

652:名無しさん@お腹いっぱい。
08/04/15 20:49:37
>>651
今度はこうなります
i = 123
i: command not found

653:名無しさん@お腹いっぱい。
08/04/15 20:57:39
>>651のをコピペしな

あと、何シェルかくらいかこうぜ・・・

654:名無しさん@お腹いっぱい。
08/04/15 21:03:03
>>653
この場合何シェルか関係あるか??

655:名無しさん@お腹いっぱい。
08/04/15 21:24:30
関係有るから指摘している。
が、cshだったら他所へ行ってくれ。

656:名無しさん@お腹いっぱい。
08/04/15 21:26:27
cshだったらエラーメッセージが違うじゃん。回答者はそれくらい見抜かないと。

657:名無しさん@お腹いっぱい。
08/04/15 21:27:17
>□お約束
>・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
> bash/zsh/ksh/ashなどに依存する場合は明示しましょう。


658:650
08/04/15 21:30:24
#!/bin/shです。
i = 123;
ってやっても、やっぱり
i: command not found
と出ます><

659:名無しさん@お腹いっぱい。
08/04/15 21:31:33
650はネタなのかマジなのか。

660:名無しさん@お腹いっぱい。
08/04/15 21:50:24
シェルでは = は比較を表す (例: [ $i = 123 ] )
代入は := で。

661:名無しさん@お腹いっぱい。
08/04/15 21:50:27
i = 123でなくてi=123です。スペースを入れてはいけません。

662:名無しさん@お腹いっぱい。
08/04/15 22:08:02
ネタはほっとけ。

663:名無しさん@お腹いっぱい。
08/04/16 08:48:00
質問させて下さい。

あるディレクトリ以下の、特定の拡張子(.tig)をもつファイルの(find ./ -name "*.tig")
名前を変えて( hoge.tig -> hoge_org.tig)
その二つの名前を与えたコマンドを実行したいです。( hoge -t hogu hoge_org.tig hoge.tig)

for org_name in `find ./ -name "*.jpg"`
do
$name = $org_name + "_org";
echo $org_name; echo $name;
done

と言うのを考えてみたのですが、エラーでうまく行きません。
あと、拡張子の前に名前を追加したいのですが、実現方法が分かりません。

もしよろしければ、教えて頂けると助かります。
よろしくお願いします。


664:名無しさん@お腹いっぱい。
08/04/16 08:53:43
>>663
とりあえず、
$name = $org_name + "_org";
の部分のみに回答。
まず、perlみたいな書き方の癖はやめろ。

name=`basename $org_name .jpg`_org.jpg


あと、質問が、最初は .tigと言ってるのに下のfor文は .jpgで、矛盾してるぞ。

665:663
08/04/16 08:58:21
ありがとうございます。
それがわかれば、なんとかできそうです。

.jpgなのは、ローカルな環境でテストをしたため違うファイルを使っていました。



666:名無しさん@お腹いっぱい。
08/04/16 13:41:14
findでやってるから'/'含みのpathnameになる。
しかしbasenameは最後のコンポーネントだけ切り出してしまう。

name=`echo $org_name | sed 's/.jpg$/_org.jpg/'`

の方が良いと思われ。あるいは、

dir=`dirname "$org_name"`
org=`basename "$org_name"`
new=`basename "$org_name" .jpg`_.org.jpg
orgpath="$dir/$org"
newpath="$dir/$new"

667:名無しさん@お腹いっぱい。
08/04/16 18:41:06
phpのsystem関数から
シェルコマンドを実行を試してます。

lftp -f hoge.conf
rm hoge.conf
したいのですが、
lftp -f hoge.conf がかなり時間がかかるため、
lftp -f hoge.conf > /dev/null & してから
rm hoge.conf を実行したいと思います。

system("lftp -f hoge.conf > /dev/null & rm 000 hoge.conf");
とすると
lftpが正常に実行されません。
おそらくrmがlftp完了前に実行されているからと思いますが、
どのように記述すれば良いでしょうか?

どなたかご教授くださいませ。


668:名無しさん@お腹いっぱい。
08/04/16 18:56:25
>>667
system("lftp -f hoge.conf > /dev/null ; rm hoge.conf");
じゃだめなの?

669:名無しさん@お腹いっぱい。
08/04/16 19:08:25
OSコマンドインジェクションを入れ込まないように気をつけろよ

670:名無しさん@お腹いっぱい。
08/04/16 19:08:44
& を何だと思ってるんだ

671:名無しさん@お腹いっぱい。
08/04/16 19:26:22
system("(lftp -f hoge.conf > /dev/null ; rm hoge.conf) &");
こうかな

672:667
08/04/16 19:36:29
>>668
これだと rm hoge.conf が lftp 完了前に実行されたようです

>>671
"("なんてしらねーよ、みたいなエラーが出てしまいました。

673:名無しさん@お腹いっぱい。
08/04/16 19:49:57
>>672
system("sh -c 'lftp -f hoge.conf > /dev/null ; rm hoge.conf' &");

674:667
08/04/16 20:08:22
>>673
神サンクスです!!それでいけました!

675:667
08/04/16 20:35:38
すいません、
いけたと思ったら、lftpが終わるまでブラウザで読み込みが続いてしまいます。

URLリンク(www.stackasterisk.jp)
----------------------------------------------
> /dev/null」 が「リダイレクト」に相当する記述です。
/dev/null というのは、「ゴミ箱」と思って頂いて構いません。
すべての出力を捨てます。
最後の & は、バックグラウンドで実行するという意味です。
このあたりの詳しいことは UNIX のシェルの本をみれば載っています。
「PHPはそのプログラムの実行が終了するまでハングします」というのは、
つまり IE の地球マークが廻りつづける状態をいいます。
----------------------------------------------
というのを参照しています。

676:名無しさん@お腹いっぱい。
08/04/17 02:33:27
ぐぐって得た付け焼き刃の知識をこねくるんではなく
一度基礎から勉強した方がよろしいかと。

677:名無しさん@お腹いっぱい。
08/04/17 08:36:16
>>675
結局jpgなんだねw


678:名無しさん@お腹いっぱい。
08/04/17 12:33:53
シェルスクリプトで関数計算とかできるの?

A= 2√3/0.0000456789*π+$hoge
echo $A

小数点以下なげーとか・・・・


679:名無しさん@お腹いっぱい。
08/04/17 12:47:28
>>678
$ hoge=123
$ echo "2*sqrt(3)/0.0000456789*(a(1)*4)+$hoge" | bc -l
238368.58352774053454525488

注: πは (a(1)*4) で表す。(atan(1) = π/4 を利用)

680:名無しさん@お腹いっぱい。
08/04/17 12:53:56
そういう場合はbcとか関数計算を行うプログラムに実行させる。

POSIXシェルならば整数の四則演算が行えるので、この上に(関数演算を含む)
浮動小数点演算を実装すればシェル単独でも可能。

681:名無しさん@お腹いっぱい。
08/04/17 13:00:42
>>679 少し分かりやすく
hoge=123
pi="(a(1)*4)"
echo "2*sqrt(3)/0.0000456789*$pi+$hoge" | bc -l

682:名無しさん@お腹いっぱい。
08/04/17 13:14:45
実例 >>679 が投稿された「あと」で、
実例示せずに能書きだけ書いてる >>680 ってマヌケだよなぁ。

683:名無しさん@お腹いっぱい。
08/04/17 14:29:32
「やりかた」を書くだけで間抜けなのか

684:名無しさん@お腹いっぱい。
08/04/17 14:33:27
具体的な「やりかた」を書いているのは >>679 の方。
>>680 は具体的な「やりかた」を何ひとつ書いていない、だから間抜け。

685:名無しさん@お腹いっぱい。
08/04/17 14:34:14
そんなことより、批判だけするやつのほうが・・

686:名無しさん@お腹いっぱい。
08/04/17 15:55:30
シエルで、フォントサイズを変えるのはどうやるんですか

A$ = "エラーが発生しました"
echo A$

のところで、「エラー」の文字だけ大きくしたいんですが

687:名無しさん@お腹いっぱい。
08/04/17 16:00:27
banner Error; echo 'が発生しました'

688:名無しさん@お腹いっぱい。
08/04/17 16:46:29
仮想端末のエスケープシーケンスにフォントサイズ変更があれば
「エラー」の前後にそのエスケープシーケンスを書けばいい。
色やブリンクの有無といった変更も同様。


689:名無しさん@お腹いっぱい。
08/04/17 19:13:26
スクリプトの神様

今日もありがとうございました
勉強になりました!!!


690:名無しさん@お腹いっぱい。
08/04/17 19:54:36
banner面白いなw

691:名無しさん@お腹いっぱい。
08/04/17 22:12:31
>>679 >>680 >>681 神よ! d(゚Д゚)☆スペシャルサンクス☆( ゚Д゚)b

さて、Excelを窓からブン投げるかw

692:名無しさん@お腹いっぱい。
08/04/18 01:03:30
このスレは定期的に神が現れるな。的確で即レス、何者なんだろ

693:名無しさん@お腹いっぱい。
08/04/18 01:38:31
>>686
少し目的からずれる気がするが、以前どっかのスレに
投下したスクリプトをちょっと改造したもの。

#! /usr/bin/env bash
# vivid_error.sh -- 標準エラー出力に色を付ける
# Original:
# URLリンク(d.hatena.ne.jp)

name='vivid_error.sh'
(( $# > 0 )) || {
echo "error: $name: No argument." 1>&2
exit 1
}

temp=$( mktemp "$TEMP/$name.$PID" )
rm -f "$temp"
mkfifo "$temp"

sed 's/.*/1m\0m/' < "$temp" 1>&2 &
"$@" 2> "$temp"
status=$?

rm -f "$temp"
exit "$status"

694:名無しさん@お腹いっぱい。
08/04/18 02:37:38
ESC=$(printf '\033')
とかするのおすすめ

695:名無しさん@お腹いっぱい。
08/04/18 08:19:53
terminfoなsystemじゃないとtputはないかも。

BOLD=`tput bold`
EXIT=`tput sgr0`
printf "${BOLD}This ${EXIT}is a ${BOLD}test${EXIT}.\n"

カラーも可能。
文字列加工はsed等で。


696:名無しさん@お腹いっぱい。
08/04/18 13:32:39
fifoなんていらないよね。

#!/bin/sh
# 標準エラー出力に色をつけてコマンドを実行
if [ $# -eq 0 ]
then
    echo "Usage: $(basename $0) command args..." 1>&2
    exit 1
fi

exec 3>&1
ESC=$(printf '\033')
"$@" 2>&1 1>&3 | sed "s/.*/$ESC[1;31m\0$ESC[0m/" 1>&2

697:名無しさん@お腹いっぱい。
08/04/20 18:50:18
初歩的な質問ですが
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
の様に変更したいのですが・・・
sed -i "s/^LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined/LogFormat \"%h %l %u %t \\\"%!414r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined/g" /root/test
で良い様に思うのですが・・・
"%h \"の様な所でエラーが出て変換ができません よろしくです

698:名無しさん@お腹いっぱい。
08/04/20 18:51:56
初歩的な質問ですが
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
の様に変更したいのですが・・・
sed -i "s/^LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined/LogFormat \"%h %l %u %t \\\"%!414r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined/g" /root/test
で良い様に思うのですが・・・
"%h \"の様な所でエラーが出て変換ができません よろしくです

699:名無しさん@お腹いっぱい。
08/04/20 18:53:14
なんとなくワロタ

700:名無しさん@お腹いっぱい。
08/04/20 19:48:07
>>698
まず、sedプログラム本体は " " じゃなくて ' 'で囲むこと。
" " だといろいろエスケープが面倒。

701:名無しさん@お腹いっぱい。
08/04/20 21:47:22
>>700
ありがとうございました 修正できました

702:名無しさん@お腹いっぱい。
08/04/20 22:34:02
シェルスクリプトでPerlとかRubyのchopと同等なことって、
どうすればいいですか?
bash限定でもかまいません。

703:名無しさん@お腹いっぱい。
08/04/20 22:42:41
>>702
シェルでは、何も考えなくても readとかで読み込んだら自動的に chopされてる。

704:名無しさん@お腹いっぱい。
08/04/20 23:31:00
>>703 さっきは、
「echo -nで改行が取れないなあ、あれ?」って状態で質問したのですが、
readでも取れませんでした。で、ようやく\r\n改行だったことに気づきました。
bashの%*\r*で解決しました。

705:名無しさん@お腹いっぱい。
08/04/21 00:26:14
質問させてください

テキストファイル内に

建造物 (けんぞうぶつ)
構築物 (こうちくぶつ)
構造体 (こうぞうたい)

()でくくられた文字のみを取り出したいのですが可能でしょうか?

706:名無しさん@お腹いっぱい。
08/04/21 00:36:23
>705
いくらでも方法はある。
sed、awk、perl あたりなら一行野郎でいける。

awk -F '\\(|\\)' 'length($2)>0{print $2}'


707:名無しさん@お腹いっぱい。
08/04/21 00:44:02
>>706
レスありがとうございます!
ちなみにsedだと、どういう風になりますか?


708:名無しさん@お腹いっぱい。
08/04/21 02:15:09
>>706
建造物 (けんぞうぶつ) 構築物 (こうちくぶつ) 構造体 (こうぞうたい)
こういうテキストのこともないかな。





709:名無しさん@お腹いっぱい。
08/04/21 02:19:44
$ echo '建造物 (けんぞうぶつ) 構築物 (こうちくぶつ) 構造体 (こうぞうたい)' | sed 's/[^(]*(\([^)]*\))/\1/g'
けんぞうぶつこうちくぶつこうぞうたい


710:名無しさん@お腹いっぱい。
08/04/21 18:20:49
多分、作りこまないと駄目だと思うんですが、駄目元で質問します。
`find .`の結果を各ディレクトリ毎に、
第1のソートキー:ディレクトリorファイルの別(ディレクトリが先)
第2のソートキー:更新時間の降順
でソートしたものが欲しいです。
ファイルブラウザとかだと、そういう表示が出来るので、
もしかすると、簡単におこなう方法があるのかな?と密かに期待してます。
宜しくお願いします。

711:名無しさん@お腹いっぱい。
08/04/21 18:56:59
普通に考えたら出来る

712:名無しさん@お腹いっぱい。
08/04/21 19:01:20
>>711
結果をファイルに出力してもいいのであれば、
find -type dでループを回していけばやれるのはわかっているのですが、
作業ファイルを介さずにそのままwhile readで受け取れるくらい
簡単な方法がないかな?と思って質問させて頂きました。

713:名無しさん@お腹いっぱい。
08/04/21 19:12:16
多分スクリプト言語使った方がいいと思う

714:名無しさん@お腹いっぱい。
08/04/21 19:19:38
>>713
ちょっとごめんなさい
ディレクトリは名前順でもいいです。
当初>>710で書いたよりはずっと簡単に実現できます。

715:名無しさん@お腹いっぱい。
08/04/21 19:19:44
>>711
そういうことはお前の考えた結果を貼ってから家。

716:名無しさん@お腹いっぱい。
08/04/21 19:26:48
>>714
「ディレクトリが先」という条件さえなければ、
単に ls -latR で行ける。findすらいらない。

>>712
結果をファイルに出力する方法でやる方法がわかってるなら、
それをファイルに出力しない方式に書き換えることは多分できる。

717:名無しさん@お腹いっぱい。
08/04/21 19:31:02
>>710
GNU ls使えば、
ls -latR --group-directories-first
で一発。


718:名無しさん@お腹いっぱい。
08/04/21 20:23:19
みなさんどうもありがとうございました。
結局(とりあえず)、
find -d でループを回して作業ファイルを作る方法にしました。
ディレクトリは名前順でファイルは更新時間降順にしました。
ちなみにGNU ls 5.21で--group-directories-firstはサポートされてませんでした。

719:名無しさん@お腹いっぱい。
08/04/21 21:04:47
find ... -print0|xargs -0 ...
と区切りをわざわざ^@にするのが推奨されてるのって何故なんですか?

720:名無しさん@お腹いっぱい。
08/04/21 21:13:18
他の文字はファイル名に使われてるかもしれないから。

721:名無しさん@お腹いっぱい。
08/04/21 21:55:46
-print0|xargs-0を使うのは石器人。
現代人なら-exec utility_name [argument ...] {} +

722:名無しさん@お腹いっぱい。
08/04/21 21:57:15
いまさら-execはちょっと…という気分
気分だけね

723:名無しさん@お腹いっぱい。
08/04/21 22:08:08
>>722
お前、行末の「+」の意味知ってて発言してるのか?

724:名無しさん@お腹いっぱい。
08/04/21 22:15:16
>>718
GNUコマンド群くらい最新にしとけよ。6.xなら使える。

725:名無しさん@お腹いっぱい。
08/04/22 02:59:08
>>724
バージョンアップできない(許可されない)環境って結構多いぞ。
(*nix系ならローカルに実行環境つくれば済む話だが)

726:名無しさん@お腹いっぱい。
08/04/22 07:04:01
>>725
もしそういう環境なら、GNU lsを入れること自体許可されないだろ。
(古いバージョンとは言え)GNU lsが入っているということは、
OS標準じゃないコマンドを自分でインストールしてもいい環境と考えられる。

727:名無しさん@お腹いっぱい。
08/04/22 10:39:16
システム構築時にGNU系を入れて構築、運用開始した後、
バージョンアップの費用(現システムの稼働確認費用)が認められないため、そのままってパターンが多い。

そういうトコだと、ローカルに新版lsをコピーしてくる方が(手続き的に)楽だったり。

728:名無しさん@お腹いっぱい。
08/04/22 12:30:34
>>710
タイムスタンプが、
2008-04-22 12:30
こういう形式で、
$6, $7にあると仮定すれば、
ls -l | sort -k 6,7 | sort -sr
でいい。-sはstable sort。

729:名無しさん@お腹いっぱい。
08/04/22 13:27:05
>>728
それだと symbolic link が先頭に来てしまうので失格。

730:名無しさん@お腹いっぱい。
08/04/22 13:30:00
>>728
というか、せっかく sort -k 6,7 したあとで sort -sr したら
最初の sort -k 6,7 が無意味になってしまうし、全然ダメじゃん。

731:名無しさん@お腹いっぱい。
08/04/22 19:43:49
つ sort -srk 1,1

732:名無しさん@お腹いっぱい。
08/04/22 19:58:42
>>731
>>729
失格。

733:名無しさん@お腹いっぱい。
08/04/23 15:40:13
Apache の mod_ext_filter モジュールを利用したスクリプトを作成しています。

Apache --標準出力--> script --標準出力 --> Apache を行うスクリプトにて、
Apache からの標準出力を $temp_file に書き出して主な処理をした後に
cat $temp_file を行い Apache に返しているのですが、

#!/bin/sh

temp_file=`mktemp`
while read line
do
echo "$line" >> $temp_file
done

ファイル操作

cat $temp_file
rm -f $temp_file


上記コードだと、HTML ソースに \ $ ` などが入っていた際に、
echo "$line" >> $temp_file で意図せぬ動作が起きてしまいます。

またファイルに書き出す事で処理速度の低下も考えられるので、
Apache からの標準出力(複数行)を変数に格納する方法はないかと思ったのですが、

どなたかご教授ください。

734:名無しさん@お腹いっぱい。
08/04/23 20:08:40
>>733
それはシェルのreadの仕様だから仕方ない。
そもそも while readで読む必要ないだろ。

while do ... done の部分全部を、
cat > $temp_file
に置き換えればよろし。

735:733
08/04/23 20:31:31
>>374
おぉ、色々と勘違いしていたみたいですね。
ご指摘の方法でやってみたところちゃんとできました。
すみません、ほんと有難うございます。


736:733
08/04/24 00:18:33
733です。
度々すみません。

#!/bin/sh

temp_file=`mktemp`
cat > $temp_file

ファイル操作

cat $temp_file
rm -f $temp_file

確かにご教授いただいた上記コードで可能なのですが、
Apache からの標準出力をファイルに書き出さず、変数として処理する事は出来ないのでしょうか?

737:名無しさん@お腹いっぱい。
08/04/24 00:55:16
そんなに速度が気になるなら他の言語でやったほうがいい

738:733
08/04/24 01:45:55
>>737
ありがとうございます。
色々試行錯誤してみます。

739:名無しさん@お腹いっぱい。
08/04/24 06:52:22
>>736
その「ファイル操作」の内容が、

sed 's/hoge/boke/' < $temp_file

だとすると、そもそもcatは2つとも要らない。

#!/bin/sh
sed 's/hoge/boke/'

↑の2行だけでOK。
sedは、何も指定しないと標準入力から読んで標準出力に出すから。

740:名無しさん@お腹いっぱい。
08/04/24 06:56:05
>>736
一旦変数に入れたいなら、

tmp=`cat`

とする。これで変数tmpに入る。
参照する時は、

echo "$tmp"
とする。シェルに特殊文字を解釈されないように" "を付けるのを忘れないように。

741:名無しさん@お腹いっぱい。
08/04/24 19:36:45
>>739
返信ありがとうございます。
標準入力の内容によって条件わけがしたかったので、ご指摘の方法は断念しました。

>>740
返信ありがとうございます。おかげさまで出来ました。
一つ疑問が残るのですが、ダブルクォート (") は $ ` \ 以外を普通の文字として扱うと認識していますが。

# echo "`date`"
Thu Apr 24 17:55:30 JST 2008

# cat sample.html
<html>
<body>
`date`
</body>
</html>

# cat filter.sh
#!/bin/sh
temp=`cat`
echo "$temp"

# cat sample.html | sh filter.sh
<html>
<body>
`date`
</body>
</html>

なぜ echo "$temp" では ` が普通の文字として扱われているのでしょうか?
お恥ずかしい質問で済みません。

742:名無しさん@お腹いっぱい。
08/04/24 19:38:59
変数、サブシェルなどの展開は一度だけ。
再度展開したい時はeval。

743:名無しさん@お腹いっぱい。
08/04/24 20:15:21
>>742
eval をさっそく調べ、勉強になりました。
ありがとうございます。


744:名無しさん@お腹いっぱい。
08/04/25 00:26:56
質問させてください。
シェルスクリプトで16進数を2進数に変換するにはどうしたらいいでしょうか?


745:名無しさん@お腹いっぱい。
08/04/25 00:49:57
どうしてもシェルスクリプトというならこんな感じか。
最適なのはbc。sedだけでもできる。

h2b() {
for h in `echo $1 | sed 's/\(.\)/ \1/g'`; do
case $h in
0) echo -n 0000;;
1) echo -n 0001;;
2) echo -n 0010;;
3) echo -n 0011;;
4) echo -n 0100;;
5) echo -n 0101;;
6) echo -n 0110;;
7) echo -n 0111;;
8) echo -n 1000;;
9) echo -n 1001;;
a|A) echo -n 1010;;
b|B) echo -n 1011;;
c|C) echo -n 1100;;
d|D) echo -n 1101;;
e|E) echo -n 1110;;
f|F) echo -n 1111;;
esac
done
echo
}


746:名無しさん@お腹いっぱい。
08/04/25 00:54:10
>>755
あ、どうしてもってわけじゃないです。
コマンドとかありますか?何度もすいません。

747:名無しさん@お腹いっぱい。
08/04/25 01:17:50
bcで16進数を2進数に変換。
できそうでよくわからない・・・orz

748:名無しさん@お腹いっぱい。
08/04/25 01:18:21
bcならこんな感じかな、便利だね知らなかったよ。
echo "obase=2; ibase=16; $1" | bc

749:名無しさん@お腹いっぱい。
08/04/25 01:32:27
>>748
ありがとう。しかしながら
例えば 0xffffff00 これを10進数に変換したいと思い

echo "obase=10; ibase=16; 0xffffff00" | bc

とやってみましたがsyntax errorがでました・・・orz

750:名無しさん@お腹いっぱい。
08/04/25 01:40:21
頭に0xは付けずに,それから大文字で書かないといけないっぽい.

751:名無しさん@お腹いっぱい。
08/04/25 02:03:41
>>750
なるほど。ありがとうございました。

752:名無しさん@お腹いっぱい。
08/04/25 06:48:02
>>749
bcなんか使わなくても printfで一発だろww

$ printf '%d\n' 0xffffff00
4294967040


753:名無しさん@お腹いっぱい。
08/04/25 08:48:45
んっと、釣られとくけど、

志村ー

754:名無しさん@お腹いっぱい。
08/04/25 13:18:18
>>753
なにが釣りなのかわからないゆとりな俺にkwskたのむ

シェルスクリプトのtmtowtdiな感じって好きだ

755:名無しさん@お腹いっぱい。
08/04/25 13:28:34
printf(3)は二進がないからなあ。
printf(1)の%bは違う意味だし。

756:名無しさん@お腹いっぱい。
08/04/25 13:35:12
>>775
欲嫁。
>>749 は 16進→10進の質問。
>>752 はそれに最適解を答えている。

757:名無しさん@お腹いっぱい。
08/04/25 22:01:10
昨日質問した者です。ちょっと間違ってました。ごめんなさい。

正しくは ffffff00 これを 255.255.255.0 に変換したい。です。
これってできるのでしょうか?

758:名無しさん@お腹いっぱい。
08/04/25 22:09:13
簡単だね
>>757
$ hex=ffffff00
$ printf '%d.%d.%d.%d\n' `echo $hex | sed 's/../0x& /g'`
255.255.255.0

759:名無しさん@お腹いっぱい。
08/04/25 22:57:09
>>758
すごいなぁ。ありがとう。

760:名無しさん@お腹いっぱい。
08/04/26 12:50:24
>>758 これは(・∀・)イイ!! もれももらた

761:名無しさん@お腹いっぱい。
08/04/26 16:59:52
よく読まずに余計な突っ込みした >>753 は今ごろ赤面ww

762:名無しさん@お腹いっぱい。
08/04/28 17:23:56
>>761

kannke-nexekedo
お前のレスうざい

763:名無しさん@お腹いっぱい。
08/04/29 09:04:12
シェルで、拡張子の付いていないファイルを一発でワイルドカード指定するには
どうすればいいですか?

あるいは、何かのオプション変更とかで、
* で、hogeとかだけにマッチして、
hoge.hog にはマッチしないようにして、
*.* とやった時だけ hoge.hogにマッチするようにしたいんです。

764:名無しさん@お腹いっぱい。
08/04/29 09:43:06
一部シェル限定ならできる
一発でなくていいならできるようにはできる

765:名無しさん@お腹いっぱい。
08/04/29 11:18:22
>>764
kwsk

766:名無しさん@お腹いっぱい。
08/04/29 12:33:12
>>764 は、具体的な「やりかた」を書かない(書けない)知ったかの
>>680 と同一人物、に1俵。

767:名無しさん@お腹いっぱい。
08/04/29 12:39:25
>>765
シェルは何だ?
ワイルドカード使うシチュエーションは?カレントディレクトリだけなのか?
ファイルの表示ができればいいだけなのか?各ファイルに何かするのか?

>>766
あいにく違うな
1俵よこせ


768:名無しさん@お腹いっぱい。
08/04/29 12:43:35
>>767
じゃなくて、逆にその「できるシェル」を教えて欲しい。
シチュエーション関係なしに、すべての場合において
* が hoge.hogにはマッチしないようにしたい。

769:名無しさん@お腹いっぱい。
08/04/29 12:46:16
EXTENDED_GLOBつきのzshで*~*.*かな。

770:名無しさん@お腹いっぱい。
08/04/29 12:55:22
* 1個の動作を変えられるようなシェルはないかと思う

同じくzshで
setopt EXTENDED_GLOB
ls -d [^.]#


771:名無しさん@お腹いっぱい。
08/04/29 12:57:46
command.com

772:名無しさん@お腹いっぱい。
08/04/29 13:01:56
少なくとも >>766 だけうざいな

773:名無しさん@お腹いっぱい。
08/04/29 13:50:40
シェルを秘密にしたいのだからエスパースレに行くべきだな。
全ての場合を見通して答えてくれるエスパー様(>>766)に任せよう。

774:名無しさん@お腹いっぱい。
08/04/29 13:58:03
できるシェルを教えてくれっていう質問だから、
シェルを秘密にしてるのとは違うかと

775:名無しさん@お腹いっぱい。
08/04/29 20:45:09
よく読まずに余計な突っ込みした >>773 は今ごろ赤面ww

776:名無しさん@お腹いっぱい。
08/04/29 21:08:40
>>775
お前のレスうざい


777:名無しさん@お腹いっぱい。
08/04/29 21:32:45
OSを秘密にしているのだから、エスパー様の出番だな。
余計な突っ込みした、知恵足らずの>>775は今ごろ赤面ww

778:名無しさん@お腹いっぱい。
08/04/29 21:41:31
シェルはOSには依存しないな。
余計な突っ込みした、知恵足らずの>>777 は今ごろ赤面ww

779:名無しさん@お腹いっぱい。
08/04/29 21:43:02
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。

780:名無しさん@お腹いっぱい。
08/04/29 21:54:17
まあよくある願望とごっちゃにしたな

781:名無しさん@お腹いっぱい。
08/04/29 22:04:17
たとえば最近の例を引き合いに出すが、
>>757 の質問(OS不明)に >>758 が的確に回答してる。
どこにもOSに依存してるところはないな。

>>757 に対して「OSが秘密じゃ答えられない」なんていってる奴は
無知をさらけ出してる奴。OSがわかったところで答えられないだろう。

782:名無しさん@お腹いっぱい。
08/04/29 22:06:52
全然関係ない事例を持ち出して
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
> シェルはOSには依存しないな。
を誤魔化そうとする>>778憐れ。

783:名無しさん@お腹いっぱい。
08/04/29 22:08:34
本件事例の
>>769 の回答は、OSには依存しないな。

784:名無しさん@お腹いっぱい。
08/04/29 22:17:34
糞みたいな雑談でスレを延ばすなよ
コードで語れ

785:名無しさん@お腹いっぱい。
08/04/29 22:22:29
G Em7 Am7 Am7/D D7 G

786:名無しさん@お腹いっぱい。
08/04/29 22:23:36
>>769は誤回答。お題は「* で、hogeとかだけにマッチして、hoge.hog にはマッチしない」

787:名無しさん@お腹いっぱい。
08/04/29 22:25:33
OSに依存しない誤回答ですね。

788:名無しさん@お腹いっぱい。
08/04/29 22:45:17
誤解答を例示して
> シェルはOSには依存しないな。
を誤魔化そうと必死の>>778憐れ。

789:名無しさん@お腹いっぱい。
08/05/02 11:38:05
$ls
test1.jpg  test10.jpg test2.jpg
test3.jpg  test4.jpg  test5.jpg
test6.jpg  test7.jpg  test8.jpg
test9.jpg

と1桁の数字からなる連番ファイルがあるときに

$ls
test0001.jpg  test0002.jpg  test0003.jpg
test0004.jpg  test0005.jpg  test0006.jpg
test0007.jpg  test0008.jpg  test0009.jpg
test0010.jpg

というように4桁の連番ファイルにリネームしたいのですが、
ご教授お願いします。

790:名無しさん@お腹いっぱい。
08/05/02 11:40:37
>>789
mv
sed
printf
for

これだけ調べればできる

791:名無しさん@お腹いっぱい。
08/05/02 11:41:07
書き忘れた、

test10.jpg
これ 1桁の数字じゃないよな

792:名無しさん@お腹いっぱい。
08/05/02 11:43:03
>>789
環境依存かつ汎用性ナシだけど、
おれならこうやっちゃう。
$ for i in {1..9}; do mv test$i.jpg test000$i.jpg; done
$ mv test10.jpg test0010.jpg

793:名無しさん@お腹いっぱい。
08/05/02 11:49:01
>>789

#!/bin/sh

for file in *.jpg
do
num=`expr $file : '[^0-9]*\([0-9]*\)'`
base=`expr $file : '\([^0-9]*\)'`
num=`printf %04d $num`
echo mv $file $base$num.jpg
done


794:789
08/05/02 11:52:46
>>791
最初1桁の例だけ書いてたんで、
2桁も混じっているということを書き忘れました。

>>792
$ for i in {1..9}; do mv test$i.jpg test000$i.jpg; done
$ for i in {10..99}; do mv test$i.jpg test00$i.jpg; done

ってかんじですかね。ありがとうございます。

795:名無しさん@お腹いっぱい。
08/05/02 11:52:51
>>790
具体例を示さない奴は黙ってろ。あと、sedよりexprの方がいいな。

796:名無しさん@お腹いっぱい。
08/05/02 11:53:29
>>794
>>793

797:名無しさん@お腹いっぱい。
08/05/02 11:55:18
3桁のときは、0を一つ、2桁の時は、0を2つ
一桁のときは、0を3つってつけてけばいいねん
sedだけでできる

798:名無しさん@お腹いっぱい。
08/05/02 11:56:45
>>797
そんなことをしなくても >>793 で一発。

799:名無しさん@お腹いっぱい。
08/05/02 11:57:56
でしたね^^
解決したようで

800:793
08/05/02 12:09:21
sedだけでやるならこうかな

#!/bin/sh

for file in *.jpg
do
new=`echo $file | sed 's/[0-9]/0000&/; s/[0-9]*\([0-9][0-9][0-9][0-9]\)/\1/'`
mv $file $new
done


801:名無しさん@お腹いっぱい。
08/05/02 12:11:08
ごちゃごちゃしてるなぁ

802:名無しさん@お腹いっぱい。
08/05/02 12:13:48
そう思うならprintfの方がすっきりする

803:名無しさん@お腹いっぱい。
08/05/02 12:16:28
カレントディレクトリ配下で自分が所有者のファイルを探してすべて消したいのですが、
どのように書けばいいですか?

804:名無しさん@お腹いっぱい。
08/05/02 12:17:35
find . -user `whoami` -exec rm -f {} \;

805:名無しさん@お腹いっぱい。
08/05/02 12:18:06
ありがとうございます
試してみます

806:名無しさん@お腹いっぱい。
08/05/02 20:11:05
>>795
> >>790
> 具体例を示さない奴は黙ってろ。あと、sedよりexprの方がいいな。
お前が真っ先に黙れ。

807:名無しさん@お腹いっぱい。
08/05/05 12:08:46
若干スレ違いですが、
シェルスクリプラーなみなさんが詳しそうなので質問させてください。

unix,linuxで、
カーネルの脆弱性なんかでrootに権限昇格の可能性があるのって
特定コマンドを利用不可にしていたら難しい、
なんてことあるでしょうか?

また、特定コマンドを利用した回数、利用したユーザ、
とか調べる方法ってないでしょうか?

808:名無しさん@お腹いっぱい。
08/05/05 13:02:50
つ BSD acct & lastcomm

809:名無しさん@お腹いっぱい。
08/05/05 13:55:52
>>807-809
具体例を出さない書き込みは禁止。

810:名無しさん@お腹いっぱい。
08/05/05 15:43:33
若干どころじゃなくスレ違い。

811:名無しさん@お腹いっぱい。
08/05/05 15:47:30
「シェルスクリプロ」って何ですか?

812:名無しさん@お腹いっぱい。
08/05/05 15:57:16
シェルスクリプる

813:名無しさん@お腹いっぱい。
08/05/06 08:56:10
a 5 9 2
b 7 3 6
c 5 3 2
d 8 3 7
e 4 4 4

のようなテキストファイルから

a 5 9 2 16
b 7 3 6 16
c 5 3 2 10
d 8 3 7 18
e 4 4 4 12

のように行の値の合計を右端に出力したいのですがどうしたらできますか?
awk '{print $1,$2,$3,$4,$1+$2+$3}'
のようにではなく、列の値の数が3でなくても対応できるようにしたいです。

814:名無しさん@お腹いっぱい。
08/05/06 09:01:46
>>813
簡単だね。

#!/bin/sh

while read line
do
set $line
shift
sum=0
for i in "$@"
do
sum=`expr $sum + $i`
done
echo "$line $sum"
done < file


815:名無しさん@お腹いっぱい。
08/05/06 09:20:27
適当にがんばってみたらできたました。
ありがとうございました。
awk '{sum=0;for(i=1;i<=NF;i++)sum+=$i; print $"$i",sum}' test.txt

816:名無しさん@お腹いっぱい。
08/05/06 09:38:50
>>815
ちゃんと「シェルで」答えてくれた >>814 に礼もなしで
自己解決かよ。

しかも、awkでやるならスレ違い。awkスクリプトはシェルスクリプトにあらず。

817:名無しさん@お腹いっぱい。
08/05/06 09:41:33
おいおい、 >>815 の awkだと間違ってるぞ。
1列目の文字がたまたま数値的に 0 と評価されたら
結果的に正しく動いてるように見えるけど、
1列目に数値と解釈される文字があったらアウト。
このスレ的には >>814 が正解。

818:名無しさん@お腹いっぱい。
08/05/06 20:45:33
unix初心者ですが、シェルについて教えてください。
if文で、if~then~else~endif を使用しています。
if文の判定は、ファイル有無の判定です。
判定対象のファイルを正規表現で記述すると、elseまで辿り着きますが、
メタキャラ"?"で判定すると、elseまで辿り着かず、

「照合パターンに合いません」

と出力され終了してしまいます。
シェルの構文は下記の通りです。


#!/bin/csh
if ( -f /tmp/a?a.log ) then
echo "ファイルが見付かりました"
else
echo "ファイルが見付かりませんでした"
endif

メタキャラを使用して、ファイル判定をする方法を教えて頂けませんでしょうか。

宜しくお願い致します。


819:名無しさん@お腹いっぱい。
08/05/06 20:50:12
>>818
cshでスクリプトを作ってはいけません。
どうしてもcshが良いなら独学でどうぞ。

820:名無しさん@お腹いっぱい。
08/05/06 21:05:42
>>818
#!/bin/sh

if [ -f /tmp/a?a.log ]; then
echo 'ファイルが見付かりました'
else
echo 'ファイルが見付かりませんでした'
fi


821:名無しさん@お腹いっぱい。
08/05/06 21:15:22
#!/bin/sh

[ -f /tmp/a?a.log ] && {
echo 'ファイルが見付かりました'
} || {
echo 'ファイルが見付かりませんでした'
}

822:名無しさん@お腹いっぱい。
08/05/06 21:19:42
#!/bin/sh

s=; [ -f /tmp/a?a.log ] || s='せんで'; echo 'ファイルが見付かりま'"$s"'した'

823:名無しさん@お腹いっぱい。
08/05/06 21:27:57
s=;(</tmp/a?a.log)2>/dev/null||s='せんで';echo 'ファイルが見付かりま'"$s"'した'

824:名無しさん@お腹いっぱい。
08/05/06 22:16:35
ゴルファーがいるw

825:名無しさん@お腹いっぱい。
08/05/06 22:21:36
すんません、検索したけど見つからなかったので教えてください。
bash + awk, bc, perl あたりで、小数部が3桁の計算をして、
その結果を変数に格納してます。その後、その変数の値を
絶対値にして返してくれるコマンドはありませんか?
上記のbash, awk, bc, perl あたりでできれば一番良いのですが。
よろしくお願いしまつ。

826:名無しさん@お腹いっぱい。
08/05/06 22:44:52
> 820、821

ありがとうございました。
Bシェルで作成します。


作成したのですが、複数ファイルがマッチした場合、

ファイル名: binary operator expected

が表示され、マッチしたにも関わらず、elseが適用されます…。

ご存知でしたら、複数マッチしても、真となるような方法を教えて頂けませんでしょうか。

827:名無しさん@お腹いっぱい。
08/05/06 22:58:20
>>825
マイナス符号を取ったらいいだけだろ

$ var1=-123.456
$ expr $var : '-*\(.*\)'
123.456
$ var2=123.456
$ expr $var : '-*\(.*\)'
123.456


828:名無しさん@お腹いっぱい。
08/05/06 23:01:42
>>826

#!/bin/sh

if ls /tmp/a?a.log 2>/dev/null; then
echo 'ファイルが見付かりました'
else
echo 'ファイルが見付かりませんでした'
fi


829:名無しさん@お腹いっぱい。
08/05/06 23:14:46
>>825

$ var=-123.456
$ echo ${var#-}
123.456
$ var=123.456
$ echo ${var#-}
123.456

830:名無しさん@お腹いっぱい。
08/05/06 23:22:26
bash依存乙。

831:名無しさん@お腹いっぱい。
08/05/06 23:29:02
だからksh由来だと何度(ry

まあテンプレにもあるようにsh以外ならそう明記すべきだな。

832:名無しさん@お腹いっぱい。
08/05/07 11:40:42
カレントディレクトリ配下のファイルにsedをかけたいのですが、
どのようにしたらできますか?

833:名無しさん@お腹いっぱい。
08/05/07 11:50:19
>>832
要エスパー質問だなw

for file in *
do
sed 's/hoge/hage' "$file" > "$file".new
done

てことをやりたいのか?

834:名無しさん@お腹いっぱい。
08/05/07 11:54:09
>>832
OSやシェルの種類/バージョンは秘密ですか?
それを秘密にしたままでは誰も答えられないでしょう。
このレス以外、レスは0件でしょう。

835:名無しさん@お腹いっぱい。
08/05/07 11:58:42
OSはわかりません。(アウトソーシングでunameが使えないため)
ShellはBashです。
$ bash --version
GNU bash, version 3.1.17(1)-release

>>833
それだと、カレントディレクトリのファイルしか置き換えできません。
カレントディレクトリ配下をすべて置き換えたいです。
また、置き換えしたいので、.newファイルを作成したいのではないです。
(名前を変更すればいいだけですが。)

836:名無しさん@お腹いっぱい。
08/05/07 12:02:49
>>835
find . -type f -exec sed -i 's/hoge/hage' {} \;

837:名無しさん@お腹いっぱい。
08/05/07 12:06:32
>>834
OS関係ないだろw

すでに適切な回答がなされた後で再読み込みもせずに余計なことを書いた
>>834 は今ごろ赤面。

838:名無しさん@お腹いっぱい。
08/05/07 12:09:01
>>835
「カレントディレクトリ配下」という言葉の使い方を間違ってます。

839:名無しさん@お腹いっぱい。
08/05/07 14:40:31
>>832, >>834-835, >>837-839
具体例を出さない書き込みは禁止。

840:名無しさん@お腹いっぱい。
08/05/07 18:20:43
>>838
配下っていう意味的にはあってるでしょ

841:名無しさん@お腹いっぱい。
08/05/07 18:21:36
>>840
合ってない。直下のディレクトリのみ指す用語。

842:名無しさん@お腹いっぱい。
08/05/07 18:24:34
>>841
配下って言うのは、傘下って意味。
参加は直下以外も指す。

ダイハツの下もTOYOTAの傘下でしょ。

843:名無しさん@お腹いっぱい。
08/05/07 18:39:44
>>842
勝手に言葉を定義されても、困るのですが。

844:名無しさん@お腹いっぱい。
08/05/07 18:46:27
その人の支配に属していること。また、その者。手下。部下。
- 三省堂提供「大辞林 第二版」より

類語:
⇒ 関連語 てした【手下】
⇒ 関連語 さんか【傘下】
⇒ 関連語 したやく【下役】
- YAHOO辞書より

845:名無しさん@お腹いっぱい。
08/05/07 18:47:48
一言「サブディレクトリ以下も含む」と付け加えれば意味が通じたのに、
>>832 は「サブディレクトリ」という用語を知らないに1票。

846:名無しさん@お腹いっぱい。
08/05/07 18:52:45
例えば、
/aaa/bbb
というディレクトリがあって、
touch /aaa/bbb/ccc.txt
ってやりたい時、
bbbディレクトリに書き込みパーミッションがあれば、
aaaディレクトリは書き込み禁止であっても書き込める。
よって、bbbはaaaに支配されているわけではない。
aaa自体の書き込みパーミッションは、
aaa直下に作成するファイルにしか効かない。
つまり、bbbはaaaの支配には属していない。

847:名無しさん@お腹いっぱい。
08/05/07 19:10:11
基本的には親ディレクトリを削除したら下は全部削除されるんだから支配されてるでしょ。
孫請け会社が親とは直接的なやり取りがないのとおなじ

848:名無しさん@お腹いっぱい。
08/05/07 19:19:12
リンク

849:名無しさん@お腹いっぱい。
08/05/07 19:19:17
>>846 >>847
だから、勝手に言葉を定義されても困るのですが。

>>845
「再帰的(reccursive)に」というキーワードがありますね。 よくあるオプションは-rですか。


850:名無しさん@お腹いっぱい。
08/05/07 19:21:22
-Rだな

851:名無しさん@お腹いっぱい。
08/05/07 19:33:05
>>849
言葉を定義してるはあなたも同じでしょ。

YAHOO辞書に従うと、類義で傘下があるから傘下としてはただしいんだし。

852:名無しさん@お腹いっぱい。
08/05/07 19:42:10
>>851
いや、してませんけど。
言葉は流動的なもので、大辞林や広辞苑にこう書かれている、としても、
それがすべての場合に同様に正確にあてはまるわけではないのは、日常の
言葉のやりとりで体得していないのですか?
プログラム言語じゃあるまいし。

853:名無しさん@お腹いっぱい。
08/05/07 20:20:38
>>847
逆。下のディレクトリがあると親ディレクトリは削除できない。
そういう意味では子に親が支配されてる。

あと、NFSとかnullfsでループバックマウントする場合、
子のディレクトリを別の場所にマウントすると
まさに親ディレクトリに関係なく子のディレクトリにアクセスできる。
ディレクトリ間は単にリンクしあっているだけであって、支配関係はない。

854:名無しさん@お腹いっぱい。
08/05/07 22:40:38
>>852
指標にはなるでしょ。
根拠をしめしてるだけ、ちゃんと示してる。

>>853
削除できないようにしてるだけ。

855:名無しさん@お腹いっぱい。
08/05/07 22:59:03
いったいなんのスレだここはw

856:名無しさん@お腹いっぱい。
08/05/08 05:17:48
こういう宗教戦争があるのがUNIX板のいいところ

857:名無しさん@お腹いっぱい。
08/05/08 08:25:57
どうでもいいが、>>836 で正解もらってるのに、
>>835 = >>832 から礼の一言もなしに書き逃げしてるなw


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch