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

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


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

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

前スレ
シェルスクリプト総合 その11
http://pc11.2ch.net/test/read.cgi/unix/1211284684/
2名無しさん@お腹いっぱい。:2008/08/09(土) 19:23:50
□過去スレ:
シェルスクリプト総合 その11
http://pc11.2ch.net/test/read.cgi/unix/1211284684/
シェルスクリプト総合 その10
http://pc11.2ch.net/test/read.cgi/unix/1202725267/
シェルスクリプト総合 その9
http://pc11.2ch.net/test/read.cgi/unix/1187130302/
シェルスクリプト総合 その8
http://pc11.2ch.net/test/read.cgi/unix/1171517324/
シェルスクリプト総合 その7
http://pc11.2ch.net/test/read.cgi/unix/1157601611/
シェルスクリプト総合 その6
http://pc11.2ch.net/test/read.cgi/unix/1143302182/
シェルスクリプト総合 その5
http://pc11.2ch.net/test/read.cgi/unix/1137801629/
シェルスクリプト総合 その4
http://pc11.2ch.net/test/read.cgi/unix/1131026501/
シェルスクリプト総合 その3
http://pc11.2ch.net/test/read.cgi/unix/1124889646/
シェルスクリプト総合 その2
http://pc11.2ch.net/test/read.cgi/unix/1113664637/
シェルスクリプト総合 その1
http://pc11.2ch.net/test/read.cgi/unix/1101820646/
3名無しさん@お腹いっぱい。:2008/08/09(土) 19:26:22
□関連スレ:
sed
http://pc11.2ch.net/test/read.cgi/unix/1085730992/
正規表現
http://pc11.2ch.net/test/read.cgi/unix/1039165754/
おまえら! shell は何を使っているんですか?
http://pc11.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc11.2ch.net/test/read.cgi/unix/1102921590/
4名無しさん@お腹いっぱい。:2008/08/09(土) 19:27:01
□初心者向けリンク
「誰にでも」シリーズ
ttp://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/publications/dareUni/
/bin/shプログラミング入門
ttp://freebooks.info.nara-k.ac.jp/archive/ShellProgramming/
シェルを使おう - 導入からプログラミングまで -
ttp://www.netfort.gr.jp/~tomokuni/lms/shell/text/

□入門者向け書籍:
プロフェショナルシェルプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4756116329/
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
http://www.amazon.co.jp/exec/obidos/ASIN/4797321946/
UNIXシェルプログラミング徹底解説
http://www.amazon.co.jp/exec/obidos/ASIN/4822280489/
入門Kornシェル
http://www.amazon.co.jp/exec/obidos/ASIN/4873110149/
入門bash
http://www.amazon.co.jp/exec/obidos/ASIN/4900900788/

□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
http://x68000.q-e-d.net/~68user/unix/
POSIX: Shell & Utilities (標準規格)
http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html
5名無しさん@お腹いっぱい。:2008/08/09(土) 19:27:34
□最近のシェルスクリプト本(1)

(2004/03) UNIXシェルスクリプトハンドブック 関根 達夫 (著)
http://amazon.co.jp/o/ASIN/4797326522/
(2004/10) UNIXシェルスクリプト逆引き大全333の極意 中橋 一朗 (著)
http://amazon.co.jp/o/ASIN/4798008842/
(2004/11) 仕事に使えるLinuxシェルスクリプト 千葉 真人 (著)
http://amazon.co.jp/o/ASIN/4822282090/
(2004/12) UNIXシェルスクリプトサンプルブック デイブ・テイラー (著)
http://amazon.co.jp/o/ASIN/4797327286/
(2005/02) シェルスクリプト基本リファレンス 山森 丈範 (著)
http://amazon.co.jp/o/ASIN/4774122610/
(2005/04) LinuxWorldスクリプト 月刊リナックス・ワールド総集編 月刊LinuxWorld特
別 (著)
http://amazon.co.jp/o/ASIN/4872802349/
(2005/05) UNIXシェルスクリプトコマンドブック 山下 哲典 (著)
http://amazon.co.jp/o/ASIN/4797330635/
(2005/05) わかる&使える UNIX基礎講座 シェルスクリプト編 中井 獏 (著)
http://amazon.co.jp/o/ASIN/4774123625/
6名無しさん@お腹いっぱい。:2008/08/09(土) 19:28:08
□最近のシェルスクリプト本(2)
(2005/07) UNIX シェルスクリプト辞典 川井 義治 (著)
http://amazon.co.jp/o/ASIN/4798109231/
(2005/08) シェルスクリプト ポケットリファレンス bash編 宮原 徹 (著), 川原 龍人 (著)
http://www.amazon.co.jp/o/ASIN/4774124818/
(2005/12) 図解でわかるLinuxシェルスクリプト・正規表現 小泉 修 (著)
http://www.amazon.co.jp/o/ASIN/4534040067/
(2006/01)詳解 シェルスクリプト アーノルド ロビンス (著), ネルソン・H.F. ベーブ(著), Arnold Robbins (原著), Nelson H.F. Beebe (原著), 日向 あおい (翻訳)
http://www.amazon.co.jp/o/ASIN/4873112672/
(2007/3) Linuxシェルスクリプトユーザー便利帳―bash2/bash3対応 伊藤 幸夫 (著), 寒川 陽美(著)
http://www.amazon.co.jp/o/ASIN/4798015954/
(2007/9) ゲームで極める シェルスクリプトスーパーテクニック 山森 丈範
http://www.amazon.co.jp/o/ASIN/4774132020/
(2007/10) UNIX/Linuxシェルスクリプトマスタリングハンドブック 野川 准子
http://www.amazon.co.jp/o/ASIN/4798017957/
7名無しさん@お腹いっぱい。:2008/08/09(土) 19:33:01
□関連書籍と関連リンク:

FreeBSD Hypertext Man Pages
http://www.freebsd.org/cgi/man.cgi

Linux JF (Japanese FAQ) Project.
http://www.linux.or.jp/JF/

Unix Programming Frequently Asked Questions 日本語訳
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html

UNIXプログラミング環境
http://www.amazon.co.jp/exec/obidos/ASIN/4871483517/

□人間初心者へのお願い:
・このスレはシェルスクリプトについてのスレです。
 シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
 使い方の質問などはスレ違いなので無用に願います。

