シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(
>>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/
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年以上もまえありがとよ・・
ファイル検索系: find,xargs
(スペースなどを含むファイル名を正しく処理するため、
findは -exec command {} + を推奨。
他に -print0、xargsは -0オプションという方法もあるがSolaris非対応)
前スレ、`# hoge` だとコメントアウトになるが、
$(# hoge) だと期待通り動作しないな。
やっぱ $( ) より ` ` を使えということか。
「`」を含んだコメントが書けないからクソノウハウ
>>12 「注釈」の意味でコメントを「書く」んじゃなくて、
すでにあるコマンドラインオプションの一部を(テスト的に)外すための
コメントアウトだから、無問題。
「`」を使用したオプションをコメント化できないからクソノウハウ
15 :
名無しさん@お腹いっぱい。:2008/08/09(土) 22:23:30
ノウハウって文字をみると、「ウハウハ」に見える
>>14 それは、すでにある ` ` の中の先頭に # を書けばいいだけ。
しかし、cshみたいにコメント行にも末尾に'\'を付けたら
継続できる仕様には、なんでならなかったんだろうね。
「純正シェル」はともかく、
後継のでは仕様変更しようという事にはならなかったのだろうか。
bashもzshも同様だし。
いまからそういう変更を突っ込んでみたらいいかもね
受けたら広まる
最初の質問とは別として、
行継続中のコマンドラインの右側にコメントを書ければいいなと思うことはある。
↓みたいに
command \
-a \ # -aオプションに対するコメント
-b \ # -bオプションに対するコメント
-c \ # -cオプションに対するコメント
file
shではコメントから改行までを改行と同一視します。
改行には意味があるので、空白と同一視できません。
だから末尾に'\'で意味を変えたら後方互換性に問題が出ます。
>>19 /* コメント */ みたいなのがあればいいのにね。
#から改行までを改行と同一視するけど、
「\#から改行まで」を「\改行」とは同一視してくれないから
>>19 みたいなコメントは付けられないんだな。
23 :
BASH初心者:2008/08/10(日) 00:47:18
シェルスクリプト総合 その11の 984さんへ
”ところで981は、なんでコメント行にも "!" を付けてるんだ?”
特に意味はなかったです。
一行目の#!/bin/sh をコピーペしたんです。(コピペしすぎです)
ややこしくして、すみませんでした。
>>16 実例示されないとわからないのか? 駄目な奴だなあ。
hoge -F`hage`
>>24 hoge -F`#hage`
何が実例だよwww
前スレから継続して「クソノウハウ」って叫んでる奴、
自分が知らないknow how披露されて悔しいから、
言いがかり付けて意地でもknow how潰したいだけちゃうんかと、、
しかしcshが # と \ の2文字でいいのに、`# ` \ の4文字必要で、
vimやemacsのsyntax highlight的にも微妙ではあるな。
十分bad know howにカテゴライズされると思う。
>>20 >コメントから改行までを改行と同一視します
って言うのは、厳密には違うわけだな。
` ` の中の場合、#から`を閉じるところまでをコメントとみなす、ということになる。
ところで、$(#hoge) の場合、#より右側が全部コメントとみなされてしまって
$( )の右側の括弧までもがコメントとみなされる模様。(よって括弧が閉じない)
`#hoge` の書き方との実装の違いが現れる一例ではある。
>>25 あほー、それだと-Fがhogeに渡るだろ。www
>>28 $ echo `echo a
> # echo b
> echo c`
a c
>>29 おまえとことんアフォだな、
-Fをコメントアウトしたいなら
hoge `#-F``#hage`
だろ。
なお、初めてここを読んだ人が誤解するかも知れないので言っておくと、
元の質問だと、
hoge \
-F`hage` \
boke
っていう3行に渡るコマンドラインの、2行目だけコメントアウトしたいって言う質問。
(なので、hoge -F`hage` という
>>24 が出した例は悪い例
なぜなら、
>>24 の場合だと hoge #-F`hage` でOKだから)
` が対応しません.
>>30 言葉を使っても書けよ。
#から、改行または 閉じる` のどちらか先に来る方までをコメントとみなす、
って言いたいんだろ。
>>31 「-F」をコメントアウトじゃなくて、「-F`hage`」をコメントアウトだ。
ところで、`#-F``#hage`を戻すのはどうやって戻すんだ?
`直後の#をはずして、``をはずすと「-Fhage」になって元に戻らないが…
正規のコメントに書いとくのか? www
>>35 話がループしてるね。
もう一回まとめて書くよ。
元のコマンドライン:
hoge -F`hage` boke
コメントアウト:
hoge `#-F``#hage` boke
再度アンコメント:
hoge -F`hage` boke
ルールとしては、`# と ` で囲むのが基本。
ただし、囲む中にすでに ` ` がある場合は、そこを避けて複数に分割して `# ` で囲む。
その上で、もともとあった ` ` の頭には # を付ける。
知らない人が見てコメントと分からないから意味がない。
コメントの修正しようとしてエラー誘発しそうだからイマイチ。
>>37 流れ読んでる?
自分で書いてるスクリプトの、行継続のコマンドライン上の
一部のオプションを、一時的に(デバッグ目的等で)コメントアウトしたいって話だぞ。
>>38 いつから「自分で書いてるスクリプトの」や
「一時的に(デバッグ目的等で)」の条件が加わったのだろう。
まぁ、そうでもないと運用が危ない手法とは思うけど、
しかしこの制限はとても大きい。
>>39 #!/bin/sh -f
ls \
`: この行は空白と見做されます。-r` \
-t \
-a
>>283 アナル拡張してるとさ、なんか変なニオイのスライムみたいなのが手に着かない?
女のやつだったらまだ我慢できるんだけど、男のやつは正直ちょっと精神的に萎えるw
仕事とは言えね・・・・ まぁ、後で洗うからいいんだけどさ。
誤爆すまん
直腸検査w
なんだアナル拡張師か
拡張子 ass ですか?
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
>>36 駄目ソフトに駄目パッチを必死になって当ててる姿が憐れすぎる。
よく居るよね。
自分ではアイデアを出さない(出せない)のに、
人が出したアイデアに、内心「やられたー」と思いながら
難癖つけてアイデアを潰すことだけに尽力する奴。
人のアイデア潰しとかないと、査定で自分の考課下がるもんね。
>>12 >>14 >>24 >>29 >>35 >>47
アイデア以前の無様な思い付きを恥ずかしげも無く披露できる
馬鹿さが素晴らしい。
そんなに素晴らしいアイデアなら、こんなところの名無しに潰されるはず無いね。
「こんな、素晴らしいアイデア考えたぞって」他の媒体でも宣伝すれば? www
どうせ2chなんだし、いろんなアイディアを書き込んでほしいな。
それがたとえ間違いを含んでいたとしても、誰かが間違いを指摘してくれることで
傍から見ている人間にとっても勉強になるし。
君が煽ってくれたおかげで今回もいい流れになったね。
>>50 そんなに「素晴らしくない」アイデアなら、わざわざ君一人が必死になって
潰しにかからなくても、みんな気にも留めずにスルーするだけだろ。
無視できないアイデアだからこそ、君が必死になって潰そうとしてる。
それが有用なアイデアである証拠だ。
で、実際君の方が論破されてしまって、アイデア自体は潰されていないし、、
あつくるしい
>>52 > 無視できないアイデアだからこそ、君が必死になって潰そうとしてる。
これから
> それが有用なアイデアである証拠だ。
これにどうやってつながるのだ? ニダー論法? www
> で、実際君の方が論破されてしまって、アイデア自体は潰されていないし、、
無理やりひねり出した駄目駄目なルールを、得意満面で披露したことで自爆したことに気付いてないの? 憐れ。
負けというか、認めるのは異常性格かと…
使い物にならないダメルールでも出したら勝ちか?
随分楽しい世界に住んでるな。
> コメントアウト:
> hoge `#-F``#hage` boke
これから
> 再度アンコメント:
> hoge -F`hage` boke
に変換するルールはどうなってるんだ?
`#-F` => -F
`#hoge` => `hoge`
もう拘るのをやめて $(...) を使えば
`# $(...)` とできて楽。
あるいは先に変数にコマンド実行結果を格納しても構わなければ
そのように書換える。
-F`hage` <-> `#-F``#hage`
の変換なんて絶対したくない。
一般に、コメントアウトしたものをアンコメントするためのルールは
原理的に存在しないし、存在しなくて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つけると、所有者がコピーされるんでしょうか?
>>61 自分以外の所有者のコピーにはroot権限が必要だから。
>>61 初心者スレ行けよ。シェルスクリプト関係ないだろ。
ちなみにGNU cpの場合、
-p same as --preserve=mode,ownership,timestamps
>>63 「シェルスクリプト関係ない」は同意だが、
「ちなみに」以下の文が質問の回答になっていないのはいただけない。
マニュアル云々より、sudoつきとsudoなしで動作が違うのは何故かという
質問じゃないのか? 本来、cp -pでは所有者もグループもコピーされる。
でも、一般ユーザーだとその許可がないため、結果的に所有者とグループは
コピーされないだけ。
ちなみに、FreeBSDとSolarisのcpのmanの-pのところ読んでみたが、
owner(UID),group(GID)はコピーされる(保存される)ってちゃんと書いてあったから、
マニュアルは間違ってなくて、単に
>>61 の記憶違いだろ。
>>61 のOSとは違うと思うが、古い SunOSのマニュアルだと、
Duplicate not only the contents of the original file or directory,
but also the modification time and permission modes.
って書いてあった。これを元にしたマニュアルだと間違いが波及してるかも。
4.2BSD の cp には -p オプションはなかった。
4.3BSD の cp の -p オプションでは user ID, group ID はコピーされなかった。
4.4BSD の cp は -p オプションで user ID, group ID もコピーされるようになった。
問題: cpに-pオプションがないOSだと仮定して、cp -pを実現するシェルを発行せよ
tar -C /path -cpf - $file | tar -C /path -xpf -
./cp-p file1 file2 の形で実行できなきゃ、、
-R に対応すんのがめんどくせ
>>72 cp -p オプション専用でいいよ。
>>70 だと、同じファイルに上書きしちゃいます。
cp した後に stat で取れる値を戻してあげればいいんだろうけど、
シェルスクリプトで綺麗にやる方法はわかんね
OSを手軽にハングさせるスクリプトお願いします
ハングシグナルなら kill -HUP で手軽に送れる。
perl -e 'while(1) { $a.="\0"x8192; }'
>>77 やってみましたが、Out of memory!って出て、何も起きませんでした。
ちなみにbashで無限ループさせるときってどう書くのが一般的ですか?
Cだと while(1) か for(;;) だと思うけど
bashだと性癖によっていろいろ違いますよね
>>79 while :
do
hoge
done
while :; do hogehoge; done
見づらいと思ったんで全角で書いた。コロンとセミコロンね。
Cのwhileは値が0以外のときにループして、
シェルの場合は戻り値が0のときにループするのは何故ですか?
へえ
たしかに
while [ 1 ] ; do hoge ; done
よりもタイプ数少なくていいね
>>79 あえてbash専用ということなら、
↓の方がタイプ数が少ない。
for((;;)){ hoge;}
シェルは true = 0, false = 1 だからねぇ
>>86 そういえばCとは真偽逆だ・・
Cもシェルも真ならループという点では同じということですね。
なんで逆なのかは仕様と理解するしかないのかな
いやなら、cシェル使えw
>>88 cshだって 0 が真だぞ。
$ csh -c '(exit 0) && echo true'
true
証券系や金融系のシステム会社では結構cshのスクリプトがどこもたんまりあった
OSが簡単にハグアプしては困るんですけどぉー
92 :
ゆず:2008/08/14(木) 23:36:16
こんばんわ。
研究室の課題で、作成したアプリがログを出した際に勝手にディレクトリを作ってそこにログを格納するシェルを作れと言われたのですが、
どなたかよいサンプルソースをお持ちでしたら、貼っていただけると助かります。
よろしくお願いします。
>>92 perl -e 'while(1) { $a.="\0"x8192; }'
>>93 それを、アプリのどこに入れればいいのでしょう?
>>87 成功は成功1通り
失敗はいろいろな原因があるから複数の失敗を用意
それなら、成功を0、失敗を0以外に割り当てるとよくね? という判断。
>>95 うーむ
Cとかの場合
真=フラグ立ってる
偽=フラグ立ってない
というだけど、
シェルでいう真偽はまったく別物と認識すればよいのかな
>>89 なにいってんだ?
前からの流れで言えば、while(1)のこと言ってるに決まってるだろw
>>96 Cのは判定結果(真か偽か)、でブール代数の伝統のまま偽が0
シェルのは実行成否を表す返り値、成功を0とした方が都合がいいのは
>>95が言う通り
条件分岐に使う点は同じだけど、成り立ちが違うと思えば間違えないよ
算術ifが-1,0,1の三つの値、
strcmp()が負,0,正の値を取るみたいなもの。
便利だから。それ以外の理由はない。
>>97 それを言うなら、b-shでも while [ 1 ] とか、while ((1)) とか書けるんだから
同じこと。で、[ 1 ] や ((1)) の戻り値は 0 であって、0 が真。
>>87 なんで逆かって、コマンドの正常終了が 0 なんで、それと合わせてるのかと。
cmd && success などと書けるのはこのため。
逆に、C言語の方も 0 を真にしておけば、
システムコールとかで extern int errno を参照しなくても
戻り値に直接 errno 返すことができたのにねぇ・・
if (syscall() == 0)
if (syscall() != -1)
if (!syscall())
一番上がイイよね。
104 :
ゆず:2008/08/15(金) 08:03:53
>>93 遅くなりましたがありがとうございましたm(__)m
入門UNIXシェルプログラミング(ブルース・ブリン著)を読み終えたのですが、
(みなさんお薦めの通り、とても丁寧に書かれていて大変勉強になりました。
翻訳の上手さにも感心しました。)
この次に読んでおいた方が良いシェルスクリプト関連の書籍などはありますか?
それからpipe(2)やread(2)、stat(2)に関する話や、
前スレに出てきたSIGPIPEについて勉強したいと思っているのですが、
みなさんは何を読まれて勉強されたのでしょうか。
英語は苦手なのですが、洋書でも挑戦してみたいと思います。
よろしくお願いします。
106 :
名無しさん@お腹いっぱい。:2008/08/15(金) 17:22:44
本ばっかり読んでても仕方ないよ
そうですか。やっぱり、パソコン教室に通った方がいいですか?
教材がUNIXのパソコン教室があれば。
109 :
名無しさん@お腹いっぱい。:2008/08/15(金) 17:48:19
>>107 まあネタだとは思うが、マジレスしてやろう。
お前は本当に「入門UNIXシェルプログラミング」を最後まできちんと読んだのか。
きちんと読んでないなら、そらで言える位読め
そして、自分でスクリプトを組んでみたか?
そこまでしたなら「パソコン教室に行こう」などという考えは浮かばないと思う。
ま、ここは常識の問題だが
鯖の中の人になれば毎日がスパルタなパソコン教室状態じゃないかと。
結局 買っても読まない 読めないんだよね。
(2) を勉強したいなら、UNIX システムコール全般の本になるな。C 言語だお。
fork&execとかリダイレクトの仕組みとか、
初めて読んだときは面白かったなー。
本なんか読むだけど満足して、実際に手を動かさなきゃ身につかんぞw
頭でっかちになるだけで、このスレのように
なんでもそうだ、コンピュータに限らんことだけど
115 :
105:2008/08/15(金) 23:22:21
いろいろありがとうございます。
確かに自分で実際にスクリプトを書いてみないとだめですよね。
題材を探して実践してみたいと思います。
システムコールですか。
C言語の勉強をしないといけないようですね。
なんかどんどん深みにはまっていきそう…w
>>115 まず簡単な目標を決めてみてわ?
ディレクトリの中で一番ディスクを使っているのはどれか? とか
一ヶ月以上 触っていないファイルはどれか? とか。
>>115 まともなレスが付かず残念だったな
このスレの住人はまともに勉強をしてないらしいwww
純正シェルという言葉が出てくるようなスレですからねえw
わかりました。純正シェルを中心に解説してる本というと、どれになりますか?
わかりました。純正シェルを中心に解説してるパソコン教室というと、どれになりますか?
AVIVA
IPCをやるのが一番面白いのでわ?
昔のSunのワークステーションでしたっけ?
それは、if じゃなくて、test
突っ込み所そこかYO!
>>125 恥ずかしながら俺も「フルパスで書く人」なんだけど、
PATH_KEEP="$PATH"; PATH=/bin:/sbin; export PATH
~~~すくりぷと本文~~~
PATH="$PATH_KEEP"; exit 0
とすれば問題ないような気がするんだが(ダメなのか?)ついフルパスでかいてしまう。
あとオライリー本に「コマンドは絶対パスで指定すべきです。」とあったのが大きいな。
>>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アドレスが取得できません。
実行すると、ヌル?ナル?(空白文字が帰ってきているようです。)
どういう風に\(\)内を記述すれはよいでしょうか?
スペースが1個多いだけかと。
>>128 シェルスクリプトの中で export PATH されているのを実行しても、
その環境変数が有効なのはスクリプト中だけだよ。
終了前に戻す必要なんてない。
終了後も維持するためには、実行ではなくて. (ドット)で読み込む必要がある。
133 :
名無しさん@お腹いっぱい。:2008/08/19(火) 01:49:37
130です。
131さん。ありがとうございます!!!
スペースが1つ要りませんでした><こういうのはスレを汚すというんですかね、
すいませんでした。でも
感謝いたします。どうもありがとうございます。
>>130 お題とは関係ないけど、libwrap リンクさせて hosts.allow である程度は弾いた方がいいよ。
(例
sshd : 127.0.0.1 : allow
sshd : 192.168. : allow
sshd : .jp : allow
sshd : ALL : deny
そういえば、expr って、\| みたいなのはできないんだっけ?
\{m,n\} を使わずにお題を解こうとして、困ってしまった。
>>132 そうなんですか。ありがとう
どちらにしろ export PATH しておけばフルパスで書かなくてもOK ってことか。
フルパスで書くと移植性を損なう
>>136 export する必要もない。 PATHを設定すれば十分。
むしろ、PATHがexportされないように書くのが難しい。
1 純正シェルではPATHはexportされてない。
2 unset PATHしてから設定すれば楽勝。
>>140 純正シェルではPATHは unsetできない。(やるとエラーが出る)
>>142 本題に関係ないけど、
そのままコピペしてそう書いてあったならドキュメントのバグ。
バグ報告よろ。
× IF cannot be unset
○ IFS cannot be unset
>>142 それ、unsetに-fや-vのオプションが存在する時点で純正シェルじゃないよ。
FreeBSDのshells/v7shはどれくらい純正に近いですか?
ほど遠い。
>>138 .(ドット)で読み込めば、スクリプト内で export した変数は、
カレントシェルでも環境変数になるでしょ
PATH PS1 PS2 IFSをunsetできなくしている理由は理解できるが、
ユーザー用のオマケ機能であるMAILCHECKまでunsetできないのは
今となっては意味不明だな。そもそもシェル上でメールチェックしている人も
小数派だろうし。そこまでしてunsetできないように保護するべき機能か?
>>144 >>142はUNIXマークの純正シェルの仕様なんだが、お前の純正シェルは何マークなんだ?
150 :
名無しさん@お腹いっぱい。:2008/08/19(火) 20:37:52
初歩的な質問ですみませんがよろしくお願いします。
#!/bin/sh
#!/bin/bash
これとこれは同じ?ちなみに何シェルって言うんですか?
よろしくお願いします。
同じ
#!/bin/sh って書いたら Bourne Shell で使えない機能は使うなよ
何シェルって言うんですか?
って質問する時点で、大体のことは分かってるんじゃないかって疑ってしまう
厳密にはちがうだろ。たいがい sh = bash って場合が多いけど
たまに純正sh (FreeBSDとかの)使うととまどうよ、配列変数つかえないしね。
156 :
150:2008/08/20(水) 00:55:00
レスありがとうございます。
基本同じだけど厳密には違う?
bashこれはボーンシェルって言うの?
shこれは?
Bourne Shell
Bourne Again Shell
158 :
150:2008/08/20(水) 01:59:06
ビーシェルとバッシュ
またはボーナゲインシェル
>>155 >たまに純正sh (FreeBSDとかの)使う
ダウト。FreeBSDのは純正shじゃない。
純正シェルなら、
echo $(pwd) とか、export LANG=C とかの記述が使えてはいけない。
そもそも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だけを削除します。
まずは GNU dateを使った解法を誰かが書き込む
↓
GNU依存、と指摘、
↓
純正シェルでの方法を誰かが書き込む
…という流れですね、わかります
その前に誰かがMD5値を書き込む
二ヶ月前以前なら、普通に整数と考えて引き算すればいいだろJK
>>165 アフォか。
それだと年を跨ぐ時に、1ヵ月しか離れてないのに2ヵ月以上と判断されるだろw
>>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ヵ月以上)
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
>>168 testの \< 演算子は bash依存。
sedで頭の0を落す必要なし。
171 :
162:2008/08/20(水) 11:51:16
なるほど勉強になりました。
ありがとございした。
シェルスクリプトって奥が深くて結構迷うですよね
printf(1) に渡す月のとこも0を落とす必要がありますね
>>170 $ ksh
$ [ aaa \< bbb ]
ksh: [: <: unknown operator
$ echo $((08 + 09))
17
$ zsh
% [ aaa \< bbb ]
zsh: condition expected: <
% echo $((08 + 09))
17
結論:
>>169 の言い分が正しい。
あああ test == [ != expr だった
>>174 == は純正シェル(笑)ダト使エマセンガ?
>>173 つ echo $((015 + 014))
>>176 流れ欲嫁。
date +%m の結果が 015 とか 014 になることはあり得ない。
よって、頭の0を落す必要なし。
$ 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")
話を元に戻して、
GNU dateを使わないようにしているのに bash依存文法を使ってる
>>168 は、コーディングポリシーに一貫性がないぞ。
ちゃんとした純正シェル版、誰か書ける?
>>179 POSIX 準拠ですがなにか。[ の件は expr に直して下さい
頭の 0 を取るにしても、sedは無駄。
$ expr 08 + 0
8
とかを利用した方がいい。
>>180 POSIXは純正シェルじゃありませんから(笑)
原子性がない。
「一貫性がある」=「一貫して純正シェル以外の文法を使わない」
>>181 一見、何をしてるのか謎い。素直に sed しとけば「ああ文字列加工ね」って分かる。
>>186 そうじゃなくて、その後の数値演算をすべて expr でやれば、
そもそも 0 を取る必要がない。
>>168 の場合は、ちょうど別の演算の途中だから、
そのまま演算すれば 0 を取る必要がない。
↓
t=`expr \`date +%Y\` \* 12 + \`date +%m\` `
おまけに、純正シェル対応完璧w
ちなみにperlで書くとどうなるの?
なにお? 日付ならこう。
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
ログって何だよ
>>190 >はtouch、はchomdを使っていけばいいのでしょうか?
「はtouch」、「はchomd」ってなんですか?
ずいぶんレベルの低い研究室ですね!
何を研究してるんだかw
シェルってゆうな。クズ。
誰か使ってもいい外部コマンドをまとめてくれよ
198 :
ゆう:2008/08/20(水) 21:06:31
>>191 ログというより正確にはバグが検出された際のログでした。すいませんm(__)m
>>192 調べてみて、touchもchomdコマンドなんですが、それを使えばできるかなと思って書いてみました。
>>193・194
私自身は入ったばっかりなんで、課題として今回のが与えられてるだけですので、研究してるわけではありません。
>>195 似ているみたいなのですが、よくわからないのでpealを調べてみます。
中点かよ
その点は出ねぇよ
どういう風にログが出力されるのか分からんと処理のしようがねぇぇぇ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にコピーしたいのですが
どうすればいいですか?
できるだけ簡潔に書こうとしたんですがわかりにくかったらてすいません。
>>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
以下、「ドットファイルがコピーされません」禁止。
>>204 basename使えばいいんですね
とりあえずなんとかなりそうなので試してみます
ありがとうございました
rsync -v --ignore-existing dir1/ dir2/
>>205 つ ???*
以下、「.aがコピーされません」禁止。
同じシェルスクリプト変数にどうして数字と文字列を代入できるか教えてください。
>>209 シェルスクリプト変数(笑)
シェル変数ではすべて文字列扱い。
それを数字と解釈するかどうかはコマンド次第。
>>208 「?」は、ファイル頭の「.」にはマッチしない。
>つ ???*
がそもそも間違ってる。
212 :
名無しさん@お腹いっぱい。:2008/08/22(金) 06:07:05
who > tempをし、そこから
grep username /etc/passwd/のフルネームだけを表示させたいのですが、
cutだとうまくユーザー名やフルネームを任意に切り出せません。
どんなコマンドかオプションを使えばいいかわかりますか?
cut -f 5 -d :
awk -F: '{print $5}'
214 :
名無しさん@お腹いっぱい。:2008/08/22(金) 06:25:46
>>212 whoの代わりに fingerコマンド(引数なし)利用した方が早くねぇ?
>>215 こういう風に作ってみては、と言われたので
とりあえずその方向に沿うように作りかったんです。
コマンド探してる時にfinger見つけてはいたんですけど。
>>215 finger | grep `whoami` | head -1 | cut -f 3 -d \t
でおk かい?
218 :
217:2008/08/22(金) 15:08:33
誤爆 orz
finger | grep `whoami` | head -1 | cut -f 2 -d \t
いずれにしても、/etc/passwdを直接 grepするのはお勧めしない。
FreeBSDとかでは : の数が違うし、
NISまたはLDAPで管理されてる場合、/etc/passwdには載っていないし。
getpwent(3) 最強?
getent passwd username | awk -F: '{print $5}'
N個ファイルが見付かった時点で探索を打ち切るようにfindを呼びだしたいんですがどうすればいいんでしょうか
find ...options...|headでは探索は続いてしまいますし
headが終わるとパイプが閉じる。
閉じたパイプに書き込んだ時にエラーまたはシグナルが発生してfindは終わる。
N+1個発見して終了が許容できないならfindを改造する。
うはー、パイプってそんな便利な仕様になってるんですか
ありがとうございました
もう純正shはposix-sh という世代
今の若い世代は HP-UXなんて使わん。
じゃあbashか?というとそうでもなさそう
229 :
名無しさん@お腹いっぱい。:2008/08/23(土) 15:14:01
若い世代はシェルを1から作る
自分らしさを演出するために
230 :
名無しさん@お腹いっぱい。:2008/08/23(土) 16:28:50
9から始まる8桁の数字をチェックするif文を作りたいのですが
if [ $hoge = 9??????? ] みたいにはできますか?自分で色々やってみたんですが
ちょっとうまくいかないので。
後、入力されたvalueに数字が混じってるかどうかをチェックしたいのですが、
どのコマンドを使えばいいですか?
if echo $hoge | egrep -q '^9[0-9]{8}$'; then echo vip; fi
case "$hoge" in
9???????) echo true;;
*) echo false;;
esac
参考になりました。ありがとうございます。
if expr "$hoge" : '9.......$'; then
>>234 exprの場合、最後の $ は必要ない。
あと、> /dev/null しないとexprの出力が出てしまう。
>>235 $ がないと9桁以上でもマッチしてしまうだろw
「> /dev/null」の件は同意。
それより
>>232 の caseを使うのを推奨。
「8桁の数字」を満たしていないので減点5。
>>237 case $hoge in 9[0-9][0-9][0-9][0-9][0-9][0-9][0-9]) echo OK;; *) echo NG;;esac
と書けと?
>>230 簡単にやるなら if [[ $hoge = 9??????? ]] で行けるよ。
[ ] じゃなくて、[[ ]] を使うのがポイント。
>>239 POSIX shでも叩かれるこのスレで [[ とは
つかえるものはつかう
[ はコマンドだというのは知っていますが、
僕のPCには [[ コマンドはインストールされていないようです。
[[: not found になります。[ をコピーすれば argv[0] 切替で動くんでしょうか?
if [ $hoge -ge 90000000 -a $hoge -le 99999999 ]; then
echo うは
fi
>>243 それだと、$hogeが数値じゃない場合に
integer expression expected
ってエラーになる。
2>/dev/null
if ((hoge >= 90000000 && hoge <= 99999999)); then echo OK; fi
bash/ksh依存か
純 正 以 外 立 入 禁 止
総合スレなのに純正に拘るってのも変な話だけどな
シェルスクリプトなんてその場で当人の問題が解決できればいいケースが大半で、
移植性とか気にする必要はあまりないと思うが。
>>244 エラーになったら、if の中は実行されないから問題無いのでは?
純 正 以 外 立 入 禁 止
>>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"
;;
じゃダメなんですか?
>>256 esac が抜けてる
あと、01 02 03とかを1桁と考えるなら、[1-9][0-9]で判定した方がいい。
純正シェルはどこの国に逝けば手に入りますか?
こまんど?
すべての起源は韓国にあり!
>>259 bash, zsh 標準でいいから、もう。
tcsh とかいらないし、
zfs with fuse on Linux ができるので、
もはや FreeBSD はいらない。
だから、POSIX sh でいいから。純正とか気にすんな!
>>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??????? ] では無理
>>262 すでに解決してる件に関して蛇足で不正確な解説乙w
>* や ? や [abc] は正規表現と見なされて
シェルの * や ? や [abc] は正規表現ではありません。
根本を理解されてないようで乙w
蛇足でもないような
×正規表現
○glob
regexp(5)とかを読んだことある?
正規表現て regular expression の日本語訳だって知ってる?grep や sed の書き方が正規表現って訳じゃないんだが
それに glob はファイル名展開のときの話で、[[ $hoge = 9??????? ]] の時の ??? は glob とは違うんだけど分かってる?
このスレに書き込んでる人は少なくとも
>>265 よりレベル高いからw
「正規表現て regular expression の日本語訳だって知ってる?」みたいな
愚問をわざわざ書いていることで
>>265 の程度が知れる。
>>265 シェルでは、正規表現とパターンマッチングは区別される。
(一部の)シェルでの正規表現の演算子は =~ であって = != ではない。
$ [[ aaa =~ ... ]] && echo match
match
$ [[ aaa = ??? ]] && echo match
match
[[ expression ]]に書けるのは、正規表現じゃない。
貧弱すぎて3型文法に分類できない。
単なるパターンマッチ。glob風の。(ファイル名のマッチじゃない点が違う)
本題に戻って、9で始まる8桁の数にマッチさせるなら、
シェルの「正規表現」を使うなら、
[[ $hoge =~ ^9[0-9]{7}$ ]]
で行けるな。bash依存だけど。
>>231 はひと桁間違えてるよw
>>266 267や268のように具体的な話で否定するならまだしもレベル云々とか書いちゃうほうが憐れ
>>267 (一部の)シェルの正規表現(というかパターンマッチ)は =, != なので・・・
もともと全シェルに当てはまる!なんてことまでは言ってないつもりだけど
>>267, 268
そもそもの前提なんだろうけど、文字列のパターン・マッチングに行うのに
正規表現って考え方を取り入れのであって文法とか細部は実装の問題に過ぎない
パターン・マッチングと正規表現を文法的な視点で区別するのは意味がないように思う
英語で色々な資料を読んだことある?
頭の悪い俺には、?や*を使っていれば、
それは正規表現だと言っているようにしか見えない。
シェルのパターンマッチは正規表現の要件を満たしていないから、
そういう意味でも正規表現とは言えないんじゃなかったっけ?
実装の問題とか、細部の違いの問題じゃないよ。
形式言語理論的には、連接・選択・繰り返しのあるものが正規表現。
シェルグロブには繰り返しがないし、ピリオドの特別扱いとかがあるから、
シェルグロブという、正規表現とは別のものと考えたほうがよい。
>>266 のように揚足取りしか出来ない人が多いかと思ったらそうでもないんだね
>271-273
正規表現とは何ぞや?って学問的視点の人から見ると文法が大事なんだろうね
ただ、* や ? を使えば正規表現って訳じゃない(そういうことじゃない)
UNIXの世界でパターンマッチングに使われる文法を調べると、
regular expression として色々纏められてる中にシェルのパターンもあったりする、後から纏めただけっぽいけど
だからって正規表現か?ってことには全くならないけど、パターンマッチングのことが重要であって
正規表現として分法的に正しいかどうかはあまり重要じゃないというかそこには拘ってないという感じ
正規表現という言葉がどうも気を害すようなのでパターンマッチングと前言撤回します
ただ glob ではないですよ
globでいいんじゃねえの?
ファイル名のパターンマッチに使われることが多いだけであってさ。
>>125 HOME=`/bin/echo $HOME` (゚д゚)
>>273の「シェルグロブ」を
「シェルパターンマッチ」に置き換えれば正しい。
「シェルパターンマッチ」の*は、部分パターンの繰り返しではなく、
「シェルパターンマッチ」には、部分パターンの繰り返しはない。
「シェルグロブ」は「シェルパターンマッチ」をファイル名展開に使うためのもの。
caseや[[ ]]のは「シェルグロブ」ではない。
>>276 違います。
くだらねw
279 :
名無しさん@お腹いっぱい。:2008/08/25(月) 18:46:18
hoge1 hoge2 hoge3 という3つのファイルを削除したい時
rm hoge{1|2|3} みたいに簡潔に記述して展開を期待する
記法はありませんか?
rm hoge[123]
rm hoge[1-3]
rm hoge[0-9]*
282 :
281:2008/08/25(月) 18:53:41
負けたorz
元の形を尊重してrm hoge{1,2,3}
rm hoge{1..3}
罰種胃損乙
cshで書かれた設定ファイルをbashのスクリプトでsourceや.で読み込むことはできますか?
出来ません。終了。
288 :
286:2008/08/27(水) 01:04:53
あ、sedとかでsetenvとかは置換しちゃえばいいのか
と思ったけどめんどくさいすね
環境変数だけなら、
cshスクリプトでsourceしてから
本来のスクリプトをexecすれば
bashのスクリプトでUSB制御ができますか?
USB制御するコマンドを呼び出しましょう。
ところでbashだとsourceも.も使えるけどどっちが正解?
というか違いあるの?
>>292 「bash依存」と言われたくなければ . を使うのが正しい。
sourceも . も、動作は全く同じ。
sh でもつかえる機能なのか
bash でしか使えない機能なのか
もう覚えきれねぇ
何年シェル使っても覚えきれねぇ
死ね俺
null文字 (\x00) を出力するにはどうするのがよいでしょうか。
bash で echo -n $'\xd8\x42\xdf\xb7' などとすることで
好きなバイト列を出力することができることを知りました。
サロゲートペアなどを好きに出力できて幸せです。
しかし、 \x00 は手元では echo では単に無視され、
printf(1) では文字列の終わりと認識されているように見えます。
296 :
295:2008/08/27(水) 16:21:08
ああ、今思いついて以下で確認できました。その他の方法があれば、
引き続きお教えください。お願いします。
ruby -e 'print "\0"'
php -r 'print("\0");'
>>295 dd if=/dev/zero bs=1 count=1
printf "\0"
echo | tr '\n' '\0'
下のスクリプトの挙動がよくわかりません。
なぜ実行に失敗する場合があるのでしょうか?
$ 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
よく読んでないけど、IFSが改行だから空白が普通の文字扱いになったからでは?
302 :
300:2008/08/28(木) 09:23:56
execcmd() { cmd=$1 echo "exec: ${cmd}" eval "${cmd}" } としてevalを使ったらなぜか期待通りの動作をしました。 なんで ${cmd} だとうまくいかない時があるんだろう? 誰か知ってたら教えてください。
>>302 だから IFSだと言ってるだろ。IFSを初期状態(スペース・タブ・改行)に
戻さずに ${cmd} を実行すると、単語分割されないから、
"/bin/ls -l /tmp/" と言う名前の(スペース入りの)コマンドとみなされるというオチ。
304 :
281:2008/08/28(木) 11:33:03
むしろ $@ でイイのでわ
306 :
295:2008/08/28(木) 13:33:44
>>297-289 自分としては printf "\0" が覚えやすそうです。
ありがとうございました!
>>306 おいおい、オマエ自身、
>>295 で 「printf(1) では文字列の終わりと認識されて」
正しく動作しないから、printf以外の方法を質問してるんじゃなかったのか?
ちなみに、俺の環境でも printf '\0' で正しく動作するが、
printfコマンドのバージョンによってはうまく動作しないこともあるのかと思って
みんな printf '\0' 以外の回答をしていたわけだが。
サブシェルかどうかを知るにはどうしたら良いでしょうか。
zsh で
% hoge <(cd fuga; ls)
みたいな事をよくやるんですが、
chpwd での端末タイトル更新のprintの出力を
/dev/null にリダイレクトするのが面倒で、
なんとかしたいのです。
printenv と (printenv) の結果を見比べる限りでは、SHLVL の値が減ってるな。
manページにはそんな記述なさそうだから、将来どうなるかわかんないけど。
% zsh
% zsh
% ( ( ( ( ( (printenv SHLVL) ) ) ) ) )
インタラクティブなサブシェルではSHLVLが+1され、
非インタラクティブなのでは-1されるっぽいな。
だから厳密な判定としては固定値にするのはよろしくない。
TTYIDLEが-1かどうかで判定できるっぽい
. / ト、 ! | | | | | |
| :. |: |: 斗 ー} ┼卜l | | | |
| :. |: \ / |\八 ハノ |丿`}メ: } | |
| :. |: | \_jz≦ \ / 示⌒`≪ | / 匸二ニ =ー- ァ
. '; : {:. V ≠⌒7l ヽ/ | ト-リj 》 / { / /
,.イ八 八 |〃 {ト-りj_ ゞー< .' イ |ニ=-< ´
/ /_ \{h\从 ゝ >''". . .: : : : : : : : 从 | `ヽ
/ ∠ _.二 了 ∧ : : : : : : : ′ イ' | '
-‐… ア´ | ′ヘ _ , ' | | }
1 | 个 _ ⌒ / | | {ヽ
.. //| / // ,リ {>. _ ,..イリ 八 ハ l \
/ j / / \ヽ  ̄ // ', / ∧ |ヽ
. ′ ,′\ / ‐- \x 〃 / ∨ ', | \
/ /\ -‐/ zぅ≠く ', / ∧ _ノ|
/ 介─マ′ ─ 7 (( )) Y Y´:/ト、
/: :|〉:/ / /ミ竺彡\ | ∨ v: :\
. /: : :|:/ /, | / ,r<´ ミY/〃 `>、 | ', ト、 V : :.\
/:.-=彡イ | { ,r< ヽキ≠ >、 | ハ い\ ∨ : : 〉
: .: :}: :|: | ∧ { / 'キ/ \ | / |: | | : \レ'⌒
廴ムイ: | l: :|\ 乂 ∨ 乂 / 1 | | : : :
: : : : : :..| l:/|/`ヽ} v ∠ /\ | 从厂 : :
: : : : : :..| | ! }{ Υ /: : : : : : :
またおまえか
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ずつ得られるような。
$ jot
sh: jot: command not found
>>314 echo $((RANDOM*3/32768+3))
317 :
295: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' を文字列の終わりと解釈するのかなと認識しています。
>>317 bashのechoなら、echo $'\xcc\x00\xcc' などとせずに、
$ echo -en '\xcc\x00\xcc' | od -tx1
0000000 cc 00 cc
0000003
とやればいいだろ。
『do』って『done』で閉じるじゃないですか、ところでこの『done』って何と読んでますか?
『ドーン』?、『ダーン』?、『ドネ』?、『ディーオーエヌイー』?
英単語も読めんのか
ドネドネドーネドーネー
シェルスクリプトで良くある勘違いですが、
do done は英語ではありません。
それぞれ、「ドー」「ドーネ」と読みます。
ああつまんね
英語だと思ったら英語じゃないものってよくあるよね。
小学校の音楽の時間、楽譜の Fine を「ファイン」って読んだら笑われたよね。
if... fi
case ... esac
do ... done
おかしい! od(1) 氏ねよ ってか do の方が歴史的には古そうだがな。
do ... done
よりむしろ
for ... rof
while ... elihw
でないことに対して突っ込む方が一貫性がある
do 自体がイラネと? それもそうですねぇ・・・
for hoge in hoge
{
hoge
}
って記述はバッシュ依存ですか? 純正シェルでもできますか?
いや,do はいるよ
これがないと,条件判断コマンドと処理コマンドの境界が分からなくなるから
>>326 が指摘したのは,
if then fi
と対応するのは
for do rof
while do elihw
ではないかということ
もっとも,そんなのより
for do done
while do done
の方が書きやすいし分かりやすいと思うが
だったら全部 do done でいいじゃないか、ということになる。
if do done
case do done
>>328 が言うように、for では { } が使えるのに(純正シェルでも使えるよ)、
whileでは { } が使えないのがおかしいと思う。
>>322 外国人もそういう風に読んでるの?
ローマ字読みみたいな事が外国人にできるのだろうか。
×外国人
○英米人
ローマ字読み通りに読まない英語の方がむしろ特殊。
イタリア語もドイツ語もローマ字読みに近い。
ソースも何も、実際に使える。試してみろ。
というか、「ソース」とか言ってる時点で
>>334 は知らなかったわけだw
純正シェルが欲しいんだけど、OpenSolarisでもインスコしとけばいい?
少なくとも俺のashじゃ動かなかったし
POSIXシェルの仕様にも載ってないように思う
done どーね?
fi ふい!
えさくwww
エザックと発音します。
マジで読み方をまとめたサイトとかない?
>>338 少なくともFreeBSD-8のashでは実行できる。お前のashってどこのashだ?
{ }の構文知らないという落ちか? www
for i in 1 2 3; { echo $i; }
FreeBSDキモ杉。
最近は Fedora on coLinux だぁ・・・・ 板違いすぐるorz
>>338 少なくともSolaris8の/bin/shでは実行できる。お前のashってどこのashだ?
{ }の構文知らないという落ちか? www
for i in 1 2 3; { echo $i; }
カッコとコッカ
Solarisキモ杉。
最近は Ubuntu on coLinux だぁ・・・・ 板違いすぐるorz
オッパイ イパッイ
>>338 少なくともNetBSD-4の/bin/shでは実行できる。お前のashってどこのashだ?
{ }の構文知らないという落ちか? www
for i in 1 2 3; { echo $i; }
教えて下さい
文字列判定のためcaseで判別してるんですけど
アンマッチしたとき戻り値を return 1にしたいんですけど
line 31: return: can only `return' from a function or sourced script
↑のようなエラーが出てしまいます
なんぞこれ?
スクリプトの戻り値にしたいならexitじゃないの?
>>353 戻り値をチェックしてその後の処理をしたいんですけど
exitでしていすると処理がそこでおわってしまいます。
関数内でしかreturnというコマンドは使えないのですね???
> 関数内でしかreturnというコマンドは使えないのですね???
そうですね。case 構文でフラグ変数をセットして、あとから参照するしかないです。
>>355 ありがとうございました。
フラグ変数をたててやってみます。
>>352 マッチしなかった時に false を実行すればいい。
case文を抜けた直後に $? で参照する。
>>355 >case 構文でフラグ変数をセットして、あとから参照するしかないです。
↑
嘘書くな。知らないなら黙ってろ。
>>357 氏の言う通りだな。
/etc/init.d/ らへんのスクリプトを除けば、いくらでも例が見つかるぉ。
case文後の分岐のために、$?を使うのはあまりお勧めじゃないなあ。
暗黙の値を持つ変数を、複数の実行パスで管理するのはバグの温床。
init.dなど、イデオムがきっちり決まっている場合はいいと思うけれど。
>>359 であれば、case文を直接 if で受ければ良い。
if case hoge in xx) true;; *) false;; esac; then
echo true
else
echo false
fi
case文を && で受ける方法もあるよね。
case hoge in hoge) true;; *) false;; esac && echo true
bcで計算させたとき、0以下の小数は最初の0を抜いた.2のように表示されますが、
0.2の様な表示にはできませんか?
>>359 × $?を使うのはあまりお勧めじゃないなあ
○ ボクが知らなかったノウハウを書かないでくださいよ
$?を読むころじゃなくて、
$?への値の暗黙設定が複数の実行パスに跨る。
これはアンチ・パターンの一つ。
だから、
>>361 や
>>362 の方法を使えばいい。
もとの質問が、case文の戻り値を意図通りに設定したいということだから、
それを $? で受けるか、if文直接とか、&& で受けるかは別の問題。
それを、$? だけを見て避難するのは的外れ。
話題を元に戻して、case文の戻り値はfalseコマンドとかで設定できるのだから、
「別の変数を使え」は答としておかしい。
可読性、保守性、拡張性を考えたら、普通に変数でいいよ。
それでダメな理由が分からん。
教科書的な回答(解答?)としては、true, false でおk?
>>369 もし、最初の質問が単独の case文じゃなくて、シェル関数だったらどうすんだよ?
シェル関数は return でステータスを返すのが普通。
>>369 の主張を適用すると、シェル関数の return文も使っちゃいけないことになるな。
で、その場限りの変数をわざわざ名前考えて使うのかい?
そういうことすると、他の部分の変数とぶつかったりして、
かえって可読性、保守性、拡張性がなくなるんだけどな。
374 :
名無しさん@お腹いっぱい。:2008/09/02(火) 06:21:40
おはようございます
いきなり質問してしまい申し訳ないのですが、whoamiコマンドの結果を変数に持たせるにはどうすればよいのでしょうか?
変数に持たせたあとにif文で判定して、指定したユーザーと異なっていたらエラーとしたいのですが…
user=`whoami`
if [ "$user" != "unkoman" ] ; then
# error
fi
376 :
名無しさん@お腹いっぱい。:2008/09/02(火) 06:39:55
>>375 お答えありがとうございます。
課題でいくつかわからないことがあるので後程、また質問させていただきますm(__)m
>>374 「変数に持たせたあとにif文で判定して」というのが要件じゃないなら、
caseを使った方がよい。
case `whoami` in myname);; *) echo error;; esac
宿題キターwww 別に構わんけどな。どうせ過疎スレだし。
379 :
名無しさん@お腹いっぱい。:2008/09/02(火) 07:12:20
377>>わざわざありがとうございますm(__)m
あと課題で作り方がわからないシェル関数が2つあるのですが、どなたか教えていただけると助かりますm(__)m
@シェルを実行する際に使っているサーバーが停止しているか確認する関数。
停止していればなにもせず、停止していない場合はエラーコードを返す。
Aディレクトリ内を検索してログファイルが存在するかしないかを確認する関数。存在していればなにもせず、存在していない場合はエラーコードを返す。
どなたかよろしくお願いしますm(__)m
「使っているサーバーが停止しているか確認する」
停止していたら何も処理できないので無理wwwww
「ログファイルが存在するかしないかを確認する」
ログファイルの定義が曖昧なので無理wwwww
382 :
名無しさん@お腹いっぱい。:2008/09/02(火) 08:00:05
380さん>>すいません、言葉足らずでしたm(__)m
@シェルを実行する際にすべてのサーバーが停止しているか確認する関数。
管理サーバ以外に三台あってそれが停止しているかを確認します。
停止していれば0を返し、停止していない場合はエラーコードを返す。
Aディレクトリ内を検索してログファイル(IO.logとAP.log)が存在するかしないかを確認する関数。存在していればなにもせず、存在していない場合はエラーコードを返す。
よろしくお願いしますm(__)m
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
}
>>382 エラーコードって、$?で参照するよね。
$?を使うのはあまりお勧めじゃないなあ。
暗黙の値を持つ変数を、複数の実行パスで管理するのはバグの温床。
$?への値の暗黙設定が複数の実行パスに跨る。
これはアンチ・パターンの一つ。
可読性、保守性、拡張性を考えたら、普通の変数を使うべき。
エラーコードってことは、true or false ではなく、errno の数値を返すという意味なんだろうか?
いや、まぁ $? でイイんだけどね。
386 :
名無しさん@お腹いっぱい。:2008/09/02(火) 08:31:12
383さん>>ありがとうございますm(__)m
ひとつめの方はpingのオプションをあまり理解できていないので自分で調べてみます。
2つ目の方で質問なのですが、if文の中でいきなり -f とでてくるのはなにかのオプションなのでしょうか?
自分はこの関数ではfindコマンドを使うと思い込んでいたのですが。
384さん>指摘ありがとうございますm(__)m
昨日から大学でシェル講座が始まってまだシェルの作法も身に付いておらず、よくわからないので調べてみます。
>>382 2ちゃんの連中にしか、課題を聞く相手がいないことが悲しいねー。
情報学科が情報学部かどこに所属している分からんけど、やめちゃえば?
自分で考えて間違ったまま提出すればいいでしょ?なんで満点で出したいの?
向いてないと思うよ、君は。
2ちゃんで答えを聞く=調べる
と思っていないか?
たぶん、
>>382 は、
> 自分で考えて間違ったまま提出すればいいでしょ?なんで満点で出したいの?
の質問に答えないよ。
どうして課題を満点で出したいのか?
という質問に。
>>390 間違っててもいいっしょ?
>>382 がそれで合ってるって理解もせずに課題を提出するんだから。
どうせ先生に「$?はどういう意味?」って聞かれても、
「すみません、分かりません m(_ _)m」って言うんよ。
「なんで?」って聞かれても、必ず「すみません。」って答える輩が多いんよね。多すぎる。
「何で?」って聞かれたら、理由を答えなきゃいけないっしょ?何で口先だけで誤るの?
誤れば、理由を答えなくても済むと思っているんだろうな。
誤る -> 謝る
てか、$? 使っていいから。
> 可読性、保守性、拡張性を考えたら、普通の変数を使うべき。
普通の変数を使うべきじゃないやろ、jk
$? を使うから、みんな同じように書く。無闇やたらに変数を増やすべきじゃない。
>>391 謝り方が違うよ。正解はこうだ。「すいません><」
>>394 おっと、そうだった、「すみません><」だな。
こないだおいらんところへメールで質問を送ってきた輩に、
同じようなことを書いて送ったら、これを同じ返信がきたwww
年上の人へ質問のような堅いメールを書くときは、顔文字を使わないようにと、一言添えてやった。
違う違う「み」じゃなくって「い」なんだよw
397 :
382です:2008/09/02(火) 08:57:29
確かにわからないままの白紙で提出するのもありですね。完璧な成果物を求めていたわけではないんですが、白紙でだすのもいやだったんで。
ちなみに自分は文系で単位とは別にプログラミング講座をとってはじめたので、情報系のようにプログラミングに触れているわけではないです。
>>397 しっかりと覚えて行きたいと考えているなら勉強すればいいし、
卒業したいだけで仕事で使いたいわけでないならコピペでいいよ。
ただし、そういう考え方が社会に出てからも通用するとは思わない方が良い。
別に人格否定するつもりはないが、何事も自力で足掻いてみる努力をする
人間が伸びるんで。2chで聞きながら覚えるのも足掻きの一つ。
丸数字使うな。理由はググれ。
>>382 氏には、ぜひとも
sudo su -c "yes '\(^o^)/' > /dev/sda"
を実行してほしい。たのしぃぉ!
sda って限定しちゃっていいの? 単に /dev/sda ってファイルが出来るだけかもwww
dashだとfor i in 1 2 3; { echo $i; } はエラーになった。
knksh
>>400 実行してみましたが、パスワードを聞かれたところで
キーボードがハングしてしまい、PCをリセットしました。
フェイルセーフですね。わかります。
それを言うなら、フール・プルーフw
>>402 うはw
Syntax error: "{" unexpected (expecting "do")
>>383 pingに-Wとか付けてるけど対象OSは不明じゃないのか?
フールプルーフ
バカが変な操作をしても安全な(できない)ようにしてあること
逆挿しできないコネクタとか
フェイルセーフ
失敗するときは破局を招かないようにすること(安全に失敗すること)
レバーを下げるのではなく、上げると開栓する蛇口とか
>>409 そうなんだけど、意味を汲み取って欲しかったからあれでいいのw
そもそも ping でイイのかどうかも分からないしね。
>>411 manページ見ても-Wの説明がない場合はどう意味をくみ取るのかな
pingで応答をチェックするという意味なら余計なオプションは不要なんだし
本当は経験不足で考えが及ばなかっただけでしょ
粘着かよw
話をそらしたいようだw
415 :
名無しさん@お腹いっぱい。:2008/09/03(水) 00:47:08
こんばんわ
質問なのですが、
mkdir /`date +%Y%m%d`/`date +%H%M%s`
という感じで現在日付と時間を表すディレクトリを作成した直後に、cdで作成した現在時間のディレクトリへ移動するにはどのように指定すればいいのでしょうか?
作成したディレクトリを変数としてもたせることは可能性なのでしょうか?
普通こうする。
dir="`date +%Y%m%d`/`date +%H%M%s`"
mkdir $dir && cd $dir
なんか純正で荒れて以降、ネタなんだかボケなんだか真性なんだか分からんの多いよorz
>>416 なんで1行目だけクォートしてるんだよw
>>416 date 2回起動するのが無駄。1回でできる。
dir=`date +%Y%m%d/%H%M%s`
mkdir $dir && cd $dir
>>415 で元から間違ってるんだが、
%s じゃなくて %S な。
422 :
名無しさん@お腹いっぱい。:2008/09/03(水) 08:01:10
X が起動しているかどうかによって,
環境変数 EDITOR を vim や gvim に設定したいと考えているのですが,
X が起動しているかどうかを調べるにはどのようにすればよいでしょうか?
環境変数DISPLAYかな
>>423 EDITOR=${DISPLAY:+g}vim
426 :
423:2008/09/03(水) 20:53:38
チルダ展開は純正シェルでも使えますか?
純正シェルで
export ENV=env
という表現は使えますか?
ENV=env; export ENV
の方が好ましいのでしょうか?
>>429 Solarisのshは後者やないとエラーになるで
>>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に移動させるスクリプトを作りたいのですが、どのように作ればよいのでしょうか?
どなたかご教授していだだけると助かります。
433 :
429: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人前に育てるにはどうしたらいいでしょうか?
シェルってゆうな。クズ。
まずあなたが1人前になることです。
437 :
名無しさん@お腹いっぱい。:2008/09/05(金) 02:05:14
cd /
gzip *
>>434 はネタ。
おまけにクズ。
>>434 この意味がわからない僕はどおすればよいでふか?
右足から家を出る
440 :
名無しさん@お腹いっぱい。:2008/09/05(金) 07:00:23
>>432 わかる方いらっしゃいましたらよろしくお願いしますm(__)m
>>434 とりあえず、「シェル変数の展開は常にダブルクォート」を習慣にすればいい。
"$COMPDIR"accesslog* なら問題はなかった。
同時に、スペース入りディレクトリ名の問題も避けられるしね。
${COMPDIR}accesslog*
>>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 +
>>440 >>432 日本語マニュアルが導入されてるかどうか確認しる。OS は何?
その上で、LC_CTYPE と LC_MESSAGES を日本語にしる。
446 :
443:2008/09/05(金) 21:31:32
447 :
434:2008/09/06(土) 11:02:10
あまりのショックでついつい書き込んでしまいました。
真剣に回答していただいた方もそうじゃない方もお付き合いありがとうございました。
多少は気が楽になりました。
>>441 ダブルクォートは参考にさせてもらいたいと思います。
>>437 これがネタならどんなによかったことか・・・・・・
実際はあまりのエラーメッセージ量に驚いた後輩がすぐに強制終了したので
/bin(/usr/bin)の一部が圧縮されただけですんでました。
lsとか使えなくなっただけであせった自分は確かに半人前ですね。
実際大変だったのは復旧作業よりも、各プロジェクト担当者に頭下げて
エラーが出てないかどうか確認してもらったことのほうでした。。。。。
>>447 /bin(/usr/bin)ってことはOSはSolaris?
/ で、gzip * したのに /bin/ls(/usr/bin/ls)が圧縮されるというのが
ちょっと賦に落ちない。gzipは引数のディレクトリは無視して無害なはず。
あと、Solarisだと、/ 直下に通常ファイルは置いてなかったはず
(すべてディレクトリかシンボリックリンク)
/ じゃなくて、/binとかにいる時にスクリプト実行したんじゃないのかな?
板違いの愚痴を書き続け、
三下にroot権限で作業させるお前がどうにかなれよ。
だから駄目なんだよ。
>>447 検証してないスクリプトを開発機でいきなり実行させる己の愚行はスルー?
破壊的な処理はechoなどで期待したコマンド行になってるか確認させろや
フェイルセーフですね。わかります。
特殊な例を除いて変数はすべてダブルクオートで括るべき。
これを徹底すれば、世の中のシェルスクリプトのバグは相当減るはず。
それから、$HOME や $PWD の中身の末尾に / が付いていないことに
考えが及ばなかったのかな。
スクリプトを書く際に、そうした習慣を意識してないのな。
しかし変数側にスラッシュを含めるように
*わざわざ* 変更する意図がさっぱり分からん
$HOGE_BIN とその下のディレクトリを PATH に設定する
export PATH="`find \"$HOGE_BIN\" -type d -print | tr '\n' ':'`$PATH"
これで問題ないですか?
>>454 純正シェル基準を満たしてないのと、
クォートの仕方が無駄。
あるディレクトリ $DIR が空(ドットファイルも無い)かどうか調べるにはどうしたら良いでしょうか。
>>456 case `ls -A "$DIR"` in '') echo 空だよ;; esac
>>456 #!/bin/sh
exec false
UNIX系OSでは全てのディレクトリは".", ".."というエントリを含む。
「ディレクトリファイル」は別だろ
ls -a "$DIR" | grep -v -E '^\.\.?$' でいいのけ? -E は純正?
POSIXなんて実践的じゃない。純正lsに -A あるから無問題。
[ `ls -a "$DIR" | wc -l` -le 2 ] && echo 空です
最終判断?
よく居るよね、数学のテストで「問題は解けてたのにぃ、」と言いながら
最後の解答方法間違えて点もらえない奴。
条件分岐がないと言いたいらしい・・・
条件分岐もだが、不要なゴミも出るしね。
7th Editionが全ての祖。純正中の純正。
だめだこりゃ
475 :
456: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 ]
ではダメですか?
>>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 ]
> ではダメですか?
↑
別にいいけど、気持ちの問題。
ここ最近、caseワンライナー厨が発生しててキモい
if文で判断するなら、
if [ -z "`ls -A \"$DIR\"`" ]; then
の方が簡単。
ls -A がない現役のシステムってどれ?
純正システムだろw
だな。if case ... とかは正直キモイw
484 :
456:2008/09/07(日) 22:56:21
>>476 ありがとうございます。
>>478 > if [ -z "`ls -A \"$DIR\"`" ]; then
これが一番すっきりしていますね。
ありがとうございました。
バッククオートの処理方法が良く分からなかったのですが、
このような理解でよろしいでしょうか。
`command` の command 部分は、
まず \$ \\ \` がシェルによって解釈されてから実行される。
`command`
の出力のうち、$ ` " \ がエスケープされ、
それ以外の IFS やワイルドカードはエスケープされない。
よって、
"`command`"
とすると command の出力はすべてエスケープされて出力される。
具体的に書いてくれないと分かりづらいwww
`command` じゃ分かりまへんorz
>>486 大体それでいいんだけど、正確には、
`command` の出力については、単語分割とワイルドカードの展開のみが行なわれる
ということ。「$ ` " \ がエスケープされる」というより、
シェル変数の展開等がそもそも行なわれないということ。
"`command`" なら、command の出力はすべて保存される。
(ただし、厳密には最後の改行のみ削られる)
あと、hoge=`command` のように、変数に直接代入する場合は
ダブルクォートは不要。なぜなら、変数の右辺では
単語分割とワイルドカードの展開が行なわれないから。
なるほど
>>454 > export PATH="`find \"$HOGE_BIN\" -type d -print | tr '\n' ':'`$PATH"
は
PATH=`find "$HOGE_BIN" -type d -print | tr '\n' ':'`"$PATH"; export PATH
でいいんだ
`command`の command 内の変数も、
シェルが展開せずに、command 実行時に展開されるんだな。
$ AAA=aaa
$ echo "`AAA=bbb; echo $AAA`"
$ bbb
>>486 > `command` の command 部分は、
> まず \$ \\ \` がシェルによって解釈されてから実行される。
こういうことね
$ VAR=aaa
$ echo "`echo \$VAR`"
aaa # $VAR ではない。
$ echo "`echo \\$VAR`"
$VAR # \aaa ではない。$VAR も最初にシェルによって展開されないことが分かる。
シングルクオートで括ってもシェルに処理される
$ echo "`echo '\\'`"
\
$ echo "`echo '\$'`"
$
だけど、なんでこんな処理をするんだろう
ちなみに \" はシェルによってエスケープ処理されない
$ echo `echo \"`
" # シェルによってエスケープされたら echo " が実行され、エラーになるはず。
# " はエスケープされてバッククオートから出力されるので、2つ目の echo 実行時にはエラーにならない。
$ echo `echo '\"'`
\" # \ もエスケープされてバッククオートから出力される。
$ echo `echo "\""`
" # \" の左に " があってもシェルによってエスケープされない。\" がエスケープされるのは "` の後にある時のみ。
>>492 後半部分、シングルクオートで括ってもシェルに処理される理由は、
シングルクオートとは言え、それを含んでバッククォートで囲まれてるから。
バッククォートの中で \ が特別な意味を持つので、
\ 自身を表現するのに \\ とする必要があるから、
シェルとしては \\ を解釈して \ に変換する必要が生じる。
バッククォートの代わりに $( ) を使うと、
$( )の中で \ は特別な意味を持たないので、
上の問題はなくなる。
$ echo "`echo '\\'`"
\
$ echo "$(echo '\\')"
\\
それでも純正なら・・・
純正ならきっと何とかしてくれる・・・
Solarisの echoコマンドみたいに、echo -e オプション相当が
デフォで組み込まれてる echoだと、
>>494 の問題以外に、echoコマンド自体が \ を解釈するので、
$ echo '\\'
\
となってしまう、という別の問題が発生するので超複雑。
つまり、16個の \ が、解釈されて 2個の \ になるんですね、
$ echo -e "`echo -e '\\\\\\\\\\\\\\\\'`"
\\
わかります
なぜシェルスクリプト変数の呼び出しは$を付けなければならないのですか?
$は基軸通貨だから。
なぜ「シェルスクリプト変数」という造語を使うんですか?
シェルって言うと
昭和
ホタテビキニ
>>494 > バッククォートの中で \ が特別な意味を持つので、
> \ 自身を表現するのに \\ とする必要があるから、
> シェルとしては \\ を解釈して \ に変換する必要が生じる。
あまり説明になってないような。
バッククォートの中で \ が特別な意味を持つのは分かるけど(` " のエスケープをする)、
なんでわざわざ \\ を解釈して \ に変換する必要があるの?
\ や \\ をそのまま渡せばいいだけじゃん。
…て思ったけど、
要するに \\ を \ に変換しないと \` を渡せなくなるなど、表現が不完全になるから?
(\\ を \ に変換しないと \\` → \\`)
>>504 「…て思ったけど、」以下に自分で書いているとおり。
×あまり説明になってないような
○とてもいい説明だったのに
>>504 はすぐには理解できなかったような
最近、自分で書いたスクリプトの書式が純正かどうかが気になる。
いちおう「HP-UXのsh-posixのマニュアルに書いてあるやり方なら
だいたいPOSIX.2準拠ってことでいいんじゃね?」と考えているんだけど、
みんなはどんな基準で判断していやがるんですか?
どうか教えてください。
export HOGE=hoge を使わない
$(command) を使わない
{a,b,c} を使わない
~user を使わない
if ! を使わない
[[ ]] を使わない
(( )) を使わない
$(( )) を使わない
配列を使わない
その他、馴染みのない妙な文法を使わない
関数はいいんですかっ?
もちろんいいよ
しばりプレイってやつですね。わかります。
せ、関数…?
513 :
名無しさん@お腹いっぱい。:2008/09/09(火) 22:53:42
>>508 はどこかで参照可能な仕様書ってわけじゃなさそうだな…
514 :
名無しさん@お腹いっぱい。:2008/09/10(水) 08:14:46
はじめまして。
いきなりの質問になってしまいますが、現在、
『ログが格納されているディレクトリ(/jtb/debug/log)からスクリプト実行日付のログファイルのみを見付けて抽出し、/jtb/info/date というディレクトリに移動させる』
というスクリプトを作ろうと考えているのですが、うまい実現方法がわかりません。
どなたか助言していていただけないでしょうか?
よろしくお願い致します。
「スクリプト実行日付のログファイル」って具体的には?
ファイル名? 最終変更日時?
516 :
名無しさん@お腹いっぱい。:2008/09/10(水) 08:36:06
>>515 作成したスクリプトを実行した日と格納されているログファイルの最終更新日付を比べて、一致したログファイルをすべて移動させるという要件になります。
わかりにくくてすみません
517 :
名無しさん@お腹いっぱい。:2008/09/10(水) 08:44:07
書き忘れがあったので追加させていただきます。
/jtb/debug/logに格納されているログファイルはすべて *.log という形式です。
環境はHP-UXです。
>>514 HP の新米社員かい?それっぽいな。課題なんだろうよ?
>>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
文体を見ると同一人物だな。問題なげて消息不明になるところも同じ。
よって釣りかただのアフォなので以後スルーでOK
523 :
507:2008/09/10(水) 21:19:04
結局みんな我流の純正ってことか
少し安心したぜ
どこをどう読めばそうなるんだよ?
実際に純正シェル上で動かしてみるのが一番。
動くか動かないかのどちらかだから、我流の発生する余地はない。
>>508 はその要点を噛み砕いてまとめて説明してくれてるんじゃないか?
それに対して
>>513 みたいな言い方はないな。
そういう奴に限って、仕様書渡したところで仕事できない奴のことが多いしな。
526 :
名無しさん@お腹いっぱい。:2008/09/10(水) 23:23:44
つまり手元に純正シェルがある人以外は純正どうのなど考えるだけ無駄
このスレで回答するためには、7th Editionの/bin/shで確認してから回答すること。
>>527 はいはい、古典シェルの人には聞いてないよ。
>>527 パイプに ^ を使ってもいいのですねっ
このスレで「純正シェル」と言う奴は必ずといっていいほど
どのOSのどのコマンドかを明示するのをいやがる。
まるで詐欺師。
「純正シェル」とは何をさしているか曖昧なきがするな。
こうなったらOSを指定するのはどう?FreeBSD6.3の/bin/sh とか(Linuxでもいいですよ)
FreeBSDの/bin/shはashだから純正じゃない。
その証拠に、$(com)とか ~ とか export a=a とか使えてしまう。
そうなんだ「純正シェル」の入手先はどこですか?
GNU pure sh つくっておくれ
たびたびすまん。FreeBSDだと
>>527にあるように /usr/ports/shells/v7sh でいいのかな?
$(com)とか ~ とか export a=a とかつかえないので v7sh を「純正シェル」だと考えます。
違ったら指摘してください。おやすみなさい。
うぉおおおおおおおぉぉぉぉおおぉぉ
>>536 GJ
コンパイルエラーの嵐wwww
ダメだorz 純正shの純正ソースは修正してると眩暈がする・・・
FreeBSDのportsからソースをいただくとするか。
まじで純正シェルの定義が知りたい。
いちいちシミュレータで7th起動するのもあほらしい
だれか作ってくれ
もう誰かスーパーハカーが動作中含む全てのOSに同じシェル組み込んじゃえよ
散々ガイシュツだが、#!/bin/bash とでもすればいいだろw
インスコされてなきゃエラーになるんだしよぅ
で?
もういい。 Life with UNIX読んで寝る
ポータビリティ重視なんで、純正(7th)かどうかはあんまり気にならない
posixを満たしているならいいんじゃないか
$()を使わないとかexport a=を使わないとかストイックすぎるだろ
おいおい、ポータビリティ重視ならposixなんて役に立たんだろ。
うん、POSIXでいいね。
いおい、ポータビリティ重視ならPOSIXなんて役に立たんだろ。
>>547 #!/bin/sh
$(hoge)
export HOGE=hoge
って書いたスクリプトをSolarisにFTPして動かしてみてから
顔洗って出直してこい(笑)
POSIX と各 BSD の ash と bash と Solaris の sh で動くこと、で
いいと思うが。
POSIXも余分だろ
solarisも余分だろ
bashも余分だろ
ashも余分だな。
bash でしか動かんものを #!/bin/sh で書いたりしなけりゃ何でもいいよ。
だから、Solarisの/bin/shで動かない $(cmd) や export H=h を
#!/bin/sh って書いちゃいけないんですよ。
ashを使ってるなら始めから#!/bin/ashと書けばよい
紛い物の分際で/bin/shを名乗るな烏滸がましい
ashってPOSIX互換+BSD拡張だぞ。
古典shとは程遠いぞ。
指定フォルダ内で
パーミッションが700のディレクトリのみ表示させる、には
どうすればよいでしょうか?
find . -type d -and -perm 700 -print
フォルダって何ですか? 質問内でディレクトリという言葉も使ってるし、
ディレクトリとは別のものですよね?
>>563 -and は 純正find違反。「指定フォルダ内で」の題意を満たしていない。
>>562 UNIXでフォルダと言ったら MHのフォルダのことだろ。
フォルダの絶対パスは mhpath +hoge コマンドで表示できる。よって、
find "`mhpath +指定のフォルダ`" -type d -perm 700 -print
かな。
取り敢えず今主流と思われる
GNUとBSDとsolarisとAIXとHP-UX辺りで共通で動くもの
って言うふうに決めればいいじゃないか
ほぼ誰も困らないと思うぞ
それ、部分集合の関係になってるから、
「Solarisで動く」だけで条件を満たす。
Solarisは純正厨がうざいから専用スレで隔離した方がいい。
それがここだろ?
残念ながらそう思っているのはお前だけ。
Solarisが無ければ、Solarisさえ無ければ…
FreeBSDでもSolarisでもLinuxでも同じ実行結果を得るためのスクリプト書く必要がある仕事してる人っている?
kshとVBScriptで同じものを書かされたことならある。
Solarisの人気に嫉妬
どうやら、一時ファイル作成するのめんどいから、
時にはzshの =() まで使う俺は幸せものだな。
<()ならbashでも使えるんだけどな
/bin/shでの代替品にこんなのはどうかな。`cmd|psub`で=(cmd)相当。
psub() {
PSUB=/tmp/psub.$$
cat >$PSUB
echo $PSUB
(exec >&-; sleep 3; rm -f $PSUB) &
}
FreeBSDはないけど、SolarisとLinuxなら同じsh スクリプトを使えるようにするよ。
solarisのshで動けばlinuxでも動くからな。
linuxにksh入れて、スクリプトはkshで書けば割と楽なんだが。
>>568 つまり、
Solaris ∩ 〜Linux = φ
Solaris ∩ 〜FreeBSD = φ
∴ Linux ∩ FreeBSD ∩ Solaris = Solaris
ということですね、わかります
空集合の記号はU+2205
582 :
547: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の正体がよくわからん。
>>582 OpenSolarisはSolarisじゃありませんから(笑)
OpenSolarisなら、/bin/shじゃなくて、/usr/has/bin/sh で試してね。
/usr/has/bin/sh の方が純正だから。
>>583 おお、すごい。
#!/usr/has/bin/sh
にしたら $() も export a= もダメになった。
てことは、本物のSolaris(の定義がよくわからんが、商用サポートしてもらえるSolaris?)では
/bin/sh が /usr/has/bin/sh になってるってこと?
さすがに本物のSolarisは手元に用意できんですよ。
>>584 Solaris10なら、ダウンローダーズエディションが無料で手に入るよ。
OpenSolarisは、SolarisのユーザーランドをLinux風に改変してあるからね。
/usr/has/binのディレクトリはOpenSolaris独自のもので、
本来のSolarisにあったコマンドを退避しているディレクトリ。
Solarisでは、/bin/shはシンボリックリンクではなく、
OpenSolarisでいうところの/usr/has/bin/shのバイナリが直接/bin/shに置かれている。
>>585 OpenSolarisとフリーのSolaris10を混同してた。
ありがとう。試してみるぜ。
そもそもOpenSolarisはソースベースのことで云々
10からsolarisが嫌いになったんで
俺はもうbashで開き直ることにした。
最近仕事は専らLinuxだし。
やっぱりbash&Gnuツールの方が便利だぜ?
純正に対する拘りを捨てるぐらいなら最初からperl使うし
perl(笑)
講評: せめてPythonと言っておけば笑われなかっただろう。
純正(笑)
Python(笑)
C(笑)
(笑)(笑)
でもここ5年くらいのリリースで、インストーラのデフォルト選択でperlが入らない
UNIXってあるの?
「インストール時の選択で削れば入らない」とかじゃなくて。
お客さんは不足から来るトラブルを嫌がるからデフォルト+追加で入れたがる。
FreeBSDはデフォで入らんが
awkは?
FreeBSDはUNIXではない
>>601 awkは起動スクリプトとかで使われてることもあって、必須で外せない。
sedも同じこと。
FreeBSDはUNIX系ではない
FreeBSD系はUNIXではない
|
\ _ /
_ (m) _
目 ピコーン
/ `′ \
∧∧
(・∀・)
ノ( )ヽ
< >
シェルごとにスレを立てれば・・・!!!
BSD系はUNIX系ではない。
2chの総力を結集して新たな標準シェルを作ればいいんじゃね。
2shとかいう名前で。
ビルトインコマンド
age
sage
aborn
Solaris11 から、/bin/sh = bash になるみたいだから、
そうなって、Solaris10以前のサポートが切れれば、
晴れて $(hoge) とか export hoge=hoge とか
堂々と書けるようになるぞ。
やめてくれよ(´・ω・`)
>>609 2ch側で実装すれば最強じゃね?OSなんでもよくね?
>>612 なんで嫌なの? 古い技術にしがみつくタイプ?
機械式計算機サイコー
cshの設定ファイルのうち、
せめて環境変数の部分だけでもそのまま流用できるとありがたいんだけど、
zsh紹介ページにある
setenv () {
export $1="$@[2,-1]"
}
なんてのは、「純正」やposixのシェルでも通用するのでしょうか。
あ、ごめん。
純正では少なくともexport文を分ける必要がありますね。
>>616 awk '$1 ~ /setenv/ { printf("export %s=%s\n", $2, $3) }'
>>616 awk '$1 ~ /setenv/ { printf("export %s=%s\n", $2, $3) }'
× 純正
○ 純正(笑)
>>618 $3だとスペース含んでいる時にNGっしょ
POSIXまんせーでOK
純正じゃないとどうしても動かないシステム使っているのは終わっている。
solarisも全く無問題。
固執した使い方をする「人間」に問題が有る場合が殆どだろう。
>>622 Solarisの/bin/shはPOSIXじゃないよ。嘘書いちゃいかん。
Solarisの/bin/shがPOSIXだなんて書いてないじゃん。
#!/bin/sh と書いたスクリプトが Solarisでも動く必要がある。
「無問題」なんて書いてる
>>622 は大嘘。
Solarisだと
#! /usr/xpg4/bin/sh
としないといけないのかな。> POSIX sh
>>626 だから、#!/usr/xpg4/bin/sh などと書くと今度は他のOSで動かなくなる。
Solarisの新バージョンで、/bin/sh=/usr/xpg4/bin/shとなるなら話は別だが、
現状では #!/bin/shのスクリプトは、純正shの範囲に限定して記述することが必要。
他のOSで動かさなきゃいいじゃんw
SolarisはSolaris
糞は糞
こんな所にも技術者の哲学と美学が見え隠れするね。
いや、原理主義と現実主義のイデオロギー紛争だ
原理主義
→ 本家元祖 bsh で動くものにすべきだ
現実主義
→ どんな shell でも動くものにすべきだ
たいして結果は変わらないように思うのだが
仕事頼むなら現実主義者がいいな
`` のネストの可読性とか `expr ...` のコストとか考えてPOSIXでいいと思うんだけど
Solarisで動かすときはshebang行だけ書き換えればいいし
現実主義
→ 周りにあるOSだけで動けばいいじゃん。
どうせ各種コマンドだってパスや使い方が違うんだし。
posixshellpath=どうしたこうした
なんだかんだでeval `exec $posixshellpath ああだこうだ`
一番汎用的なのはなんですか?
ぼ、汎用的…?
>>627 なるほどね、#!/bin/sh は bash とか ash の可能性もあるし まずありえないけど純正shかもしれない。
で、純正shで動けば b系シェルなら必ず動く。 なんかあたりまえだけど納得した。
だから、純正shってなんだよw
つ POSIX
話題がループしてるぞー
2chの総力を結集して新たな標準シェルを作ればいいんじゃね。
2shとかいう名前で。
POSXは全く実践的じゃないから、一旦忘れろ。
事実上の標準シェルは、現状最も制限が厳しいSolarisの/bin/sh。
Solarisの/bin/shで動くように書けば、ashでもbashでも動く。
それが実践的な方法。
Solarisの/bin/shってソース公開されてる?
コマンドやシェルが
シェル上から対話的に実行されているか
クーロンなどから実行されているか見分ける方法ってありますか
tty -s
PS1が設定されているかどうか。
>>648 シェルスクリプトがコマンドラインなどから対話的に実行されていても
PS1は設定されないよ。
無端末状態かどうかを調べる
>>647 が正解。
>>644 そう思ってるのはお前だけだから、純正(笑)シェルスクリプト総合スレでも作って
そっちに蟄居してろ。
>>646-647 tty -s より、test -t 0 の方が内部コマンドだし、いいかな。
ここは純正シェルのスレ
>>651 にぴったりのスレタイ考えてやったよ。
自分でスレ建ててそっちに移住しな
↓
【動かなくても】POSIXシェルスクリプト【自己満足】
だから、純正shってなんだよw
純正(笑)シェルって何ですか?
仕様はどこにありますか?
つ /usr/ports/v7sh
ラッパ作って uname で呼び出すファイルを選別する。
これで solaris でも動くぜ。
実にバカバカしいがね。
それより /bin/sh を rm して、さっさとリンクを張れば無問題だ。
>>634が正論だろう。
一応シェアドライブラリが一つもいらないようにリンクして
バイナリを置いてあげて/sbin/shにもね
/usr/xpg4/bin/shがあるとは言え、これが動作可能なのは/usrがマウントされた後の話。
/usrマウント前に、/ ファイルシステム上のライブラリだけで動作可能な
/sbin/shも必要なわけで、現状、/sbin/shは/usr/xpg4/bin/shでは置き換え不可。
なので、やはり/bin/shの範囲で記述することが必要。
そんな、マジレスするなよ。
正直みんな困るから、sun が posix に歩み寄るべしという、婉曲表現なんだからさ。
$ echo "outer +`echo inner -\`echo \"nested quots\" here\`- inner`+ outer" って書きたくない。
と言うだけの事。
今度からテンプレに「純正シェルとは具体的になにか」をいれない? この話題延々ループするし
概出だけど手頃なとこでは、FreeBSD の /usr/ports/shells/v7sh 知ってる方がいたら、ぜひLinux系の情報も
ソースの場所教えてくれたら俺が移植してやるよ。
探すのがめんどい
見てなお移植する気力が残っていたら見上げたものだ。
FreeBSDのportsにあるパッチ当てれば労力が100分の1ぐらいで済みそうだけど
7thは純正過ぎるだろ
functtionもつかえんぞ
そんなのPOSIXにも無いよ
668 :
名無しさん@お腹いっぱい。:2008/09/19(金) 00:28:39
シェルを終了したときに返すエラーコードだけど、この番号はこの意味って決まりはありますか?
自分が知っているのは、0が正常終了ということ。
たとえば、1がシステムエラーで、2がプログラムエラーで、3がパラメタエラーとか、、
なんか、意味が決まっているのかなと、ふと思いました。
からすのかってでしょ!
おぉ普通にコンパイルできそうじゃん
じゃこれこのスレの標準shてことで。
>>668 errno.h に従うべきなんだろうけど、守ってないプログラムが多いから
正常は 0 で、それ以外はエラーという程度の認識の方がいい。
しかしながら、製品で失敗しようが何だろうが 0 で終わるのを見たw
クレームつけたら、出力されるメッセージを見てくださいと・・・
そりゃそうしてたけどさ、大した修正じゃないんだから直してくれよorz
>>670 portsやdebにはheirloom-shってのがありますね。
RedHatでmakeを確認した。
このスレの前提として、
特にシェルの種類の指定がない場合は純正シェルで動作をするものとする。
(商用Unixでない人は、純正シェル≒heirloom-sh とする)
みたいな決まりをテンプレに入れようか。
1の
「特記なき場合はBourne Shell(/bin/sh)がデフォルトです。」を
「特記なき場合は純正シェル(heirloom-sh)がデフォルトです。」と
すればいいのか?
>>674 そもそも商用でないUNIXは存在しないから無視。
ex. *BSD、Linuxなど。
Opensolaris涙目www
v7とheirloomは違うところあるのかな?
関数定義?
こうしてみると、色々違いがあるし、結構変わってきてるもんだな
solarisのshで動いてbashで動かないこともあり得るじゃんよ
>>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)
もう純正っていうとv7shしかないな。まさにBourneが書いたものだし。
>>683 Heirloomのソース読むと、
ソースコードはSVR2由来で、
ほんの一部のみCaldera経由でv7ソースにみえる。
(gmatch.c, mapmalloc.c, umask.c, sh.1)
今日はshの歴史探訪か…
いや、いいんじゃないか。面白くて。
温故知新
特定のシェルを持ち出して純正いうのが間違ってるよ
${1+"$@"} とか書くのはごめんだ
今日の流れは珍しく興味深い。
しかし一見、純正主義が支配しているかのように見えるこのスレだが、
実際に書く時に拘っている人は何割ぐらいなんだろうか。
Solaris使いだけど、なるべく/bin/shで書くようにはしている。
が、forのサブシェル化とか、解決がめんどくさいときは、kshで書いている。
691 :
名無しさん@お腹いっぱい。:2008/09/20(土) 01:50:52
bashで、1〜10のランダム変数を作るにはどうしたらいいでしょうか?
$RANDOMに適当な計算を施す
/dev/urandomのようなデバイスをddあたりで読んでどうにかする
(GNU) date +%sでごまかす
perlなどの乱数機能に頼る
$((RANDOM % 10 + 1))
expr $RANDOM % 10 + 1
>>672 嘘を教えないように。従うべきはsysexits.h。
errno.hに従うと負の値を返すことになるが、exit(3)に負の値を渡すのは
超絶ウルトラ初心者。
そうゆうヘボに知ったかクレーム付けられたら、スルー対応するのは当然。
EXIT_SUCCESSとEXIT_FAILUREしか知らなかった
一般のアプリケーションがそれに従う必要なんてないだろw
>>697 ANSI C的にはそれでOK
UNIX的には/usr/include/sysexits.h
700 :
名無しさん@お腹いっぱい。:2008/09/20(土) 09:09:54
>>698 キミが知らないだけで、終了ステータスでエラーを判別して動作を変える
プログラムは存在する。たとえばsendmail。
make
>>702 makeは、0か「0以外」かしか判断しないだろ。
今話題になってるのは、0以外(偽)の中でも、1か2か3か、、で
判断するようなアプリが一般的に存在するかどうかという話。
>>703 むきになって、自ら無知を曝け出すこともないだろうに。
makeは0,1,それ以外を見ている。修行して出直しなさい。
>>704 makeは見てねーよw
>>702 は流れ読めずに単に終了コードを見てるコマンドを挙げただけだろ。
だったら test でも何でも同じこと。
v7 makeは、
・0
・それ以外
・シグナル受けてない
・-で失敗無視
・失敗で終了
・シグナル受けて終了
の別。make自体のexit statusは0,1,2の三種類。
補足すると、
make自体のexit statusの話じゃなくて、
makeが判断する外部コマンドのexit statusの話だから、
0、それ以外の 2種類でFA。
>>696 嗚呼、間違えた sysexits.h だorz 指摘ありがと。
漏れがヘボでも何でも構わないんだが、エラーなのに 0 で終了するのは
それはそれで思いっきりダメだと思うぞw
sysexits.h って UNIX がどうのじゃなくて、
そもそもが sendmail 由来のヘッダじゃないのか?
sysexits.hの中身読んでみろ。
EX_HOGEってエラーの内容、メール関係ばっかだw
もともとsendmail用のヘッダーだった
↓
一般のアプリケーションにも使ってもらうつもりで/usr/includeに配置
↓
でも、メール関係のエラーコードしか定義されてない
↓
結局誰にも使われず、今に至る
ってのが現状?
盲腸ですね。
stdlib.hは?w
715 :
名無しさん@お腹いっぱい。:2008/09/21(日) 00:38:15
bashなんですが、
while read iにバックスラッシュが含まれた文字列を渡すと、
どうししても、勝手にバックスラッシュが削除されてからiに入ってしまいます。
これって回避不可能なんでしょうか?
read -r
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形式のパスが書いてあるとします
このスクリプトだとサブシェルを起動してしまうので
環境変数を設定できません。何かいい方法はないでしょうか?
while read -r l;do
if test "x$l" != "x";then
PATH="$( /usr/bin/cygpath -u "$l" ):${PATH}"
fi
done < /PATH.txt
すいませんこれでおkでした
別にcat使う方式でもできるだろ
csh用の下のような設定ファイルをbashで読みたいんですが、
#!/bin/csh
setenv HOGE hoge
cat a.env | grep setenv | sed 's/^setenv/export/' | gawk ' { print $1" "$2"="$3 } ' | sh -
これだとサブシェルでexportして終わりみたいでだめです。
一時ファイルに書いて . で読むのはださいなぁと思ってるんですが、いい方法ないでしょうか?
>>721 最後の標準出力を ` ` で読めばいいだけ。一時ファイルは不要。
あと、cat grep sed gawkは無駄っぽい。もっと簡単になる。
>>722 ``は盲点でした
ありがとうございます
setenv だけだったらこれで大丈夫でした!
`grep setenv a.env | awk ' { print "export "$2"="$3 } '`
>>723 grepも無駄。
`gawk '/^setenv/{print "export " $2 "=" $3}' < a.env`
>>725 eval はいらん。 ` ` だから。(まずは試してみろ)
evalが要るのは "` `" の時。
setenv HOGE hoge
ならいいけど、
setenv HOGE `hoge -fuga`
だとアウトだぞ。
>>727 その場合は eval付けても eval以前の問題でアウトだから、
そこまで対応する必要無しと思われ。
>>727 汎用的なもので考えると、aliasとかsetとか中でsourceしてたりとかキリがないっすよ
シェルの中で!$とかって使えないんですか?
'!' '$'
キミのシェルがまがい物でなければ、!は使える。
まがいもののシェルだったとしても、
set +H
しておけば、! は文字通りの意味で使える。
734 :
730:2008/09/23(火) 20:19:25
ちょっと誤解を招いてるかもしれないですが、
前のコマンドの最終引数という意味の"!$"ですよ!
!$でもできるんですけど
これってまがい物のシェルですかね!
というか$_知らなかった
>>736 コマンドラインでは !$ も $_ も使えるが、
シェルスクリプトの中では $_ だけが使える。
sortって何バイト目から何バイト目をキー1 何バイト目から何バイト目をキー2 とかってできなんですかね?
そんなsortコマンドはキーたことがない
GNUのsortなら、--key=1.m,1.n --key=1.o,1.p みたいにできるんじゃないかな。
試してないけど。
試してから、出直してこい
だが断わる
make のこと聞いてもいいですかね?
さすがにmakeはぜんぜんシェルスクリプトじゃないだろ
スレ一覧でmakeぐらい検索しろ
まけまけ
じゃぁtcpdumpのこと聞いてもいいですか?
シェルスクリプトと関連があれば
でなければくだ質
スペース混じりのファイル名だとかディレクトリとかを変数で使うのって
かっこよくかけないものか
file_name='/home/piyo/hammer with jj'
cp -p "$file_name" /home/piyo/bakup.`date+%Y%m%d/"$file_name"
やっぱこんな感じにせざるを得ない?
それのどこが不満なのかと
>>749 カッコいいかどうか以前に、クォート間違ってるし…
bashスクリプトの整形はみんな手作業?
整形ってなに?生まれたままの姿じゃだめなの?
なんかインデントくらいはツールでなんとかできないかなぁと思ったんですが。
emacsがインデントする。
ソビエトロシアではインデントがemacsする
viとかってCとかのインデントはできるけどシェルのインデントはできなくない?
というかforの終わりとかifの終わりとか判定する気ないんじゃないの あいつら
760 :
名無しさん@お腹いっぱい。:2008/09/27(土) 00:48:40
2バイト文字を16進数で指定してcdするにはどうすればいいでしょうか?
シェルはBashです
tmp=a
hoge=b
mogemoge=c
じゃ不揃いなんで
tmp=a
hoge=b
mogemoge=c
とかやってる馬鹿とか、いるんかな。
環境変数設定してるファイルとか見ると、
cshはこの点だけはスッキリしてていいと思う。
あ、他に前スレラストからのネタのコメントもいいね。
>>761 こういうことか?
tmp = a
hoge =b
mogemoge = c
ぜんぜん揃ってなかった orz
こまかいとこはまぁいいとして
shにはgotoがないってのが、他の機能で補えない分つらい
そもそもgotoが必要になるようなプログラムになることがおかしい。
shでは、2レベル以上のループをbreakで脱出できるし、(←C言語では不可能)
シェル関数も使えるから、gotoがなくて困ったことなんて1度もない。
>>764はgotoが使えないと困る実例を挙げること。
シェル関数といっても、他の言語でいうところの関数とは違って、ただのサブルーチンに過ぎないからな。
gotoなんかは全く意味がない。
さすがにgotoが必要ってのはネタだろ?
csherなら全然普通。
そりゃgotoが不要なように構成すりゃgotoはいらんよ
でもあると便利だってだけの話
どんくらい便利かというと、便利だからって乱用してわけわからなくする奴がいるから
goto使うなってローカルルールが生まれるくらい便利だってこと
>>770 だから、そのgotoが便利に思えるような例を1つでも挙げろよ。
「gotoが不要なように構成」なんてしないよ。
普通にスクリプトを書くだけ。
それでもgotoが便利だと思う場面は過去長年の間、1度もない。
仮に、純正shにgotoがあっても、誰もその存在に気づかないほど不要な文法。
そりゃ便利なんじゃなくて構造的な考え方が出来ないで
その場しのぎのことしか思いつけないってだけの話だな。
どんな文だろうが式だろうが、あれば便利に思えるヤツもいるだろうけど
少なくともシェルプログラミングにgotoが必要になるって場面はそうないだろ。
インタラクティブに使ってるときにgotoを使いたくなるならあってもいいだろうが,そんなことはないだろうし
その場しのぎの非構造的スクリプトを書くときに便利じゃないか
アセンブラのまねの時
>>774 その場しのぎでも、関数の方がやっぱり使い勝手がいいと思うんだけど...
まぁどうしてもgotoがよければもうexec使うくらいの勢いでいいんじゃ。
goto使わなきゃ書けないような処理を示せる人はgoto使いません
でも良く構文知らない言語使うときに便利だよ
あれvbaのforってどう書くんだっけ?→gotoでいいや
batってcaseあったっけ?→gotoでいいや
javaってなんだっけ?→gotoでいいや
Javaにgotoなんてあったっけ?
予約語ではあるよな
なんだ、構造化プログラムどころか、プログラム一般についてもよく知らない人の
意見だったんだな、
>>777 は(笑)。
781 :
723: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したいんですが、うまい方法ないでしょうか!
eval `csh -c "source a.env;env"`
>>777 良く構文知らない言語を使うな。
go to hell.
質問させてください。
c言語で作ったプログラムa.outが今手元にあります。
シェル(シェルスクリプト)から、このa.outを実行し、
int main()が戻す数値を変数に得ることは出来ないでしょうか?
文字ではないから受け取れないのでしょうか?
それともそもそも、main()の戻り値は、OSに返される値で、シェルには何も戻ってこないとかでしょうか?
cプログラムの戻り値を利用できるととても便利で助かるのですが…。
どうか知恵を御貸しください。
v=`./a.out`
よく読んでなかったorz
./a.out
v=$?
./a.out
echo $?
>785-787
即レスありがとうございます。
$?でいけました。
ヒントをいただき、検索したことで、$?や周辺の知識が入りました。
始めの一歩を手助けしてくださったことに、感謝します。
ありがとうございます。
790 :
名無しさん@お腹いっぱい。:2008/10/01(水) 01:32:23
メール関数おしえて
mail_send(from, to, msg)
こんな感じ
mail_send() {
/usr/sbin/sendmail -f "$1" "$2" << _END_OF_MSG_
$3
_END_OF_MSG_
}
$3に仕込まれて好き放題やられる。
自分で使うんだったらいんじゃね?w
まぁ、ファイルに落とし込んでから流した方がいいけど。
794 :
784: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のどこがおかしいのか気になって仕方がありません。
どなたか問題箇所を教えてください。
>>792 へー。どうやったら$3に仕込めるんですか?
>>794 ・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
>>794 "$arg" "$vari1" "$vari2" みたいに、全部""で囲んでみたら?
すみません。
投稿前のチェックが微妙でした。
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』しか書かなくとも必ずひとつは出ます…。
× elseif ○ else if ってこと?
elseif というコマンドに見えるから、変なところに括弧があると見なされるわけだ。
>799
ええええええええええええええええええ! д
そんな…。解決しました。。。
あ、ありがとうございます…。
な、な、何故エラーが出ないのでshouka...
>797
変数を利用するときは""で囲めるですか。
勉強になります。ありがとうございます。
今回の件では解決に至りませんでした。
>796
csh-whynot
紹介ありがとうございます。
いろいろなサイトで、紹介されているので一応読みました。
私は、bashに惹かれるものがありますが、cshについても学習中です。
現在でもcshの紹介がなくならないということは、cshについても基本は知ったほうがいいと考えていました。
まわりにcshのコードがあるので、どうしても読まねばならない環境にありますし。
>>795 mail_send("from", "to","_END_OF_MSG_
rm -rf *" )
>>802 そんなことやっても仕込めないよ。
シェル関数の呼び出し方も間違ってるし。
謝罪と賠償を要求するニダ
なんだ、素で仕込み方わかってなかったのか。
ほらヒントやるよ。お前の好きなmd5だ。www
873cd540c150a4db88e18fb02ec4434c
ヒアドキュメントの展開や、シェルの解釈順を知っていれば、
$3には仕込めないことは明白。
>>806 どうせ、「すみませんでした」とか、そういう意味の言葉の md5だろw
初めてここを読んだ人のために書いておくと、
話題の元は
>>791 ね。
頭が固い奴にはハッキングは無理。www
実際に試しもせずに、
>>802 で「仕込めた」と勘違いしてる人の
勘違い md5 なんて無視しておけ。
$ echo 正直スマンかった | md5sum
873cd540c150a4db88e18fb02ec4434c
逃げ出したか?
>>808 10/5 0:00過ぎに
>>806の答公開してやるよ。 後26時間。まぁがんばれ。www
$ echo 正直スマンかった | md5sum fa4ea9e33e02566ce9c88102e24f3d51 -
>>812 ワロタwww そういう素直はレスは好きだぜ
>>816 わからないのが悔しくてたまらないようだな。あと14時間。www
818 :
790:2008/10/04(土) 11:38:14
こたえまだー?
819 :
790:2008/10/04(土) 11:39:49
ていうか、自分で使うから仕込むとかどうでもいいしw
てか、sendmailのpathが固定なのが気になる。
mailコマンドでヨロ
820 :
名無しさん@お腹いっぱい。:2008/10/04(土) 11:40:34
そういう突っ込みが欲しいけど、お前らじゃ無理だなw
>>818 >>791 mailコマンドではfromの変更ができないから、
sendmailにする必要がある。
path固定がやなら path外せばいいだけ。
822 :
名無しさん@お腹いっぱい。:2008/10/04(土) 17:22:34
シェルで、マウスポインターの位置を指定座標に強制移動するにはどうすればいいですか?
XWarpPointerを呼ぶプログラムを書け
シェルでやりたいんですが、、
XWarpPointerを呼ぶプログラムを書いてシェルスクリプトから呼べ
「XWarpPointerを呼ぶプログラム」はシェルで書けるんですか?
マウスポインターの位置を指定座標に強制移動する機能があるシェルを作ればよい。
perlのモジュールか何かそういう感じので、マウスを動かすことはできませんか?
>>828 Perlを何か勘違いしてないかw
perlはテキスト処理言語。
だからそもそもperlでグラフィックの処理はできない。
>>829 お前こそPerlを何か勘違いしてるだろw
ほらよ。
to="-t"
ちゅーかperlはスレ違い
もしくは板違い
>>829 Perlはテキスト処理?w Tk使ってXのプログラムも書けるぞ?
>>821 mail -f foo -t too
しったかだな ぷぷ
mail(1) はどのシステムでも共通の仕様だっけ?
sendmail(1) なら、Sendmail, Postfix, qmail でも使えるが…
>>834 しったかはオマエ。もっかい man mail 読み直せ。
sendmail -t しても、To: From: 等が自由になるだけで、
rm -rf * とかコマンドが実行できるわけではない。
>>831 は何か勘違いしたんだろうな。カッコ悪い奴だな。
841 :
名無しさん@お腹いっぱい。:2008/10/05(日) 13:26:27
>>838 なに熱くなってんの?
早く質問に答えてよ。意味和漢ないひとだな
>>836 アホ、$3に仕込むための「ヒント」だよ。
想像力の欠如している奴は救いようがないな。
「コマンド実行」を仕込むと勝手に曲解して思考が固まったんだろう。
>>842 あはぁぁ、開きなおっちゃったかw
コマンド実行できなきゃ何の問題も起きない。
-t 付けたところで、$3 の To: や Cc: にそのままメールが送られるだけ。
全く無問題。
見当違いな回答をわざわざ md5まで作って 1日もったいぶって回答して、
さぞかし悔しいだろうね。
>>831 今度からは、途中から話題に加わる時は、話の流れ良く読めよ。
>>841 manくらい自分で読めよ。
mailコマンドの -f オプションは、メールボックスの指定。
Fromアドレスの指定じゃない。
>>831 は、それが回答だと言ってなかったか?
大間違いな回答だったけど、「それはヒントだ」と言い訳して、
今大急ぎで弁解方法考えてるんだろなwww
>>845 悔しくてメクラになったのか? www
>>806 > ほらヒントやるよ。お前の好きなmd5だ。www
>>842 > 「コマンド実行」を仕込むと勝手に曲解して
↑
ということは、結局「コマンド実行」はできないんだよね。
で、
>>831 は、-t でアドレス複数を自由に同時に指定できるようになることを
「仕込む」と曲解したのか?
>>792 が言う、「$3に仕込まれて好き放題やられる」のニュアンスとは程遠いぞ。
もともとの質問で、Toは自由に引数指定可能なんだから、
-tにしたところでユーザーができることに大差ない。
そんな大差ないことを「$3に仕込まれて好き放題やられる」とは言わない。
さあ、$2は -t にするとして、$3 をどうやったら 「好き放題やられる」か
やれるもんなら回答してみろ。
傷口を広げる前に謝った方がいいとは思うけどな。
たぶん、
>>792 =
>>802 で、「コマンド実行を仕込める」と勘違いしていた。
その話の流れを途中から読んだ
>>806 は、よくわからずに
>>831 という見当違いなことを言い出した。
というのが真相。
>>847 >>842は訂正しよう。
× 想像力が欠如してるんだな。
> ということは、結局「コマンド実行」はできないんだよね。
「コマンド実行」は、お前が溢れ出る想像力で脳内で変換したもの。www
toでは一通しか出せない。
-tでメッセージから読ませれば好きなだけ送れる。
お前にかけているのは応用力のようだ。
>>849 > -tでメッセージから読ませれば好きなだけ送れる
↑
やっぱそれだけか。そんなの最初から問題じゃない。
>>831 の敗北宣言ということで、終了。
>>849 -tでメッセージから読ませれば好きなだけ送れると、何か問題なの?
どうせシェルを回すんだろうし、仮に-tを使わないとしても
そのメールを送るシェル関数を繰返し呼び出せばいいだけでしょ。
まさか、それを「仕込む」って言ってるんじゃないよね?
と書こうとしてレス見たら、本当にそうみたいだ。アフォか(笑)
>>855 じゃあ、
>>792 本人だとして、
「$3に仕込まれて好き放題やられる」
の回答は?
-t で多数のメールを出すことは、-tを使わなくてもできるし、
これはsendmailの通常の使用方法だからクラックされたことにはならない。
$3に仕込んで、どうやってクラックするんだ?
>>854 お前アホだろ。シェル関数を繰り返し呼び出すことができるなら仕込む必要はない。
お前ついてこれないようだから、退場。
>>856 >>791では$2には直接多数のアドレスは渡せない。
> これはsendmailの通常の使用方法だからクラックされたことにはならない。
sendmailをクラックするというのはお前の妄想。
まとめると、
>>792 が「$3に仕込まれて好き放題やられる」と書いた時点で、
>>792 自身はヒアドキュメントの内容がシェルに解釈されて
コマンドを実行されてしまうと誤解していた。
>>802 は全くの第3者によるデタラメ回答。
(このあたりで、
>>792 自身も仕込みは不可能なことに気づく)
引っ込みがつかなくなった
>>792 は、
>>806 で -t の md5を書き込む。
もちろん、-t では「好き放題やられる」ことにはならない。
結論:
>>831 の負け。
>>858 クラックじゃなく、通常の使用方法なのに
「仕込んだ」と勝手に言葉を定義し直すのはお前の妄想。
よくいるよね、議論に負けると言葉の定義を変えて言い逃れする奴。
>>858 もとの質問では、シェル関数を作って、それをユーザーに解放して使わせる、
と読めるから、ユーザーは何度でもシェル関数を呼べると考えるのが自然。
forでもwhileでも回せば良い
というか、クラックにも何にもなってない -t を大真面目に回答してる時点で
>>831 の負けだよ。
>>858 >>791の$2はアドレスを渡されるように作られているだが。
アドレスが渡されるはずの引数にスイッチを渡す。これはクラック。
お前も退場。
>>862 >>790がそのように読めるなら。中学校から国語の勉強やり直した方がいい。
ユーザーに開放して使わせるなら「仕込む」必要は全くない。
>>864 で、結局、
コ マ ン ド 実 行 は で き な い
んだろ。それがすべて。お前の負け。
>>858 > $2には直接多数のアドレスは渡せない。
↑ $2に、複数のアドレスをカンマで区切って渡せる。
だから、
>>791 の時点で、-t 以前の問題として
複数アドレスを送ることは可能だった。
結局
>>858 は 複数のアドレスをカンマで区切って渡せることも知らなかったのかwww
>>866 残念ながらARG_MAXという制限があるんだ。
>>865 発言していないことが出来ないと負けなのか? www
なら
コ マ ン ド 実 行 は で き な い
ので、
>>865の負け。絶望的敗退。
>>867 逆にARG_MAXまでなら送れるじゃん。
もともとARG_MAXまでOKだったのに、
-tをつけて「仕込んだ」と言うのは極めて不自然。
>>858 が、$2で複数アドレス指定ができることを知らなかったのは、ガチ。
再度まとめると、
>>792 =
>>831 は、sendmailの引数で、toアドレスを複数区切って並べられることを
知らなかった。そして、-tオプションで複数アドレスが指定できることには気づいた。
それを、「もともとできなかったのができるようになった」
と勘違いして、「仕込めた」と思い込んでしまった。
ところが、
>>866 の指摘通り、「仕込めた」と思ったのは、
「もともとできた」ことだった。
>>858 (の後半)は、赤面モノの間違いカキコ。
いいかげん、別スレでやってほしいなぁ
>>868 もともと出来ていたことなのに、「別の方法でも出来た、これは大変だ」と言って
md5までわざわざ計算して書き込んだお前の負け。
>>867 OSにもよるが、ARG_MAXって4096バイトほどだから、ほとんど制限にならないよ。
>>874 ARG_MAXの制限はとても緩いので、
「多数」でも問題なく送れる。
>>873 の言うとおり。
逆に、Toアドレスを引数指定した方がむしろ送れるアドレス数は多いだろう。
-tでヘッダにTo: Cc:を書くと、ヘッダの行数制限に先に引っかかる。
盛り上がってると思って来てみたらwwwwwwwwwwwwwwwwwwww
30秒斜め読みしただけでここまで来たぜ
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を指定するオプション。
>>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"
>>858 曰く、
> $2には直接多数のアドレスは渡せない。
> $2には直接多数のアドレスは渡せない。
> $2には直接多数のアドレスは渡せない。
> $2には直接多数のアドレスは渡せない。
↑ $2に、多数のアドレスをカンマで区切って渡せる。
-tオプション使うより多数のアドレスをカンマで区切って渡せる。
>>881 -tより多数を渡せないポリシーで運用してる場合もあるだろうね。
それが何か?
こういう流れ見るとなんか安心するわ
>>883 正確には、
>>858 で、
「
>>791 では$2には直接多数のアドレスは渡せない」
って言っているよ。
つまり、sendmailの運用ポリシーは関係なくて、
>>791 のスクリプトの、"$2" とダブルクォートされた状態では
$2に多数(複数)のアドレスを入れられないと
>>858 は勘違いしていたんだろう。
だから、-t オプションで、多数(複数)のアドレスにメールを出せること自体を
>>858 は問題だと勘違いしたんだ。
で、結局コマンド実行を仕込むことは出来ないことが明らかになった。
>>858 が一人で勘違いしていただけ。
>>885 最後の
> で、結局コマンド実行を仕込むことは出来ないことが明らかになった。
が、全然繋がっていないな。
コマンド実行は出来ない。だからお前(
>>885)の負け。
>>868で確定している。
必死に取り繕ってもto="-t"を26時間以内に指摘できなかったお前の負け。www
>>792 > $3に仕込まれて好き放題やられる。
to="-t"としたとして、何を好き放題やられるんだ?
>>792のニュアンスだと
>>791のセキュリティホールを指摘してると思うんだが、
to="-t"は拡張機能みたいなもんで、セキュリティホールでもなんでもないぞ。
889 :
名無しさん@お腹いっぱい。:2008/10/06(月) 06:37:30
>>886 へ。
何を勘違いしてるんだ?
>>865 は、「コマンド実行は出来ない」と主張してる本人だよ。
だから、コマンド実行は出来なかった(セキュリティホールはなかった)んだから、
>>865 の勝ち。
>>831 の負け。
もうこの話題はいいよ。くだらねー
自分専用のスクリプトなら仕込むとかないから問題ないし、
外部から入力された値を使うなら、事前に値の正当性チェックを
するのが常識だろ。その処理を追加すればいいだけ。
まとめると、
>>792 は、最初、セキュリティホールだと思い込んでいた。
だから「好き放題やられる」みたいな言葉を使って書き込んだ。
↓
その後、コマンド実行は出来ないことに
>>792 自身も気づく
↓
それでは悔しいと思った
>>792 は -t オプションに気づく
↓
-tをmd5にして書き込む
↓
でも、-tでは全然セキュリティホールになってないので、
俺を含めてだれもそんな馬鹿げた回答をしなかった
↓
この時点で、
>>792 は、-t じゃなくても、"$2" に多数アドレスをカンマで
付けられることを知らなかった
↓
>>792 が
>>831 で -t の誤った回答を公開
↓
多数アドレスなら、もともと "$2" で指定できることが指摘される。
↓
行き場のなくなった
>>792 は、
>>868 のような意味不明のことを発言。
「コマンド実行できない」なら
>>792 の負け(確定済み)。
892 :
名無しさん@お腹いっぱい。:2008/10/06(月) 07:38:33
いつ答え出てくるの?
ちーん
>>892 答えは
>>791 。
セキュリティホールもないことが確認されたから、安心して使って良い。
いくら $2 に仕込んで成功したところで、
それは $3 に仕込んで好き放題ではない。
>>889 アホ。俺は(831)は一回も「コマンド実行可能」などと発言していない。
「発言していない事が不可能であるから負け」←このルールを作ったのは
>>885 >>885(
>>865)が自分で作ったルールだ
>>885,865はそれに従え。
お前の作ったルールには俺は従わん。
従って「コマンド実行不可能なので
>>885の負け。歴史的敗北」
>>891 後付けの理由を幾ら考えても、26時間で指摘できなかった事実の前に、お前の負け。www
>>895 って、元の議論とは関係ない「メタ議論」になってるよ。
そういうメタな言い方でしか言い逃れが出来ないこと自体、
>>895 自身が負けを認めている。
「コマンド実行可能」という言葉通りには言っていなくても、
それ相当の意味のことを
>>792 は言ってる。
(多数のメールを送ることを「好き放題やられる」とは言わないし、
多数のメールを送ることはもともと "$2" でできるから、
「『$3に仕込まれて』、好き放題やられる」と言う言い方もおかしい。
明らかに、
>>792 の時点で、もっと別のこと、つまりコマンド実行ができると
勘違いしていたと思われる。多分、ヒアドキュメントのシェルの解釈を
間違って考えていたのだろう)
で、結局コマンド実行不可能は明らかな事実。
よって、
>>895 >>831 の負け。
>>897 お前がそのように脳内変換しただけ。読み違えたお前の負け。
>>898 >>831 ところで、-t ってゆうのはあくまで「ヒント」だったよね。
解答はまだだったよね。
ヒントの-t で多数メールを送れる(もともと「$2」ででも送れたけど)
というのはわかったよ。
降参するから、解答を教えてくれないか?
さぞかし「仕込まれて好き放題やられる」というたいそうなことを
「コマンド実行」以外の方法で出来ると
>>898 は言ってるんだから、
是非知りたいよ。
900 :
高3生:2008/10/06(月) 13:15:20
年を取ると「私が間違っていた。すまん。」って素直に謝りにくく
なるんだねぇ。
んなこたー無い
社会的協調性に問題があって、あんまり普通ぽく無い生活をしてるが故に、こんな時間に2ch見られる奴だけだ
勝ち負けに異常にこだわるのは在日ってばっちゃが言ってた
>>898 は「脳内変換」とか「読み違えた」って言うけど、
本当に「-t で多数メール」だとすると、
>>792 が言うように「仕込まれて好き放題やられる」と騒ぐようなことは何もないよね。
「仕込まれて好き放題やられる」と騒いでいる以上、何かを
>>791 は
考えていたはずだ。
>>897 だけじゃなくて
>>888 も同じように思ってるし、
>>897 と同じように「普通に」意味を解釈した人はたくさんいるぞ。
>>898 が、後で言い訳として
>>898 一人だけの(実際は違うけど)「脳内変換」
ということにしたいだけだろ。
904 :
名無しさん@お腹いっぱい。:2008/10/06(月) 16:19:14
あの、
>>831 さん、負けでいいですから、早く本当の解答をください。
831 の -t オプションでメールを多数送れるっていうヒントはわかりました。
そのヒントだけでは答がわからないです。
コマンドを実行するんじゃないというのもヒントですよね。
それもわかりますが、それでも解答はわかりません。
負けでいいですから、"$3に仕込まれて好き放題やられる" という
具体例の解答をお願いします。
>>903 >>792の「$3にしこまれて好き放題やられる」
を勝手に脳内変換して騒いだのはお前。
お前は26時間以内に-tに気付かなかった。事実はこれだけ。
>>905 で、答えは何ですか?
(ヒントは -t 、でも答がまだ出てない)
>>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を指摘できなかった間抜けということ。
>>908 やっぱオマエ、here documentの仕組み知らなかったのかww
-t 答えてしまった後、「アドレス多数」の言い訳、ハタで見てても苦し杉だぞw
>>908 だから、To=-t と言うのはわかったから、
それで「好き放題やられる」にはどうすればいいんですか?
試しに、-tで、アドレスいっぱい付けてメール出してみましたけど、
ちゃんと動作しました。「好き放題やられる」ためには
あとまだ何かしなければならないんでしょうけど、
その方法を教えてください。
シェルスクリプトで同一ネットワーク内のホストにrloginして、いくつかコマンドを入力して元のホストに戻ってくることってできる?ちなみに環境のせいかrshは使えない…
>>806 では「ヒント」って言ってるね。
>>831 (-t)はまだヒントの段階。
最終的な「答え」は何でしょうか?
>>831 ヒントだけ出して、答え書かずに逃げる気か?
実は答が間違ってたから、ウヤムヤにしたいの?
capistranoは、あれはssh前提だし、そもそもrubyだな。
>>911 素直に rshd 動かせよ。
rlogind と rshd はサービスは別物。ポート番号も違う。
>>909 「やっぱり」とか全然繋がっていない。
やっぱり-tを指摘できなかったボンクラの事だけはあるな。www
また下らんことで盛り上がったんだな
そういうなよ
>>831 って、24時間も引っ張った挙げ句に書いた -t(笑) が、
ヒントにも答えにもなってないことがわかって、
よっぽど悔しかったんだろうね。
ヒントにも答えにもなってないだから、
誰も答えるはずないよ。
>>831 を非難してるのは俺だけじゃないよ。
俺以外の人間も同じように
>>831 に反対するカキコしてることは
(少なくとも)俺自身はわかってる。
(自分以外で
>>831 を攻撃してるカキコが多数あるから)
>>920 お前
>>907だろ。お前は馬鹿すぎるから相手にしていない。
面倒だから突っ込まなかったけど、明白なでたらめな発言してるな。
訂正して謝罪しろ。そして退場。
ヒント
102e7bda3ff4572145809d25da2bbe11
ほんと壷って役にたたねーな
くやしいのうwww
>>916 大学だからそうもいかないのよ…。
調べてみたかぎりexpectで良さそうなんだけど、expect使うとローカルかリモートかで頭の中がこんがらがって良く分からなくなる。。もう少し考えてみるか…
aa
パイプしまくったら戻り値には最後のコマンドのものが入る
であってますか?
例外はありますか?
難しいこと聞くね 君は
echo "ねるぽ" | gzip | gzip -c | cat -