シェルスクリプト総合 その20
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2012/06/08(金) 00:35:51.19スクリプトのお勉強・自慢・腕試しなどにどうぞ。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ
シェルスクリプト総合 その19
http://toro.2ch.net/test/read.cgi/unix/1323515200/
0630名無しさん@お腹いっぱい。
2012/08/10(金) 01:39:01.51コンパイル時決め打ちだからちょっとまずいね。
0631名無しさん@お腹いっぱい。
2012/08/10(金) 01:58:31.640632名無しさん@お腹いっぱい。
2012/08/10(金) 07:29:33.75現在、'nc -l 12345'コマンドを発行し、それに対しsocket通信を行い、期待した通信が行われているか確認しています。
しかし、上記コマンドでは1回closeしてしまうと、上記コマンドも終了してしまいます。
連続的にsocket通信を行い、期待した結果が入っているかチェックを行いたかったので、以下のようなスクリプトを書きました
while :
do
`nc -l 12345`
done
しかし、上記を実行して、socket通信を行うと、なぜか、送信したデータを表示するのではなく、実行しようとして、エラーメッセージが出ます
socket通信を受けるたびに、nc -l... コマンドを発行し通信内容を表示するにはどうすればいいのでしょうか?
よろしくお願いいたします。
0633名無しさん@お腹いっぱい。
2012/08/10(金) 07:34:47.58` ` が余計だろ。
0634名無しさん@お腹いっぱい。
2012/08/10(金) 07:57:12.67わざわざシェルスクリプトにしなくても、
nc -k -l 12345
を発行(笑)すればcloseしても終了しないよ。
0635名無しさん@お腹いっぱい。
2012/08/10(金) 13:05:30.890636名無しさん@お腹いっぱい。
2012/08/10(金) 13:07:59.840637名無しさん@お腹いっぱい。
2012/08/10(金) 13:23:20.110638名無しさん@お腹いっぱい。
2012/08/10(金) 13:32:30.350639名無しさん@お腹いっぱい。
2012/08/10(金) 13:39:44.13> nc -k -l 12345
に使うのは正しいが、
> を起動
とは使わない。
> のように起動
0640名無しさん@お腹いっぱい。
2012/08/10(金) 13:49:30.52ktkr
0641名無しさん@お腹いっぱい。
2012/08/10(金) 14:01:15.32issueは機械語命令レベルならアリだけどな。
0642名無しさん@お腹いっぱい。
2012/08/10(金) 14:24:21.060643名無しさん@お腹いっぱい。
2012/08/10(金) 15:47:16.980644名無しさん@お腹いっぱい。
2012/08/10(金) 17:51:11.83乙
> ・ fifoのwrite openは、readするプロセスがいなければブロックされる。
そうか、これで read 側のオープンを検知できるのね。勉強になった。
この named pipe を使わう場合の実装、面倒臭そうだなー。
0645名無しさん@お腹いっぱい。
2012/08/10(金) 18:01:48.990646名無しさん@お腹いっぱい。
2012/08/10(金) 18:03:28.19open()に O_NONBLOCK フラグ付けて呼べば「検知」できるだろ。
0647名無しさん@お腹いっぱい。
2012/08/10(金) 18:04:12.63なにいってんの?
read側のオープンをブロックするって何?
0648名無しさん@お腹いっぱい。
2012/08/10(金) 18:04:46.74procfsがデフォで有効になってないこととも関係ある?
0649名無しさん@お腹いっぱい。
2012/08/10(金) 18:07:24.02O_NONBLOCKで行けるなら、昨日誰かが言ってた select()でも検知できそうだな。
0650名無しさん@お腹いっぱい。
2012/08/10(金) 18:16:22.36相手が読出しopenしてブロック解除されたことで「検出」してる。
0651名無しさん@お腹いっぱい。
2012/08/10(金) 18:33:26.93だと
1. named pipe作成
2. 読み出しオープン→cmd1実行
3. 書き込みオープン→cmd2実行
こんな順のはず。SIGPIPE/EPIPE食らわないように。
0652名無しさん@お腹いっぱい。
2012/08/10(金) 19:26:29.50procfsもfdescfsも、Linuxのエミュレーションのためにあるような代物なのです。
fdescfsを使わない方がシステムとして美しい。
/dev/fd/ なんて使わずにnamed pipeできっちり実装した方がいいのです。
0653名無しさん@お腹いっぱい。
2012/08/10(金) 19:36:16.750654名無しさん@お腹いっぱい。
2012/08/10(金) 19:52:21.85またそういう嘘をつかないように。
/proc/ も /dev/fd/ も、どちらもベル研UNIX発祥の由緒正しいアイディアだよ。
*BSD や Linux だけじゃなく、Solaris 含む SVR4 系 UNIX でも実装されてる。
0655名無しさん@お腹いっぱい。
2012/08/10(金) 20:09:40.36FreeBSDって、6か7かあたりで /procをマウントしなくなったじゃん。
Linuxとは違って各コマンドが /procに依存してない。
だから今のFreeBSDは /procを外す方向でしょ。
fdescfsの方は知らんけど。
0656名無しさん@お腹いっぱい。
2012/08/10(金) 20:13:34.09FreeBSDハンドブックあたりには「セキュリティ上の理由」みたいなこと書いてあったような気がするけどその理由が良く分からんかった。
Linuxでは/procに頼ってるソフト結構あるせいでFreeBSDでは動かなかったりしそう。
0657名無しさん@お腹いっぱい。
2012/08/10(金) 20:14:23.290658名無しさん@お腹いっぱい。
2012/08/10(金) 20:24:09.55意味ないじゃんみたいなことを偉い人が言ったせいだって話を、どっかで
誰かが書いてたような気がする。
NetBSDは昔っから/procはマウントしてない。
で、fdescfs使うかどうかはあまり問題じゃなくて、/dev/fd/*がちゃんと
使えればそれでいいんだと思うよ。devfs登場前のFreeBSDとか、NetBSDとかは
fdescfsなしでも/dev/fd/*が、まあまあちゃんと使えたわけで、だったら
fdescfsなしでもいいじゃんみたいな発想だと思う。
devfs導入時に、/dev/fd/*が中途半端な状態になっちゃった(3未満の
ディスクリプタに対してしか動かなくなった)のが真の問題でしょう。
サポートしないつもりなら/dev/fd/*を削った方がいいし、サポートする
つもりなら、もうちょっとなんとかした方が。
0659名無しさん@お腹いっぱい。
2012/08/10(金) 20:27:13.360660名無しさん@お腹いっぱい。
2012/08/10(金) 20:28:39.420661名無しさん@お腹いっぱい。
2012/08/10(金) 20:33:35.240662名無しさん@お腹いっぱい。
2012/08/10(金) 20:35:08.85ベル研のprocfs登場時の主要機能は、子プロセス以外のプロセスを、
デバッガでアタッチすることだったんよ。
今どきのptrace(2)は標準でこの機能を含んでいるので、
若者は知らなくても仕方ないが。
ptrace(2)にない機能のうち一部は、NetBSDの場合sysctlのproc階層で
サポートしてたりするが、FreeBSDのsysctlって、proc階層はないんだっけ。
0663名無しさん@お腹いっぱい。
2012/08/10(金) 20:37:40.19NetBSDの偉い人が/procについて言ってたのは、まさにそういう話だった希ガス。
robustだし、余計なエンコード→デコードとか、ファイルシステムとして
見せるための諸々のオーバーヘッドがなくて効率的だとか。
0664名無しさん@お腹いっぱい。
2012/08/10(金) 20:41:55.71/procをread/writeしてメモリ、ファイル、統計情報読み書き、設定変更するくらいで。
0665名無しさん@お腹いっぱい。
2012/08/10(金) 20:46:25.76それは/proc経由でシグナル送ったり、リソース設定変更/取得したりする時の話でしょ。
/proc全てを0/1で考える必要はないよね。
Named pipeをunlinkする戦略練るより、fd叩くほうがずっと便利だもの。
0666名無しさん@お腹いっぱい。
2012/08/10(金) 20:47:55.890667名無しさん@お腹いっぱい。
2012/08/10(金) 20:50:45.89process関係ないw
processorじゃ!とかなしよん
0668663
2012/08/10(金) 20:52:29.93それはfdescfsの話だから。
procfsの存在価値は疑問だけど (ptraceやsysctlの方がいい)、
/dev/fd/* はあった方がいいよ。
FreeBSD上で問題を今すぐ解決するには、fdescfsを使うのが楽だけど、
FreeBSD的にはdevfs を直す方がいいのかもしれん。
よく知らないけど。
0669名無しさん@お腹いっぱい。
2012/08/10(金) 20:55:14.28さすがにLinuxの人も無理に気づいたみたいで、最近は/procじゃなくて
/sys階層に入れるようにしてるよね。
過去に入れちゃった奴はておくれで残ってるけど。南無南無。
0670名無しさん@お腹いっぱい。
2012/08/10(金) 20:59:10.47/proc, /sysみたいにテキストになってるもの素敵やん。
0671名無しさん@お腹いっぱい。
2012/08/11(土) 00:12:39.76スクリプト言語から使うときなんかはテキストの方が楽だったりするね
(言語によるけど)。
そういう場合はprocfsやkernfsを使えばいいんだよ。
低級言語で書かれたOS付属コマンドまでそういうのに頼る必要はないけど。
0672名無しさん@お腹いっぱい。
2012/08/11(土) 00:20:16.15中継用のコマンドをユーザーランドに置いておけばよくて、
カーネルがサポートしなくてもいいよね
0673名無しさん@お腹いっぱい。
2012/08/11(土) 01:49:37.99/dev/fd/* みたいなのは、なんらかのカーネルサポートが必要だが。
0674名無しさん@お腹いっぱい。
2012/08/14(火) 03:35:46.04bashだけのものですか?
他のシェルでも使える?
0675名無しさん@お腹いっぱい。
2012/08/14(火) 09:38:22.60ただし、PS1とかの中の特殊文字の解釈はシェルごとに異なる。
0676名無しさん@お腹いっぱい。
2012/08/14(火) 20:07:54.88echo abcde | zip test.zip -
ってやると圧縮ファイルに標準入力データを追加できるのですが
追加されたファイル名が「-」になってしまいます。
ファイルをディスクに書かずに、パイプを使ってzip圧縮までやりたいです。
0677名無しさん@お腹いっぱい。
2012/08/14(火) 20:15:26.80echo abcde | zip test.zip hoge.txt
とか。symlinkは許せ。
0678名無しさん@お腹いっぱい。
2012/08/14(火) 22:50:08.33希望が見えました。ありがとう。
0679名無しさん@お腹いっぱい。
2012/08/14(火) 23:00:48.310680名無しさん@お腹いっぱい。
2012/08/15(水) 05:39:00.88普通にtemporaryファイルつくって消したら?
0681名無しさん@お腹いっぱい。
2012/08/15(水) 06:50:20.970682名無しさん@お腹いっぱい。
2012/08/16(木) 00:43:00.83echo $VAR とすると全て一行で表示されてしまいますが、
元のdfの出力結果をそのまま表示するようにするにはどうしたらいいでしょうか?
0683名無しさん@お腹いっぱい。
2012/08/16(木) 00:47:05.41って最近似たような質問見たような。
0684名無しさん@お腹いっぱい。
2012/08/16(木) 01:01:11.89すいません、""の存在をすっかり忘れていました。
ありがとうございました。
0685名無しさん@お腹いっぱい。
2012/08/16(木) 13:52:12.32echo $((91-72)) はちゃんと出るけど
A=$((91-72)) は出来ない。
まさかいちいちA=`echo $((91-72))`ってやんの?
0686名無しさん@お腹いっぱい。
2012/08/16(木) 13:57:08.74$ A=$((91-72))
$ echo $A
19
できてるけど
0687名無しさん@お腹いっぱい。
2012/08/16(木) 14:00:53.80A=$((91-72)) は出来ない、という環境は何か?
というエスパー検定だろw ちょっと上級の問題だな。
0688名無しさん@お腹いっぱい。
2012/08/16(木) 16:01:24.160689名無しさん@お腹いっぱい。
2012/08/16(木) 17:14:30.15系とエスパー
0690名無しさん@お腹いっぱい。
2012/08/16(木) 18:10:35.35ってなんでエラーになるの?
0691名無しさん@お腹いっぱい。
2012/08/16(木) 18:14:24.15wcの出力にファイル名(a.txt)が出ちゃうから。
echo $(( `wc -l < a.txt` / 2 ))
で桶
0692名無しさん@お腹いっぱい。
2012/08/16(木) 20:20:08.24ありがとう
0693名無しさん@お腹いっぱい。
2012/08/17(金) 12:54:21.22ベタテキストよりオブジェクトそのままの方が扱いやすい。
0694名無しさん@お腹いっぱい。
2012/08/17(金) 14:11:13.110695名無しさん@お腹いっぱい。
2012/08/18(土) 09:29:13.33linuxのシェルでの問題です。
@aaa="a b";echo ${aaa}
a b と半角スペースがなぜ詰まるのでしょうか?
ASJISテキストファイル編集時の文字化け
やりたい事、csv2ファイル入力し、双方マッチングし
条件により、行データを出力するしないを制御するだけのものです。
そこで、head,cat,sort,uniqコマンドを|で通した後をリダイレクト
で出力したものに関しては文字化けは見受けられなかった。
文字化けが発生したのは
read LINEで一行読込
echo ${LINE} >> out.cvs で追加出力
とした場合のみ
前者後者あまり違いが内容に思われるのですが対策って有るでしょうか?
ちなみにlinux側の文字コードはutf8設定です。
当編集シェル実行時のみ文字コードを環境変数なりで変えることは
可能でしょうか?またその方法は有効でしょうか?
よろしくお願いします。
0696名無しさん@お腹いっぱい。
2012/08/18(土) 09:37:46.512 readはバックスラッシュを解釈する。したがってSJISでは利用できない。
0697名無しさん@お腹いっぱい。
2012/08/18(土) 09:39:32.05機種依存文字使うな
aaa="a b";echo "$aaa"
echo "$LINE"
同じような質問が、>>683 で出たばかり
0698名無しさん@お腹いっぱい。
2012/08/18(土) 09:42:26.61どうせbashだろうから、
IFS= read -r LINE
echo "$LINE"
でいいな。
0699名無しさん@お腹いっぱい。
2012/08/18(土) 09:56:30.061.機種依存注意します。
2.類似質問分からず失礼しました。
職場ではnetに繋げないため、別の場所からの質問でした。
直ぐの確認できませんが、後ほど確かめます。
ありがとうございました
0700名無しさん@お腹いっぱい。
2012/08/18(土) 10:32:16.48スレチですまんのだが、丸数字は10年以上前に UNICODE に採用されているし、
UTF-8 表示できない環境でまともに Web 閲覧できるとは思えないし、MAC も
最早 Windows 側にあわせてるらしいので機種依存文字として指摘するのもそろそろ
終わりにして良いんじゃないかな。
0701名無しさん@お腹いっぱい。
2012/08/18(土) 10:46:31.570702名無しさん@お腹いっぱい。
2012/08/18(土) 10:56:37.52SJIS @
0703名無しさん@お腹いっぱい。
2012/08/18(土) 11:02:46.61Web上で単純閲覧は出来ても、コピー(引用)編集時に化けるという問題があるよ。
0704名無しさん@お腹いっぱい。
2012/08/18(土) 14:37:23.030705名無しさん@お腹いっぱい。
2012/08/18(土) 14:43:39.83ばかじゃね?
0706名無しさん@お腹いっぱい。
2012/08/18(土) 14:46:18.510707名無しさん@お腹いっぱい。
2012/08/18(土) 15:04:19.060708名無しさん@お腹いっぱい。
2012/08/18(土) 15:26:19.780709名無しさん@お腹いっぱい。
2012/08/18(土) 15:33:34.030710名無しさん@お腹いっぱい。
2012/08/18(土) 16:26:28.280711名無しさん@お腹いっぱい。
2012/08/18(土) 16:49:46.330712名無しさん@お腹いっぱい。
2012/08/18(土) 16:53:07.24なんだかな。。。
>>711
意味不明なオレ様英語で書かれるより遥かにマシ。
0713名無しさん@お腹いっぱい。
2012/08/18(土) 17:39:52.74確かに。ヘタな英語のほうがまだマシだな。
0714名無しさん@お腹いっぱい。
2012/08/18(土) 22:13:16.26心配でしたので、自分のPCにcygwinをいれて試してみました。
1,2点確認取れました。
全く同じ環境ではないですが、問題なさそうですね。
安心しました。助かりました。
ありがとうございました。
0715名無しさん@お腹いっぱい。
2012/08/19(日) 08:36:59.512chのエンコードコードがUTF-8なら同意見なんだが、残念ながらSJISだ。
そして、SJISのコードページが複数あり、HTMLのshift_jisが機種依存文字を明確に定義していない以上、機種依存問題は残る。
ただ、その中でも丸数字は現在Webクライアントで使われているほとんどのコードページで共通なので問題は起きないとは思う。
0716名無しさん@お腹いっぱい。
2012/08/19(日) 08:55:36.890717名無しさん@お腹いっぱい。
2012/08/19(日) 09:32:20.05どの板?
0718名無しさん@お腹いっぱい。
2012/08/19(日) 13:27:36.99スレ違いなので誘導?です↓
2chで外国語の特殊文字を使うには[unicode][専ブラ] 2
http://awabi.2ch.net/test/read.cgi/gogaku/1298542858/
0719名無しさん@お腹いっぱい。
2012/08/19(日) 14:00:34.37その板も Shift_JISだねw
0720名無しさん@お腹いっぱい。
2012/08/19(日) 17:08:00.350721名無しさん@お腹いっぱい。
2012/08/20(月) 00:07:04.29正規化してフルパスにしたいんだけど
一番かっこういい方法はどんな手順?
0722名無しさん@お腹いっぱい。
2012/08/20(月) 00:10:53.29FreBSDならrealpath
0723名無しさん@お腹いっぱい。
2012/08/20(月) 00:37:28.76NetBSDではどうしたらいいんでしょうか
0724名無しさん@お腹いっぱい。
2012/08/20(月) 00:40:15.070725名無しさん@お腹いっぱい。
2012/08/20(月) 00:40:16.430726名無しさん@お腹いっぱい。
2012/08/20(月) 01:00:03.170727名無しさん@お腹いっぱい。
2012/08/20(月) 01:56:51.87完璧な方法
1 openする
2 fstatかける
2 /からinode,dev一致するファイルを探す
0729名無しさん@お腹いっぱい。
2012/08/20(月) 06:32:20.27それだと対象ファイルがパーミッションでopenできない時に使えない。
openせずに直接 statした方が良い。
■ このスレッドは過去ログ倉庫に格納されています