□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,test,expr,true,false,yes,getopts
テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join
ファイル検索系: find,xargs
(スペースなどを含むファイル名を正しく処理するため、
findは -print0、xargsは -0オプションを常に付けることを推奨
ただし、Solarisでは未対応。どうするんだろ?)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
8ザキル:2008/08/09(土) 19:44:59
9ザキル:2008/08/09(土) 19:45:53
ここをみつけた・・・・
5年以上もまえありがとよ・・
10名無しさん@お腹いっぱい。:2008/08/09(土) 21:58:55
ファイル検索系: find,xargs
(スペースなどを含むファイル名を正しく処理するため、
findは -exec command {} + を推奨。
他に -print0、xargsは -0オプションという方法もあるがSolaris非対応)
11名無しさん@お腹いっぱい。:2008/08/09(土) 22:06:49
前スレ、`# hoge` だとコメントアウトになるが、
$(# hoge) だと期待通り動作しないな。
やっぱ $( ) より ` ` を使えということか。
12名無しさん@お腹いっぱい。:2008/08/09(土) 22:09:07
「`」を含んだコメントが書けないからクソノウハウ
13名無しさん@お腹いっぱい。:2008/08/09(土) 22:12:06
>>12
「注釈」の意味でコメントを「書く」んじゃなくて、
すでにあるコマンドラインオプションの一部を(テスト的に)外すための
コメントアウトだから、無問題。
14名無しさん@お腹いっぱい。:2008/08/09(土) 22:20:12
「`」を使用したオプションをコメント化できないからクソノウハウ
15名無しさん@お腹いっぱい。:2008/08/09(土) 22:23:30
ノウハウって文字をみると、「ウハウハ」に見える
16名無しさん@お腹いっぱい。:2008/08/09(土) 22:25:15
>>14
それは、すでにある ` ` の中の先頭に # を書けばいいだけ。
17名無しさん@お腹いっぱい。:2008/08/09(土) 22:37:47
しかし、cshみたいにコメント行にも末尾に'\'を付けたら
継続できる仕様には、なんでならなかったんだろうね。
「純正シェル」はともかく、
後継のでは仕様変更しようという事にはならなかったのだろうか。
bashもzshも同様だし。
18名無しさん@お腹いっぱい。:2008/08/09(土) 23:14:58
いまからそういう変更を突っ込んでみたらいいかもね
受けたら広まる
19名無しさん@お腹いっぱい。:2008/08/09(土) 23:18:30
最初の質問とは別として、
行継続中のコマンドラインの右側にコメントを書ければいいなと思うことはある。
↓みたいに

command \
-a \ # -aオプションに対するコメント
-b \ # -bオプションに対するコメント
-c \ # -cオプションに対するコメント
file
20名無しさん@お腹いっぱい。:2008/08/09(土) 23:20:55
shではコメントから改行までを改行と同一視します。
改行には意味があるので、空白と同一視できません。
だから末尾に'\'で意味を変えたら後方互換性に問題が出ます。
21名無しさん@お腹いっぱい。:2008/08/09(土) 23:22:02
>>19
/* コメント */ みたいなのがあればいいのにね。
22名無しさん@お腹いっぱい。:2008/08/09(土) 23:26:49
#から改行までを改行と同一視するけど、
「\#から改行まで」を「\改行」とは同一視してくれないから
>>19 みたいなコメントは付けられないんだな。
23BASH初心者:2008/08/10(日) 00:47:18
シェルスクリプト総合 その11の 984さんへ

”ところで981は、なんでコメント行にも "!" を付けてるんだ?”

特に意味はなかったです。
一行目の#!/bin/sh をコピーペしたんです。(コピペしすぎです)
ややこしくして、すみませんでした。
24名無しさん@お腹いっぱい。:2008/08/10(日) 01:22:46
>>16
実例示されないとわからないのか? 駄目な奴だなあ。

hoge -F`hage`
25名無しさん@お腹いっぱい。:2008/08/10(日) 06:58:25
>>24
hoge -F`#hage`

何が実例だよwww
26名無しさん@お腹いっぱい。:2008/08/10(日) 07:06:22
前スレから継続して「クソノウハウ」って叫んでる奴、
自分が知らないknow how披露されて悔しいから、
言いがかり付けて意地でもknow how潰したいだけちゃうんかと、、
27名無しさん@お腹いっぱい。:2008/08/10(日) 08:19:56
しかしcshが # と \ の2文字でいいのに、`# ` \ の4文字必要で、
vimやemacsのsyntax highlight的にも微妙ではあるな。
十分bad know howにカテゴライズされると思う。
28名無しさん@お腹いっぱい。:2008/08/10(日) 08:25:49
>>20
>コメントから改行までを改行と同一視します
って言うのは、厳密には違うわけだな。
` ` の中の場合、#から`を閉じるところまでをコメントとみなす、ということになる。

ところで、$(#hoge) の場合、#より右側が全部コメントとみなされてしまって
$( )の右側の括弧までもがコメントとみなされる模様。(よって括弧が閉じない)
`#hoge` の書き方との実装の違いが現れる一例ではある。
29名無しさん@お腹いっぱい。:2008/08/10(日) 08:39:25
>>25
あほー、それだと-Fがhogeに渡るだろ。www
30名無しさん@お腹いっぱい。:2008/08/10(日) 08:48:55
>>28
$ echo `echo a
> # echo b
> echo c`
a c

31名無しさん@お腹いっぱい。:2008/08/10(日) 08:51:11
>>29
おまえとことんアフォだな、

-Fをコメントアウトしたいなら

hoge `#-F``#hage`

だろ。

なお、初めてここを読んだ人が誤解するかも知れないので言っておくと、
元の質問だと、

hoge \
-F`hage` \
boke

っていう3行に渡るコマンドラインの、2行目だけコメントアウトしたいって言う質問。
(なので、hoge -F`hage` という >>24 が出した例は悪い例
なぜなら、>>24 の場合だと hoge #-F`hage` でOKだから)
32名無しさん@お腹いっぱい。:2008/08/10(日) 08:52:24
` が対応しません.
33名無しさん@お腹いっぱい。:2008/08/10(日) 08:54:00
>>30
言葉を使っても書けよ。
#から、改行または 閉じる` のどちらか先に来る方までをコメントとみなす、
って言いたいんだろ。
34名無しさん@お腹いっぱい。:2008/08/10(日) 08:55:06
>>32 は誰と戦ってるの?
35名無しさん@お腹いっぱい。:2008/08/10(日) 09:30:35
>>31
「-F」をコメントアウトじゃなくて、「-F`hage`」をコメントアウトだ。

ところで、`#-F``#hage`を戻すのはどうやって戻すんだ?
`直後の#をはずして、``をはずすと「-Fhage」になって元に戻らないが…
正規のコメントに書いとくのか? www
36名無しさん@お腹いっぱい。:2008/08/10(日) 09:48:51
>>35
話がループしてるね。

もう一回まとめて書くよ。

元のコマンドライン:
hoge -F`hage` boke

コメントアウト:
hoge `#-F``#hage` boke

再度アンコメント:
hoge -F`hage` boke


ルールとしては、`# と ` で囲むのが基本。
ただし、囲む中にすでに ` ` がある場合は、そこを避けて複数に分割して `# ` で囲む。
その上で、もともとあった ` ` の頭には # を付ける。
37名無しさん@お腹いっぱい。:2008/08/10(日) 14:18:49
知らない人が見てコメントと分からないから意味がない。
コメントの修正しようとしてエラー誘発しそうだからイマイチ。
38名無しさん@お腹いっぱい。:2008/08/10(日) 14:25:59
>>37
流れ読んでる?
自分で書いてるスクリプトの、行継続のコマンドライン上の
一部のオプションを、一時的に(デバッグ目的等で)コメントアウトしたいって話だぞ。
39名無しさん@お腹いっぱい。:2008/08/10(日) 15:44:07
>>38
いつから「自分で書いてるスクリプトの」や
「一時的に(デバッグ目的等で)」の条件が加わったのだろう。
まぁ、そうでもないと運用が危ない手法とは思うけど、
しかしこの制限はとても大きい。
40名無しさん@お腹いっぱい。:2008/08/10(日) 16:05:16
>>39
#!/bin/sh -f
ls \
`: この行は空白と見做されます。-r` \
-t \
-a
41名無しさん@お腹いっぱい。:2008/08/11(月) 00:03:26
>>283
アナル拡張してるとさ、なんか変なニオイのスライムみたいなのが手に着かない?
女のやつだったらまだ我慢できるんだけど、男のやつは正直ちょっと精神的に萎えるw
仕事とは言えね・・・・ まぁ、後で洗うからいいんだけどさ。
42名無しさん@お腹いっぱい。:2008/08/11(月) 00:04:00
誤爆すまん
43名無しさん@お腹いっぱい。:2008/08/11(月) 00:06:25
直腸検査w
44名無しさん@お腹いっぱい。:2008/08/11(月) 00:32:46
なんだアナル拡張師か
45名無しさん@お腹いっぱい。:2008/08/11(月) 00:57:22
拡張子 ass ですか?
46名無しさん@お腹いっぱい。:2008/08/11(月) 15:42:45
Bourne Shell 自習テキストの「配列(表引き)」の例で
何でファイル記述子3を使ってるのか分からなかったので
使わないようにいじってみた

i=0
while read k month
do
i=`expr $i + 1`
eval M_$k='"$month"'
done <month.name
j=$i
i=1
while test $i -lt $j
do
eval echo \$i -- \$M_$i
i=`expr $i + 1`
done
47名無しさん@お腹いっぱい。:2008/08/11(月) 21:21:58
>>36
駄目ソフトに駄目パッチを必死になって当ててる姿が憐れすぎる。
48名無しさん@お腹いっぱい。:2008/08/11(月) 21:45:55
よく居るよね。
自分ではアイデアを出さない(出せない)のに、
人が出したアイデアに、内心「やられたー」と思いながら
難癖つけてアイデアを潰すことだけに尽力する奴。
人のアイデア潰しとかないと、査定で自分の考課下がるもんね。
>>12 >>14 >>24 >>29 >>35 >>47
49名無しさん@お腹いっぱい。:2008/08/12(火) 01:26:48
アイデア以前の無様な思い付きを恥ずかしげも無く披露できる
馬鹿さが素晴らしい。
50名無しさん@お腹いっぱい。:2008/08/12(火) 01:32:57
そんなに素晴らしいアイデアなら、こんなところの名無しに潰されるはず無いね。
「こんな、素晴らしいアイデア考えたぞって」他の媒体でも宣伝すれば? www
51名無しさん@お腹いっぱい。:2008/08/12(火) 01:48:30
どうせ2chなんだし、いろんなアイディアを書き込んでほしいな。
それがたとえ間違いを含んでいたとしても、誰かが間違いを指摘してくれることで
傍から見ている人間にとっても勉強になるし。
君が煽ってくれたおかげで今回もいい流れになったね。
52名無しさん@お腹いっぱい。:2008/08/12(火) 06:10:27
>>50
そんなに「素晴らしくない」アイデアなら、わざわざ君一人が必死になって
潰しにかからなくても、みんな気にも留めずにスルーするだけだろ。
無視できないアイデアだからこそ、君が必死になって潰そうとしてる。
それが有用なアイデアである証拠だ。
で、実際君の方が論破されてしまって、アイデア自体は潰されていないし、、
53名無しさん@お腹いっぱい。:2008/08/12(火) 07:25:22
あつくるしい
54名無しさん@お腹いっぱい。:2008/08/12(火) 09:21:37
>>52
> 無視できないアイデアだからこそ、君が必死になって潰そうとしてる。
これから

> それが有用なアイデアである証拠だ。
これにどうやってつながるのだ? ニダー論法? www
55名無しさん@お腹いっぱい。:2008/08/12(火) 09:23:15
> で、実際君の方が論破されてしまって、アイデア自体は潰されていないし、、
無理やりひねり出した駄目駄目なルールを、得意満面で披露したことで自爆したことに気付いてないの? 憐れ。
56名無しさん@お腹いっぱい。:2008/08/12(火) 09:42:41
まずは、>>55 >>54 は、 >>36 に代わる代案のアイデアを出すこと。
話はそれからだ。出せないなら >>55 の負け。負けは素直に認めること。
57名無しさん@お腹いっぱい。:2008/08/12(火) 10:59:01
負けというか、認めるのは異常性格かと…
58名無しさん@お腹いっぱい。:2008/08/12(火) 11:01:04
使い物にならないダメルールでも出したら勝ちか?
随分楽しい世界に住んでるな。

> コメントアウト:
> hoge `#-F``#hage` boke
これから
> 再度アンコメント:
> hoge -F`hage` boke
に変換するルールはどうなってるんだ?
`#-F` => -F
`#hoge` => `hoge`
59名無しさん@お腹いっぱい。:2008/08/12(火) 12:20:20
もう拘るのをやめて $(...) を使えば
`# $(...)` とできて楽。
あるいは先に変数にコマンド実行結果を格納しても構わなければ
そのように書換える。

-F`hage` <-> `#-F``#hage`
の変換なんて絶対したくない。
60名無しさん@お腹いっぱい。:2008/08/12(火) 12:46:00
一般に、コメントアウトしたものをアンコメントするためのルールは
原理的に存在しないし、存在しなくてOK。

例えば次の例、

(元のスクリプト)
#This is a comment
ls -lF

(コメントアウト)
#This is a comment
#ls -lF

となった場合、これをアンコメントする場合、
「This is a comment」の部分がもともとのコメントなのか、
もともとはコマンドで、コメントアウトしたのかは、
人間が見て判断するしかない。

-----
こういうと、じゃあ、もともとのコメントは ## でコメントにすればいいじゃないか、
とかいろいろ出そうだが、いずれにしてもそういう取り決めがないと成り立たない話に
なって行くので、技術的な議論からは外れるので、議論の意味なし。

-----
とりあえずやれる方法を出したものが勝ち。
理屈ばかりこねて結局何も出さないものは負け。
>>58
61名無しさん@お腹いっぱい。:2008/08/14(木) 03:31:49
cpコマンドについて質問です。

cp -p でコピーしたファイルって所有者はコピーされないのに、
sudo cp -p でコピーしたファイルは、所有者がコピーされる理由はなんでなんでしょうか?

cpコマンドのマニュアルを読むとpオプションは、タイムスタンプと許可属性だけをコピーするみたいなのですが、
なぜsudoつけると、所有者がコピーされるんでしょうか?

62名無しさん@お腹いっぱい。:2008/08/14(木) 07:07:58
>>61
自分以外の所有者のコピーにはroot権限が必要だから。
63名無しさん@お腹いっぱい。:2008/08/14(木) 11:00:45
>>61
初心者スレ行けよ。シェルスクリプト関係ないだろ。

ちなみにGNU cpの場合、
-p same as --preserve=mode,ownership,timestamps
64名無しさん@お腹いっぱい。:2008/08/14(木) 11:09:07
>>63
「シェルスクリプト関係ない」は同意だが、
「ちなみに」以下の文が質問の回答になっていないのはいただけない。
65名無しさん@お腹いっぱい。:2008/08/14(木) 15:09:59
>>61
読んだマニュアルが間違っている。
66名無しさん@お腹いっぱい。:2008/08/14(木) 15:25:29
マニュアル云々より、sudoつきとsudoなしで動作が違うのは何故かという
質問じゃないのか? 本来、cp -pでは所有者もグループもコピーされる。
でも、一般ユーザーだとその許可がないため、結果的に所有者とグループは
コピーされないだけ。
ちなみに、FreeBSDとSolarisのcpのmanの-pのところ読んでみたが、
owner(UID),group(GID)はコピーされる(保存される)ってちゃんと書いてあったから、
マニュアルは間違ってなくて、単に >>61 の記憶違いだろ。
67名無しさん@お腹いっぱい。:2008/08/14(木) 15:45:18
>>61 のOSとは違うと思うが、古い SunOSのマニュアルだと、
Duplicate not only the contents of the original file or directory,
but also the modification time and permission modes.
って書いてあった。これを元にしたマニュアルだと間違いが波及してるかも。
68名無しさん@お腹いっぱい。:2008/08/14(木) 16:24:46
4.2BSD の cp には -p オプションはなかった。
4.3BSD の cp の -p オプションでは user ID, group ID はコピーされなかった。
4.4BSD の cp は -p オプションで user ID, group ID もコピーされるようになった。
69名無しさん@お腹いっぱい。:2008/08/14(木) 16:36:00
問題: cpに-pオプションがないOSだと仮定して、cp -pを実現するシェルを発行せよ
70名無しさん@お腹いっぱい。:2008/08/14(木) 16:55:41
tar -C /path -cpf - $file | tar -C /path -xpf -
71名無しさん@お腹いっぱい。:2008/08/14(木) 17:00:03
./cp-p file1 file2 の形で実行できなきゃ、、
72名無しさん@お腹いっぱい。:2008/08/14(木) 17:07:27
-R に対応すんのがめんどくせ
73名無しさん@お腹いっぱい。:2008/08/14(木) 17:09:17
>>72 cp -p オプション専用でいいよ。
>>70 だと、同じファイルに上書きしちゃいます。
74名無しさん@お腹いっぱい。:2008/08/14(木) 17:16:50
cp した後に stat で取れる値を戻してあげればいいんだろうけど、
シェルスクリプトで綺麗にやる方法はわかんね
75名無しさん@お腹いっぱい。:2008/08/14(木) 19:22:51
OSを手軽にハングさせるスクリプトお願いします
76名無しさん@お腹いっぱい。:2008/08/14(木) 19:24:04
ハングシグナルなら kill -HUP で手軽に送れる。
77名無しさん@お腹いっぱい。:2008/08/14(木) 19:37:25
perl -e 'while(1) { $a.="\0"x8192; }'
78名無しさん@お腹いっぱい。:2008/08/14(木) 20:05:48
>>77
やってみましたが、Out of memory!って出て、何も起きませんでした。
79名無しさん@お腹いっぱい。:2008/08/14(木) 22:12:20
ちなみにbashで無限ループさせるときってどう書くのが一般的ですか?
Cだと while(1) か for(;;) だと思うけど
bashだと性癖によっていろいろ違いますよね
80名無しさん@お腹いっぱい。:2008/08/14(木) 22:13:51
>>79
while :
do
hoge
done
81名無しさん@お腹いっぱい。:2008/08/14(木) 22:50:48
while :; do hogehoge; done

見づらいと思ったんで全角で書いた。コロンとセミコロンね。
82名無しさん@お腹いっぱい。:2008/08/14(木) 22:53:46
Cのwhileは値が0以外のときにループして、
シェルの場合は戻り値が0のときにループするのは何故ですか?
83名無しさん@お腹いっぱい。:2008/08/14(木) 22:55:01
へえ
たしかに
while [ 1 ] ; do hoge ; done
よりもタイプ数少なくていいね
84名無しさん@お腹いっぱい。:2008/08/14(木) 22:57:05
>>82
それ、がいしゅつ
85名無しさん@お腹いっぱい。:2008/08/14(木) 22:58:11
>>79
あえてbash専用ということなら、
↓の方がタイプ数が少ない。

for((;;)){ hoge;}
86名無しさん@お腹いっぱい。:2008/08/14(木) 22:58:24
シェルは true = 0, false = 1 だからねぇ
87名無しさん@お腹いっぱい。:2008/08/14(木) 23:09:02
>>86
そういえばCとは真偽逆だ・・
Cもシェルも真ならループという点では同じということですね。

なんで逆なのかは仕様と理解するしかないのかな
88名無しさん@お腹いっぱい。:2008/08/14(木) 23:12:21
いやなら、cシェル使えw
89名無しさん@お腹いっぱい。:2008/08/14(木) 23:17:56
>>88
cshだって 0 が真だぞ。

$ csh -c '(exit 0) && echo true'
true
90名無しさん@お腹いっぱい。:2008/08/14(木) 23:19:05
証券系や金融系のシステム会社では結構cshのスクリプトがどこもたんまりあった
91名無しさん@お腹いっぱい。:2008/08/14(木) 23:27:56
OSが簡単にハグアプしては困るんですけどぉー
92ゆず:2008/08/14(木) 23:36:16
こんばんわ。
研究室の課題で、作成したアプリがログを出した際に勝手にディレクトリを作ってそこにログを格納するシェルを作れと言われたのですが、
どなたかよいサンプルソースをお持ちでしたら、貼っていただけると助かります。

よろしくお願いします。
93名無しさん@お腹いっぱい。:2008/08/14(木) 23:38:36
>>92
perl -e 'while(1) { $a.="\0"x8192; }'
94名無しさん@お腹いっぱい。:2008/08/14(木) 23:40:07
>>93
それを、アプリのどこに入れればいいのでしょう?
95名無しさん@お腹いっぱい。:2008/08/14(木) 23:40:08
>>87
成功は成功1通り
失敗はいろいろな原因があるから複数の失敗を用意
それなら、成功を0、失敗を0以外に割り当てるとよくね? という判断。
96名無しさん@お腹いっぱい。:2008/08/14(木) 23:54:24
>>95
うーむ
Cとかの場合
真=フラグ立ってる
偽=フラグ立ってない
というだけど、
シェルでいう真偽はまったく別物と認識すればよいのかな

97名無しさん@お腹いっぱい。:2008/08/15(金) 00:07:34
>>89
なにいってんだ?
前からの流れで言えば、while(1)のこと言ってるに決まってるだろw
98名無しさん@お腹いっぱい。:2008/08/15(金) 01:51:57
>>96
Cのは判定結果(真か偽か)、でブール代数の伝統のまま偽が0
シェルのは実行成否を表す返り値、成功を0とした方が都合がいいのは>>95が言う通り
条件分岐に使う点は同じだけど、成り立ちが違うと思えば間違えないよ



99名無しさん@お腹いっぱい。:2008/08/15(金) 03:13:18
算術ifが-1,0,1の三つの値、
strcmp()が負,0,正の値を取るみたいなもの。
便利だから。それ以外の理由はない。
100名無しさん@お腹いっぱい。:2008/08/15(金) 06:21:25
>>97
それを言うなら、b-shでも while [ 1 ] とか、while ((1)) とか書けるんだから
同じこと。で、[ 1 ] や ((1)) の戻り値は 0 であって、0 が真。
101名無しさん@お腹いっぱい。:2008/08/15(金) 07:03:26
>>87
なんで逆かって、コマンドの正常終了が 0 なんで、それと合わせてるのかと。
cmd && success などと書けるのはこのため。
102名無しさん@お腹いっぱい。:2008/08/15(金) 07:09:55
逆に、C言語の方も 0 を真にしておけば、
システムコールとかで extern int errno を参照しなくても
戻り値に直接 errno 返すことができたのにねぇ・・
103名無しさん@お腹いっぱい。:2008/08/15(金) 07:12:39
if (syscall() == 0)
if (syscall() != -1)
if (!syscall())

一番上がイイよね。
104ゆず:2008/08/15(金) 08:03:53
>>93
遅くなりましたがありがとうございましたm(__)m
105名無しさん@お腹いっぱい。:2008/08/15(金) 17:19:11
入門UNIXシェルプログラミング(ブルース・ブリン著)を読み終えたのですが、
(みなさんお薦めの通り、とても丁寧に書かれていて大変勉強になりました。
翻訳の上手さにも感心しました。)
この次に読んでおいた方が良いシェルスクリプト関連の書籍などはありますか?

それからpipe(2)やread(2)、stat(2)に関する話や、
前スレに出てきたSIGPIPEについて勉強したいと思っているのですが、
みなさんは何を読まれて勉強されたのでしょうか。
英語は苦手なのですが、洋書でも挑戦してみたいと思います。
よろしくお願いします。
106名無しさん@お腹いっぱい。:2008/08/15(金) 17:22:44
本ばっかり読んでても仕方ないよ
107名無しさん@お腹いっぱい。:2008/08/15(金) 17:42:54
そうですか。やっぱり、パソコン教室に通った方がいいですか?
108名無しさん@お腹いっぱい。:2008/08/15(金) 17:44:43
教材がUNIXのパソコン教室があれば。
109名無しさん@お腹いっぱい。:2008/08/15(金) 17:48:19
>>107
まあネタだとは思うが、マジレスしてやろう。
お前は本当に「入門UNIXシェルプログラミング」を最後まできちんと読んだのか。
きちんと読んでないなら、そらで言える位読め
そして、自分でスクリプトを組んでみたか?

そこまでしたなら「パソコン教室に行こう」などという考えは浮かばないと思う。
ま、ここは常識の問題だが
110名無しさん@お腹いっぱい。:2008/08/15(金) 17:57:56
鯖の中の人になれば毎日がスパルタなパソコン教室状態じゃないかと。
111名無しさん@お腹いっぱい。:2008/08/15(金) 18:52:25
結局 買っても読まない 読めないんだよね。
112名無しさん@お腹いっぱい。:2008/08/15(金) 19:58:16
(2) を勉強したいなら、UNIX システムコール全般の本になるな。C 言語だお。
113名無しさん@お腹いっぱい。:2008/08/15(金) 22:37:31
fork&execとかリダイレクトの仕組みとか、
初めて読んだときは面白かったなー。

114名無しさん@お腹いっぱい。:2008/08/15(金) 22:49:07
本なんか読むだけど満足して、実際に手を動かさなきゃ身につかんぞw
頭でっかちになるだけで、このスレのように
なんでもそうだ、コンピュータに限らんことだけど
115105:2008/08/15(金) 23:22:21
いろいろありがとうございます。
確かに自分で実際にスクリプトを書いてみないとだめですよね。
題材を探して実践してみたいと思います。

システムコールですか。
C言語の勉強をしないといけないようですね。
なんかどんどん深みにはまっていきそう…w
116名無しさん@お腹いっぱい。:2008/08/16(土) 00:29:53
>>115
まず簡単な目標を決めてみてわ?

ディレクトリの中で一番ディスクを使っているのはどれか? とか
一ヶ月以上 触っていないファイルはどれか? とか。
117名無しさん@お腹いっぱい。:2008/08/16(土) 01:41:25
>>115
まともなレスが付かず残念だったな
このスレの住人はまともに勉強をしてないらしいwww
118名無しさん@お腹いっぱい。:2008/08/16(土) 01:48:24
純正シェルという言葉が出てくるようなスレですからねえw
119名無しさん@お腹いっぱい。:2008/08/16(土) 05:51:31
わかりました。純正シェルを中心に解説してる本というと、どれになりますか?
120名無しさん@お腹いっぱい。:2008/08/16(土) 06:04:08
>>119 >>41見れ
121名無しさん@お腹いっぱい。:2008/08/16(土) 06:05:54
わかりました。純正シェルを中心に解説してるパソコン教室というと、どれになりますか?
122名無しさん@お腹いっぱい。:2008/08/16(土) 12:32:07
AVIVA
123名無しさん@お腹いっぱい。:2008/08/16(土) 16:33:13
IPCをやるのが一番面白いのでわ?
124名無しさん@お腹いっぱい。:2008/08/16(土) 16:34:43
昔のSunのワークステーションでしたっけ?
125名無しさん@お腹いっぱい。:2008/08/19(火) 00:52:08
http://www.thinkit.co.jp/cert/article/0707/2/1/2.htm

これみたいにコマンドをフルパスで書く人ってたまにいるけど何なの?
PATH を export するんじゃダメなんかね。アフォすぐる。

# フルパスで書くんだったら if も
# if /usr/bin/[ hogehoge ] と書いて欲しいんですがw
126名無しさん@お腹いっぱい。:2008/08/19(火) 01:03:09
それは、if じゃなくて、test
127名無しさん@お腹いっぱい。:2008/08/19(火) 01:09:46
突っ込み所そこかYO!
128名無しさん@お腹いっぱい。:2008/08/19(火) 01:17:29
>>125
恥ずかしながら俺も「フルパスで書く人」なんだけど、

PATH_KEEP="$PATH"; PATH=/bin:/sbin; export PATH
~~~すくりぷと本文~~~
PATH="$PATH_KEEP"; exit 0

とすれば問題ないような気がするんだが(ダメなのか?)ついフルパスでかいてしまう。
あとオライリー本に「コマンドは絶対パスで指定すべきです。」とあったのが大きいな。
129名無しさん@お腹いっぱい。:2008/08/19(火) 01:20:50
>>125
[ が内部コマンドな sh ということじゃないか?w
130名無しさん@お腹いっぱい。:2008/08/19(火) 01:22:48
盆休みの間はまっていたのですが
自分では解決できそうにないので質問します。

/var/log/secure から
grep -h "^${agoTime}.*sshd\[.*\]: \(Invalid user\|Received disconnect from\|Failed password for\)"
とやって、sshに接続失敗をしたログを取得した後
expr を使って
expr 'Aug 16 21:02:43 localhost sshd[27299]: Received disconnect from 123.456.789.012: 11: Bye Bye' : '.*sshd.* \([0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}\)'
こういった感じで IPアドレスだけを取得したいです。(123.456.789.012)
\(\)で囲まれた部分を変えてみても 上手にIPアドレスが取得できません。
実行すると、ヌル?ナル?(空白文字が帰ってきているようです。)
どういう風に\(\)内を記述すれはよいでしょうか?
131名無しさん@お腹いっぱい。:2008/08/19(火) 01:41:03
スペースが1個多いだけかと。
132名無しさん@お腹いっぱい。:2008/08/19(火) 01:45:44
>>128
シェルスクリプトの中で export PATH されているのを実行しても、
その環境変数が有効なのはスクリプト中だけだよ。
終了前に戻す必要なんてない。

終了後も維持するためには、実行ではなくて. (ドット)で読み込む必要がある。
133名無しさん@お腹いっぱい。:2008/08/19(火) 01:49:37
130です。
131さん。ありがとうございます!!!
スペースが1つ要りませんでした><こういうのはスレを汚すというんですかね、
すいませんでした。でも
感謝いたします。どうもありがとうございます。
134名無しさん@お腹いっぱい。:2008/08/19(火) 02:00:12
>>130
お題とは関係ないけど、libwrap リンクさせて hosts.allow である程度は弾いた方がいいよ。
(例
sshd : 127.0.0.1 : allow
sshd : 192.168. : allow
sshd : .jp : allow
sshd : ALL : deny
135名無しさん@お腹いっぱい。:2008/08/19(火) 02:08:12
そういえば、expr って、\| みたいなのはできないんだっけ?
\{m,n\} を使わずにお題を解こうとして、困ってしまった。
136名無しさん@お腹いっぱい。:2008/08/19(火) 02:57:42
>>132
そうなんですか。ありがとう
どちらにしろ export PATH しておけばフルパスで書かなくてもOK ってことか。
137名無しさん@お腹いっぱい。:2008/08/19(火) 03:53:22
フルパスで書くと移植性を損なう
138名無しさん@お腹いっぱい。:2008/08/19(火) 04:54:27
>>132
.じゃだめだろw
139名無しさん@お腹いっぱい。:2008/08/19(火) 08:17:22
>>136
export する必要もない。 PATHを設定すれば十分。
むしろ、PATHがexportされないように書くのが難しい。
140名無しさん@お腹いっぱい。:2008/08/19(火) 10:37:18
1 純正シェルではPATHはexportされてない。
2 unset PATHしてから設定すれば楽勝。
141名無しさん@お腹いっぱい。:2008/08/19(火) 10:50:59
>>140
純正シェルではPATHは unsetできない。(やるとエラーが出る)
142名無しさん@お腹いっぱい。:2008/08/19(火) 11:10:14
>>141
お前が純正と信じているそれは実はパチモン。
http://docs.sun.com/app/docs/doc/816-5165/unset-1?l=Ja&a=view
For each name, unset removes the corresponding variable or function value.
The variables PATH, PS1, PS2, MAILCHECK, and IF cannot be unset.

真の純正シェルにはそのような制限はない。
http://www.opengroup.org/onlinepubs/009695399/utilities/unset.html
143名無しさん@お腹いっぱい。:2008/08/19(火) 11:18:50
>>142
本題に関係ないけど、
そのままコピペしてそう書いてあったならドキュメントのバグ。
バグ報告よろ。

× IF cannot be unset
○ IFS cannot be unset
144名無しさん@お腹いっぱい。:2008/08/19(火) 11:35:08
>>142
それ、unsetに-fや-vのオプションが存在する時点で純正シェルじゃないよ。
145名無しさん@お腹いっぱい。:2008/08/19(火) 11:47:43
FreeBSDのshells/v7shはどれくらい純正に近いですか?
146名無しさん@お腹いっぱい。:2008/08/19(火) 12:08:39
ほど遠い。
147名無しさん@お腹いっぱい。:2008/08/19(火) 18:37:54
>>138
.(ドット)で読み込めば、スクリプト内で export した変数は、
カレントシェルでも環境変数になるでしょ
148名無しさん@お腹いっぱい。:2008/08/19(火) 20:02:18
PATH PS1 PS2 IFSをunsetできなくしている理由は理解できるが、
ユーザー用のオマケ機能であるMAILCHECKまでunsetできないのは
今となっては意味不明だな。そもそもシェル上でメールチェックしている人も
小数派だろうし。そこまでしてunsetできないように保護するべき機能か?
149名無しさん@お腹いっぱい。:2008/08/19(火) 20:33:55
>>144
>>142はUNIXマークの純正シェルの仕様なんだが、お前の純正シェルは何マークなんだ?
150名無しさん@お腹いっぱい。:2008/08/19(火) 20:37:52
初歩的な質問ですみませんがよろしくお願いします。

#!/bin/sh
#!/bin/bash
これとこれは同じ?ちなみに何シェルって言うんですか?
よろしくお願いします。
151名無しさん@お腹いっぱい。:2008/08/19(火) 21:30:46
同じ
152名無しさん@お腹いっぱい。:2008/08/19(火) 21:36:00
#!/bin/sh って書いたら Bourne Shell で使えない機能は使うなよ
153名無しさん@お腹いっぱい。:2008/08/19(火) 21:52:01
>>150
バッシェル
154名無しさん@お腹いっぱい。:2008/08/19(火) 22:41:06
何シェルって言うんですか?
って質問する時点で、大体のことは分かってるんじゃないかって疑ってしまう
155名無しさん@お腹いっぱい。:2008/08/20(水) 00:20:08
厳密にはちがうだろ。たいがい sh = bash って場合が多いけど
たまに純正sh (FreeBSDとかの)使うととまどうよ、配列変数つかえないしね。
156150:2008/08/20(水) 00:55:00
レスありがとうございます。
基本同じだけど厳密には違う?
bashこれはボーンシェルって言うの?
shこれは?
157名無しさん@お腹いっぱい。:2008/08/20(水) 01:53:16
Bourne Shell
Bourne Again Shell
158150:2008/08/20(水) 01:59:06
>>157
ありがとう!
159名無しさん@お腹いっぱい。:2008/08/20(水) 04:38:52
ビーシェルとバッシュ
またはボーナゲインシェル
160名無しさん@お腹いっぱい。:2008/08/20(水) 07:34:55
>>155
>たまに純正sh (FreeBSDとかの)使う

ダウト。FreeBSDのは純正shじゃない。

純正シェルなら、
echo $(pwd) とか、export LANG=C とかの記述が使えてはいけない。
161名無しさん@お腹いっぱい。:2008/08/20(水) 07:52:03
そもそもashだしねぇ
162名無しさん@お腹いっぱい。:2008/08/20(水) 10:17:57
sample.log.20080501
sample.log.20080601
sample.log.20080701
sample.log.20080801

というファイル名のファイルがあります。下の8桁は、年月日です。
そのファイルを、shellを実行した日より2ヶ月前のファイルならば削除したいのですがなんか良い方法はないでしょうか?
ちなみに年をまたぐ時も問題なくできようにしたいのですが
例としては8月20日にshellを実行した場合、sample.log.20080501,sample.log.20080601だけを削除します。
163名無しさん@お腹いっぱい。:2008/08/20(水) 10:28:06
まずは GNU dateを使った解法を誰かが書き込む

GNU依存、と指摘、

純正シェルでの方法を誰かが書き込む

…という流れですね、わかります
164名無しさん@お腹いっぱい。:2008/08/20(水) 10:30:28
その前に誰かがMD5値を書き込む
165名無しさん@お腹いっぱい。:2008/08/20(水) 10:39:12
二ヶ月前以前なら、普通に整数と考えて引き算すればいいだろJK
166名無しさん@お腹いっぱい。:2008/08/20(水) 10:43:59
>>165
アフォか。
それだと年を跨ぐ時に、1ヵ月しか離れてないのに2ヵ月以上と判断されるだろw
167名無しさん@お腹いっぱい。:2008/08/20(水) 11:12:59
>>162
ちゃんとスクリプト書くの面倒だから、ヒントだけね。

GNU date方式:

date -d -2months +%Y%m%d で、2ヵ月前の日付の数値が出る。
例えば今日実行すれば、
20080620
と出る。この数値とファイル名を比較する。


純正シェル方式:

年の4桁(例:2008)を12倍した値と、月の2桁を加算する。(という前処理をする)
例: 2007年12月 → 2007*12+12=24096
例: 2008年01月 → 2008*12+01=24097
この数値は、年を跨いでも1ヵ月に1ずつ変わる連続した値になるので、
この数を使って引き算して、2以上離れていたら2ヵ月以上とみなす。
(日付の2桁を下に付けて、200以上離れていたら2ヵ月以上)
168名無しさん@お腹いっぱい。:2008/08/20(水) 11:18:03
t=$(( $(date +%Y) * 12 + $(date +%m | sed -e 's/^0//') ))
YEAR=$(( (t - 2) / 12 ))
MONTH=$(( (t - 2) % 12 ))
EXPIRED=$(printf "%04d%02d%02d" $YEAR $MONTH $(date +%d))

# EXPIRED=$(date --date "2 month ago" +%Y%m%d)

LOGNAME=sample.log
for file in $LOGNAME.????????
do
    [ "$file" \< "$LOGNAME.$EXPIRED" ] && echo "$file"
done
169名無しさん@お腹いっぱい。:2008/08/20(水) 11:34:51
>>168
testの \< 演算子は bash依存。
sedで頭の0を落す必要なし。
170名無しさん@お腹いっぱい。:2008/08/20(水) 11:51:05
>>169
> testの \< 演算子は bash依存。
http://www.opengroup.org/onlinepubs/009695399/utilities/expr.html

> sedで頭の0を落す必要なし。
http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_04
0n は8進数として扱われるので、08 09 でエラーになります。
171162:2008/08/20(水) 11:51:16
なるほど勉強になりました。
ありがとございした。
シェルスクリプトって奥が深くて結構迷うですよね
172名無しさん@お腹いっぱい。:2008/08/20(水) 12:00:22
printf(1) に渡す月のとこも0を落とす必要がありますね
173名無しさん@お腹いっぱい。:2008/08/20(水) 12:16:22
>>170
$ ksh
$ [ aaa \< bbb ]
ksh: [: <: unknown operator
$ echo $((08 + 09))
17

$ zsh
% [ aaa \< bbb ]
zsh: condition expected: <
% echo $((08 + 09))
17


結論:
>>169 の言い分が正しい。
174名無しさん@お腹いっぱい。:2008/08/20(水) 12:21:39
あああ test == [ != expr だった
175名無しさん@お腹いっぱい。:2008/08/20(水) 12:27:19
>>174
== は純正シェル(笑)ダト使エマセンガ?
176名無しさん@お腹いっぱい。:2008/08/20(水) 14:37:26
>>173
つ echo $((015 + 014))
177名無しさん@お腹いっぱい。:2008/08/20(水) 14:47:05
>>176
流れ欲嫁。

date +%m の結果が 015 とか 014 になることはあり得ない。
よって、頭の0を落す必要なし。
178名無しさん@お腹いっぱい。:2008/08/20(水) 14:50:11
$ bash --version
GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
$ bash -c 'echo $((08 + 09))'
bash: 08: value too great for base (error token is "08")
179名無しさん@お腹いっぱい。:2008/08/20(水) 14:57:07
話を元に戻して、
GNU dateを使わないようにしているのに bash依存文法を使ってる
>>168 は、コーディングポリシーに一貫性がないぞ。

ちゃんとした純正シェル版、誰か書ける?
180名無しさん@お腹いっぱい。:2008/08/20(水) 15:01:56
>>179
POSIX 準拠ですがなにか。[ の件は expr に直して下さい
181名無しさん@お腹いっぱい。:2008/08/20(水) 15:02:11
頭の 0 を取るにしても、sedは無駄。

$ expr 08 + 0
8

とかを利用した方がいい。
182名無しさん@お腹いっぱい。:2008/08/20(水) 15:06:33
>>180
POSIXは純正シェルじゃありませんから(笑)
183名無しさん@お腹いっぱい。:2008/08/20(水) 15:07:21
>>182
一貫性がないと言ったのはあなたです
184名無しさん@お腹いっぱい。:2008/08/20(水) 15:12:42
原子性がない。
185名無しさん@お腹いっぱい。:2008/08/20(水) 15:12:44
「一貫性がある」=「一貫して純正シェル以外の文法を使わない」
186名無しさん@お腹いっぱい。:2008/08/20(水) 15:39:18
>>181 一見、何をしてるのか謎い。素直に sed しとけば「ああ文字列加工ね」って分かる。
187名無しさん@お腹いっぱい。:2008/08/20(水) 16:07:12
>>186
そうじゃなくて、その後の数値演算をすべて expr でやれば、
そもそも 0 を取る必要がない。

>>168 の場合は、ちょうど別の演算の途中だから、
そのまま演算すれば 0 を取る必要がない。


t=`expr \`date +%Y\` \* 12 + \`date +%m\` `

おまけに、純正シェル対応完璧w
188名無しさん@お腹いっぱい。:2008/08/20(水) 16:12:52
ちなみにperlで書くとどうなるの?
189名無しさん@お腹いっぱい。:2008/08/20(水) 16:20:22
なにお? 日付ならこう。

perl -e '($Y,$M,$D,$h,$m,$s)=(localtime(time))[5,4,3,2,1]; \
printf("%04d/%02d/%02d %02d:%02d:%02d\n",$Y+1900,$M+1,$D,$h,$m,$s);'
190ゆう:2008/08/20(水) 19:28:40
こんばんわ。
研究室の課題でサーバから得られるログをひとつのディレクトリに格納するシェルを作成することになったのですが、
いまいちわからないのでどなたかご教授お願いします。
課題:サーバから得られるログをひとつのディレクトリに格納するシェルを作成する
制限:
@検出されたログの格納先は /tokai/debug/kasai の直下に /現在日付/現在時刻 
というディレクトリを追加し、ログを格納すること。
Aログを格納後にはタイムスタンプを更新すること。
Bログを格納したファイルが作成されたら、アクセス権限をすべてrwxに変更すること。
以上のような要件が設けられています。
Aはtouch、Bはchomdを使っていけばいいのでしょうか?
どなたかご指導お願いしますm(__)m
191名無しさん@お腹いっぱい。:2008/08/20(水) 19:54:44
ログって何だよ
192名無しさん@お腹いっぱい。:2008/08/20(水) 20:01:39
>>190
>はtouch、はchomdを使っていけばいいのでしょうか?

「はtouch」、「はchomd」ってなんですか?
193名無しさん@お腹いっぱい。:2008/08/20(水) 20:06:13
ずいぶんレベルの低い研究室ですね!
194名無しさん@お腹いっぱい。:2008/08/20(水) 20:07:24
何を研究してるんだかw
195名無しさん@お腹いっぱい。:2008/08/20(水) 20:33:42
>>190
>>92 さんが同じような研究室で質問されているようです。
回答は >>93 で、>>104 で解決されているようです。
全く同じかどうかはわかりませんが、>>93 が参考になるのでは?
196名無しさん@お腹いっぱい。:2008/08/20(水) 20:37:05
シェルってゆうな。クズ。
197名無しさん@お腹いっぱい。:2008/08/20(水) 20:57:39
誰か使ってもいい外部コマンドをまとめてくれよ
198ゆう:2008/08/20(水) 21:06:31
>>191
ログというより正確にはバグが検出された際のログでした。すいませんm(__)m

>>192
調べてみて、touchもchomdコマンドなんですが、それを使えばできるかなと思って書いてみました。

>>193・194
私自身は入ったばっかりなんで、課題として今回のが与えられてるだけですので、研究してるわけではありません。

>>195
似ているみたいなのですが、よくわからないのでpealを調べてみます。
199名無しさん@お腹いっぱい。:2008/08/20(水) 21:11:42
中点かよ
200名無しさん@お腹いっぱい。:2008/08/20(水) 21:24:52
その点は出ねぇよ
201名無しさん@お腹いっぱい。:2008/08/20(水) 21:27:10
どういう風にログが出力されるのか分からんと処理のしようがねぇぇぇwww
まぁどうせ、$cmd >> /path/to/log 2>&1 ってオチなんだろうけどな。
202ゆう:2008/08/20(水) 21:44:54
>>201
どうログがでるかは未確認です、すいません(((・・;)
今日の帰り際に口で言われたのをメモっただけなので。
明日確認してみます。
203名無しさん@お腹いっぱい。:2008/08/21(木) 12:32:29
dir1 とdir2のディレクトリを見て、dir2にはないファイルを
ファイル名を含んだメッセージを表示した後にdir1からdir2にコピーしたいのですが
どうすればいいですか?
できるだけ簡潔に書こうとしたんですがわかりにくかったらてすいません。
204名無しさん@お腹いっぱい。:2008/08/21(木) 12:48:28
>>203
#!/bin/sh

for file in dir1/*
do
[ -f "$file" ] || continue # 通常ファイル以外はパス
f=`basename "$file"`
if [ ! -f dir2/"$f" ]; then
echo "$f がないのでコピーします"
cp "$file" dir2/"$f"
fi
done
205名無しさん@お腹いっぱい。:2008/08/21(木) 12:54:28
以下、「ドットファイルがコピーされません」禁止。
206名無しさん@お腹いっぱい。:2008/08/21(木) 12:55:24
>>204
basename使えばいいんですね
とりあえずなんとかなりそうなので試してみます
ありがとうございました
207名無しさん@お腹いっぱい。:2008/08/21(木) 15:55:47
rsync -v --ignore-existing dir1/ dir2/
208名無しさん@お腹いっぱい。:2008/08/21(木) 16:03:06
>>205
つ ???*

以下、「.aがコピーされません」禁止。
209名無しさん@お腹いっぱい。:2008/08/21(木) 16:50:56
同じシェルスクリプト変数にどうして数字と文字列を代入できるか教えてください。
210名無しさん@お腹いっぱい。:2008/08/21(木) 16:54:04
>>209
シェルスクリプト変数(笑)

シェル変数ではすべて文字列扱い。
それを数字と解釈するかどうかはコマンド次第。
211名無しさん@お腹いっぱい。:2008/08/21(木) 17:35:49
>>208
「?」は、ファイル頭の「.」にはマッチしない。

>つ ???*
がそもそも間違ってる。
212名無しさん@お腹いっぱい。:2008/08/22(金) 06:07:05
who > tempをし、そこから
grep username /etc/passwd/のフルネームだけを表示させたいのですが、
cutだとうまくユーザー名やフルネームを任意に切り出せません。
どんなコマンドかオプションを使えばいいかわかりますか?
213名無しさん@お腹いっぱい。:2008/08/22(金) 06:14:38
cut -f 5 -d :
awk -F: '{print $5}'
214名無しさん@お腹いっぱい。:2008/08/22(金) 06:25:46
>>213
ありがとうございました
215名無しさん@お腹いっぱい。:2008/08/22(金) 07:24:33
>>212
whoの代わりに fingerコマンド(引数なし)利用した方が早くねぇ?
216名無しさん@お腹いっぱい。:2008/08/22(金) 09:21:50
>>215
こういう風に作ってみては、と言われたので
とりあえずその方向に沿うように作りかったんです。
コマンド探してる時にfinger見つけてはいたんですけど。
217名無しさん@お腹いっぱい。:2008/08/22(金) 15:06:21
>>215
finger | grep `whoami` | head -1 | cut -f 3 -d \t
でおk かい?
218217:2008/08/22(金) 15:08:33
誤爆 orz
finger | grep `whoami` | head -1 | cut -f 2 -d \t
219名無しさん@お腹いっぱい。:2008/08/22(金) 16:04:44
>>217-218
そうじゃなくて、
finger
一発で済むんだが。
220名無しさん@お腹いっぱい。:2008/08/22(金) 19:16:48
いずれにしても、/etc/passwdを直接 grepするのはお勧めしない。
FreeBSDとかでは : の数が違うし、
NISまたはLDAPで管理されてる場合、/etc/passwdには載っていないし。
221名無しさん@お腹いっぱい。:2008/08/22(金) 20:00:24
getpwent(3) 最強?
222名無しさん@お腹いっぱい。:2008/08/23(土) 05:03:28
getent passwd username | awk -F: '{print $5}'
223名無しさん@お腹いっぱい。:2008/08/23(土) 10:11:56
N個ファイルが見付かった時点で探索を打ち切るようにfindを呼びだしたいんですがどうすればいいんでしょうか
find ...options...|headでは探索は続いてしまいますし
224名無しさん@お腹いっぱい。:2008/08/23(土) 10:53:13
headが終わるとパイプが閉じる。
閉じたパイプに書き込んだ時にエラーまたはシグナルが発生してfindは終わる。
N+1個発見して終了が許容できないならfindを改造する。
225名無しさん@お腹いっぱい。:2008/08/23(土) 11:23:48
うはー、パイプってそんな便利な仕様になってるんですか
ありがとうございました
226名無しさん@お腹いっぱい。:2008/08/23(土) 13:09:56
もう純正shはposix-sh という世代
227名無しさん@お腹いっぱい。:2008/08/23(土) 13:41:32
今の若い世代は HP-UXなんて使わん。
228名無しさん@お腹いっぱい。:2008/08/23(土) 14:01:18
じゃあbashか?というとそうでもなさそう
229名無しさん@お腹いっぱい。:2008/08/23(土) 15:14:01
若い世代はシェルを1から作る
自分らしさを演出するために
230名無しさん@お腹いっぱい。:2008/08/23(土) 16:28:50
9から始まる8桁の数字をチェックするif文を作りたいのですが
if [ $hoge = 9??????? ] みたいにはできますか?自分で色々やってみたんですが
ちょっとうまくいかないので。
後、入力されたvalueに数字が混じってるかどうかをチェックしたいのですが、
どのコマンドを使えばいいですか?
231名無しさん@お腹いっぱい。:2008/08/23(土) 16:30:35
if echo $hoge | egrep -q '^9[0-9]{8}$'; then echo vip; fi
232名無しさん@お腹いっぱい。:2008/08/23(土) 16:35:09
case "$hoge" in
    9???????) echo true;;
    *) echo false;;
esac
233名無しさん@お腹いっぱい。:2008/08/23(土) 17:04:52
参考になりました。ありがとうございます。
234名無しさん@お腹いっぱい。:2008/08/23(土) 20:51:14
if expr "$hoge" : '9.......$'; then
235名無しさん@お腹いっぱい。:2008/08/23(土) 20:54:43
>>234
exprの場合、最後の $ は必要ない。
あと、> /dev/null しないとexprの出力が出てしまう。
236名無しさん@お腹いっぱい。:2008/08/23(土) 20:58:13
>>235
$ がないと9桁以上でもマッチしてしまうだろw
「> /dev/null」の件は同意。

それより >>232 の caseを使うのを推奨。
237名無しさん@お腹いっぱい。:2008/08/23(土) 20:59:37
「8桁の数字」を満たしていないので減点5。
238名無しさん@お腹いっぱい。:2008/08/23(土) 21:02:41
>>237
case $hoge in 9[0-9][0-9][0-9][0-9][0-9][0-9][0-9]) echo OK;; *) echo NG;;esac

と書けと?
239名無しさん@お腹いっぱい。:2008/08/23(土) 21:11:11
>>230
簡単にやるなら if [[ $hoge = 9??????? ]] で行けるよ。
[ ] じゃなくて、[[ ]] を使うのがポイント。
240名無しさん@お腹いっぱい。:2008/08/23(土) 21:12:36
>>239
POSIX shでも叩かれるこのスレで [[ とは
241名無しさん@お腹いっぱい。:2008/08/23(土) 21:17:30
つかえるものはつかう
242名無しさん@お腹いっぱい。:2008/08/23(土) 21:19:25
[ はコマンドだというのは知っていますが、
僕のPCには [[ コマンドはインストールされていないようです。
[[: not found になります。[ をコピーすれば argv[0] 切替で動くんでしょうか?
243名無しさん@お腹いっぱい。:2008/08/23(土) 21:50:12
if [ $hoge -ge 90000000 -a $hoge -le 99999999 ]; then
echo うは
fi
244名無しさん@お腹いっぱい。:2008/08/23(土) 21:52:38
>>243
それだと、$hogeが数値じゃない場合に
integer expression expected
ってエラーになる。
245名無しさん@お腹いっぱい。:2008/08/23(土) 21:53:36
2>/dev/null
246名無しさん@お腹いっぱい。:2008/08/23(土) 21:54:31
if ((hoge >= 90000000 && hoge <= 99999999)); then echo OK; fi
247名無しさん@お腹いっぱい。:2008/08/23(土) 22:01:39
bash/ksh依存か
248名無しさん@お腹いっぱい。:2008/08/23(土) 22:33:54
 純 正 以 外 立 入 禁 止
249名無しさん@お腹いっぱい。:2008/08/23(土) 23:35:48
総合スレなのに純正に拘るってのも変な話だけどな
250名無しさん@お腹いっぱい。:2008/08/24(日) 00:02:37
シェルスクリプトなんてその場で当人の問題が解決できればいいケースが大半で、
移植性とか気にする必要はあまりないと思うが。
251名無しさん@お腹いっぱい。:2008/08/24(日) 00:14:33
>>244
エラーになったら、if の中は実行されないから問題無いのでは?
252名無しさん@お腹いっぱい。:2008/08/24(日) 00:41:09
>>235
必要ないのは^
これは暗黙
253名無しさん@お腹いっぱい。:2008/08/24(日) 01:19:14
 純 正 以 外 立 入 禁 止
254名無しさん@お腹いっぱい。:2008/08/24(日) 01:28:09
>>230
> if [ $hoge = 9??????? ]

これが上手く行かないのは,?,*,[] は基本的にカレントディレクトリのファイル名に補完されるから。
おそらく,カレントディレクトリに 9??????? を満たすファイル名のファイルが存在しないから
test が上手く機能しない。
255名無しさん@お腹いっぱい。:2008/08/24(日) 03:00:07
では純正の話題でも。


アクロポリスの丘にそびえ立つ誇り高きパルテノン神殿。
カードの左端から3センチ5ミリの部分を見て欲しい。
神殿の屋根の上に、小さくアメックスのセンチュリオンが立っているのが見えるだろうか?
それは高貴な神殿と、それを警備している兵の情景を描いている。
まさに、三井住友VISAカードとアメリカンエキスプレスカードの
それぞれのグレードを表すのに相応しい巧みな構成である。

右上の部分には、オリーブのリースの囲まれた
瑞々しい「V」の紋章。
それは、全世界でその名を轟かせるVISA中のVISAカードである、本物の証。
純正であり、由緒正しい血統を示す紋章である。
この「V」マークのついていないVISAカードは
ひとくくりにVISAカードと言っても、まるで血統が違うのだ。

カードの「色」にも、計算し尽くされた演出がある。
ブティックやレストランの照明で
一番美しく輝くように計算されたゴールド色の粒子の大きさ、そして色。
それは三井住友VISAゴールドカードホルダーと
カードを受け取った店員だけが知りえる究極の美しさである。

三井住友VISAゴールドカードは
今までのどんなカードも到達できなかった世界を、
見事に表現しきったカードだと言えるだろう。
256名無しさん@お腹いっぱい。:2008/08/24(日) 04:09:41
2桁の数字のみを判別したいんですけど
case $hoge in
[0-9][0-9])
echo "ok"
;;
じゃダメなんですか?
257名無しさん@お腹いっぱい。:2008/08/24(日) 07:31:54
>>251
余分なメッセージが表示されるのが問題。

>>254 そういう問題じゃない
>>239 参照
258名無しさん@お腹いっぱい。:2008/08/24(日) 07:34:01
>>256
esac が抜けてる

あと、01 02 03とかを1桁と考えるなら、[1-9][0-9]で判定した方がいい。
259名無しさん@お腹いっぱい。:2008/08/24(日) 07:36:37
純正シェルはどこの国に逝けば手に入りますか?
こまんど?
260名無しさん@お腹いっぱい。:2008/08/24(日) 07:56:29
すべての起源は韓国にあり!
261名無しさん@お腹いっぱい。:2008/08/24(日) 10:58:57
>>259
bash, zsh 標準でいいから、もう。
tcsh とかいらないし、
zfs with fuse on Linux ができるので、
もはや FreeBSD はいらない。

だから、POSIX sh でいいから。純正とか気にすんな!
262名無しさん@お腹いっぱい。:2008/08/24(日) 10:59:58
>>230
[ $hoge = 9??????? ] は test $hoge = 9??????? と同じなので2つの問題がある

1つ目は * や ? や [abc] がワイルドカード(ファイル名展開が発生)になり、カレント・ディレクトリに 9??????? に
相当するものがあるとそのファイル名(ディレクトリ名)に変わってしまう、例えば 9_ab.log とかになる事がある

2つ目はそもそも論だが、test の文字列比較 "$hoge" = "9???????" では * や ? に特別な意味は無い
* や ? や [abc] はそのままの文字として扱われる

それに対して [[ $hoge = 9??????? ]] とすると、上記の1つ目の問題は起きず(ファイル名展開が発生しない)
* や ? や [abc] は正規表現と見なされて特別な意味を持つのでうまくいく
お題に合わせるには [[ $hoge = 9[0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]] とした方が良いけど

[[ ]] が使えない環境なら case や expr や grep や awk を使ってもいいけど [ $hoge = 9??????? ] では無理
263名無しさん@お腹いっぱい。:2008/08/24(日) 11:08:05
>>262
すでに解決してる件に関して蛇足で不正確な解説乙w

>* や ? や [abc] は正規表現と見なされて

シェルの * や ? や [abc] は正規表現ではありません。

根本を理解されてないようで乙w
264名無しさん@お腹いっぱい。:2008/08/24(日) 11:52:56
蛇足でもないような

×正規表現
○glob
265名無しさん@お腹いっぱい。:2008/08/24(日) 13:10:19
regexp(5)とかを読んだことある?
正規表現て regular expression の日本語訳だって知ってる?grep や sed の書き方が正規表現って訳じゃないんだが
それに glob はファイル名展開のときの話で、[[ $hoge = 9??????? ]] の時の ??? は glob とは違うんだけど分かってる?
266名無しさん@お腹いっぱい。:2008/08/24(日) 13:27:12
このスレに書き込んでる人は少なくとも >>265 よりレベル高いからw
「正規表現て regular expression の日本語訳だって知ってる?」みたいな
愚問をわざわざ書いていることで >>265 の程度が知れる。
267名無しさん@お腹いっぱい。:2008/08/24(日) 13:32:25
>>265

シェルでは、正規表現とパターンマッチングは区別される。
(一部の)シェルでの正規表現の演算子は =~ であって = != ではない。

$ [[ aaa =~ ... ]] && echo match
match

$ [[ aaa = ??? ]] && echo match
match
268名無しさん@お腹いっぱい。:2008/08/24(日) 13:39:21
[[ expression ]]に書けるのは、正規表現じゃない。
貧弱すぎて3型文法に分類できない。
単なるパターンマッチ。glob風の。(ファイル名のマッチじゃない点が違う)
269名無しさん@お腹いっぱい。:2008/08/24(日) 13:53:55
本題に戻って、9で始まる8桁の数にマッチさせるなら、
シェルの「正規表現」を使うなら、

[[ $hoge =~ ^9[0-9]{7}$ ]]

で行けるな。bash依存だけど。

>>231 はひと桁間違えてるよw
270名無しさん@お腹いっぱい。:2008/08/24(日) 14:07:35
>>266
267や268のように具体的な話で否定するならまだしもレベル云々とか書いちゃうほうが憐れ

>>267
(一部の)シェルの正規表現(というかパターンマッチ)は =, != なので・・・
もともと全シェルに当てはまる!なんてことまでは言ってないつもりだけど

>>267, 268
そもそもの前提なんだろうけど、文字列のパターン・マッチングに行うのに
正規表現って考え方を取り入れのであって文法とか細部は実装の問題に過ぎない
パターン・マッチングと正規表現を文法的な視点で区別するのは意味がないように思う
英語で色々な資料を読んだことある?
271名無しさん@お腹いっぱい。:2008/08/24(日) 14:17:32
頭の悪い俺には、?や*を使っていれば、
それは正規表現だと言っているようにしか見えない。
272名無しさん@お腹いっぱい。:2008/08/24(日) 14:21:33
シェルのパターンマッチは正規表現の要件を満たしていないから、
そういう意味でも正規表現とは言えないんじゃなかったっけ?
実装の問題とか、細部の違いの問題じゃないよ。
273名無しさん@お腹いっぱい。:2008/08/24(日) 14:33:46
形式言語理論的には、連接・選択・繰り返しのあるものが正規表現。
シェルグロブには繰り返しがないし、ピリオドの特別扱いとかがあるから、
シェルグロブという、正規表現とは別のものと考えたほうがよい。
274名無しさん@お腹いっぱい。:2008/08/24(日) 16:34:22
>>266
のように揚足取りしか出来ない人が多いかと思ったらそうでもないんだね

>271-273
正規表現とは何ぞや?って学問的視点の人から見ると文法が大事なんだろうね
ただ、* や ? を使えば正規表現って訳じゃない(そういうことじゃない)

UNIXの世界でパターンマッチングに使われる文法を調べると、
regular expression として色々纏められてる中にシェルのパターンもあったりする、後から纏めただけっぽいけど

だからって正規表現か?ってことには全くならないけど、パターンマッチングのことが重要であって
正規表現として分法的に正しいかどうかはあまり重要じゃないというかそこには拘ってないという感じ

正規表現という言葉がどうも気を害すようなのでパターンマッチングと前言撤回します
ただ glob ではないですよ
275名無しさん@お腹いっぱい。:2008/08/24(日) 17:11:50
globでいいんじゃねえの?
ファイル名のパターンマッチに使われることが多いだけであってさ。
276名無しさん@お腹いっぱい。:2008/08/24(日) 20:40:56
>>125 HOME=`/bin/echo $HOME` (゚д゚)
277名無しさん@お腹いっぱい。:2008/08/25(月) 08:21:11
>>273の「シェルグロブ」を
「シェルパターンマッチ」に置き換えれば正しい。
「シェルパターンマッチ」の*は、部分パターンの繰り返しではなく、
「シェルパターンマッチ」には、部分パターンの繰り返しはない。

「シェルグロブ」は「シェルパターンマッチ」をファイル名展開に使うためのもの。
caseや[[ ]]のは「シェルグロブ」ではない。
>>276
違います。
278名無しさん@お腹いっぱい。:2008/08/25(月) 12:45:00
くだらねw
279名無しさん@お腹いっぱい。:2008/08/25(月) 18:46:18
hoge1 hoge2 hoge3 という3つのファイルを削除したい時
rm hoge{1|2|3} みたいに簡潔に記述して展開を期待する
記法はありませんか?
280名無しさん@お腹いっぱい。:2008/08/25(月) 18:52:49
rm hoge[123]
rm hoge[1-3]
281名無しさん@お腹いっぱい。:2008/08/25(月) 18:52:49
rm hoge[0-9]*
282281:2008/08/25(月) 18:53:41
負けたorz
283名無しさん@お腹いっぱい。:2008/08/25(月) 19:14:39
元の形を尊重してrm hoge{1,2,3}
284名無しさん@お腹いっぱい。:2008/08/25(月) 19:29:11
rm hoge{1..3}
285名無しさん@お腹いっぱい。:2008/08/26(火) 07:26:50
罰種胃損乙
286名無しさん@お腹いっぱい。:2008/08/27(水) 00:48:55
cshで書かれた設定ファイルをbashのスクリプトでsourceや.で読み込むことはできますか?
287名無しさん@お腹いっぱい。:2008/08/27(水) 00:52:27
出来ません。終了。
288286:2008/08/27(水) 01:04:53
あ、sedとかでsetenvとかは置換しちゃえばいいのか
と思ったけどめんどくさいすね

289名無しさん@お腹いっぱい。:2008/08/27(水) 02:06:17
環境変数だけなら、
cshスクリプトでsourceしてから
本来のスクリプトをexecすれば
290名無しさん@お腹いっぱい。:2008/08/27(水) 06:18:40
bashのスクリプトでUSB制御ができますか?
291名無しさん@お腹いっぱい。:2008/08/27(水) 07:16:17
USB制御するコマンドを呼び出しましょう。
292名無しさん@お腹いっぱい。:2008/08/27(水) 09:07:51
ところでbashだとsourceも.も使えるけどどっちが正解?
というか違いあるの?
293名無しさん@お腹いっぱい。:2008/08/27(水) 09:13:34
>>292
「bash依存」と言われたくなければ . を使うのが正しい。
sourceも . も、動作は全く同じ。
294名無しさん@お腹いっぱい。:2008/08/27(水) 10:30:22
sh でもつかえる機能なのか
bash でしか使えない機能なのか
もう覚えきれねぇ

何年シェル使っても覚えきれねぇ
死ね俺
295名無しさん@お腹いっぱい。:2008/08/27(水) 16:18:22
null文字 (\x00) を出力するにはどうするのがよいでしょうか。

bash で echo -n $'\xd8\x42\xdf\xb7' などとすることで
好きなバイト列を出力することができることを知りました。
サロゲートペアなどを好きに出力できて幸せです。
しかし、 \x00 は手元では echo では単に無視され、
printf(1) では文字列の終わりと認識されているように見えます。
296295:2008/08/27(水) 16:21:08
ああ、今思いついて以下で確認できました。その他の方法があれば、
引き続きお教えください。お願いします。

ruby -e 'print "\0"'
php -r 'print("\0");'
297名無しさん@お腹いっぱい。:2008/08/27(水) 16:38:34
>>295
dd if=/dev/zero bs=1 count=1
298名無しさん@お腹いっぱい。:2008/08/27(水) 17:11:46
printf "\0"
299名無しさん@お腹いっぱい。:2008/08/27(水) 18:19:49
echo | tr '\n' '\0'
300名無しさん@お腹いっぱい。:2008/08/27(水) 22:41:50
下のスクリプトの挙動がよくわかりません。
なぜ実行に失敗する場合があるのでしょうか?

$ cat /tmp/test.sh
#!/bin/sh
execcmd() {
cmd=$1
echo "exec: ${cmd}"
${cmd}
}

execcmd "/bin/ls -l /tmp/" <--実行に成功する
execcmd "/bin/uname -a" <--実行に成功する

cat <<EOF >/tmp/test.cmd
/bin/ls -l /tmp/ <--実行に失敗する
/bin/uname -a <--実行に失敗する
EOF

IFS="
"
for l in `cat /tmp/test.cmd`; do
execcmd ${l}
done

「実行に失敗」は以下のように失敗します
exec: /bin/ls -l /tmp/
test.sh: 20: /bin/ls -l /tmp/: not found
exec: /bin/uname -a
test.sh: 20: uname -a: not found
301名無しさん@お腹いっぱい。:2008/08/27(水) 22:48:36
よく読んでないけど、IFSが改行だから空白が普通の文字扱いになったからでは?
302300:2008/08/28(木) 09:23:56
execcmd() { cmd=$1 echo "exec: ${cmd}" eval "${cmd}" } としてevalを使ったらなぜか期待通りの動作をしました。 なんで ${cmd} だとうまくいかない時があるんだろう? 誰か知ってたら教えてください。
303名無しさん@お腹いっぱい。:2008/08/28(木) 11:19:07
>>302
だから IFSだと言ってるだろ。IFSを初期状態(スペース・タブ・改行)に
戻さずに ${cmd} を実行すると、単語分割されないから、
"/bin/ls -l /tmp/" と言う名前の(スペース入りの)コマンドとみなされるというオチ。
304281:2008/08/28(木) 11:33:03
むしろ $@ でイイのでわ
305名無しさん@お腹いっぱい。:2008/08/28(木) 11:33:53
ウホwww漏れ>>281さん乙wwwwww
306295:2008/08/28(木) 13:33:44
>>297-289
自分としては printf "\0" が覚えやすそうです。
ありがとうございました!
307名無しさん@お腹いっぱい。:2008/08/28(木) 13:41:34
>>306
おいおい、オマエ自身、>>295 で 「printf(1) では文字列の終わりと認識されて」
正しく動作しないから、printf以外の方法を質問してるんじゃなかったのか?
ちなみに、俺の環境でも printf '\0' で正しく動作するが、
printfコマンドのバージョンによってはうまく動作しないこともあるのかと思って
みんな printf '\0' 以外の回答をしていたわけだが。
308名無しさん@お腹いっぱい。:2008/08/29(金) 00:30:57
サブシェルかどうかを知るにはどうしたら良いでしょうか。
zsh で
% hoge <(cd fuga; ls)
みたいな事をよくやるんですが、
chpwd での端末タイトル更新のprintの出力を
/dev/null にリダイレクトするのが面倒で、
なんとかしたいのです。
309名無しさん@お腹いっぱい。:2008/08/29(金) 00:54:09
printenv と (printenv) の結果を見比べる限りでは、SHLVL の値が減ってるな。
manページにはそんな記述なさそうだから、将来どうなるかわかんないけど。
310名無しさん@お腹いっぱい。:2008/08/29(金) 03:52:33
% zsh
% zsh
% ( ( ( ( ( (printenv SHLVL) ) ) ) ) )

インタラクティブなサブシェルではSHLVLが+1され、
非インタラクティブなのでは-1されるっぽいな。
だから厳密な判定としては固定値にするのはよろしくない。
311名無しさん@お腹いっぱい。:2008/08/29(金) 04:00:17
TTYIDLEが-1かどうかで判定できるっぽい
312名無しさん@お腹いっぱい。:2008/08/29(金) 15:38:26
.       /            ト、 !        |  |   |   |  | |
      | :.   |:         |: 斗    ー} ┼卜l   |   |  | |
      | :.   |:   \ / |\八     ハノ |丿`}メ:   }  | |
      | :.   |:    | \_jz≦ \  /  示⌒`≪ |  /  匸二ニ =ー- ァ
.        '; :   {:.   V ≠⌒7l   ヽ/   | ト-リj 》 /   {     / /
    ,.イ八   八   |〃 {ト-りj_        ゞー< .' イ     |ニ=-< ´ 
  / /_  \{h\从 ゝ >''". .    .:   : : : : : : : 从   |   `ヽ
/ ∠   _.二 了   ∧ : : : : : : :  ′       イ'      |       '
 -‐… ア´    |   ′ヘ          _       , ' |       |      }
    1     |      个 _      ⌒     /  |      |       {ヽ
.. //|    /  //  ,リ  {>. _   ,..イリ   八     ハ     l  \
/    j    /      /   \ヽ   ̄  //       ',  / ∧      |ヽ
.     ′   ,′\    /    ‐- \x   〃 /    ∨     ',    |  \
   /   /\   -‐/          zぅ≠く         ',  /  ∧   _ノ|
/ 介─マ′   ─ 7        ((   ))          Y      Y´:/ト、
  /: :|〉:/         /       /ミ竺彡\        |      ∨  v: :\
. /: : :|:/ /,   |   /      ,r<´  ミY/〃  `>、      |   ',    ト、  V : :.\
/:.-=彡イ    |   {   ,r<     ヽキ≠      >、    |   ハ   い\ ∨ : : 〉
: .: :}: :|: |   ∧  {  /         'キ/         \  | / |:   | | : \レ'⌒
廴ムイ: |   l: :|\ 乂          ∨             乂 /  1  | | : : :
: : : : : :..|   l:/|/`ヽ}             v          ∠ /\ |   从厂 : :
: : : : : :..|   | !                }{              Υ  /: : : : : : :
313名無しさん@お腹いっぱい。:2008/08/29(金) 16:44:47
またおまえか
314名無しさん@お腹いっぱい。:2008/08/30(土) 01:36:36
jot -rで整数の乱数を得ようとしています。
FreeBSD 6-STABLEではこうなります。
$ jot -r 100000 3 5|sort|uniq -c|sort -k2n
16706 3
33326 4
33287 5
16681 6
3から5の乱数を得ようとしているのに平気な顔して6を返すのです。
OpenBSD 3.3ではこうなります。
$ jot -r 100000 3 5|sort|uniq -c|sort -k2n
25273 3
49636 4
25091 5
最初と最後の出現確率がその他の半分になるのは悲しい仕様だとして諦めるとします。

(1) jot -r - 3 5で6が出るのはjotの仕様としてアリなのでしょうか。
  (範囲外の値が出たら最小値として扱うことで確率を均せるので便利なような気もしますが)
(2) 出力を加工せずに、jotだけでうまいこと均等な出現確率を得られるような
  パラメータの与え方はあるのでしょうか。3、4、5を3分の1ずつ得られるような。
315名無しさん@お腹いっぱい。:2008/08/30(土) 02:28:41
$ jot
sh: jot: command not found
316名無しさん@お腹いっぱい。:2008/08/30(土) 08:06:44
>>314
echo $((RANDOM*3/32768+3))
317295:2008/08/30(土) 12:18:36
>>307
間違った発言・わかりにくい発言をしていました。申し訳ありません。
bash の機能と printf の機能についてわかりにくく言及してしまいました。
また、 $'\x0' が printf(1) の引数に使われたとき、文字列の終わりと
認識されると思っていましたが、ちょっと違う現象かもしれません。
echo と printf の挙動にも、実は特に違いは見られないようでした。

$ printf $'\xcc\xcc\xcc' | od -tx1
0000000 cc cc cc
0000003
$ printf $'\xcc\x00\xcc' | od -tx1
0000000 cc
0000001
$ printf $'\xcc'$'\x00'$'\xcc' | od -tx1
0000000 cc cc
0000002
$ printf "\xcc\x00\xcc" | od -tx1
0000000 cc 00 cc
0000003

今では、 bash が $'\x00' を文字列の終わりと解釈するのかなと認識しています。
318名無しさん@お腹いっぱい。:2008/08/30(土) 13:27:41
>>317

bashのechoなら、echo $'\xcc\x00\xcc' などとせずに、

$ echo -en '\xcc\x00\xcc' | od -tx1
0000000 cc 00 cc
0000003

とやればいいだろ。
319名無しさん@お腹いっぱい。:2008/08/31(日) 14:52:27
『do』って『done』で閉じるじゃないですか、ところでこの『done』って何と読んでますか?
『ドーン』?、『ダーン』?、『ドネ』?、『ディーオーエヌイー』?
320名無しさん@お腹いっぱい。:2008/08/31(日) 15:00:24
英単語も読めんのか
321名無しさん@お腹いっぱい。:2008/08/31(日) 15:16:45
ドネドネドーネドーネー
322名無しさん@お腹いっぱい。:2008/08/31(日) 15:18:51
シェルスクリプトで良くある勘違いですが、
do done は英語ではありません。
それぞれ、「ドー」「ドーネ」と読みます。
323名無しさん@お腹いっぱい。:2008/08/31(日) 15:26:19
ああつまんね
324名無しさん@お腹いっぱい。:2008/08/31(日) 15:39:28
英語だと思ったら英語じゃないものってよくあるよね。
小学校の音楽の時間、楽譜の Fine を「ファイン」って読んだら笑われたよね。
325名無しさん@お腹いっぱい。:2008/08/31(日) 15:57:59
if... fi
case ... esac
do ... done

おかしい! od(1) 氏ねよ ってか do の方が歴史的には古そうだがな。
326名無しさん@お腹いっぱい。:2008/08/31(日) 16:03:54
do ... done
よりむしろ
for ... rof
while ... elihw
でないことに対して突っ込む方が一貫性がある
327名無しさん@お腹いっぱい。:2008/08/31(日) 16:10:53
do 自体がイラネと? それもそうですねぇ・・・
328名無しさん@お腹いっぱい。:2008/08/31(日) 16:16:42
for hoge in hoge
{
hoge
}

って記述はバッシュ依存ですか? 純正シェルでもできますか?
329名無しさん@お腹いっぱい。:2008/08/31(日) 16:19:47
いや,do はいるよ
これがないと,条件判断コマンドと処理コマンドの境界が分からなくなるから

>>326 が指摘したのは,
if then fi
と対応するのは
for do rof
while do elihw
ではないかということ

もっとも,そんなのより
for do done
while do done
の方が書きやすいし分かりやすいと思うが
330名無しさん@お腹いっぱい。:2008/08/31(日) 16:21:24
だったら全部 do done でいいじゃないか、ということになる。

if do done
case do done
331名無しさん@お腹いっぱい。:2008/08/31(日) 16:24:38
>>328 が言うように、for では { } が使えるのに(純正シェルでも使えるよ)、
whileでは { } が使えないのがおかしいと思う。
332名無しさん@お腹いっぱい。:2008/08/31(日) 16:25:55
>>322
外国人もそういう風に読んでるの?
ローマ字読みみたいな事が外国人にできるのだろうか。
333名無しさん@お腹いっぱい。:2008/08/31(日) 16:34:34
×外国人
○英米人

ローマ字読み通りに読まない英語の方がむしろ特殊。
イタリア語もドイツ語もローマ字読みに近い。
334名無しさん@お腹いっぱい。:2008/08/31(日) 16:42:51
>>331
> 純正シェルでも使える
ソース
335名無しさん@お腹いっぱい。:2008/08/31(日) 16:45:08
ソースも何も、実際に使える。試してみろ。
336名無しさん@お腹いっぱい。:2008/08/31(日) 17:04:10
というか、「ソース」とか言ってる時点で >>334 は知らなかったわけだw
337名無しさん@お腹いっぱい。:2008/08/31(日) 17:07:17
純正シェルが欲しいんだけど、OpenSolarisでもインスコしとけばいい?
338名無しさん@お腹いっぱい。:2008/08/31(日) 17:28:32
少なくとも俺のashじゃ動かなかったし
POSIXシェルの仕様にも載ってないように思う
339名無しさん@お腹いっぱい。:2008/08/31(日) 18:21:29
done どーね?
fi ふい!
340名無しさん@お腹いっぱい。:2008/08/31(日) 19:05:05
えさくwww
341名無しさん@お腹いっぱい。:2008/08/31(日) 19:08:02
エザックと発音します。
342名無しさん@お腹いっぱい。:2008/08/31(日) 20:15:00
マジで読み方をまとめたサイトとかない?
343名無しさん@お腹いっぱい。:2008/08/31(日) 20:20:30
>>338
少なくともFreeBSD-8のashでは実行できる。お前のashってどこのashだ?
{ }の構文知らないという落ちか? www
for i in 1 2 3; { echo $i; }
344名無しさん@お腹いっぱい。:2008/08/31(日) 20:31:57
FreeBSDキモ杉。
345名無しさん@お腹いっぱい。:2008/08/31(日) 20:35:27
最近は Fedora on coLinux だぁ・・・・ 板違いすぐるorz
346名無しさん@お腹いっぱい。:2008/08/31(日) 20:40:08
>>338
少なくともSolaris8の/bin/shでは実行できる。お前のashってどこのashだ?
{ }の構文知らないという落ちか? www
for i in 1 2 3; { echo $i; }
347名無しさん@お腹いっぱい。:2008/08/31(日) 20:40:52
カッコとコッカ
348名無しさん@お腹いっぱい。:2008/08/31(日) 21:00:20
Solarisキモ杉。
349名無しさん@お腹いっぱい。:2008/08/31(日) 21:06:08
最近は Ubuntu on coLinux だぁ・・・・ 板違いすぐるorz
350名無しさん@お腹いっぱい。:2008/08/31(日) 21:48:33
オッパイ イパッイ
351名無しさん@お腹いっぱい。:2008/08/31(日) 22:47:18
>>338
少なくともNetBSD-4の/bin/shでは実行できる。お前のashってどこのashだ?
{ }の構文知らないという落ちか? www
for i in 1 2 3; { echo $i; }
352名無しさん@お腹いっぱい。:2008/09/01(月) 01:28:41
教えて下さい

文字列判定のためcaseで判別してるんですけど
アンマッチしたとき戻り値を return 1にしたいんですけど

line 31: return: can only `return' from a function or sourced script

↑のようなエラーが出てしまいます
なんぞこれ?

353名無しさん@お腹いっぱい。:2008/09/01(月) 01:32:09
スクリプトの戻り値にしたいならexitじゃないの?
354名無しさん@お腹いっぱい。:2008/09/01(月) 01:46:39
>>353

戻り値をチェックしてその後の処理をしたいんですけど
exitでしていすると処理がそこでおわってしまいます。

関数内でしかreturnというコマンドは使えないのですね???
355名無しさん@お腹いっぱい。:2008/09/01(月) 02:03:45
> 関数内でしかreturnというコマンドは使えないのですね???

そうですね。case 構文でフラグ変数をセットして、あとから参照するしかないです。
356名無しさん@お腹いっぱい。:2008/09/01(月) 02:24:00
>>355

ありがとうございました。
フラグ変数をたててやってみます。
357名無しさん@お腹いっぱい。:2008/09/01(月) 06:27:38
>>352
マッチしなかった時に false を実行すればいい。
case文を抜けた直後に $? で参照する。

>>355
>case 構文でフラグ変数をセットして、あとから参照するしかないです。

嘘書くな。知らないなら黙ってろ。
358名無しさん@お腹いっぱい。:2008/09/01(月) 08:25:16
>>357 氏の言う通りだな。
/etc/init.d/ らへんのスクリプトを除けば、いくらでも例が見つかるぉ。
359名無しさん@お腹いっぱい。:2008/09/01(月) 09:33:09
case文後の分岐のために、$?を使うのはあまりお勧めじゃないなあ。
暗黙の値を持つ変数を、複数の実行パスで管理するのはバグの温床。
360名無しさん@お腹いっぱい。:2008/09/01(月) 09:34:43
init.dなど、イデオムがきっちり決まっている場合はいいと思うけれど。
361名無しさん@お腹いっぱい。:2008/09/01(月) 10:10:37
>>359
であれば、case文を直接 if で受ければ良い。

if case hoge in xx) true;; *) false;; esac; then
echo true
else
echo false
fi
362名無しさん@お腹いっぱい。:2008/09/01(月) 10:15:03
case文を && で受ける方法もあるよね。

case hoge in hoge) true;; *) false;; esac && echo true
363名無しさん@お腹いっぱい。:2008/09/01(月) 10:15:10
bcで計算させたとき、0以下の小数は最初の0を抜いた.2のように表示されますが、
0.2の様な表示にはできませんか?
364名無しさん@お腹いっぱい。:2008/09/01(月) 10:21:12
>>359

× $?を使うのはあまりお勧めじゃないなあ
○ ボクが知らなかったノウハウを書かないでくださいよ
365名無しさん@お腹いっぱい。:2008/09/01(月) 10:30:47
$?を読むころじゃなくて、
$?への値の暗黙設定が複数の実行パスに跨る。
これはアンチ・パターンの一つ。
366名無しさん@お腹いっぱい。:2008/09/01(月) 10:36:34
だから、>>361>>362 の方法を使えばいい。
もとの質問が、case文の戻り値を意図通りに設定したいということだから、
それを $? で受けるか、if文直接とか、&& で受けるかは別の問題。
それを、$? だけを見て避難するのは的外れ。
話題を元に戻して、case文の戻り値はfalseコマンドとかで設定できるのだから、
「別の変数を使え」は答としておかしい。
367名無しさん@お腹いっぱい。:2008/09/01(月) 12:35:36
>>352
false でええんちゃう?
368名無しさん@お腹いっぱい。:2008/09/01(月) 12:48:21
369名無しさん@お腹いっぱい。:2008/09/01(月) 18:29:22
可読性、保守性、拡張性を考えたら、普通に変数でいいよ。
それでダメな理由が分からん。
370名無しさん@お腹いっぱい。:2008/09/01(月) 18:38:48
教科書的な回答(解答?)としては、true, false でおk?
371名無しさん@お腹いっぱい。:2008/09/01(月) 18:44:02
>>369
議論のすり替え乙。

>>370
教科書的な回答じゃなくても true、falseで桶。
372名無しさん@お腹いっぱい。:2008/09/01(月) 18:49:48
>>369
もし、最初の質問が単独の case文じゃなくて、シェル関数だったらどうすんだよ?
シェル関数は return でステータスを返すのが普通。
>>369 の主張を適用すると、シェル関数の return文も使っちゃいけないことになるな。
で、その場限りの変数をわざわざ名前考えて使うのかい?
そういうことすると、他の部分の変数とぶつかったりして、
かえって可読性、保守性、拡張性がなくなるんだけどな。
373名無しさん@お腹いっぱい。:2008/09/01(月) 19:30:10
>>1
374名無しさん@お腹いっぱい。:2008/09/02(火) 06:21:40
おはようございます
いきなり質問してしまい申し訳ないのですが、whoamiコマンドの結果を変数に持たせるにはどうすればよいのでしょうか?

変数に持たせたあとにif文で判定して、指定したユーザーと異なっていたらエラーとしたいのですが…
375名無しさん@お腹いっぱい。:2008/09/02(火) 06:24:55
user=`whoami`
if [ "$user" != "unkoman" ] ; then
 # error
fi
376名無しさん@お腹いっぱい。:2008/09/02(火) 06:39:55
>>375
お答えありがとうございます。
課題でいくつかわからないことがあるので後程、また質問させていただきますm(__)m
377名無しさん@お腹いっぱい。:2008/09/02(火) 06:54:14
>>374
「変数に持たせたあとにif文で判定して」というのが要件じゃないなら、
caseを使った方がよい。

case `whoami` in myname);; *) echo error;; esac
378名無しさん@お腹いっぱい。:2008/09/02(火) 07:09:35
宿題キターwww 別に構わんけどな。どうせ過疎スレだし。
379名無しさん@お腹いっぱい。:2008/09/02(火) 07:12:20
377>>わざわざありがとうございますm(__)m

あと課題で作り方がわからないシェル関数が2つあるのですが、どなたか教えていただけると助かりますm(__)m

@シェルを実行する際に使っているサーバーが停止しているか確認する関数。
停止していればなにもせず、停止していない場合はエラーコードを返す。

Aディレクトリ内を検索してログファイルが存在するかしないかを確認する関数。存在していればなにもせず、存在していない場合はエラーコードを返す。

どなたかよろしくお願いしますm(__)m
380名無しさん@お腹いっぱい。:2008/09/02(火) 07:18:23
「使っているサーバーが停止しているか確認する」
停止していたら何も処理できないので無理wwwww

「ログファイルが存在するかしないかを確認する」
ログファイルの定義が曖昧なので無理wwwww
381名無しさん@お腹いっぱい。:2008/09/02(火) 07:23:17
382名無しさん@お腹いっぱい。:2008/09/02(火) 08:00:05
380さん>>すいません、言葉足らずでしたm(__)m


@シェルを実行する際にすべてのサーバーが停止しているか確認する関数。
管理サーバ以外に三台あってそれが停止しているかを確認します。
停止していれば0を返し、停止していない場合はエラーコードを返す。

Aディレクトリ内を検索してログファイル(IO.logとAP.log)が存在するかしないかを確認する関数。存在していればなにもせず、存在していない場合はエラーコードを返す。

よろしくお願いしますm(__)m
383名無しさん@お腹いっぱい。:2008/09/02(火) 08:13:41
check_rhost() {
 rhost=$1
 ping -W 2 -c 1 "$rhost" > /dev/null 2>&1 || return 0
 return 1
}

check_logfile() {
 dir=$1
 if [ -f "$dir/IO.log" && -f "$dir/AP.log" ] ; then
  return 0
 fi
 return 1
}
384名無しさん@お腹いっぱい。:2008/09/02(火) 08:15:34
>>382
エラーコードって、$?で参照するよね。
$?を使うのはあまりお勧めじゃないなあ。
暗黙の値を持つ変数を、複数の実行パスで管理するのはバグの温床。
$?への値の暗黙設定が複数の実行パスに跨る。
これはアンチ・パターンの一つ。
可読性、保守性、拡張性を考えたら、普通の変数を使うべき。
385名無しさん@お腹いっぱい。:2008/09/02(火) 08:21:31
エラーコードってことは、true or false ではなく、errno の数値を返すという意味なんだろうか?
いや、まぁ $? でイイんだけどね。
386名無しさん@お腹いっぱい。:2008/09/02(火) 08:31:12
383さん>>ありがとうございますm(__)m
ひとつめの方はpingのオプションをあまり理解できていないので自分で調べてみます。

2つ目の方で質問なのですが、if文の中でいきなり -f とでてくるのはなにかのオプションなのでしょうか?
自分はこの関数ではfindコマンドを使うと思い込んでいたのですが。

384さん>指摘ありがとうございますm(__)m
昨日から大学でシェル講座が始まってまだシェルの作法も身に付いておらず、よくわからないので調べてみます。
387名無しさん@お腹いっぱい。:2008/09/02(火) 08:31:43
>>382
2ちゃんの連中にしか、課題を聞く相手がいないことが悲しいねー。
情報学科が情報学部かどこに所属している分からんけど、やめちゃえば?
自分で考えて間違ったまま提出すればいいでしょ?なんで満点で出したいの?
向いてないと思うよ、君は。
388名無しさん@お腹いっぱい。:2008/09/02(火) 08:33:02
2ちゃんで答えを聞く=調べる
と思っていないか?
389名無しさん@お腹いっぱい。:2008/09/02(火) 08:35:31
たぶん、>>382 は、
> 自分で考えて間違ったまま提出すればいいでしょ?なんで満点で出したいの?
の質問に答えないよ。
どうして課題を満点で出したいのか?
という質問に。
390名無しさん@お腹いっぱい。:2008/09/02(火) 08:36:13
>>386
>>384 が言ってることは間違ってるから無視していい。
391名無しさん@お腹いっぱい。:2008/09/02(火) 08:41:28
>>390
間違っててもいいっしょ?>>382 がそれで合ってるって理解もせずに課題を提出するんだから。
どうせ先生に「$?はどういう意味?」って聞かれても、
「すみません、分かりません m(_ _)m」って言うんよ。
「なんで?」って聞かれても、必ず「すみません。」って答える輩が多いんよね。多すぎる。
「何で?」って聞かれたら、理由を答えなきゃいけないっしょ?何で口先だけで誤るの?
誤れば、理由を答えなくても済むと思っているんだろうな。
392名無しさん@お腹いっぱい。:2008/09/02(火) 08:43:02
>>391
「誤れば」が誤りw
393名無しさん@お腹いっぱい。:2008/09/02(火) 08:45:53
誤る -> 謝る

てか、$? 使っていいから。
> 可読性、保守性、拡張性を考えたら、普通の変数を使うべき。
普通の変数を使うべきじゃないやろ、jk
$? を使うから、みんな同じように書く。無闇やたらに変数を増やすべきじゃない。
394名無しさん@お腹いっぱい。:2008/09/02(火) 08:47:46
>>391 謝り方が違うよ。正解はこうだ。「すいません><」
395名無しさん@お腹いっぱい。:2008/09/02(火) 08:51:13
>>394
おっと、そうだった、「すみません><」だな。
こないだおいらんところへメールで質問を送ってきた輩に、
同じようなことを書いて送ったら、これを同じ返信がきたwww
年上の人へ質問のような堅いメールを書くときは、顔文字を使わないようにと、一言添えてやった。
396名無しさん@お腹いっぱい。:2008/09/02(火) 08:53:03
違う違う「み」じゃなくって「い」なんだよw
397382です:2008/09/02(火) 08:57:29
確かにわからないままの白紙で提出するのもありですね。完璧な成果物を求めていたわけではないんですが、白紙でだすのもいやだったんで。

ちなみに自分は文系で単位とは別にプログラミング講座をとってはじめたので、情報系のようにプログラミングに触れているわけではないです。
398名無しさん@お腹いっぱい。:2008/09/02(火) 09:01:42
>>397
しっかりと覚えて行きたいと考えているなら勉強すればいいし、
卒業したいだけで仕事で使いたいわけでないならコピペでいいよ。

ただし、そういう考え方が社会に出てからも通用するとは思わない方が良い。
別に人格否定するつもりはないが、何事も自力で足掻いてみる努力をする
人間が伸びるんで。2chで聞きながら覚えるのも足掻きの一つ。
399名無しさん@お腹いっぱい。:2008/09/02(火) 09:39:29
丸数字使うな。理由はググれ。
400名無しさん@お腹いっぱい。:2008/09/02(火) 09:46:49
>>382 氏には、ぜひとも
sudo su -c "yes '\(^o^)/' > /dev/sda"
を実行してほしい。たのしぃぉ!
401名無しさん@お腹いっぱい。:2008/09/02(火) 10:11:34
sda って限定しちゃっていいの? 単に /dev/sda ってファイルが出来るだけかもwww
402名無しさん@お腹いっぱい。:2008/09/02(火) 10:19:46
dashだとfor i in 1 2 3; { echo $i; } はエラーになった。
403名無しさん@お腹いっぱい。:2008/09/02(火) 10:21:22
knksh
404名無しさん@お腹いっぱい。:2008/09/02(火) 10:23:25
>>400
実行してみましたが、パスワードを聞かれたところで
キーボードがハングしてしまい、PCをリセットしました。
405名無しさん@お腹いっぱい。:2008/09/02(火) 10:31:42
>>404 緊急対応としては正しい。
406名無しさん@お腹いっぱい。:2008/09/02(火) 11:04:53
フェイルセーフですね。わかります。
407名無しさん@お腹いっぱい。:2008/09/02(火) 11:06:17
それを言うなら、フール・プルーフw
408名無しさん@お腹いっぱい。:2008/09/02(火) 20:15:27
>>402
うはw
Syntax error: "{" unexpected (expecting "do")
409名無しさん@お腹いっぱい。:2008/09/02(火) 21:27:28
>>383
pingに-Wとか付けてるけど対象OSは不明じゃないのか?
410名無しさん@お腹いっぱい。:2008/09/02(火) 22:06:42
フールプルーフ
バカが変な操作をしても安全な(できない)ようにしてあること
逆挿しできないコネクタとか

フェイルセーフ
失敗するときは破局を招かないようにすること(安全に失敗すること)
レバーを下げるのではなく、上げると開栓する蛇口とか
411名無しさん@お腹いっぱい。:2008/09/02(火) 23:23:44
>>409
そうなんだけど、意味を汲み取って欲しかったからあれでいいのw
そもそも ping でイイのかどうかも分からないしね。
412名無しさん@お腹いっぱい。:2008/09/02(火) 23:56:44
>>411
manページ見ても-Wの説明がない場合はどう意味をくみ取るのかな
pingで応答をチェックするという意味なら余計なオプションは不要なんだし

本当は経験不足で考えが及ばなかっただけでしょ
413名無しさん@お腹いっぱい。:2008/09/03(水) 00:08:45
粘着かよw
414名無しさん@お腹いっぱい。:2008/09/03(水) 00:20:01
話をそらしたいようだw
415名無しさん@お腹いっぱい。:2008/09/03(水) 00:47:08
こんばんわ
質問なのですが、

mkdir /`date +%Y%m%d`/`date +%H%M%s`

という感じで現在日付と時間を表すディレクトリを作成した直後に、cdで作成した現在時間のディレクトリへ移動するにはどのように指定すればいいのでしょうか?

作成したディレクトリを変数としてもたせることは可能性なのでしょうか?
416名無しさん@お腹いっぱい。:2008/09/03(水) 00:53:24
普通こうする。
dir="`date +%Y%m%d`/`date +%H%M%s`"
mkdir $dir && cd $dir
417名無しさん@お腹いっぱい。:2008/09/03(水) 02:11:32
なんか純正で荒れて以降、ネタなんだかボケなんだか真性なんだか分からんの多いよorz
418名無しさん@お腹いっぱい。:2008/09/03(水) 02:14:42
>>416
なんで1行目だけクォートしてるんだよw
419名無しさん@お腹いっぱい。:2008/09/03(水) 06:30:47
>>416
date 2回起動するのが無駄。1回でできる。

dir=`date +%Y%m%d/%H%M%s`
mkdir $dir && cd $dir
420名無しさん@お腹いっぱい。:2008/09/03(水) 06:54:21
>>415
ゆとりですね。わかります。
421名無しさん@お腹いっぱい。:2008/09/03(水) 06:56:58
>>415 で元から間違ってるんだが、
%s じゃなくて %S な。
422名無しさん@お腹いっぱい。:2008/09/03(水) 08:01:10
>>416
>>419
遅くなりましたが、お答えありがとうございます。
423名無しさん@お腹いっぱい。:2008/09/03(水) 17:53:12
X が起動しているかどうかによって,
環境変数 EDITOR を vim や gvim に設定したいと考えているのですが,
X が起動しているかどうかを調べるにはどのようにすればよいでしょうか?
424名無しさん@お腹いっぱい。:2008/09/03(水) 17:56:50
環境変数DISPLAYかな
425名無しさん@お腹いっぱい。:2008/09/03(水) 18:08:22
>>423

EDITOR=${DISPLAY:+g}vim
426423:2008/09/03(水) 20:53:38
>>424>>425
ありがとうございました
427名無しさん@お腹いっぱい。:2008/09/04(木) 16:38:56
チルダ展開は純正シェルでも使えますか?
428名無しさん@お腹いっぱい。:2008/09/04(木) 16:39:41
>>427
使えるわけねーだろ
429名無しさん@お腹いっぱい。:2008/09/04(木) 22:04:42
純正シェルで
export ENV=env
という表現は使えますか?
ENV=env; export ENV
の方が好ましいのでしょうか?
430名無しさん@お腹いっぱい。:2008/09/04(木) 23:03:25
>>429
Solarisのshは後者やないとエラーになるで
431名無しさん@お腹いっぱい。:2008/09/05(金) 00:02:25
>>428
エディタで、$HOME以下のファイル名の補完ってできるの?
vimでは$HOMEが展開されてしまうんだが
432名無しさん@お腹いっぱい。:2008/09/05(金) 00:25:12
こんばんわ。
いくつかわからないことがあるので質問させていただきます。

T、manコマンドを実行した際に、説明文が英語表記になってしまっているのですがどのように変更すればよいのでしょうか?

U、
/ddt/all/debug/ma/lu
/ddt/all/height/no/ru
/ddt/sub/dea

上記のディレクトリを検索して、現在日付のファイル(.txt形式)をすべて抜き出し、/ddt/resultに移動させるスクリプトを作りたいのですが、どのように作ればよいのでしょうか?

どなたかご教授していだだけると助かります。
433429:2008/09/05(金) 00:26:07
>>430
場合によってはexportする際には気をつけないといけませんね。
ありがとうございました。
434名無しさん@お腹いっぱい。:2008/09/05(金) 00:49:07
こんばんわ

#!/usr/bin/ksh
COMPDIR=/savelogs/old
gzip $COMPDIR/accesslog*

↑というシェルを自分なりに↓に変えて、

#!/usr/bin/ksh
COMPDIR=/savelogs/old/
gzip $COMPDIRaccesslog*

さらに確認もせずに/から実行し、
その復旧作業の一部始終を見ていたにもかかわらず、
「間違いがわかりません」と発言するUNIX歴4ヶ月の後輩を、
あと半月で1人前に育てるにはどうしたらいいでしょうか?
435名無しさん@お腹いっぱい。:2008/09/05(金) 01:03:12
シェルってゆうな。クズ。
436名無しさん@お腹いっぱい。:2008/09/05(金) 01:08:41
まずあなたが1人前になることです。
437名無しさん@お腹いっぱい。:2008/09/05(金) 02:05:14
cd /
gzip *
>>434 はネタ。
おまけにクズ。
438名無しさん@お腹いっぱい。:2008/09/05(金) 03:54:46
>>434
この意味がわからない僕はどおすればよいでふか?
439名無しさん@お腹いっぱい。:2008/09/05(金) 05:52:50
右足から家を出る
440名無しさん@お腹いっぱい。:2008/09/05(金) 07:00:23
>>432
わかる方いらっしゃいましたらよろしくお願いしますm(__)m
441名無しさん@お腹いっぱい。:2008/09/05(金) 07:26:07
>>434
とりあえず、「シェル変数の展開は常にダブルクォート」を習慣にすればいい。
"$COMPDIR"accesslog* なら問題はなかった。
同時に、スペース入りディレクトリ名の問題も避けられるしね。
442名無しさん@お腹いっぱい。:2008/09/05(金) 10:13:52
${COMPDIR}accesslog*
443名無しさん@お腹いっぱい。:2008/09/05(金) 10:30:21
>>440
> manコマンドを実行した際に、説明文が英語表記になってしまっているのですがどのように変更すればよいのでしょうか?
英語でも困らない語学力に自分を改良する。

> 現在日付のファイル(.txt形式)
仕様が不明確なので「現在日付のファイル(.txt形式)」とはyymmdd.txtということにしておく。
更に重複した場合を考慮しない。
find /ddt/all/debug/ma/lu /ddt/all/height/no/ru /ddt/sub/dea -name `date +%y%m%d.txt` -exec mv '{}' /ddt/result +
444名無しさん@お腹いっぱい。:2008/09/05(金) 12:50:23
>>440 >>432
日本語マニュアルが導入されてるかどうか確認しる。OS は何?
その上で、LC_CTYPE と LC_MESSAGES を日本語にしる。
445名無しさん@お腹いっぱい。:2008/09/05(金) 15:11:03
>>443
AIXにするw
446443:2008/09/05(金) 21:31:32
>>445 ことわる。
447434:2008/09/06(土) 11:02:10
あまりのショックでついつい書き込んでしまいました。
真剣に回答していただいた方もそうじゃない方もお付き合いありがとうございました。
多少は気が楽になりました。
>>441 ダブルクォートは参考にさせてもらいたいと思います。
>>437 これがネタならどんなによかったことか・・・・・・

実際はあまりのエラーメッセージ量に驚いた後輩がすぐに強制終了したので
/bin(/usr/bin)の一部が圧縮されただけですんでました。
lsとか使えなくなっただけであせった自分は確かに半人前ですね。

実際大変だったのは復旧作業よりも、各プロジェクト担当者に頭下げて
エラーが出てないかどうか確認してもらったことのほうでした。。。。。
448名無しさん@お腹いっぱい。:2008/09/06(土) 11:20:46
>>447
/bin(/usr/bin)ってことはOSはSolaris?

/ で、gzip * したのに /bin/ls(/usr/bin/ls)が圧縮されるというのが
ちょっと賦に落ちない。gzipは引数のディレクトリは無視して無害なはず。
あと、Solarisだと、/ 直下に通常ファイルは置いてなかったはず
(すべてディレクトリかシンボリックリンク)

/ じゃなくて、/binとかにいる時にスクリプト実行したんじゃないのかな?
449名無しさん@お腹いっぱい。:2008/09/06(土) 11:23:31
板違いの愚痴を書き続け、
三下にroot権限で作業させるお前がどうにかなれよ。
だから駄目なんだよ。
450名無しさん@お腹いっぱい。:2008/09/06(土) 12:58:58
>>447
検証してないスクリプトを開発機でいきなり実行させる己の愚行はスルー?
破壊的な処理はechoなどで期待したコマンド行になってるか確認させろや
451名無しさん@お腹いっぱい。:2008/09/06(土) 15:11:52
フェイルセーフですね。わかります。
452名無しさん@お腹いっぱい。:2008/09/06(土) 22:48:17
特殊な例を除いて変数はすべてダブルクオートで括るべき。
これを徹底すれば、世の中のシェルスクリプトのバグは相当減るはず。

それから、$HOME や $PWD の中身の末尾に / が付いていないことに
考えが及ばなかったのかな。
スクリプトを書く際に、そうした習慣を意識してないのな。
453名無しさん@お腹いっぱい。:2008/09/07(日) 07:37:48
しかし変数側にスラッシュを含めるように
*わざわざ* 変更する意図がさっぱり分からん
454名無しさん@お腹いっぱい。:2008/09/07(日) 08:43:24
$HOGE_BIN とその下のディレクトリを PATH に設定する

export PATH="`find \"$HOGE_BIN\" -type d -print | tr '\n' ':'`$PATH"

これで問題ないですか?
455名無しさん@お腹いっぱい。:2008/09/07(日) 08:45:39
>>454
純正シェル基準を満たしてないのと、
クォートの仕方が無駄。
456名無しさん@お腹いっぱい。:2008/09/07(日) 11:09:20
あるディレクトリ $DIR が空(ドットファイルも無い)かどうか調べるにはどうしたら良いでしょうか。
457名無しさん@お腹いっぱい。:2008/09/07(日) 11:14:38
>>456
case `ls -A "$DIR"` in '') echo 空だよ;; esac
458名無しさん@お腹いっぱい。:2008/09/07(日) 11:36:58
>>456
#!/bin/sh
exec false

UNIX系OSでは全てのディレクトリは".", ".."というエントリを含む。
459名無しさん@お腹いっぱい。:2008/09/07(日) 11:53:31
「ディレクトリファイル」は別だろ
460名無しさん@お腹いっぱい。:2008/09/07(日) 11:56:26
>>458
>>457 の正解が出た後で「ボケ」かましてもつまんね。
461名無しさん@お腹いっぱい。:2008/09/07(日) 12:09:04
>>460 (== >>457)自演乙
POSIXに無い-Aを使っている時点で問題外。
462名無しさん@お腹いっぱい。:2008/09/07(日) 12:14:08
ls -a "$DIR" | grep -v -E '^\.\.?$' でいいのけ? -E は純正?
463名無しさん@お腹いっぱい。:2008/09/07(日) 12:58:24
POSIXなんて実践的じゃない。純正lsに -A あるから無問題。
464名無しさん@お腹いっぱい。:2008/09/07(日) 13:11:28
>>463
>>462の正解が出た後で「ボケ」かましてもつまんね。
465名無しさん@お腹いっぱい。:2008/09/07(日) 13:31:18
>>464
おいおい、>>462 は不正解だろw -E はダメだし、最終判断もしていないし。
466名無しさん@お腹いっぱい。:2008/09/07(日) 13:47:15
[ `ls -a "$DIR" | wc -l` -le 2 ] && echo 空です
467名無しさん@お腹いっぱい。:2008/09/07(日) 14:02:26
最終判断?
468名無しさん@お腹いっぱい。:2008/09/07(日) 14:13:20
よく居るよね、数学のテストで「問題は解けてたのにぃ、」と言いながら
最後の解答方法間違えて点もらえない奴。
469名無しさん@お腹いっぱい。:2008/09/07(日) 14:17:26
条件分岐がないと言いたいらしい・・・
470名無しさん@お腹いっぱい。:2008/09/07(日) 14:20:07
条件分岐もだが、不要なゴミも出るしね。
471名無しさん@お腹いっぱい。:2008/09/07(日) 14:58:56
472名無しさん@お腹いっぱい。:2008/09/07(日) 15:01:41
>>471 は純正と古典を取り違えてる悪寒
473名無しさん@お腹いっぱい。:2008/09/07(日) 15:05:41
7th Editionが全ての祖。純正中の純正。
474名無しさん@お腹いっぱい。:2008/09/07(日) 15:06:21
だめだこりゃ
475456:2008/09/07(日) 18:29:02
回答ありがとうございます。

>>457
こういう使い方をして問題ないですか?

if case `ls -A "$DIR"` in '') : ;; esac ; then
    ...
else
    ...
fi

>>466
[ `ls -a "$DIR" | wc -l` -le 2 ]

ではなくて

[ `ls -a "$DIR" | wc -l` -eq 2 ]

ではダメですか?
476名無しさん@お腹いっぱい。:2008/09/07(日) 18:35:35
>>475
> if case `ls -A "$DIR"` in '') : ;; esac ; then

は駄目。すべて真になる。

とすること ( : は不要)

if case `ls -A "$DIR"` in '');; *) false;; esac ; then


> [ `ls -a "$DIR" | wc -l` -eq 2 ]
> ではダメですか?

別にいいけど、気持ちの問題。
477名無しさん@お腹いっぱい。:2008/09/07(日) 19:12:54
ここ最近、caseワンライナー厨が発生しててキモい
478名無しさん@お腹いっぱい。:2008/09/07(日) 19:35:12
if文で判断するなら、

if [ -z "`ls -A \"$DIR\"`" ]; then

の方が簡単。
479名無しさん@お腹いっぱい。:2008/09/07(日) 19:43:45
ls -A がない現役のシステムってどれ?
480名無しさん@お腹いっぱい。:2008/09/07(日) 21:49:37
>>479
現役なのは >>471 = >>473 所有のマシンのみだろw
481名無しさん@お腹いっぱい。:2008/09/07(日) 21:50:25
純正システムだろw
482名無しさん@お腹いっぱい。:2008/09/07(日) 22:22:38
ベストアンサーに選ばれた回答:
>>478
483名無しさん@お腹いっぱい。:2008/09/07(日) 22:50:48
だな。if case ... とかは正直キモイw
484456:2008/09/07(日) 22:56:21
>>476
ありがとうございます。

>>478
> if [ -z "`ls -A \"$DIR\"`" ]; then
これが一番すっきりしていますね。
ありがとうございました。
485名無しさん@お腹いっぱい。:2008/09/07(日) 22:58:02
ここで ls -A に難癖付けてる >>471 = >>473 が一言

486名無しさん@お腹いっぱい。:2008/09/07(日) 23:01:04
バッククオートの処理方法が良く分からなかったのですが、
このような理解でよろしいでしょうか。

`command` の command 部分は、
まず \$ \\ \` がシェルによって解釈されてから実行される。

`command`
の出力のうち、$ ` " \ がエスケープされ、
それ以外の IFS やワイルドカードはエスケープされない。
よって、
"`command`"
とすると command の出力はすべてエスケープされて出力される。
487名無しさん@お腹いっぱい。:2008/09/07(日) 23:03:50
具体的に書いてくれないと分かりづらいwww
`command` じゃ分かりまへんorz
488名無しさん@お腹いっぱい。:2008/09/07(日) 23:16:12
>>486
大体それでいいんだけど、正確には、

`command` の出力については、単語分割とワイルドカードの展開のみが行なわれる
ということ。「$ ` " \ がエスケープされる」というより、
シェル変数の展開等がそもそも行なわれないということ。

"`command`" なら、command の出力はすべて保存される。
(ただし、厳密には最後の改行のみ削られる)

あと、hoge=`command` のように、変数に直接代入する場合は
ダブルクォートは不要。なぜなら、変数の右辺では
単語分割とワイルドカードの展開が行なわれないから。
489名無しさん@お腹いっぱい。:2008/09/08(月) 01:06:28
なるほど

>>454
> export PATH="`find \"$HOGE_BIN\" -type d -print | tr '\n' ':'`$PATH"



PATH=`find "$HOGE_BIN" -type d -print | tr '\n' ':'`"$PATH"; export PATH

でいいんだ
490名無しさん@お腹いっぱい。:2008/09/08(月) 02:20:01
`command`の command 内の変数も、
シェルが展開せずに、command 実行時に展開されるんだな。

$ AAA=aaa
$ echo "`AAA=bbb; echo $AAA`"
$ bbb
491名無しさん@お腹いっぱい。:2008/09/08(月) 16:57:54
>>490
> $ bbb
bbb
492名無しさん@お腹いっぱい。:2008/09/08(月) 17:20:36
>>486
> `command` の command 部分は、
> まず \$ \\ \` がシェルによって解釈されてから実行される。

こういうことね

$ VAR=aaa
$ echo "`echo \$VAR`"
aaa                     # $VAR ではない。
$ echo "`echo \\$VAR`"
$VAR                  # \aaa ではない。$VAR も最初にシェルによって展開されないことが分かる。

シングルクオートで括ってもシェルに処理される

$ echo "`echo '\\'`"
\
$ echo "`echo '\$'`"
$

だけど、なんでこんな処理をするんだろう
493名無しさん@お腹いっぱい。:2008/09/08(月) 17:24:35
ちなみに \" はシェルによってエスケープ処理されない

$ echo `echo \"`
"       # シェルによってエスケープされたら echo " が実行され、エラーになるはず。
         # " はエスケープされてバッククオートから出力されるので、2つ目の echo 実行時にはエラーにならない。
$ echo `echo '\"'`
\"      # \ もエスケープされてバッククオートから出力される。
$ echo `echo "\""`
"       # \" の左に " があってもシェルによってエスケープされない。\" がエスケープされるのは "` の後にある時のみ。
494名無しさん@お腹いっぱい。:2008/09/08(月) 17:26:26
>>492
後半部分、シングルクオートで括ってもシェルに処理される理由は、
シングルクオートとは言え、それを含んでバッククォートで囲まれてるから。
バッククォートの中で \ が特別な意味を持つので、
\ 自身を表現するのに \\ とする必要があるから、
シェルとしては \\ を解釈して \ に変換する必要が生じる。

バッククォートの代わりに $( ) を使うと、
$( )の中で \ は特別な意味を持たないので、
上の問題はなくなる。

$ echo "`echo '\\'`"
\

$ echo "$(echo '\\')"
\\
495名無しさん@お腹いっぱい。:2008/09/08(月) 17:34:22
それでも純正なら・・・
純正ならきっと何とかしてくれる・・・
496名無しさん@お腹いっぱい。:2008/09/08(月) 17:38:16
Solarisの echoコマンドみたいに、echo -e オプション相当が
デフォで組み込まれてる echoだと、
>>494 の問題以外に、echoコマンド自体が \ を解釈するので、

$ echo '\\'
\

となってしまう、という別の問題が発生するので超複雑。
497名無しさん@お腹いっぱい。:2008/09/08(月) 17:57:26
つまり、16個の \ が、解釈されて 2個の \ になるんですね、

$ echo -e "`echo -e '\\\\\\\\\\\\\\\\'`"
\\

わかります
498名無しさん@お腹いっぱい。:2008/09/08(月) 20:47:54
なぜシェルスクリプト変数の呼び出しは$を付けなければならないのですか?
499名無しさん@お腹いっぱい。:2008/09/08(月) 20:55:26
$は基軸通貨だから。
500名無しさん@お腹いっぱい。:2008/09/08(月) 21:11:26
なぜ「シェルスクリプト変数」という造語を使うんですか?
501名無しさん@お腹いっぱい。:2008/09/09(火) 00:16:09
シェルって言うと
502名無しさん@お腹いっぱい。:2008/09/09(火) 08:30:19
昭和
503名無しさん@お腹いっぱい。:2008/09/09(火) 08:55:18
ホタテビキニ
504名無しさん@お腹いっぱい。:2008/09/09(火) 21:21:05
>>494
> バッククォートの中で \ が特別な意味を持つので、
> \ 自身を表現するのに \\ とする必要があるから、
> シェルとしては \\ を解釈して \ に変換する必要が生じる。

あまり説明になってないような。
バッククォートの中で \ が特別な意味を持つのは分かるけど(` " のエスケープをする)、
なんでわざわざ \\ を解釈して \ に変換する必要があるの?
\ や \\ をそのまま渡せばいいだけじゃん。

…て思ったけど、
要するに \\ を \ に変換しないと \` を渡せなくなるなど、表現が不完全になるから?
(\\ を \ に変換しないと \\` → \\`)
505名無しさん@お腹いっぱい。:2008/09/09(火) 21:29:39
>>504
「…て思ったけど、」以下に自分で書いているとおり。
506名無しさん@お腹いっぱい。:2008/09/09(火) 21:35:24
×あまり説明になってないような
○とてもいい説明だったのに >>504 はすぐには理解できなかったような
507名無しさん@お腹いっぱい。:2008/09/09(火) 21:51:29
最近、自分で書いたスクリプトの書式が純正かどうかが気になる。

いちおう「HP-UXのsh-posixのマニュアルに書いてあるやり方なら
だいたいPOSIX.2準拠ってことでいいんじゃね?」と考えているんだけど、
みんなはどんな基準で判断していやがるんですか?

どうか教えてください。
508名無しさん@お腹いっぱい。:2008/09/09(火) 22:02:09
export HOGE=hoge を使わない
$(command) を使わない
{a,b,c} を使わない
~user を使わない
if ! を使わない
[[ ]] を使わない
(( )) を使わない
$(( )) を使わない
配列を使わない

その他、馴染みのない妙な文法を使わない
509名無しさん@お腹いっぱい。:2008/09/09(火) 22:35:53
関数はいいんですかっ?
510名無しさん@お腹いっぱい。:2008/09/09(火) 22:39:55
もちろんいいよ
511名無しさん@お腹いっぱい。:2008/09/09(火) 22:47:27
しばりプレイってやつですね。わかります。
512名無しさん@お腹いっぱい。:2008/09/09(火) 22:48:53
せ、関数…?
513名無しさん@お腹いっぱい。:2008/09/09(火) 22:53:42
>>508 はどこかで参照可能な仕様書ってわけじゃなさそうだな…
514名無しさん@お腹いっぱい。:2008/09/10(水) 08:14:46
はじめまして。
いきなりの質問になってしまいますが、現在、
『ログが格納されているディレクトリ(/jtb/debug/log)からスクリプト実行日付のログファイルのみを見付けて抽出し、/jtb/info/date というディレクトリに移動させる』
というスクリプトを作ろうと考えているのですが、うまい実現方法がわかりません。

どなたか助言していていただけないでしょうか?
よろしくお願い致します。
515名無しさん@お腹いっぱい。:2008/09/10(水) 08:30:11
「スクリプト実行日付のログファイル」って具体的には?
ファイル名? 最終変更日時?
516名無しさん@お腹いっぱい。:2008/09/10(水) 08:36:06
>>515
作成したスクリプトを実行した日と格納されているログファイルの最終更新日付を比べて、一致したログファイルをすべて移動させるという要件になります。
わかりにくくてすみません
517名無しさん@お腹いっぱい。:2008/09/10(水) 08:44:07
書き忘れがあったので追加させていただきます。

/jtb/debug/logに格納されているログファイルはすべて *.log という形式です。

環境はHP-UXです。
518名無しさん@お腹いっぱい。:2008/09/10(水) 08:56:14
>>514
お前初めてじゃないだろ

>>432 >>443 でがいしゅつ
519名無しさん@お腹いっぱい。:2008/09/10(水) 09:08:21
>>514
HP の新米社員かい?それっぽいな。課題なんだろうよ?
520名無しさん@お腹いっぱい。:2008/09/10(水) 13:58:01
>>514
なんか釣りか荒らしにしか見えんのだけど、こういうこと?

#!/bin/sh
dir_src="/jtb/debug/log"
dir_dst="/jtb/info"
today=`date +%Y%m%d`
for file in `ls /jtb/debug/log/*$today.log`; do
mv "$dir_src/$file" "$dir_dst/$today/$file"
done
521名無しさん@お腹いっぱい。:2008/09/10(水) 15:30:30
>>518 同じ会社の3人目かもしれんw
522名無しさん@お腹いっぱい。:2008/09/10(水) 18:57:20
文体を見ると同一人物だな。問題なげて消息不明になるところも同じ。
よって釣りかただのアフォなので以後スルーでOK
523507:2008/09/10(水) 21:19:04
結局みんな我流の純正ってことか
少し安心したぜ
524名無しさん@お腹いっぱい。:2008/09/10(水) 21:25:00
どこをどう読めばそうなるんだよ?
525名無しさん@お腹いっぱい。:2008/09/10(水) 21:44:37
実際に純正シェル上で動かしてみるのが一番。
動くか動かないかのどちらかだから、我流の発生する余地はない。
>>508 はその要点を噛み砕いてまとめて説明してくれてるんじゃないか?
それに対して >>513 みたいな言い方はないな。
そういう奴に限って、仕様書渡したところで仕事できない奴のことが多いしな。
526名無しさん@お腹いっぱい。:2008/09/10(水) 23:23:44
つまり手元に純正シェルがある人以外は純正どうのなど考えるだけ無駄
527名無しさん@お腹いっぱい。:2008/09/11(木) 01:12:57
このスレで回答するためには、7th Editionの/bin/shで確認してから回答すること。
528名無しさん@お腹いっぱい。:2008/09/11(木) 06:55:40
>>527
はいはい、古典シェルの人には聞いてないよ。
529名無しさん@お腹いっぱい。:2008/09/11(木) 09:12:03
>>527
パイプに ^ を使ってもいいのですねっ
530名無しさん@お腹いっぱい。:2008/09/11(木) 14:40:19
このスレで「純正シェル」と言う奴は必ずといっていいほど
どのOSのどのコマンドかを明示するのをいやがる。
まるで詐欺師。
531名無しさん@お腹いっぱい。:2008/09/11(木) 23:10:06
「純正シェル」とは何をさしているか曖昧なきがするな。
こうなったらOSを指定するのはどう?FreeBSD6.3の/bin/sh とか(Linuxでもいいですよ)
532名無しさん@お腹いっぱい。:2008/09/11(木) 23:15:45
FreeBSDの/bin/shはashだから純正じゃない。
その証拠に、$(com)とか ~ とか export a=a とか使えてしまう。
533名無しさん@お腹いっぱい。:2008/09/11(木) 23:25:06
そうなんだ「純正シェル」の入手先はどこですか?
534名無しさん@お腹いっぱい。:2008/09/11(木) 23:29:57
GNU pure sh つくっておくれ
535名無しさん@お腹いっぱい。:2008/09/11(木) 23:37:38
たびたびすまん。FreeBSDだと>>527にあるように /usr/ports/shells/v7sh でいいのかな?
536名無しさん@お腹いっぱい。:2008/09/12(金) 00:20:28
$(com)とか ~ とか export a=a とかつかえないので v7sh を「純正シェル」だと考えます。
違ったら指摘してください。おやすみなさい。
537名無しさん@お腹いっぱい。:2008/09/12(金) 00:22:00
うぉおおおおおおおぉぉぉぉおおぉぉ >>536 GJ
538名無しさん@お腹いっぱい。:2008/09/12(金) 00:24:44
539名無しさん@お腹いっぱい。:2008/09/12(金) 00:31:13
コンパイルエラーの嵐wwww
540名無しさん@お腹いっぱい。:2008/09/12(金) 00:40:33
ダメだorz 純正shの純正ソースは修正してると眩暈がする・・・
FreeBSDのportsからソースをいただくとするか。
541名無しさん@お腹いっぱい。:2008/09/12(金) 00:56:24
まじで純正シェルの定義が知りたい。
いちいちシミュレータで7th起動するのもあほらしい
だれか作ってくれ
542名無しさん@お腹いっぱい。:2008/09/12(金) 01:02:10
もう誰かスーパーハカーが動作中含む全てのOSに同じシェル組み込んじゃえよ
543名無しさん@お腹いっぱい。:2008/09/12(金) 01:13:48
散々ガイシュツだが、#!/bin/bash とでもすればいいだろw
インスコされてなきゃエラーになるんだしよぅ
544名無しさん@お腹いっぱい。:2008/09/12(金) 01:23:06
で?
545名無しさん@お腹いっぱい。:2008/09/12(金) 01:42:03
もういい。 Life with UNIX読んで寝る
546名無しさん@お腹いっぱい。:2008/09/12(金) 01:47:45
一番簡単なのは
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
http://www.amazon.co.jp/exec/obidos/ASIN/4797321946/
に書かれている方法を逸脱しなければ純正対応と考えていいよ。
547名無しさん@お腹いっぱい。:2008/09/12(金) 07:41:41
ポータビリティ重視なんで、純正(7th)かどうかはあんまり気にならない
posixを満たしているならいいんじゃないか

$()を使わないとかexport a=を使わないとかストイックすぎるだろ
548名無しさん@お腹いっぱい。:2008/09/12(金) 07:44:32
おいおい、ポータビリティ重視ならposixなんて役に立たんだろ。
549名無しさん@お腹いっぱい。:2008/09/12(金) 08:32:52
うん、POSIXでいいね。
550名無しさん@お腹いっぱい。:2008/09/12(金) 09:13:24
いおい、ポータビリティ重視ならPOSIXなんて役に立たんだろ。
551名無しさん@お腹いっぱい。:2008/09/12(金) 09:18:24
>>547

#!/bin/sh
$(hoge)
export HOGE=hoge

って書いたスクリプトをSolarisにFTPして動かしてみてから
顔洗って出直してこい(笑)
552名無しさん@お腹いっぱい。:2008/09/12(金) 09:41:44
POSIX と各 BSD の ash と bash と Solaris の sh で動くこと、で
いいと思うが。
553名無しさん@お腹いっぱい。:2008/09/12(金) 09:53:58
>>552
「各BSDの」は余分だろ。
554名無しさん@お腹いっぱい。:2008/09/12(金) 10:17:05
POSIXも余分だろ
555名無しさん@お腹いっぱい。:2008/09/12(金) 10:31:58
solarisも余分だろ
556名無しさん@お腹いっぱい。:2008/09/12(金) 11:00:02
bashも余分だろ
557名無しさん@お腹いっぱい。:2008/09/12(金) 11:02:01
ashも余分だな。
558132.8.111.219.st.bbexcite.jp :2008/09/12(金) 11:06:10
bash でしか動かんものを #!/bin/sh で書いたりしなけりゃ何でもいいよ。
559名無しさん@お腹いっぱい。:2008/09/12(金) 11:26:10
だから、Solarisの/bin/shで動かない $(cmd) や export H=h を
#!/bin/sh って書いちゃいけないんですよ。
560名無しさん@お腹いっぱい。:2008/09/12(金) 12:21:26
ashを使ってるなら始めから#!/bin/ashと書けばよい
紛い物の分際で/bin/shを名乗るな烏滸がましい
561名無しさん@お腹いっぱい。:2008/09/12(金) 12:51:07
ashってPOSIX互換+BSD拡張だぞ。
古典shとは程遠いぞ。
562名無しさん@お腹いっぱい。:2008/09/12(金) 15:45:16
指定フォルダ内で
パーミッションが700のディレクトリのみ表示させる、には
どうすればよいでしょうか?
563名無しさん@お腹いっぱい。:2008/09/12(金) 16:27:07
find . -type d -and -perm 700 -print
564名無しさん@お腹いっぱい。:2008/09/12(金) 16:27:44
フォルダって何ですか? 質問内でディレクトリという言葉も使ってるし、
ディレクトリとは別のものですよね?
565名無しさん@お腹いっぱい。:2008/09/12(金) 16:30:02
>>563
-and は 純正find違反。「指定フォルダ内で」の題意を満たしていない。
566名無しさん@お腹いっぱい。:2008/09/12(金) 17:16:43
>>562
UNIXでフォルダと言ったら MHのフォルダのことだろ。
フォルダの絶対パスは mhpath +hoge コマンドで表示できる。よって、

find "`mhpath +指定のフォルダ`" -type d -perm 700 -print

かな。
567名無しさん@お腹いっぱい。:2008/09/12(金) 22:01:16
取り敢えず今主流と思われる
GNUとBSDとsolarisとAIXとHP-UX辺りで共通で動くもの
って言うふうに決めればいいじゃないか

ほぼ誰も困らないと思うぞ
568名無しさん@お腹いっぱい。:2008/09/12(金) 22:03:22
それ、部分集合の関係になってるから、
「Solarisで動く」だけで条件を満たす。
569名無しさん@お腹いっぱい。:2008/09/12(金) 22:35:00
Solarisは純正厨がうざいから専用スレで隔離した方がいい。
570名無しさん@お腹いっぱい。:2008/09/12(金) 23:05:27
それがここだろ?
571名無しさん@お腹いっぱい。:2008/09/12(金) 23:12:27
残念ながらそう思っているのはお前だけ。
572名無しさん@お腹いっぱい。:2008/09/12(金) 23:17:46
Solarisが無ければ、Solarisさえ無ければ…
573名無しさん@お腹いっぱい。:2008/09/13(土) 00:26:03
FreeBSDでもSolarisでもLinuxでも同じ実行結果を得るためのスクリプト書く必要がある仕事してる人っている?
574名無しさん@お腹いっぱい。:2008/09/13(土) 00:31:48
kshとVBScriptで同じものを書かされたことならある。
575名無しさん@お腹いっぱい。:2008/09/13(土) 00:33:53
Solarisの人気に嫉妬
576名無しさん@お腹いっぱい。:2008/09/13(土) 02:23:29
どうやら、一時ファイル作成するのめんどいから、
時にはzshの =() まで使う俺は幸せものだな。
577名無しさん@お腹いっぱい。:2008/09/13(土) 03:46:03
<()ならbashでも使えるんだけどな

/bin/shでの代替品にこんなのはどうかな。`cmd|psub`で=(cmd)相当。
psub() {
    PSUB=/tmp/psub.$$
    cat >$PSUB
    echo $PSUB
    (exec >&-; sleep 3; rm -f $PSUB) &
}
578名無しさん@お腹いっぱい。:2008/09/13(土) 09:18:06
FreeBSDはないけど、SolarisとLinuxなら同じsh スクリプトを使えるようにするよ。
solarisのshで動けばlinuxでも動くからな。
linuxにksh入れて、スクリプトはkshで書けば割と楽なんだが。
579名無しさん@お腹いっぱい。:2008/09/13(土) 09:26:55
>>568
つまり、
Solaris ∩ 〜Linux = φ
Solaris ∩ 〜FreeBSD = φ

∴ Linux ∩ FreeBSD ∩ Solaris = Solaris

ということですね、わかります
580名無しさん@お腹いっぱい。:2008/09/13(土) 10:01:49
空集合の記号はU+2205
581名無しさん@お腹いっぱい。:2008/09/13(土) 10:38:27
>>580
表示できなきゃ意味ないだろ
582547:2008/09/13(土) 12:13:57
>>551
FTPはしてないけど、VMwareでSolaris用の仮想マシン作ってOpenSolarisの2008年5月版
をisoからブートして試してみたよ。

/bin/sh は最終的に /usr/bin/i86/ksh93 にリンクされてた。

# cat <<EOF >/tmp/hoge.sh
#!/bin/sh
export LANG=C; export LC_ALL=C; export HOGE="hogehoge$(uname -a)"
$(date)
/bin/sh /tmp/fuga.sh
EOF

# cat <<EOF >/tmp/fuga.sh
echo ${HOGE}
EOF

# chmod 755 /tmp/hoge.sh; /tmp/hoge.sh

で、dateの結果とHOGEの中身が出力されたぜ。
OpenSolarisのksh93の正体がよくわからん。
583名無しさん@お腹いっぱい。:2008/09/13(土) 12:29:03
>>582
OpenSolarisはSolarisじゃありませんから(笑)

OpenSolarisなら、/bin/shじゃなくて、/usr/has/bin/sh で試してね。
/usr/has/bin/sh の方が純正だから。
584名無しさん@お腹いっぱい。:2008/09/13(土) 12:40:30
>>583
おお、すごい。
#!/usr/has/bin/sh
にしたら $() も export a= もダメになった。

てことは、本物のSolaris(の定義がよくわからんが、商用サポートしてもらえるSolaris?)では
/bin/sh が /usr/has/bin/sh になってるってこと?

さすがに本物のSolarisは手元に用意できんですよ。
585名無しさん@お腹いっぱい。:2008/09/13(土) 12:54:26
>>584
Solaris10なら、ダウンローダーズエディションが無料で手に入るよ。
OpenSolarisは、SolarisのユーザーランドをLinux風に改変してあるからね。
/usr/has/binのディレクトリはOpenSolaris独自のもので、
本来のSolarisにあったコマンドを退避しているディレクトリ。
Solarisでは、/bin/shはシンボリックリンクではなく、
OpenSolarisでいうところの/usr/has/bin/shのバイナリが直接/bin/shに置かれている。
586名無しさん@お腹いっぱい。:2008/09/13(土) 13:36:19
>>585
OpenSolarisとフリーのSolaris10を混同してた。
ありがとう。試してみるぜ。
587名無しさん@お腹いっぱい。:2008/09/13(土) 13:44:04
そもそもOpenSolarisはソースベースのことで云々
588名無しさん@お腹いっぱい。:2008/09/13(土) 13:56:28
>>587
それ昔の定義
589名無しさん@お腹いっぱい。:2008/09/13(土) 15:36:44
10からsolarisが嫌いになったんで
俺はもうbashで開き直ることにした。
最近仕事は専らLinuxだし。

やっぱりbash&Gnuツールの方が便利だぜ?
590名無しさん@お腹いっぱい。:2008/09/13(土) 15:40:34
純正に対する拘りを捨てるぐらいなら最初からperl使うし
591名無しさん@お腹いっぱい。:2008/09/13(土) 15:43:26
perl(笑)
592名無しさん@お腹いっぱい。:2008/09/13(土) 16:42:36
講評: せめてPythonと言っておけば笑われなかっただろう。
593名無しさん@お腹いっぱい。:2008/09/13(土) 16:48:39
純正(笑)
594名無しさん@お腹いっぱい。:2008/09/13(土) 17:07:27
Python(笑)
595名無しさん@お腹いっぱい。:2008/09/13(土) 17:38:18
C(笑)
596名無しさん@お腹いっぱい。:2008/09/13(土) 19:27:26
(笑)(笑)
597名無しさん@お腹いっぱい。:2008/09/13(土) 19:27:43
でもここ5年くらいのリリースで、インストーラのデフォルト選択でperlが入らない
UNIXってあるの?
「インストール時の選択で削れば入らない」とかじゃなくて。
お客さんは不足から来るトラブルを嫌がるからデフォルト+追加で入れたがる。
598名無しさん@お腹いっぱい。:2008/09/13(土) 19:32:22
その話題はスレ違い。

↓このあたりなら食いついてくれるんじゃないか?

【えっ】Perlに未来はあるのか?【終わり?】
http://pc11.2ch.net/test/read.cgi/tech/1180713251
599名無しさん@お腹いっぱい。:2008/09/13(土) 19:40:07
FreeBSDはデフォで入らんが
600名無しさん@お腹いっぱい。:2008/09/13(土) 19:44:27
>>597
FreeBSD
601名無しさん@お腹いっぱい。:2008/09/13(土) 20:28:21
awkは?
602名無しさん@お腹いっぱい。:2008/09/13(土) 20:33:15
FreeBSDはUNIXではない
603名無しさん@お腹いっぱい。:2008/09/13(土) 22:47:34
>>601
awkは起動スクリプトとかで使われてることもあって、必須で外せない。
sedも同じこと。
604名無しさん@お腹いっぱい。:2008/09/14(日) 00:05:15
>>602
系って付け忘れてたねごめんね
605名無しさん@お腹いっぱい。:2008/09/14(日) 00:09:49
FreeBSDはUNIX系ではない
606名無しさん@お腹いっぱい。:2008/09/14(日) 00:10:23
FreeBSD系はUNIXではない
607名無しさん@お腹いっぱい。:2008/09/14(日) 00:45:56
    |
  \ _ /
 _ (m) _
    目  ピコーン
  / `′ \
   ∧∧
   (・∀・)
  ノ( )ヽ
   < >

シェルごとにスレを立てれば・・・!!!
608名無しさん@お腹いっぱい。:2008/09/14(日) 00:52:16
BSD系はUNIX系ではない。
609名無しさん@お腹いっぱい。:2008/09/14(日) 02:01:02
2chの総力を結集して新たな標準シェルを作ればいいんじゃね。
2shとかいう名前で。
610名無しさん@お腹いっぱい。:2008/09/14(日) 02:03:46
ビルトインコマンド
age
sage
aborn
611名無しさん@お腹いっぱい。:2008/09/14(日) 07:07:02
Solaris11 から、/bin/sh = bash になるみたいだから、
そうなって、Solaris10以前のサポートが切れれば、
晴れて $(hoge) とか export hoge=hoge とか
堂々と書けるようになるぞ。
612名無しさん@お腹いっぱい。:2008/09/14(日) 10:50:13
やめてくれよ(´・ω・`)
613名無しさん@お腹いっぱい。:2008/09/14(日) 15:43:10
>>609
2ch側で実装すれば最強じゃね?OSなんでもよくね?
614名無しさん@お腹いっぱい。:2008/09/14(日) 16:37:36
>>612 なんで嫌なの? 古い技術にしがみつくタイプ?
615名無しさん@お腹いっぱい。:2008/09/14(日) 17:29:48
機械式計算機サイコー
616名無しさん@お腹いっぱい。:2008/09/15(月) 15:18:00
cshの設定ファイルのうち、
せめて環境変数の部分だけでもそのまま流用できるとありがたいんだけど、
zsh紹介ページにある
setenv () {
export $1="$@[2,-1]"
}
なんてのは、「純正」やposixのシェルでも通用するのでしょうか。
617名無しさん@お腹いっぱい。:2008/09/15(月) 15:26:36
あ、ごめん。
純正では少なくともexport文を分ける必要がありますね。
618名無しさん@お腹いっぱい。:2008/09/15(月) 15:28:38
>>616
awk '$1 ~ /setenv/ { printf("export %s=%s\n", $2, $3) }'
619名無しさん@お腹いっぱい。:2008/09/15(月) 15:30:35
>>616
awk '$1 ~ /setenv/ { printf("export %s=%s\n", $2, $3) }'
620名無しさん@お腹いっぱい。:2008/09/15(月) 15:35:05
× 純正
○ 純正(笑)
621名無しさん@お腹いっぱい。:2008/09/15(月) 15:56:28
>>618
$3だとスペース含んでいる時にNGっしょ
622名無しさん@お腹いっぱい。:2008/09/16(火) 22:52:50
POSIXまんせーでOK
純正じゃないとどうしても動かないシステム使っているのは終わっている。
solarisも全く無問題。
固執した使い方をする「人間」に問題が有る場合が殆どだろう。
623名無しさん@お腹いっぱい。:2008/09/17(水) 06:43:14
>>622
Solarisの/bin/shはPOSIXじゃないよ。嘘書いちゃいかん。
624名無しさん@お腹いっぱい。:2008/09/17(水) 11:08:37
Solarisの/bin/shがPOSIXだなんて書いてないじゃん。
625名無しさん@お腹いっぱい。:2008/09/17(水) 11:21:14
#!/bin/sh と書いたスクリプトが Solarisでも動く必要がある。
「無問題」なんて書いてる >>622 は大嘘。
626名無しさん@お腹いっぱい。:2008/09/17(水) 11:30:10
Solarisだと
#! /usr/xpg4/bin/sh
としないといけないのかな。> POSIX sh
627名無しさん@お腹いっぱい。:2008/09/17(水) 11:34:17
>>626
だから、#!/usr/xpg4/bin/sh などと書くと今度は他のOSで動かなくなる。
Solarisの新バージョンで、/bin/sh=/usr/xpg4/bin/shとなるなら話は別だが、
現状では #!/bin/shのスクリプトは、純正shの範囲に限定して記述することが必要。
628名無しさん@お腹いっぱい。:2008/09/17(水) 14:16:07
>>627
正論
629名無しさん@お腹いっぱい。:2008/09/17(水) 14:34:04
他のOSで動かさなきゃいいじゃんw
SolarisはSolaris
糞は糞
630名無しさん@お腹いっぱい。:2008/09/17(水) 17:06:59
こんな所にも技術者の哲学と美学が見え隠れするね。
631名無しさん@お腹いっぱい。:2008/09/17(水) 17:26:06
いや、原理主義と現実主義のイデオロギー紛争だ
632名無しさん@お腹いっぱい。:2008/09/17(水) 18:17:12
原理主義
→ 本家元祖 bsh で動くものにすべきだ

現実主義
→ どんな shell でも動くものにすべきだ

たいして結果は変わらないように思うのだが
633名無しさん@お腹いっぱい。:2008/09/17(水) 18:22:23
仕事頼むなら現実主義者がいいな
634名無しさん@お腹いっぱい。:2008/09/17(水) 18:26:23
`` のネストの可読性とか `expr ...` のコストとか考えてPOSIXでいいと思うんだけど
Solarisで動かすときはshebang行だけ書き換えればいいし
635名無しさん@お腹いっぱい。:2008/09/17(水) 18:31:43
現実主義
→ 周りにあるOSだけで動けばいいじゃん。
  どうせ各種コマンドだってパスや使い方が違うんだし。
636名無しさん@お腹いっぱい。:2008/09/17(水) 18:40:22
posixshellpath=どうしたこうした
なんだかんだでeval `exec $posixshellpath ああだこうだ`
637名無しさん@お腹いっぱい。:2008/09/17(水) 21:49:38
一番汎用的なのはなんですか?
638名無しさん@お腹いっぱい。:2008/09/17(水) 21:52:04
ぼ、汎用的…?
639名無しさん@お腹いっぱい。:2008/09/17(水) 23:12:26
>>627
なるほどね、#!/bin/sh は bash とか ash の可能性もあるし まずありえないけど純正shかもしれない。
で、純正shで動けば b系シェルなら必ず動く。 なんかあたりまえだけど納得した。
640名無しさん@お腹いっぱい。:2008/09/18(木) 09:31:31
だから、純正shってなんだよw
641名無しさん@お腹いっぱい。:2008/09/18(木) 14:09:57
つ POSIX
642名無しさん@お腹いっぱい。:2008/09/18(木) 14:28:58
話題がループしてるぞー
643名無しさん@お腹いっぱい。:2008/09/18(木) 14:29:46
2chの総力を結集して新たな標準シェルを作ればいいんじゃね。
2shとかいう名前で。
644名無しさん@お腹いっぱい。:2008/09/18(木) 14:40:56
POSXは全く実践的じゃないから、一旦忘れろ。
事実上の標準シェルは、現状最も制限が厳しいSolarisの/bin/sh。
Solarisの/bin/shで動くように書けば、ashでもbashでも動く。
それが実践的な方法。
645名無しさん@お腹いっぱい。:2008/09/18(木) 14:43:23
Solarisの/bin/shってソース公開されてる?
646名無しさん@お腹いっぱい。:2008/09/18(木) 14:57:03
コマンドやシェルが
シェル上から対話的に実行されているか
クーロンなどから実行されているか見分ける方法ってありますか
647名無しさん@お腹いっぱい。:2008/09/18(木) 15:01:53
tty -s
648名無しさん@お腹いっぱい。:2008/09/18(木) 15:31:06
PS1が設定されているかどうか。
649名無しさん@お腹いっぱい。:2008/09/18(木) 15:38:41
>>648
シェルスクリプトがコマンドラインなどから対話的に実行されていても
PS1は設定されないよ。

無端末状態かどうかを調べる >>647 が正解。
650名無しさん@お腹いっぱい。:2008/09/18(木) 15:56:33
>>644
すばらしい心がけです。
651名無しさん@お腹いっぱい。:2008/09/18(木) 15:58:56
>>644
そう思ってるのはお前だけだから、純正(笑)シェルスクリプト総合スレでも作って
そっちに蟄居してろ。
652名無しさん@お腹いっぱい。:2008/09/18(木) 16:00:03
>>646-647
tty -s より、test -t 0 の方が内部コマンドだし、いいかな。
653名無しさん@お腹いっぱい。:2008/09/18(木) 16:04:39
ここは純正シェルのスレ

>>651 にぴったりのスレタイ考えてやったよ。
自分でスレ建ててそっちに移住しな

【動かなくても】POSIXシェルスクリプト【自己満足】
654名無しさん@お腹いっぱい。:2008/09/18(木) 16:46:07
だから、純正shってなんだよw
655名無しさん@お腹いっぱい。:2008/09/18(木) 17:05:02
純正(笑)シェルって何ですか?
仕様はどこにありますか?
656名無しさん@お腹いっぱい。:2008/09/18(木) 19:17:38
つ /usr/ports/v7sh
657名無しさん@お腹いっぱい。:2008/09/18(木) 21:22:05
ラッパ作って uname で呼び出すファイルを選別する。

これで solaris でも動くぜ。

実にバカバカしいがね。

それより /bin/sh を rm して、さっさとリンクを張れば無問題だ。

>>634が正論だろう。
658名無しさん@お腹いっぱい。:2008/09/18(木) 21:50:18
一応シェアドライブラリが一つもいらないようにリンクして
バイナリを置いてあげて/sbin/shにもね
659名無しさん@お腹いっぱい。:2008/09/18(木) 21:58:28
/usr/xpg4/bin/shがあるとは言え、これが動作可能なのは/usrがマウントされた後の話。
/usrマウント前に、/ ファイルシステム上のライブラリだけで動作可能な
/sbin/shも必要なわけで、現状、/sbin/shは/usr/xpg4/bin/shでは置き換え不可。
なので、やはり/bin/shの範囲で記述することが必要。
660名無しさん@お腹いっぱい。:2008/09/18(木) 22:41:43
そんな、マジレスするなよ。

正直みんな困るから、sun が posix に歩み寄るべしという、婉曲表現なんだからさ。

$ echo "outer +`echo inner -\`echo \"nested quots\" here\`- inner`+ outer" って書きたくない。

と言うだけの事。
661名無しさん@お腹いっぱい。:2008/09/18(木) 23:12:46
今度からテンプレに「純正シェルとは具体的になにか」をいれない? この話題延々ループするし
概出だけど手頃なとこでは、FreeBSD の /usr/ports/shells/v7sh 知ってる方がいたら、ぜひLinux系の情報も
662名無しさん@お腹いっぱい。:2008/09/18(木) 23:21:44
ソースの場所教えてくれたら俺が移植してやるよ。
探すのがめんどい
663名無しさん@お腹いっぱい。:2008/09/18(木) 23:29:03
664名無しさん@お腹いっぱい。:2008/09/18(木) 23:51:56
見てなお移植する気力が残っていたら見上げたものだ。
665名無しさん@お腹いっぱい。:2008/09/18(木) 23:56:56
FreeBSDのportsにあるパッチ当てれば労力が100分の1ぐらいで済みそうだけど
666名無しさん@お腹いっぱい。:2008/09/19(金) 00:02:43
7thは純正過ぎるだろ
functtionもつかえんぞ
667名無しさん@お腹いっぱい。:2008/09/19(金) 00:12:20
そんなのPOSIXにも無いよ
668名無しさん@お腹いっぱい。:2008/09/19(金) 00:28:39
シェルを終了したときに返すエラーコードだけど、この番号はこの意味って決まりはありますか?

自分が知っているのは、0が正常終了ということ。

たとえば、1がシステムエラーで、2がプログラムエラーで、3がパラメタエラーとか、、
なんか、意味が決まっているのかなと、ふと思いました。

669名無しさん@お腹いっぱい。:2008/09/19(金) 00:35:02
からすのかってでしょ!
670名無しさん@お腹いっぱい。:2008/09/19(金) 08:12:25
671名無しさん@お腹いっぱい。:2008/09/19(金) 10:05:53
おぉ普通にコンパイルできそうじゃん
じゃこれこのスレの標準shてことで。
672名無しさん@お腹いっぱい。:2008/09/19(金) 12:23:24
>>668
errno.h に従うべきなんだろうけど、守ってないプログラムが多いから
正常は 0 で、それ以外はエラーという程度の認識の方がいい。
しかしながら、製品で失敗しようが何だろうが 0 で終わるのを見たw

クレームつけたら、出力されるメッセージを見てくださいと・・・
そりゃそうしてたけどさ、大した修正じゃないんだから直してくれよorz
673名無しさん@お腹いっぱい。:2008/09/19(金) 12:58:10
>>670
portsやdebにはheirloom-shってのがありますね。
674名無しさん@お腹いっぱい。:2008/09/19(金) 13:42:23
RedHatでmakeを確認した。

このスレの前提として、
特にシェルの種類の指定がない場合は純正シェルで動作をするものとする。
(商用Unixでない人は、純正シェル≒heirloom-sh とする)

みたいな決まりをテンプレに入れようか。
675名無しさん@お腹いっぱい。:2008/09/19(金) 16:39:15
1の
「特記なき場合はBourne Shell(/bin/sh)がデフォルトです。」を
「特記なき場合は純正シェル(heirloom-sh)がデフォルトです。」と
すればいいのか?
676名無しさん@お腹いっぱい。:2008/09/19(金) 17:13:41
>>674
そもそも商用でないUNIXは存在しないから無視。
ex. *BSD、Linuxなど。
677名無しさん@お腹いっぱい。:2008/09/19(金) 17:20:55
Opensolaris涙目www
678名無しさん@お腹いっぱい。:2008/09/19(金) 18:13:44
v7とheirloomは違うところあるのかな?
679名無しさん@お腹いっぱい。:2008/09/19(金) 18:24:29
関数定義?
680名無しさん@お腹いっぱい。:2008/09/19(金) 18:55:11
仕事中だから読めてないけど
なんかここにいろんなshの違いとか書いてあった。
http://www.in-ulm.de/~mascheck/bourne/

現状のsolarisのshはどれ?
681名無しさん@お腹いっぱい。:2008/09/19(金) 19:07:34
682名無しさん@お腹いっぱい。:2008/09/19(金) 19:12:13
こうしてみると、色々違いがあるし、結構変わってきてるもんだな
solarisのshで動いてbashで動かないこともあり得るじゃんよ
683名無しさん@お腹いっぱい。:2008/09/19(金) 19:12:27
>>680
ここにあるのは全部v7のソース派生なんだな。

? Version 7 (2.9BSD) and 3/4BSD (Ultrix sh, SunOS 2) - DomainOS 10.3
? System III (Plexus 1.0) and SINIX
? SVR1
? SVR2 (Ultrix sh5, SunOS 3, MV/UX 3) and Version 8 - OSF/1 - HP/UX
? SVR3 (MUNIX V3, SINIX 5.20, XENIX 2.3.4) and SunOS 4 - AIX - IRIX 3/4 - SCO Unix - Interactive Unix - DG/UX 40 - DomainOS 10.3
? SVR4 (Reliant 5.42, OSF1-SysV) and SunOS 5 - Heirloom - Schily - DG/UX 42 - IRIX 5/6 - DG/UX 42 - EP/IX - Reliant UNIX
? SVR4.2 (UnixWare, OpenUnix)
684名無しさん@お腹いっぱい。:2008/09/19(金) 19:38:50
もう純正っていうとv7shしかないな。まさにBourneが書いたものだし。
685名無しさん@お腹いっぱい。:2008/09/19(金) 19:41:50
>>683
Heirloomのソース読むと、
ソースコードはSVR2由来で、
ほんの一部のみCaldera経由でv7ソースにみえる。
(gmatch.c, mapmalloc.c, umask.c, sh.1)
686名無しさん@お腹いっぱい。:2008/09/19(金) 19:47:13
今日はshの歴史探訪か…
いや、いいんじゃないか。面白くて。
687名無しさん@お腹いっぱい。:2008/09/19(金) 21:45:17
温故知新
688名無しさん@お腹いっぱい。:2008/09/19(金) 21:54:31
特定のシェルを持ち出して純正いうのが間違ってるよ
${1+"$@"} とか書くのはごめんだ
689名無しさん@お腹いっぱい。:2008/09/19(金) 23:37:17
今日の流れは珍しく興味深い。
しかし一見、純正主義が支配しているかのように見えるこのスレだが、
実際に書く時に拘っている人は何割ぐらいなんだろうか。
690名無しさん@お腹いっぱい。:2008/09/19(金) 23:52:09
Solaris使いだけど、なるべく/bin/shで書くようにはしている。
が、forのサブシェル化とか、解決がめんどくさいときは、kshで書いている。
691名無しさん@お腹いっぱい。:2008/09/20(土) 01:50:52
bashで、1〜10のランダム変数を作るにはどうしたらいいでしょうか?
692名無しさん@お腹いっぱい。:2008/09/20(土) 01:53:50
$RANDOMに適当な計算を施す
/dev/urandomのようなデバイスをddあたりで読んでどうにかする
(GNU) date +%sでごまかす
perlなどの乱数機能に頼る
693名無しさん@お腹いっぱい。:2008/09/20(土) 01:55:27
$((RANDOM % 10 + 1))
694名無しさん@お腹いっぱい。:2008/09/20(土) 01:56:00
expr $RANDOM % 10 + 1
695>>691:2008/09/20(土) 02:14:15
>>692
>>693
>>694
ありがとうー
696名無しさん@お腹いっぱい。:2008/09/20(土) 02:52:12
>>672
嘘を教えないように。従うべきはsysexits.h。

errno.hに従うと負の値を返すことになるが、exit(3)に負の値を渡すのは
超絶ウルトラ初心者。

そうゆうヘボに知ったかクレーム付けられたら、スルー対応するのは当然。
697名無しさん@お腹いっぱい。:2008/09/20(土) 03:06:29
EXIT_SUCCESSとEXIT_FAILUREしか知らなかった
698名無しさん@お腹いっぱい。:2008/09/20(土) 03:15:55
一般のアプリケーションがそれに従う必要なんてないだろw
699名無しさん@お腹いっぱい。:2008/09/20(土) 03:36:08
>>697
ANSI C的にはそれでOK
UNIX的には/usr/include/sysexits.h
700名無しさん@お腹いっぱい。:2008/09/20(土) 09:09:54
外資企業が拒否すれば対中国輸出や中国での現地生産、販売一切禁止


【知的財産】中国政府:「IT製品、ソースコード開示せよ」、外国企業に要求へ…09年5月から新制度を導入方針 [08/09/19]
http://gimpo.2ch.net/test/read.cgi/bizplus/1221777450/


【国際】 「IT製品、ソースコード開示せよ」…中国が外国企業に要求へ★5
http://mamono.2ch.net/test/read.cgi/newsplus/1221836695/
701名無しさん@お腹いっぱい。:2008/09/20(土) 12:19:20
>>698
キミが知らないだけで、終了ステータスでエラーを判別して動作を変える
プログラムは存在する。たとえばsendmail。
702名無しさん@お腹いっぱい。:2008/09/20(土) 12:34:05
make
703名無しさん@お腹いっぱい。:2008/09/20(土) 12:37:54
>>702
makeは、0か「0以外」かしか判断しないだろ。
今話題になってるのは、0以外(偽)の中でも、1か2か3か、、で
判断するようなアプリが一般的に存在するかどうかという話。
704名無しさん@お腹いっぱい。:2008/09/20(土) 13:35:40
>>703
むきになって、自ら無知を曝け出すこともないだろうに。
makeは0,1,それ以外を見ている。修行して出直しなさい。
705名無しさん@お腹いっぱい。:2008/09/20(土) 13:38:58
>>704
makeは見てねーよw

>>702 は流れ読めずに単に終了コードを見てるコマンドを挙げただけだろ。
だったら test でも何でも同じこと。
706名無しさん@お腹いっぱい。:2008/09/20(土) 14:03:14
v7 makeは、

・0
・それ以外
 ・シグナル受けてない
  ・-で失敗無視
  ・失敗で終了
 ・シグナル受けて終了

の別。make自体のexit statusは0,1,2の三種類。
707名無しさん@お腹いっぱい。:2008/09/20(土) 14:08:26
補足すると、
make自体のexit statusの話じゃなくて、
makeが判断する外部コマンドのexit statusの話だから、
0、それ以外の 2種類でFA。
708名無しさん@お腹いっぱい。:2008/09/20(土) 16:32:35
>>696
嗚呼、間違えた sysexits.h だorz 指摘ありがと。
漏れがヘボでも何でも構わないんだが、エラーなのに 0 で終了するのは
それはそれで思いっきりダメだと思うぞw
709名無しさん@お腹いっぱい。:2008/09/20(土) 17:56:41
sysexits.h って UNIX がどうのじゃなくて、
そもそもが sendmail 由来のヘッダじゃないのか?
710名無しさん@お腹いっぱい。:2008/09/20(土) 18:41:25
711名無しさん@お腹いっぱい。:2008/09/20(土) 18:47:35
sysexits.hの中身読んでみろ。
EX_HOGEってエラーの内容、メール関係ばっかだw
712名無しさん@お腹いっぱい。:2008/09/20(土) 21:28:16
もともとsendmail用のヘッダーだった

一般のアプリケーションにも使ってもらうつもりで/usr/includeに配置

でも、メール関係のエラーコードしか定義されてない

結局誰にも使われず、今に至る

ってのが現状?
713名無しさん@お腹いっぱい。:2008/09/20(土) 21:50:19
盲腸ですね。
714名無しさん@お腹いっぱい。:2008/09/21(日) 00:37:29
stdlib.hは?w
715名無しさん@お腹いっぱい。:2008/09/21(日) 00:38:15
bashなんですが、
while read iにバックスラッシュが含まれた文字列を渡すと、
どうししても、勝手にバックスラッシュが削除されてからiに入ってしまいます。
これって回避不可能なんでしょうか?
716名無しさん@お腹いっぱい。:2008/09/21(日) 00:59:51
read -r
717名無しさん@お腹いっぱい。:2008/09/21(日) 01:09:14
>>716
ありがとうございます。
718名無しさん@お腹いっぱい。:2008/09/21(日) 08:29:25
cat /PATH.txt | (while read -r l;do
if test "x$l" != "x";then
PATH="$( /usr/bin/cygpath -u "$l" ):${PATH}"
fi
done;echo $PATH)

PATH.txtには一行に一つWindows形式のパスが書いてあるとします
このスクリプトだとサブシェルを起動してしまうので
環境変数を設定できません。何かいい方法はないでしょうか?
719名無しさん@お腹いっぱい。:2008/09/21(日) 08:36:13
while read -r l;do
if test "x$l" != "x";then
PATH="$( /usr/bin/cygpath -u "$l" ):${PATH}"
fi
done < /PATH.txt

すいませんこれでおkでした
720名無しさん@お腹いっぱい。:2008/09/21(日) 15:19:10
別にcat使う方式でもできるだろ
721名無しさん@お腹いっぱい。:2008/09/21(日) 16:57:43
csh用の下のような設定ファイルをbashで読みたいんですが、

#!/bin/csh
setenv HOGE hoge


cat a.env | grep setenv | sed 's/^setenv/export/' | gawk ' { print $1" "$2"="$3 } ' | sh -

これだとサブシェルでexportして終わりみたいでだめです。
一時ファイルに書いて . で読むのはださいなぁと思ってるんですが、いい方法ないでしょうか?
722名無しさん@お腹いっぱい。:2008/09/21(日) 17:03:58
>>721
最後の標準出力を ` ` で読めばいいだけ。一時ファイルは不要。

あと、cat grep sed gawkは無駄っぽい。もっと簡単になる。
723名無しさん@お腹いっぱい。:2008/09/21(日) 17:09:46
>>722
``は盲点でした
ありがとうございます
setenv だけだったらこれで大丈夫でした!

`grep setenv a.env | awk ' { print "export "$2"="$3 } '`
724名無しさん@お腹いっぱい。:2008/09/21(日) 17:13:51
>>723
grepも無駄。

`gawk '/^setenv/{print "export " $2 "=" $3}' < a.env`
725名無しさん@お腹いっぱい。:2008/09/21(日) 18:07:26
>>724
eval はいらんの?
726名無しさん@お腹いっぱい。:2008/09/21(日) 18:40:59
>>725
eval はいらん。 ` ` だから。(まずは試してみろ)
evalが要るのは "` `" の時。
727名無しさん@お腹いっぱい。:2008/09/21(日) 18:48:00
setenv HOGE hoge
ならいいけど、
setenv HOGE `hoge -fuga`
だとアウトだぞ。
728名無しさん@お腹いっぱい。:2008/09/21(日) 18:59:27
>>727
その場合は eval付けても eval以前の問題でアウトだから、
そこまで対応する必要無しと思われ。
729名無しさん@お腹いっぱい。:2008/09/21(日) 23:25:43
>>727
汎用的なもので考えると、aliasとかsetとか中でsourceしてたりとかキリがないっすよ
730名無しさん@お腹いっぱい。:2008/09/23(火) 02:23:02
シェルの中で!$とかって使えないんですか?
731名無しさん@お腹いっぱい。:2008/09/23(火) 04:53:55
'!' '$'
732名無しさん@お腹いっぱい。:2008/09/23(火) 10:20:55
キミのシェルがまがい物でなければ、!は使える。
733名無しさん@お腹いっぱい。:2008/09/23(火) 10:28:26
まがいもののシェルだったとしても、
set +H
しておけば、! は文字通りの意味で使える。
734730:2008/09/23(火) 20:19:25
ちょっと誤解を招いてるかもしれないですが、
前のコマンドの最終引数という意味の"!$"ですよ!
735名無しさん@お腹いっぱい。:2008/09/23(火) 21:04:07
>>734
それは $_ だろw
736名無しさん@お腹いっぱい。:2008/09/23(火) 21:07:48
!$でもできるんですけど
これってまがい物のシェルですかね!
というか$_知らなかった
737名無しさん@お腹いっぱい。:2008/09/23(火) 21:10:52
>>736
コマンドラインでは !$ も $_ も使えるが、
シェルスクリプトの中では $_ だけが使える。
738名無しさん@お腹いっぱい。:2008/09/24(水) 22:30:01
sortって何バイト目から何バイト目をキー1 何バイト目から何バイト目をキー2 とかってできなんですかね?
739名無しさん@お腹いっぱい。:2008/09/25(木) 01:20:58
そんなsortコマンドはキーたことがない
740名無しさん@お腹いっぱい。:2008/09/25(木) 01:51:45
GNUのsortなら、--key=1.m,1.n --key=1.o,1.p みたいにできるんじゃないかな。
試してないけど。
741名無しさん@お腹いっぱい。:2008/09/25(木) 01:54:48
試してから、出直してこい
742名無しさん@お腹いっぱい。:2008/09/25(木) 02:03:35
だが断わる
743名無しさん@お腹いっぱい。:2008/09/25(木) 03:33:59
make のこと聞いてもいいですかね?
744名無しさん@お腹いっぱい。:2008/09/25(木) 11:07:18
さすがにmakeはぜんぜんシェルスクリプトじゃないだろ
745名無しさん@お腹いっぱい。:2008/09/25(木) 14:49:47
スレ一覧でmakeぐらい検索しろ
746名無しさん@お腹いっぱい。:2008/09/25(木) 15:27:29
まけまけ
747名無しさん@お腹いっぱい。:2008/09/25(木) 23:07:59
じゃぁtcpdumpのこと聞いてもいいですか?
748名無しさん@お腹いっぱい。:2008/09/26(金) 03:30:56
シェルスクリプトと関連があれば
でなければくだ質
749名無しさん@お腹いっぱい。:2008/09/26(金) 05:02:48
スペース混じりのファイル名だとかディレクトリとかを変数で使うのって
かっこよくかけないものか

file_name='/home/piyo/hammer with jj'

cp -p "$file_name" /home/piyo/bakup.`date+%Y%m%d/"$file_name"

やっぱこんな感じにせざるを得ない?
750名無しさん@お腹いっぱい。:2008/09/26(金) 05:08:53
それのどこが不満なのかと
751名無しさん@お腹いっぱい。:2008/09/26(金) 06:18:12
>>749
カッコいいかどうか以前に、クォート間違ってるし…
752名無しさん@お腹いっぱい。:2008/09/26(金) 13:46:27
bashスクリプトの整形はみんな手作業?
753名無しさん@お腹いっぱい。:2008/09/26(金) 13:49:12
整形ってなに?生まれたままの姿じゃだめなの?
754名無しさん@お腹いっぱい。:2008/09/26(金) 13:54:14
なんかインデントくらいはツールでなんとかできないかなぁと思ったんですが。
755名無しさん@お腹いっぱい。:2008/09/26(金) 13:56:11
>>754
indent
756名無しさん@お腹いっぱい。:2008/09/26(金) 20:44:25
emacsがインデントする。
757名無しさん@お腹いっぱい。:2008/09/26(金) 20:50:20
>>756
vimだってするでしょ。
758名無しさん@お腹いっぱい。:2008/09/26(金) 22:27:50
ソビエトロシアではインデントがemacsする
759名無しさん@お腹いっぱい。:2008/09/26(金) 23:04:59
viとかってCとかのインデントはできるけどシェルのインデントはできなくない?
というかforの終わりとかifの終わりとか判定する気ないんじゃないの あいつら
760名無しさん@お腹いっぱい。:2008/09/27(土) 00:48:40
2バイト文字を16進数で指定してcdするにはどうすればいいでしょうか?
シェルはBashです
761名無しさん@お腹いっぱい。:2008/09/27(土) 02:26:34
tmp=a
hoge=b
mogemoge=c

じゃ不揃いなんで

tmp=a
hoge=b
mogemoge=c

とかやってる馬鹿とか、いるんかな。

環境変数設定してるファイルとか見ると、
cshはこの点だけはスッキリしてていいと思う。
あ、他に前スレラストからのネタのコメントもいいね。
762名無しさん@お腹いっぱい。:2008/09/27(土) 03:17:44
>>761
こういうことか?
tmp      = a
hoge     =b
mogemoge = c
763名無しさん@お腹いっぱい。:2008/09/27(土) 03:18:25
ぜんぜん揃ってなかった orz
764名無しさん@お腹いっぱい。:2008/09/27(土) 04:24:38
こまかいとこはまぁいいとして
shにはgotoがないってのが、他の機能で補えない分つらい
765名無しさん@お腹いっぱい。:2008/09/27(土) 07:22:48
そもそもgotoが必要になるようなプログラムになることがおかしい。
shでは、2レベル以上のループをbreakで脱出できるし、(←C言語では不可能)
シェル関数も使えるから、gotoがなくて困ったことなんて1度もない。
766名無しさん@お腹いっぱい。:2008/09/27(土) 12:17:58
>>764はgotoが使えないと困る実例を挙げること。
767名無しさん@お腹いっぱい。:2008/09/27(土) 16:43:34
シェル関数といっても、他の言語でいうところの関数とは違って、ただのサブルーチンに過ぎないからな。
gotoなんかは全く意味がない。
768名無しさん@お腹いっぱい。:2008/09/27(土) 19:25:36
さすがにgotoが必要ってのはネタだろ?
769名無しさん@お腹いっぱい。:2008/09/27(土) 19:43:34
csherなら全然普通。
770名無しさん@お腹いっぱい。:2008/09/28(日) 23:01:39
そりゃgotoが不要なように構成すりゃgotoはいらんよ
でもあると便利だってだけの話

どんくらい便利かというと、便利だからって乱用してわけわからなくする奴がいるから
goto使うなってローカルルールが生まれるくらい便利だってこと
771名無しさん@お腹いっぱい。:2008/09/28(日) 23:16:36
>>770
だから、そのgotoが便利に思えるような例を1つでも挙げろよ。

「gotoが不要なように構成」なんてしないよ。
普通にスクリプトを書くだけ。
それでもgotoが便利だと思う場面は過去長年の間、1度もない。
仮に、純正shにgotoがあっても、誰もその存在に気づかないほど不要な文法。
772名無しさん@お腹いっぱい。:2008/09/29(月) 00:15:41
そりゃ便利なんじゃなくて構造的な考え方が出来ないで
その場しのぎのことしか思いつけないってだけの話だな。

どんな文だろうが式だろうが、あれば便利に思えるヤツもいるだろうけど
少なくともシェルプログラミングにgotoが必要になるって場面はそうないだろ。
773名無しさん@お腹いっぱい。:2008/09/29(月) 00:18:06
インタラクティブに使ってるときにgotoを使いたくなるならあってもいいだろうが,そんなことはないだろうし
774名無しさん@お腹いっぱい。:2008/09/29(月) 02:42:26
その場しのぎの非構造的スクリプトを書くときに便利じゃないか
775名無しさん@お腹いっぱい。:2008/09/29(月) 07:15:28
アセンブラのまねの時
776名無しさん@お腹いっぱい。:2008/09/29(月) 10:11:44
>>774
その場しのぎでも、関数の方がやっぱり使い勝手がいいと思うんだけど...
まぁどうしてもgotoがよければもうexec使うくらいの勢いでいいんじゃ。
777名無しさん@お腹いっぱい。:2008/09/29(月) 10:40:25
goto使わなきゃ書けないような処理を示せる人はgoto使いません
でも良く構文知らない言語使うときに便利だよ
あれvbaのforってどう書くんだっけ?→gotoでいいや
batってcaseあったっけ?→gotoでいいや
javaってなんだっけ?→gotoでいいや
778名無しさん@お腹いっぱい。:2008/09/29(月) 12:39:30
Javaにgotoなんてあったっけ?
779名無しさん@お腹いっぱい。:2008/09/29(月) 12:44:38
予約語ではあるよな
780名無しさん@お腹いっぱい。:2008/09/29(月) 12:56:14
なんだ、構造化プログラムどころか、プログラム一般についてもよく知らない人の
意見だったんだな、>>777 は(笑)。
781723:2008/09/29(月) 20:51:34
すいません
cshの設定ファイルをshで読みたくて質問したものですが、

>>724さんの

`gawk '/^setenv/{print "export " $2 "=" $3}' < a.env`

これだと、サンプルで書いた設定ファイルならまったく問題ないんですが、

a.envに

setenv HOGE_HOME /home/hoge
setenv HOGE_BIN ${HOGE_HOMGE}/bin
setenv PATH ${PATH}:$HOGE_BIN}

みたいに変数使われてるとアウチです。
$がエスケープされてしまってるようです。

できれば変数展開した上でexportしたいんですが、うまい方法ないでしょうか!
782名無しさん@お腹いっぱい。:2008/09/29(月) 20:58:15
eval `csh -c "source a.env;env"`
783名無しさん@お腹いっぱい。:2008/09/29(月) 21:26:33
>>777

良く構文知らない言語を使うな。

go to hell.
784名無しさん@お腹いっぱい。:2008/09/30(火) 23:00:33
質問させてください。

c言語で作ったプログラムa.outが今手元にあります。
シェル(シェルスクリプト)から、このa.outを実行し、
int main()が戻す数値を変数に得ることは出来ないでしょうか?

文字ではないから受け取れないのでしょうか?
それともそもそも、main()の戻り値は、OSに返される値で、シェルには何も戻ってこないとかでしょうか?
cプログラムの戻り値を利用できるととても便利で助かるのですが…。

どうか知恵を御貸しください。
785名無しさん@お腹いっぱい。:2008/09/30(火) 23:08:06
v=`./a.out`
786名無しさん@お腹いっぱい。:2008/09/30(火) 23:09:26
よく読んでなかったorz
./a.out
v=$?
787名無しさん@お腹いっぱい。:2008/09/30(火) 23:09:46
./a.out
echo $?
788名無しさん@お腹いっぱい。:2008/09/30(火) 23:29:28
>785-787
即レスありがとうございます。
$?でいけました。

ヒントをいただき、検索したことで、$?や周辺の知識が入りました。
始めの一歩を手助けしてくださったことに、感謝します。
ありがとうございます。
789名無しさん@お腹いっぱい。:2008/10/01(水) 00:00:25
>>785
?
790名無しさん@お腹いっぱい。:2008/10/01(水) 01:32:23
メール関数おしえて

mail_send(from, to, msg)

こんな感じ
791名無しさん@お腹いっぱい。:2008/10/01(水) 06:14:49
mail_send() {
/usr/sbin/sendmail -f "$1" "$2" << _END_OF_MSG_
$3
_END_OF_MSG_
}
792名無しさん@お腹いっぱい。:2008/10/01(水) 10:48:58
$3に仕込まれて好き放題やられる。
793名無しさん@お腹いっぱい。:2008/10/01(水) 19:15:17
自分で使うんだったらいんじゃね?w
まぁ、ファイルに落とし込んでから流した方がいいけど。
794784:2008/10/01(水) 21:51:23
784です。
またきてしまいました。
また質問させてください。

シェルスクリプトを使ってみているのですが、elseifの動作が意図した動きをしてくれずに困っています。
文法的にどこがおかしいのかどうしてもわかりません。
if ( $arg == $vari1 ) then
  echo 'vari1'
elseif ( $arg == $vari2 ) then
  echo 'vari2'
elseif ( $arg == $vari3 ) then
  echo 'vari3'
else
  echo 'else'
endif
上記が問題箇所なのですが、
ifの条件にマッチする場合は、処理実行後にBadly placed ()'sとなり、
elseifが評価されてかされずか、else句の中へ分岐してしまいます。
しかたがないので、
if ( $arg == $vari1 ) echo 'vari1'
if ( $arg == $vari2 ) echo 'vari2'
if ( $arg == $vari3 ) echo 'vari3'
if ( $arg != $vari1 && $arg != $vari1 && $arg != $vari3 ) echo 'else'
として目的の出力を得ているのですが、elseifのどこがおかしいのか気になって仕方がありません。
どなたか問題箇所を教えてください。
795名無しさん@お腹いっぱい。:2008/10/01(水) 21:55:46
>>792
へー。どうやったら$3に仕込めるんですか?
796名無しさん@お腹いっぱい。:2008/10/01(水) 21:56:54
>>794
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
797名無しさん@お腹いっぱい。:2008/10/01(水) 21:59:42
>>794
"$arg" "$vari1" "$vari2" みたいに、全部""で囲んでみたら?
798784=794:2008/10/01(水) 22:00:21
すみません。
投稿前のチェックが微妙でした。

18行目は、
『elseifが評価されてかされずか、else句の中へ分岐してしまいます。 』

『ifの条件にマッチしない場合は、elseifが評価されてかされずか、else句の中へ分岐し、elseifの中へ処理が移りません。 』

23行目は
『if ( $arg != $vari1 && $arg != $vari1 && $arg != $vari3 ) echo 'else' 』

『if ( $arg != $vari1 && $arg != $vari2 && $arg != $vari3 ) echo 'else' 』

elseifの動きを確認していたコードが今手元にないので、
再度作成して動きを見たのですが、チェックが甘かったです。

『Badly placed ()'s.』は、何がBadだといっているのでしょうか。
今、家では、cygwinなのですが、『#!/bin/csh』しか書かなくとも必ずひとつは出ます…。
799名無しさん@お腹いっぱい。:2008/10/01(水) 22:01:55
× elseif ○ else if ってこと?
800名無しさん@お腹いっぱい。:2008/10/01(水) 22:03:13
elseif というコマンドに見えるから、変なところに括弧があると見なされるわけだ。
801784=794:2008/10/01(水) 22:12:29
>799
ええええええええええええええええええ! д
そんな…。解決しました。。。
あ、ありがとうございます…。
な、な、何故エラーが出ないのでshouka...

>797
変数を利用するときは""で囲めるですか。
勉強になります。ありがとうございます。
今回の件では解決に至りませんでした。

>796
csh-whynot
紹介ありがとうございます。
いろいろなサイトで、紹介されているので一応読みました。
私は、bashに惹かれるものがありますが、cshについても学習中です。
現在でもcshの紹介がなくならないということは、cshについても基本は知ったほうがいいと考えていました。
まわりにcshのコードがあるので、どうしても読まねばならない環境にありますし。
802名無しさん@お腹いっぱい。:2008/10/02(木) 02:43:46
>>795
mail_send("from", "to","_END_OF_MSG_
rm -rf *" )
803名無しさん@お腹いっぱい。:2008/10/02(木) 06:47:11
>>802
そんなことやっても仕込めないよ。
シェル関数の呼び出し方も間違ってるし。
804名無しさん@お腹いっぱい。:2008/10/03(金) 07:59:53
>>792 >>802 は、間違った言いがかりを付けたことに対してちゃんと弁明しとけよ。
805名無しさん@お腹いっぱい。:2008/10/03(金) 10:35:57
謝罪と賠償を要求するニダ
806名無しさん@お腹いっぱい。:2008/10/03(金) 20:57:04
なんだ、素で仕込み方わかってなかったのか。
ほらヒントやるよ。お前の好きなmd5だ。www

873cd540c150a4db88e18fb02ec4434c
807名無しさん@お腹いっぱい。:2008/10/03(金) 21:02:07
ヒアドキュメントの展開や、シェルの解釈順を知っていれば、
$3には仕込めないことは明白。
808名無しさん@お腹いっぱい。:2008/10/03(金) 21:08:24
>>806
どうせ、「すみませんでした」とか、そういう意味の言葉の md5だろw

初めてここを読んだ人のために書いておくと、
話題の元は >>791 ね。
809名無しさん@お腹いっぱい。:2008/10/03(金) 21:11:08
頭が固い奴にはハッキングは無理。www
810名無しさん@お腹いっぱい。:2008/10/03(金) 21:13:28
実際に試しもせずに、>>802 で「仕込めた」と勘違いしてる人の
勘違い md5 なんて無視しておけ。
811名無しさん@お腹いっぱい。:2008/10/03(金) 21:20:53
>>810
>>802はお前の自演だろ。俺(806)じゃない。www
812名無しさん@お腹いっぱい。:2008/10/03(金) 21:36:28
$ echo 正直スマンかった | md5sum
873cd540c150a4db88e18fb02ec4434c
813名無しさん@お腹いっぱい。:2008/10/03(金) 21:40:06
>>812
降参するのか? www
814名無しさん@お腹いっぱい。:2008/10/03(金) 22:11:05
逃げ出したか? >>808
10/5 0:00過ぎに>>806の答公開してやるよ。 後26時間。まぁがんばれ。www
815名無しさん@お腹いっぱい。:2008/10/04(土) 02:26:00
$ echo 正直スマンかった | md5sum fa4ea9e33e02566ce9c88102e24f3d51  -
816名無しさん@お腹いっぱい。:2008/10/04(土) 02:26:05
>>812 ワロタwww そういう素直はレスは好きだぜ
817名無しさん@お腹いっぱい。:2008/10/04(土) 10:19:51
>>816
わからないのが悔しくてたまらないようだな。あと14時間。www
818790:2008/10/04(土) 11:38:14
こたえまだー?
819790:2008/10/04(土) 11:39:49
ていうか、自分で使うから仕込むとかどうでもいいしw

てか、sendmailのpathが固定なのが気になる。
mailコマンドでヨロ
820名無しさん@お腹いっぱい。:2008/10/04(土) 11:40:34
そういう突っ込みが欲しいけど、お前らじゃ無理だなw
821名無しさん@お腹いっぱい。:2008/10/04(土) 11:42:05
>>818
>>791

mailコマンドではfromの変更ができないから、
sendmailにする必要がある。
path固定がやなら path外せばいいだけ。
822名無しさん@お腹いっぱい。:2008/10/04(土) 17:22:34
シェルで、マウスポインターの位置を指定座標に強制移動するにはどうすればいいですか?
823名無しさん@お腹いっぱい。:2008/10/04(土) 17:47:33
XWarpPointerを呼ぶプログラムを書け
824名無しさん@お腹いっぱい。:2008/10/04(土) 17:48:40
シェルでやりたいんですが、、
825名無しさん@お腹いっぱい。:2008/10/04(土) 19:33:11
XWarpPointerを呼ぶプログラムを書いてシェルスクリプトから呼べ
826名無しさん@お腹いっぱい。:2008/10/04(土) 20:13:16
「XWarpPointerを呼ぶプログラム」はシェルで書けるんですか?
827名無しさん@お腹いっぱい。:2008/10/04(土) 20:17:31
マウスポインターの位置を指定座標に強制移動する機能があるシェルを作ればよい。
828名無しさん@お腹いっぱい。:2008/10/04(土) 20:20:04
perlのモジュールか何かそういう感じので、マウスを動かすことはできませんか?
829名無しさん@お腹いっぱい。:2008/10/04(土) 20:41:11
>>828
Perlを何か勘違いしてないかw
perlはテキスト処理言語。
だからそもそもperlでグラフィックの処理はできない。
830名無しさん@お腹いっぱい。:2008/10/04(土) 21:15:52
>>829
お前こそPerlを何か勘違いしてるだろw
831名無しさん@お腹いっぱい。:2008/10/05(日) 00:06:40
ほらよ。
to="-t"
832名無しさん@お腹いっぱい。:2008/10/05(日) 00:09:30
ちゅーかperlはスレ違い
もしくは板違い
833名無しさん@お腹いっぱい。:2008/10/05(日) 02:04:37
>>829 Perlはテキスト処理?w Tk使ってXのプログラムも書けるぞ?
834名無しさん@お腹いっぱい。:2008/10/05(日) 02:32:46
>>821
mail -f foo -t too

しったかだな ぷぷ
835名無しさん@お腹いっぱい。:2008/10/05(日) 03:35:12
mail(1) はどのシステムでも共通の仕様だっけ?
sendmail(1) なら、Sendmail, Postfix, qmail でも使えるが…
836名無しさん@お腹いっぱい。:2008/10/05(日) 07:32:51
>>812
>>831

やっぱり $3 に仕込めてないじゃんwww
ちゃんと謝罪しとけよ。
837名無しさん@お腹いっぱい。:2008/10/05(日) 07:36:15
>>791
>>792
>>806
>>831

結論は「仕込めない」。
838名無しさん@お腹いっぱい。:2008/10/05(日) 07:38:54
>>834
しったかはオマエ。もっかい man mail 読み直せ。
839名無しさん@お腹いっぱい。:2008/10/05(日) 07:41:52
>>831 が赤恥と聞いて飛んで来ました
840名無しさん@お腹いっぱい。:2008/10/05(日) 08:46:53
sendmail -t しても、To: From: 等が自由になるだけで、
rm -rf * とかコマンドが実行できるわけではない。
>>831 は何か勘違いしたんだろうな。カッコ悪い奴だな。
841名無しさん@お腹いっぱい。:2008/10/05(日) 13:26:27
>>838
なに熱くなってんの?
早く質問に答えてよ。意味和漢ないひとだな
842名無しさん@お腹いっぱい。:2008/10/05(日) 13:42:53
>>836
アホ、$3に仕込むための「ヒント」だよ。
想像力の欠如している奴は救いようがないな。

「コマンド実行」を仕込むと勝手に曲解して思考が固まったんだろう。
843名無しさん@お腹いっぱい。:2008/10/05(日) 14:03:25
>>842
あはぁぁ、開きなおっちゃったかw

コマンド実行できなきゃ何の問題も起きない。
-t 付けたところで、$3 の To: や Cc: にそのままメールが送られるだけ。
全く無問題。

見当違いな回答をわざわざ md5まで作って 1日もったいぶって回答して、
さぞかし悔しいだろうね。>>831
今度からは、途中から話題に加わる時は、話の流れ良く読めよ。
844名無しさん@お腹いっぱい。:2008/10/05(日) 14:05:19
>>841
manくらい自分で読めよ。

mailコマンドの -f オプションは、メールボックスの指定。
Fromアドレスの指定じゃない。
845名無しさん@お腹いっぱい。:2008/10/05(日) 14:07:41
>>831 は、それが回答だと言ってなかったか?
大間違いな回答だったけど、「それはヒントだ」と言い訳して、
今大急ぎで弁解方法考えてるんだろなwww
846名無しさん@お腹いっぱい。:2008/10/05(日) 14:22:28
>>845
悔しくてメクラになったのか? www

>>806
> ほらヒントやるよ。お前の好きなmd5だ。www
847名無しさん@お腹いっぱい。:2008/10/05(日) 14:33:41
>>842
> 「コマンド実行」を仕込むと勝手に曲解して

ということは、結局「コマンド実行」はできないんだよね。

で、>>831 は、-t でアドレス複数を自由に同時に指定できるようになることを
「仕込む」と曲解したのか?

>>792 が言う、「$3に仕込まれて好き放題やられる」のニュアンスとは程遠いぞ。
もともとの質問で、Toは自由に引数指定可能なんだから、
-tにしたところでユーザーができることに大差ない。
そんな大差ないことを「$3に仕込まれて好き放題やられる」とは言わない。

さあ、$2は -t にするとして、$3 をどうやったら 「好き放題やられる」か
やれるもんなら回答してみろ。
傷口を広げる前に謝った方がいいとは思うけどな。
848名無しさん@お腹いっぱい。:2008/10/05(日) 14:41:32
たぶん、>>792 = >>802 で、「コマンド実行を仕込める」と勘違いしていた。
その話の流れを途中から読んだ >>806 は、よくわからずに
>>831 という見当違いなことを言い出した。

というのが真相。
849名無しさん@お腹いっぱい。:2008/10/05(日) 14:41:51
>>847

>>842は訂正しよう。
× 想像力が欠如してるんだな。
> ということは、結局「コマンド実行」はできないんだよね。
「コマンド実行」は、お前が溢れ出る想像力で脳内で変換したもの。www

toでは一通しか出せない。
-tでメッセージから読ませれば好きなだけ送れる。
お前にかけているのは応用力のようだ。
850名無しさん@お腹いっぱい。:2008/10/05(日) 14:43:07
>>848
>>802はお前の自演だということは指摘済み。
851名無しさん@お腹いっぱい。:2008/10/05(日) 14:44:11
>>849
> -tでメッセージから読ませれば好きなだけ送れる

やっぱそれだけか。そんなの最初から問題じゃない。

>>831 の敗北宣言ということで、終了。
852名無しさん@お腹いっぱい。:2008/10/05(日) 14:45:38
>>850
ちがうよ。おれは >>803
「仕込めない」と主張している側。
853名無しさん@お腹いっぱい。:2008/10/05(日) 14:47:22
もしかして、>>792 = >>831 か?
>>792 を書いた時点では、「本当に仕込める」と勘違いしてたとかwww
854名無しさん@お腹いっぱい。:2008/10/05(日) 14:57:29
>>849
-tでメッセージから読ませれば好きなだけ送れると、何か問題なの?

どうせシェルを回すんだろうし、仮に-tを使わないとしても
そのメールを送るシェル関数を繰返し呼び出せばいいだけでしょ。

まさか、それを「仕込む」って言ってるんじゃないよね?




と書こうとしてレス見たら、本当にそうみたいだ。アフォか(笑)
855名無しさん@お腹いっぱい。:2008/10/05(日) 14:58:10
>>851
後だし乙。
> やっぱそれだけか。そんなの最初から問題じゃない。
www お前が勝手に想像してはしゃいでただけ。

>>853
> もしかして、>>792 = >>831 か?
そうだよ。>>806 == >>831はmd5から明らかだろ。
>>802のシェル関数の呼び出しにもなっていない意味不明のカキコは知らん。
きっと>>848の自演だろう。
856名無しさん@お腹いっぱい。:2008/10/05(日) 15:02:12
>>855

じゃあ、>>792 本人だとして、

「$3に仕込まれて好き放題やられる」
の回答は?

-t で多数のメールを出すことは、-tを使わなくてもできるし、
これはsendmailの通常の使用方法だからクラックされたことにはならない。

$3に仕込んで、どうやってクラックするんだ?
857名無しさん@お腹いっぱい。:2008/10/05(日) 15:04:56
おれは >>848 = >>803
>>802 はおれじゃない。
858名無しさん@お腹いっぱい。:2008/10/05(日) 15:14:44
>>854
お前アホだろ。シェル関数を繰り返し呼び出すことができるなら仕込む必要はない。
お前ついてこれないようだから、退場。

>>856
>>791では$2には直接多数のアドレスは渡せない。
> これはsendmailの通常の使用方法だからクラックされたことにはならない。
sendmailをクラックするというのはお前の妄想。
859名無しさん@お腹いっぱい。:2008/10/05(日) 15:18:38
まとめると、
>>792 が「$3に仕込まれて好き放題やられる」と書いた時点で、
>>792 自身はヒアドキュメントの内容がシェルに解釈されて
コマンドを実行されてしまうと誤解していた。

>>802 は全くの第3者によるデタラメ回答。

(このあたりで、>>792 自身も仕込みは不可能なことに気づく)

引っ込みがつかなくなった >>792 は、>>806 で -t の md5を書き込む。
もちろん、-t では「好き放題やられる」ことにはならない。

結論: >>831 の負け。
860名無しさん@お腹いっぱい。:2008/10/05(日) 15:21:54
>>858
クラックじゃなく、通常の使用方法なのに
「仕込んだ」と勝手に言葉を定義し直すのはお前の妄想。

よくいるよね、議論に負けると言葉の定義を変えて言い逃れする奴。
861名無しさん@お腹いっぱい。:2008/10/05(日) 15:23:38
>>859
それはお前の願望
862名無しさん@お腹いっぱい。:2008/10/05(日) 15:24:03
>>858
もとの質問では、シェル関数を作って、それをユーザーに解放して使わせる、
と読めるから、ユーザーは何度でもシェル関数を呼べると考えるのが自然。

forでもwhileでも回せば良い
863名無しさん@お腹いっぱい。:2008/10/05(日) 15:25:38
というか、クラックにも何にもなってない -t を大真面目に回答してる時点で
>>831 の負けだよ。
864名無しさん@お腹いっぱい。:2008/10/05(日) 15:30:29
>>858
>>791の$2はアドレスを渡されるように作られているだが。
アドレスが渡されるはずの引数にスイッチを渡す。これはクラック。
お前も退場。

>>862
>>790がそのように読めるなら。中学校から国語の勉強やり直した方がいい。
ユーザーに開放して使わせるなら「仕込む」必要は全くない。
865名無しさん@お腹いっぱい。:2008/10/05(日) 15:34:10
>>864
で、結局、

コ マ ン ド 実 行 は で き な い

んだろ。それがすべて。お前の負け。
866名無しさん@お腹いっぱい。:2008/10/05(日) 15:40:34
>>858
> $2には直接多数のアドレスは渡せない。

↑ $2に、複数のアドレスをカンマで区切って渡せる。

だから、>>791 の時点で、-t 以前の問題として
複数アドレスを送ることは可能だった。

結局 >>858 は 複数のアドレスをカンマで区切って渡せることも知らなかったのかwww
867名無しさん@お腹いっぱい。:2008/10/05(日) 15:45:45
>>866
残念ながらARG_MAXという制限があるんだ。
868名無しさん@お腹いっぱい。:2008/10/05(日) 15:49:22
>>865
発言していないことが出来ないと負けなのか? www

なら
コ マ ン ド 実 行 は で き な い

ので、>>865の負け。絶望的敗退。
869名無しさん@お腹いっぱい。:2008/10/05(日) 15:51:12
>>867
逆にARG_MAXまでなら送れるじゃん。
もともとARG_MAXまでOKだったのに、
-tをつけて「仕込んだ」と言うのは極めて不自然。

>>858 が、$2で複数アドレス指定ができることを知らなかったのは、ガチ。
870名無しさん@お腹いっぱい。:2008/10/05(日) 15:55:41
再度まとめると、
>>792 = >>831 は、sendmailの引数で、toアドレスを複数区切って並べられることを
知らなかった。そして、-tオプションで複数アドレスが指定できることには気づいた。
それを、「もともとできなかったのができるようになった」
と勘違いして、「仕込めた」と思い込んでしまった。

ところが、>>866 の指摘通り、「仕込めた」と思ったのは、
「もともとできた」ことだった。

>>858 (の後半)は、赤面モノの間違いカキコ。
871名無しさん@お腹いっぱい。:2008/10/05(日) 16:01:24
いいかげん、別スレでやってほしいなぁ
872名無しさん@お腹いっぱい。:2008/10/05(日) 16:08:08
>>868
もともと出来ていたことなのに、「別の方法でも出来た、これは大変だ」と言って
md5までわざわざ計算して書き込んだお前の負け。
873名無しさん@お腹いっぱい。:2008/10/05(日) 16:10:44
>>867
OSにもよるが、ARG_MAXって4096バイトほどだから、ほとんど制限にならないよ。
874名無しさん@お腹いっぱい。:2008/10/05(日) 18:34:33
>>869-870, >>872-873
「複数」ではなく「多数」と書いた意味を考えろ。
875名無しさん@お腹いっぱい。:2008/10/05(日) 18:36:47
>>874
ARG_MAXの制限はとても緩いので、
「多数」でも問題なく送れる。>>873 の言うとおり。

逆に、Toアドレスを引数指定した方がむしろ送れるアドレス数は多いだろう。
-tでヘッダにTo: Cc:を書くと、ヘッダの行数制限に先に引っかかる。
876名無しさん@お腹いっぱい。:2008/10/05(日) 18:39:53
>>874
sendmail [email protected],[email protected],.... の方が多数アドレスに送れるよ。

sendmail -t だと、ARG_MAXじゃなく、sendmail側のヘッダーの制限で
そんなに多数には送れない。
877名無しさん@お腹いっぱい。:2008/10/05(日) 19:25:25
盛り上がってると思って来てみたらwwwwwwwwwwwwwwwwwwww
30秒斜め読みしただけでここまで来たぜ
878名無しさん@お腹いっぱい。:2008/10/05(日) 19:31:58
879名無しさん@お腹いっぱい。:2008/10/05(日) 21:04:46
FreeBSD: man mail

-f [mbox]
Read in the contents of your mbox (or the specified file) for
processing; when you quit, mail writes undeleted messages back to
this file.

Solaris: man mail
-f file mail uses file (such as mbox) instead of the default mailfile.

Linux: man mail
-f Read in the contents of your mbox (or the specified file) for processing;
when you quit, mail writes undeleted messages back to this file.


どれも -f は mboxを指定するオプション。
880名無しさん@お腹いっぱい。:2008/10/05(日) 21:18:36
>>834 はうちが独自に入れてるスクリプトだよ。
>>834 はうちのユーザーかな。

$ type mail
/usr/local/bin/mail

$ file /usr/local/bin/mail
Bourne shell script text executable

$ cat /usr/local/bin/mail
#!/bin/sh
case $1$3 in
-f-t);;
*) echo 'Usage: mail -f from -t to' 1>&2; exit 1;;
esac
/usr/sbin/sendmail -f"$2" "$4"
881名無しさん@お腹いっぱい。:2008/10/05(日) 21:25:13
>>858 曰く、
> $2には直接多数のアドレスは渡せない。
> $2には直接多数のアドレスは渡せない。
> $2には直接多数のアドレスは渡せない。
> $2には直接多数のアドレスは渡せない。

↑ $2に、多数のアドレスをカンマで区切って渡せる。
-tオプション使うより多数のアドレスをカンマで区切って渡せる。
882名無しさん@お腹いっぱい。:2008/10/05(日) 21:57:33
>>880 ワロタ 同じ会社の新人かもしれんぞw >>834
883名無しさん@お腹いっぱい。:2008/10/05(日) 21:59:26
>>881
-tより多数を渡せないポリシーで運用してる場合もあるだろうね。
それが何か?
884名無しさん@お腹いっぱい。:2008/10/05(日) 23:12:06
こういう流れ見るとなんか安心するわ
885名無しさん@お腹いっぱい。:2008/10/05(日) 23:18:48
>>883
正確には、>>858 で、
>>791 では$2には直接多数のアドレスは渡せない」
って言っているよ。
つまり、sendmailの運用ポリシーは関係なくて、
>>791 のスクリプトの、"$2" とダブルクォートされた状態では
$2に多数(複数)のアドレスを入れられないと >>858 は勘違いしていたんだろう。
だから、-t オプションで、多数(複数)のアドレスにメールを出せること自体を
>>858 は問題だと勘違いしたんだ。
で、結局コマンド実行を仕込むことは出来ないことが明らかになった。
>>858 が一人で勘違いしていただけ。
886名無しさん@お腹いっぱい。:2008/10/05(日) 23:58:34
>>885
最後の
> で、結局コマンド実行を仕込むことは出来ないことが明らかになった。
が、全然繋がっていないな。

コマンド実行は出来ない。だからお前(>>885)の負け。>>868で確定している。
887名無しさん@お腹いっぱい。:2008/10/06(月) 00:08:58
必死に取り繕ってもto="-t"を26時間以内に指摘できなかったお前の負け。www
888名無しさん@お腹いっぱい。:2008/10/06(月) 02:12:40
>>792
> $3に仕込まれて好き放題やられる。

to="-t"としたとして、何を好き放題やられるんだ?
>>792のニュアンスだと>>791のセキュリティホールを指摘してると思うんだが、
to="-t"は拡張機能みたいなもんで、セキュリティホールでもなんでもないぞ。
889名無しさん@お腹いっぱい。:2008/10/06(月) 06:37:30
>>886 へ。
何を勘違いしてるんだ?
>>865 は、「コマンド実行は出来ない」と主張してる本人だよ。
だから、コマンド実行は出来なかった(セキュリティホールはなかった)んだから、
>>865 の勝ち。>>831 の負け。
890名無しさん@お腹いっぱい。:2008/10/06(月) 06:46:49
もうこの話題はいいよ。くだらねー

自分専用のスクリプトなら仕込むとかないから問題ないし、
外部から入力された値を使うなら、事前に値の正当性チェックを
するのが常識だろ。その処理を追加すればいいだけ。
891名無しさん@お腹いっぱい。:2008/10/06(月) 06:54:13
まとめると、
>>792 は、最初、セキュリティホールだと思い込んでいた。
だから「好き放題やられる」みたいな言葉を使って書き込んだ。

その後、コマンド実行は出来ないことに >>792 自身も気づく

それでは悔しいと思った >>792 は -t オプションに気づく

-tをmd5にして書き込む

でも、-tでは全然セキュリティホールになってないので、
俺を含めてだれもそんな馬鹿げた回答をしなかった

この時点で、>>792 は、-t じゃなくても、"$2" に多数アドレスをカンマで
付けられることを知らなかった

>>792>>831 で -t の誤った回答を公開

多数アドレスなら、もともと "$2" で指定できることが指摘される。

行き場のなくなった >>792 は、>>868 のような意味不明のことを発言。
「コマンド実行できない」なら >>792 の負け(確定済み)。
892名無しさん@お腹いっぱい。:2008/10/06(月) 07:38:33
いつ答え出てくるの?
ちーん
893名無しさん@お腹いっぱい。:2008/10/06(月) 07:58:05
>>892
答えは >>791
セキュリティホールもないことが確認されたから、安心して使って良い。
894名無しさん@お腹いっぱい。:2008/10/06(月) 09:10:59
いくら $2 に仕込んで成功したところで、
それは $3 に仕込んで好き放題ではない。
895名無しさん@お腹いっぱい。:2008/10/06(月) 10:00:31
>>889
アホ。俺は(831)は一回も「コマンド実行可能」などと発言していない。
「発言していない事が不可能であるから負け」←このルールを作ったのは>>885

>>885(>>865)が自分で作ったルールだ>>885,865はそれに従え。
お前の作ったルールには俺は従わん。

従って「コマンド実行不可能なので>>885の負け。歴史的敗北」
896名無しさん@お腹いっぱい。:2008/10/06(月) 10:03:46
>>891
後付けの理由を幾ら考えても、26時間で指摘できなかった事実の前に、お前の負け。www
897名無しさん@お腹いっぱい。:2008/10/06(月) 11:24:24
>>895 って、元の議論とは関係ない「メタ議論」になってるよ。
そういうメタな言い方でしか言い逃れが出来ないこと自体、
>>895 自身が負けを認めている。

「コマンド実行可能」という言葉通りには言っていなくても、
それ相当の意味のことを >>792 は言ってる。
(多数のメールを送ることを「好き放題やられる」とは言わないし、
多数のメールを送ることはもともと "$2" でできるから、
「『$3に仕込まれて』、好き放題やられる」と言う言い方もおかしい。
明らかに、>>792 の時点で、もっと別のこと、つまりコマンド実行ができると
勘違いしていたと思われる。多分、ヒアドキュメントのシェルの解釈を
間違って考えていたのだろう)

で、結局コマンド実行不可能は明らかな事実。

よって、>>895 >>831 の負け。
898名無しさん@お腹いっぱい。:2008/10/06(月) 11:46:33
>>897
お前がそのように脳内変換しただけ。読み違えたお前の負け。
899名無しさん@お腹いっぱい。:2008/10/06(月) 12:05:09
>>898 >>831
ところで、-t ってゆうのはあくまで「ヒント」だったよね。
解答はまだだったよね。

ヒントの-t で多数メールを送れる(もともと「$2」ででも送れたけど)
というのはわかったよ。

降参するから、解答を教えてくれないか?
さぞかし「仕込まれて好き放題やられる」というたいそうなことを
「コマンド実行」以外の方法で出来ると >>898 は言ってるんだから、
是非知りたいよ。
900高3生:2008/10/06(月) 13:15:20
年を取ると「私が間違っていた。すまん。」って素直に謝りにくく
なるんだねぇ。
901名無しさん@お腹いっぱい。:2008/10/06(月) 15:01:22
んなこたー無い
社会的協調性に問題があって、あんまり普通ぽく無い生活をしてるが故に、こんな時間に2ch見られる奴だけだ
902名無しさん@お腹いっぱい。:2008/10/06(月) 15:03:41
勝ち負けに異常にこだわるのは在日ってばっちゃが言ってた
903名無しさん@お腹いっぱい。:2008/10/06(月) 16:13:02
>>898 は「脳内変換」とか「読み違えた」って言うけど、
本当に「-t で多数メール」だとすると、
>>792 が言うように「仕込まれて好き放題やられる」と騒ぐようなことは何もないよね。
「仕込まれて好き放題やられる」と騒いでいる以上、何かを >>791
考えていたはずだ。
>>897 だけじゃなくて >>888 も同じように思ってるし、
>>897 と同じように「普通に」意味を解釈した人はたくさんいるぞ。
>>898 が、後で言い訳として >>898 一人だけの(実際は違うけど)「脳内変換」
ということにしたいだけだろ。
904名無しさん@お腹いっぱい。:2008/10/06(月) 16:19:14
あの、>>831 さん、負けでいいですから、早く本当の解答をください。
831 の -t オプションでメールを多数送れるっていうヒントはわかりました。
そのヒントだけでは答がわからないです。
コマンドを実行するんじゃないというのもヒントですよね。
それもわかりますが、それでも解答はわかりません。

負けでいいですから、"$3に仕込まれて好き放題やられる" という
具体例の解答をお願いします。
905名無しさん@お腹いっぱい。:2008/10/06(月) 17:42:39
>>903
>>792の「$3にしこまれて好き放題やられる」
を勝手に脳内変換して騒いだのはお前。

お前は26時間以内に-tに気付かなかった。事実はこれだけ。
906名無しさん@お腹いっぱい。:2008/10/06(月) 17:57:57
>>905
で、答えは何ですか?
(ヒントは -t 、でも答がまだ出てない)
907名無しさん@お腹いっぱい。:2008/10/06(月) 18:13:29
>>905
事実は他にあるぞ。
905 は、$2のアドレスをカンマで区切って多数付けられるのを知らなかった。
(知っていたら -t をわざわざ問題にしない)
905 は、シェルのヒアドキュメントの仕様を理解していなかった。

ちなみに俺は傍観者だが、当然 sendmail -t は知ってるよ。
(自分でスクリプトでメール出す時に使ってるし)
でも、-t では「好き放題やられる」にはならないのでレスしなかった。

ここからは推測だが、
905 は、sendmail -t << EOF みたいなヒアドキュメントで、
メール本文の途中で「.」ピリオドでデータ終了させれば、
標準入力にはsendmailに入力されない文字列が残るので、
その残った文字列がシェルに食われて、任意のコマンドを実行できる、
と、誤解したのだろう(多分図星)。
だから、「好き放題やられる」なんて書いた。

>>831 で、ヒントの -t を公開した時点でも、
ピリオドでデータ終了の方法でコマンドを実行できると信じてたんだろう。
でも、話の流れの中でコマンドは実行できないことがわかり、
903とかの「脳内変換」にこじつけて、面目を保ってるだけ。
908名無しさん@お腹いっぱい。:2008/10/06(月) 19:01:31
>>907
それはお前の妄想。
事実はお前が-tを指摘できなかった間抜けということ。
909名無しさん@お腹いっぱい。:2008/10/06(月) 21:26:54
>>908
やっぱオマエ、here documentの仕組み知らなかったのかww
-t 答えてしまった後、「アドレス多数」の言い訳、ハタで見てても苦し杉だぞw
910名無しさん@お腹いっぱい。:2008/10/06(月) 21:33:13
>>908
だから、To=-t と言うのはわかったから、
それで「好き放題やられる」にはどうすればいいんですか?

試しに、-tで、アドレスいっぱい付けてメール出してみましたけど、
ちゃんと動作しました。「好き放題やられる」ためには
あとまだ何かしなければならないんでしょうけど、
その方法を教えてください。
911名無しさん@お腹いっぱい。:2008/10/06(月) 21:45:35
シェルスクリプトで同一ネットワーク内のホストにrloginして、いくつかコマンドを入力して元のホストに戻ってくることってできる?ちなみに環境のせいかrshは使えない…
912名無しさん@お腹いっぱい。:2008/10/06(月) 21:55:03
>>806 では「ヒント」って言ってるね。>>831 (-t)はまだヒントの段階。
最終的な「答え」は何でしょうか?
913名無しさん@お腹いっぱい。:2008/10/06(月) 21:58:25
>>911
expect使うぐらいかな
914名無しさん@お腹いっぱい。:2008/10/06(月) 22:02:44
>>831
ヒントだけ出して、答え書かずに逃げる気か?
実は答が間違ってたから、ウヤムヤにしたいの?
915名無しさん@お腹いっぱい。:2008/10/06(月) 22:52:24
capistranoは、あれはssh前提だし、そもそもrubyだな。
916名無しさん@お腹いっぱい。:2008/10/06(月) 22:54:08
>>911
素直に rshd 動かせよ。
rlogind と rshd はサービスは別物。ポート番号も違う。
917名無しさん@お腹いっぱい。:2008/10/07(火) 01:07:19
>>909
「やっぱり」とか全然繋がっていない。
やっぱり-tを指摘できなかったボンクラの事だけはあるな。www
918名無しさん@お腹いっぱい。:2008/10/07(火) 01:20:54
また下らんことで盛り上がったんだな
919名無しさん@お腹いっぱい。:2008/10/07(火) 03:12:44
そういうなよ
920名無しさん@お腹いっぱい。:2008/10/07(火) 06:26:00
>>831 って、24時間も引っ張った挙げ句に書いた -t(笑) が、
ヒントにも答えにもなってないことがわかって、
よっぽど悔しかったんだろうね。
ヒントにも答えにもなってないだから、
誰も答えるはずないよ。
>>831 を非難してるのは俺だけじゃないよ。
俺以外の人間も同じように >>831 に反対するカキコしてることは
(少なくとも)俺自身はわかってる。
(自分以外で >>831 を攻撃してるカキコが多数あるから)
921名無しさん@お腹いっぱい。:2008/10/07(火) 09:36:45
>>920
お前>>907だろ。お前は馬鹿すぎるから相手にしていない。
面倒だから突っ込まなかったけど、明白なでたらめな発言してるな。
訂正して謝罪しろ。そして退場。

ヒント
102e7bda3ff4572145809d25da2bbe11
922名無しさん@お腹いっぱい。:2008/10/07(火) 17:09:52
ほんと壷って役にたたねーな
923名無しさん@お腹いっぱい。:2008/10/07(火) 17:21:06
くやしいのうwww
924名無しさん@お腹いっぱい。:2008/10/07(火) 19:08:09
>>916
大学だからそうもいかないのよ…。
調べてみたかぎりexpectで良さそうなんだけど、expect使うとローカルかリモートかで頭の中がこんがらがって良く分からなくなる。。もう少し考えてみるか…
925名無しさん@お腹いっぱい。:2008/10/08(水) 07:11:05
aa
926名無しさん@お腹いっぱい。:2008/10/09(木) 21:04:13
パイプしまくったら戻り値には最後のコマンドのものが入る
であってますか?
例外はありますか?
927名無しさん@お腹いっぱい。:2008/10/10(金) 00:04:39
難しいこと聞くね 君は
928名無しさん@お腹いっぱい。:2008/10/10(金) 10:31:06
>>926
あってる。
929名無しさん@お腹いっぱい。:2008/10/11(土) 05:45:47
echo "ねるぽ" | gzip | gzip -c | cat -
930名無しさん@お腹いっぱい。
>>929
間違ってるよ。