トップページunix
987コメント278KB

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

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名無しさん@お腹いっぱい。2012/11/15(木) 18:57:33.11
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 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でそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その20
http://toro.2ch.net/test/read.cgi/unix/1339083351/
0836名無しさん@お腹いっぱい。2013/08/08(木) NY:AN:NY.AN
ashとbash比較した時
クライアング運用ならashのが劣っている点はなんですか?
0837名無しさん@お腹いっぱい。2013/08/08(木) NY:AN:NY.AN
補間、ヒストリできないだろ。それに耐えられるならどうぞ。
0838名無しさん@お腹いっぱい。2013/08/08(木) NY:AN:NY.AN
そいつ荒らしだから相手しちゃいかんよ。
0839名無しさん@お腹いっぱい。2013/08/08(木) NY:AN:NY.AN
少なくともFreeBSDで魔改造されてる/bin/shは補完、ヒストリー呼び出し(!では呼び出せないが)は出来る。
0840名無しさん@お腹いっぱい。2013/08/08(木) NY:AN:NY.AN
じゃあashをもっと使うべきだよね
0841名無しさん@お腹いっぱい。2013/08/08(木) NY:AN:NY.AN
ログインシェルとして普通に使ってるよ。
0842名無しさん@お腹いっぱい。2013/08/08(木) NY:AN:NY.AN
わかりました。ashでクライアング運用することにします。
0843名無しさん@お腹いっぱい。2013/08/18(日) NY:AN:NY.AN
Postfix にメールが届いた時pipeを使ってrbenvでインストールしたrubyにプログラムを処理させたいのですが
ruby command not foundになってしまいます。
ログインシェルじゃないから.bashrcが読み込まれていないのが原因だと思いますがsourceで読み込んでみたり、bash -l -cなども試しましたがやはり読み込んでくれません
どこで質問したらいいかもわからず、もしすれ違いなら誘導して頂けると嬉しいです
0844名無しさん@お腹いっぱい。2013/08/19(月) NY:AN:NY.AN
env で環境変数を適切に設定してやればいいだけじゃないの?
まあ、個人設定に依存するものをシステムワイドな環境で実行できるようにするのは
セキュリティホールなので、できたとしてもやらない方がいいと思うけど。

# ruby を実行させるコマンドだったはずなのに後でユーザが破壊的な処理をする
# スクリプトに置き替えたら、システムの権限で動いてしまう。
# postfix なら root では実行されないのでまだマシだけど。
0845名無しさん@お腹いっぱい。2013/08/19(月) NY:AN:NY.AN
http://cr.yp.to/daemontools.html
これ使えば、楽なんだけど
0846名無しさん@お腹いっぱい。2013/08/19(月) NY:AN:NY.AN
postfixにはsmrshみたいな仕組みあるのかな。
sendmailでやってたのずいぶん昔の話だから覚えてないや。
0847名無しさん@お腹いっぱい。2013/08/20(火) NY:AN:NY.AN
>>846
http://www.postfix.org/postconf.5.html#local_command_shell
0848名無しさん@お腹いっぱい。2013/08/20(火) NY:AN:NY.AN
>>843
Postfix(8)
http://toro.2ch.net/test/read.cgi/unix/1227953898/
0849名無しさん@お腹いっぱい。2013/08/20(火) NY:AN:NY.AN
>>843
「pipeを使って」とは http://www.kobitosan.net/postfix/trans-2.2/jhtml/pipe.8.html
これのこと?
そして実行したいrubyのプログラムを実行するシェルスクリプトをpipeのコマンドとして指定してるということ?
だとしたら rbenv で、どれかのrubyを選択しているときのシェルの環境変数を調べて、
postfixのpipeで実行しているシェルスクリプトの最初で同じになるように設定すれば、なんとかならないかな?
08508432013/08/20(火) NY:AN:NY.AN
聞いといて申し訳ないのですが仕様が変更になりPostfixは使わなくなりました。緊急性がなくなり気が抜けてしまいましたが頂いた参考URLは見させてもらいます。アドバイスいただき本当にありがとうございました
0851名無しさん@お腹いっぱい。2013/08/27(火) NY:AN:NY.AN
ディレクトリの中に複数のテキストファイルが入っていて、
各々のファイル名を取得してそのファイル自身にファイル名を書き込むというか追加していく
というシェルスクリプト教えて下さい!
0852名無しさん@お腹いっぱい。2013/08/27(火) NY:AN:NY.AN
>>851
学校の宿題っぽいな。
テキストファイルの拡張子がtxtだったとすると、
ワンライナーで、
$ for t in *.txt; do echo $t >> $t; done
でいけると思うが、宿題でなければこれで解決だろ。
0853名無しさん@お腹いっぱい。2013/08/28(水) NY:AN:NY.AN
>>852さんありがとうございます!
宿題ではないですが超初心者です。
テキストファイルなんですが拡張子が付いてないので
試しに.txt拡張子追加してから

$ for t in *.txt; do echo $t >> $t; done

をtest.shという名前で保存して
テキストファイルがあるフォルダに放り込んでchmod +xしてから
実行しました。エラーもなく終わるんですが、どこにもファイル名が追加
されてないようです。
0854名無しさん@お腹いっぱい。2013/08/28(水) NY:AN:NY.AN
>>853
bash test.shしてみなさい
0855名無しさん@お腹いっぱい。2013/08/28(水) NY:AN:NY.AN
>>854さん、ちゃんと最下段にファイル名追加されました、感動です!
ありがとうございます!
0856名無しさん@お腹いっぱい。2013/08/28(水) NY:AN:NY.AN
>>855
ということは、もしかしてtest.shを実行するつもりで
$ test
ってやりました?
0857名無しさん@お腹いっぱい。2013/08/28(水) NY:AN:NY.AN
そんなわけないだろう。
なぁ?
0858名無しさん@お腹いっぱい。2013/08/28(水) NY:AN:NY.AN
最初は改行コードがLFになってなくて動かなくて
それに気づいて改行コード直したら、今度は
>>852さんの
$ for t in *.txt; do echo $t >> $t; done
をそのまんまコピペして行頭の$を取るの忘れてsyntax error出ました。

それでやっと$取り忘れたの気がついて動きました、お手数かけてすみませんでした。
0859名無しさん@お腹いっぱい。2013/09/04(水) 02:17:02.05
CentOSの再起動のたびに複数あるSCSIデバイス名(/dev/sd*)が変更される。
でもブロックデバイスでしか動作しないソフトがある・・・てことで、
/dev/disk/by-idやmultipath -lのようなコマンドでメジャー/マイナー番号を引き、
mknodで固定的なデバイスを作成する
・・・みたいなことをシェルで実装したいのですが可能なものですか?
0860名無しさん@お腹いっぱい。2013/09/04(水) 03:37:09.69
手作業で出来ているなら、シェルスクリプトでも出来るはず
0861名無しさん@お腹いっぱい。2013/09/04(水) 07:11:59.18
>>859
変な小細工せずに、/etc/udev/rules.d/??-persistent.rules で設定して
SCSIデバイス固定にするのが筋だろ。
0862名無しさん@お腹いっぱい。2013/09/06(金) 19:49:14.08
udevadm info -a -n /dev/sda
で出てくる条件で固有のものをさがして
ATTRS{model}=="FD-05PUQ",MODE="0666",SYMLINK+="fd0"
って感じでrulesに書くんだけどね。
一行のうち"=="が条件文で"="や"+="が実行文
0863名無しさん@お腹いっぱい。2013/09/08(日) 18:32:55.58
下記のようなフォルダ構成(src,src2など複数のフォルダがある、src直下にファイルがある、複数階層のフォルダがある)になっていて
src以下と同じフォルダ構成をlinkフォルダ以下に作成し
src以下にある全ファイルのシンボリックリンクをlink以下の同じフォルダの場所に作成したいです。
そこに、src2以下も同様にシンボリックリンクを作成し、linkフォルダ以下ではsrcとsrc2がマージされた状態としたいです。

また、シンボリックリンクのリンク先は絶対パスではなく相対パスで設定しておきたいです(myrootフォルダごと移動しても動くようにするため)
srcとsrc2には、同じファイル名のファイルが入っていることはありません。
どんなスクリプトでできるでしょうか?

現在:
myroot/
 link/
 src/
  a.txt
  f1/
   b.txt
  f2/
   f3/
    c.txt
 src2/
  f2/
   d.txt
08648632013/09/08(日) 18:33:28.24
期待値は以下のような構成になることです

期待:
myroot/
 link/
  a.txt
  f1/
   b.txt
  f2/
   d.txt
   f3/
    c.txt
 src/
  以下略

自分でやろうとしてみたところ
フォルダを決め打ちにしてやったとしても
シンボリックシンクを相対パスで設定することがうまく思いつきませんでした
0865名無しさん@お腹いっぱい。2013/09/08(日) 18:47:07.89
>>863
そのために lndirってコマンドがあるんだけど。それじゃダメ?

あ、imakeとかxmkmfとかの系統のコマンドだから、年代物なんだけどね。
0866名無しさん@お腹いっぱい。2013/09/08(日) 19:06:55.94
>>865
返信ありがとう。lndir知りませんでした。
ですがlndirだとsrcは絶対パスを渡す必要があるようでした。

myrootを移動できるように、相対パスでできるとうれしいです
0867名無しさん@お腹いっぱい。2013/09/08(日) 19:34:41.88
>>866
何言ってんだよw

lndir に相対パス渡せるよ。普通相対パスで使うし。
08688632013/09/08(日) 20:20:29.08
>>865,867
ありがとうございます!
相対パスで指定できました

カレントではなくlink からみた相対パスを指定するんですね
すみませんmanもちゃんと見ずに決めつけてしまってました

myroot $ lndir ../src link && lndir ../src2 link
0869名無しさん@お腹いっぱい。2013/09/11(水) 23:16:48.16
おまいら、ちょっくら教えてください。

↓のような感じのCSV形式の通信ログがあります。
[日時],[送信元IP],[送信元Port],[宛先IP],[宛先Port],[TCPorUDP],[bytes],[通信時間(s)]

このログから送信元IPが"192.168.0.1"の行だけを抜き出したいのですが、
単純にgrep "192.168.0.1"とかすると、宛先IPが"192.168.0.1"の場合も
かかってしまいまつ。(´・ω・`)

2番目の要素のところだけで検索をかけられるような、簡単なコマンドとか
処理方法ってないでしょうか? ご存じでしたらおながいします。
0870名無しさん@お腹いっぱい。2013/09/11(水) 23:26:35.43
>>869
awk -F, '$2 == "192.168.0.1" { print }'
08718692013/09/11(水) 23:49:22.31
>>870
ありがd
0872名無しさん@お腹いっぱい。2013/09/16(月) 00:31:27.99
cshの組み込みコマンド echo で¥nを改行コードとして扱いたいのですが。
例)echo "test"¥n"test"

test
test

bashは使えない環境のため、cshで実現をしたいのですが、可能でしょうか?
0873名無しさん@お腹いっぱい。2013/09/16(月) 00:33:52.08
>>872
> cshの組み込みコマンド echo で¥nを改行コードとして扱いたいのですが。
すみません、文字化けしてしましました・・・
¥n(円マーク)nです。
0874名無しさん@お腹いっぱい。2013/09/16(月) 00:51:21.64
>>872です

もう一つ、教えてください。
#!/bin/csh -f
と、シェバンの中で-fを指定すると、.cshrcの中で指定したエイリアスが有効になりません。
login.cshrcなら有効になるかと考え設定したのですが、こちらでもダメでした。
他にエイリアスを設定するのに有効な場所はないでしょうか。
0875名無しさん@お腹いっぱい。2013/09/16(月) 01:19:53.67
>>872です。
もう1つだけ。
組み込みコマンドを無効化することはできないでしょうか。
組み込みコマンドを無効にし、Gnu Coreutilesのechoを利用する、という方法も検討したいのですが。
0876名無しさん@お腹いっぱい。2013/09/16(月) 01:33:38.17
>>875
echo をフルパス指定で実行すれば?
0877名無しさん@お腹いっぱい。2013/09/16(月) 02:02:57.34
>>876
> >>875 
> echo をフルパス指定で実行すれば?
ありがとうございます。

既存のアプリケーションを改修できないため、フルパスでの指定は不可能なのです。
# 既存のソースコーソは#!/bin/csh -f ; echo "hogehoge"ときさいされており。
0878名無しさん@お腹いっぱい。2013/09/16(月) 08:54:19.20
シェルスクリプトなんだから改修ぐらいしろよ
修正できないっていう前提がおかしい
0879名無しさん@お腹いっぱい。2013/09/16(月) 09:54:54.21
>>878
> シェルスクリプトなんだから改修ぐらいしろよ
> 修正できないっていう前提がおかしい
そうですよね。プロジェクトの方針なので・・・
複数システムとソースを共有しており、1箇所ソースを修正すると
複数システムに影響があるため許可が出なく。
修正するべきだと思うのですが。
0880名無しさん@お腹いっぱい。2013/09/16(月) 09:57:13.27
>>873
可能だと思いますが、なぜできないかもしれないと思われるのでしょうか。
0881名無しさん@お腹いっぱい。2013/09/16(月) 10:05:41.73
>>874
-fは環境を引き継がないプロセスの起動になるので、エイリアスだけでなく、その他も引き継げなくなります。
一行目のシェル宣言はシェル起動時に実行ファイルではなく、シェルの引数として渡すことで無視されます。
% csh 実行ファイル.csh
0882名無しさん@お腹いっぱい。2013/09/16(月) 10:22:31.51
>>880
> 可能だと思いますが、なぜできないかもしれないと思われるのでしょうか。
実際に夏季のようなスクリプトを書いて挙動を確認したのですが、
¥nが文字列として扱われ、改行記号として扱われませんでした。

% cat 1_test.csh
#!/bin/csh

type echo
which echo

echo "abc\ndef"

% ./1_test.csh
echo is a shell builtin
echo: shell built-in command.
abc\ndef

bashだと-eを使うことでうまく処理できるのですが。
echo -e "ttt\nttt"
ttt
ttt
0883名無しさん@お腹いっぱい。2013/09/16(月) 10:29:07.00
>>881
> 一行目のシェル宣言はシェル起動時に実行ファイルではなく、シェルの引数として渡すことで無視されます。
> % csh 実行ファイル.csh

cshの引数にしたのですが、実行ファイルの先頭で宣言しているためやはり無効化されるようです。

◯-f付きのシェルファイル
% cat 2_test.csh
#!/bin/csh -f

type echo
which echo

echo "ghi\nlmn"

◯呼び出し元のシェルファイルでエイリアスを設定後、cshの引数として実行
% cat test.csh
#!/bin/csh

alias echo /bin/echo

csh ./2_test.csh

% ./test.csh
echo is a shell builtin
echo: shell built-in command. (←エイリアスが無効になっている)
ghi\nlmn
0884名無しさん@お腹いっぱい。2013/09/16(月) 11:01:58.54
>>882
いくつかの環境で試したのですが、シェルファイルではうまくいく環境もありました。(コマンドラインは大体ダメでした)
妥協になりますが、素直に改行するのはどうでしょうか?
echo "abc"
echo ""
echo "def"

どのシステムでも動くと思いますので、安全度が増します。
0885名無しさん@お腹いっぱい。2013/09/16(月) 11:12:56.37
>>884
> 妥協になりますが、素直に改行するのはどうでしょうか?
そうですね、最終的にはロジックを修正してすすめることになると思います。
が、修正せずに進められるのでしたらそのほうがよく。

> どのシステムでも動くと思いますので、安全度が増します。
そうですね・・・移植性の高いソースにするには、そうすべきだと思います。
0886名無しさん@お腹いっぱい。2013/09/16(月) 11:37:28.95
>>883
.cshrcか何かにaliasの設定はしていますか?
呼び出し元で定義したaliasは引き継がれません。
環境変数や変数などは引き継がれないことがあるので注意が必要です。
0887名無しさん@お腹いっぱい。2013/09/16(月) 13:59:13.40
>>883
> % csh 実行ファイル.csh

それが許されるなら、
alias echo /bin/echo
を書いたファイル "foo" を用意して、

$ cat foo 実行ファイル.csh | csh -f -s

で実行すればいいのでは
0888名無しさん@お腹いっぱい。2013/09/16(月) 20:28:28.64
.cshrcを何回実行しても破綻しないようにして
(set path = ($path hoge) のようなものは避ける)
source .cshrcで読んでしまえばいいんじゃないの?
0889名無しさん@お腹いっぱい。2013/09/16(月) 21:44:09.50
csh(笑) うぜぇ〜

↓のスレに移動してこっちへは帰ってくんな!
C shell 撲滅委員会
http://toro.2ch.net/test/read.cgi/unix/1094041299/
0890名無しさん@お腹いっぱい。2013/09/16(月) 22:15:45.70
>>889
csh が大好きだから csh で開発するぜ!
って話じゃないんだから悪くないだろ。
0891名無しさん@お腹いっぱい。2013/09/16(月) 22:30:01.35
>>886 , 887
返事が遅れてすみません。


.cshrcを利用することは諦めました。
全スクリプトファイルが共通で呼び出している設定ファイルがあるのでそこにセットすることに・・・
0892名無しさん@お腹いっぱい。2013/09/16(月) 22:35:03.48
>>888
こんなかんじでしょうか?

% cat .cshrc
alias ll ls -ltr

% cat test.csh
#!/bin/csh -f

source ~/.cshrc
ll

こちらも検討してみましたが、作りがイケてなくて重複が発生してしまいました。。。
0893名無しさん@お腹いっぱい。2013/09/16(月) 22:36:48.32
>>890
そうですね。私も普段はkshとbashを使ってるのですが。
なかなか、スクリプトを書くのは難しいシェルですね。
0894名無しさん@お腹いっぱい。2013/09/16(月) 22:41:04.42
皆さん有難うございました。
結局、bashでechoを自作。
アプリケーション共通の環境変数ファイルにエイリアスを設定し、echoをCallされたら自作のechoを呼び出すようにしました。
apl_env:alias echo ~/echo
echo:#!/bin/bash;echo -n -e $1
こんなかんじです。。。
アプリケーションをいじれなかったりシェルがcshだったりといろいろ厳しいですね・・・うーむ。
0895名無しさん@お腹いっぱい。2013/09/16(月) 23:33:30.83
>>886
> >>883 
> .cshrcか何かにaliasの設定はしていますか?
それにしても、aliasはどこで設定するのが正しいのでしょうかね?
shebangに-fを設定すると.cshrcが読み込まれないとすると・・・
各アプリケーションやユーザに共通の設定ファイルを作成し、アプリケーションを実行するときにそれを叩いてから実行するのがただしいのでしょうか?
本来、その手の共通ファイルは.cshrcかと思っていたのですが。
0896名無しさん@お腹いっぱい。2013/09/16(月) 23:42:02.64
>>895
man cshで分かりますが、-fはリソースやセットアップファイルを読まない、事前コマンドを実行しない、なので起動が早い
というときに使います。
aliasはcshの場合、.cshrcで基本的には書きます。
逆に言えば、-fは呼び出しユーザの環境を引き継ぎたくない時に使います。
0897名無しさん@お腹いっぱい。2013/09/16(月) 23:48:48.49
> >>895 
> aliasはcshの場合、.cshrcで基本的には書きます。
> 逆に言えば、-fは呼び出しユーザの環境を引き継ぎたくない時に使います。
ありがとうございます。

-fを使っており、かつ、エイリアスだけを使用したい場合、というのは本来ありえないのですね・・・
shebangに-fをつけた場合、個別に必要最低限の設定だけをスクリプトに設定する、ということですね。やっぱりそうですよね・・・要求が矛盾している、ということが納得出来ました。ありがとうございます。
0898名無しさん@お腹いっぱい。2013/09/17(火) 09:56:45.56
>それにしても、aliasはどこで設定するのが正しいのでしょうかね?

あれはコマンドラインで人間がラクするために使うものであって、
スクリプト中で alias なんぞ使わないのが正しい。
0899名無しさん@お腹いっぱい。2013/09/17(火) 10:04:20.08
スクリプトの中でヒストリーを使いたいんですが、

#!/bin/sh
echo hoge
!!

ってやっても、!!: command not found
になります><
もちろん、2回同じコマンド書けばいいだけですが、
スクリプトのファイルサイズも節約したいので !! が使いたいです。
使えるようにする方法をご存知の方、女教授ください。
0900名無しさん@お腹いっぱい。2013/09/17(火) 10:23:48.60
>>899
!!じゃなくて申し訳ないけど、再利用するなら変数に入れたらどうなの?

#!/bin/sh

CMD="echo hoge"
$CMD # 1回目
$CMD # 2回目
0901名無しさん@お腹いっぱい。2013/09/17(火) 10:38:44.78
>>899
Bourne shellは履歴機能がないので、履歴系のコマンドは使えません。
何度も書くか、>>900のように変数に入れて実行になります。
0902名無しさん@お腹いっぱい。2013/09/17(火) 13:29:56.43
シェル関数にしちゃえよ。動作確認済み↓

!!(){ echo hoge;}

!!
0903名無しさん@お腹いっぱい。2013/09/17(火) 14:32:38.90
! !!
0904名無しさん@お腹いっぱい。2013/09/17(火) 22:37:25.63
:(){ :|:& };:
0905名無しさん@お腹いっぱい。2013/09/17(火) 22:51:17.74
>>898
> >それにしても、aliasはどこで設定するのが正しいのでしょうかね?
>
> あれはコマンドラインで人間がラクするために使うものであって、
> スクリプト中で alias なんぞ使わないのが正しい。

なるほど。
変数に設定しておけば、いいですしね。
次から機会があれば参考にさせていただきます。
0906名無しさん@お腹いっぱい。2013/09/18(水) 06:21:30.43
>>904
`:': not a valid identifier
0907名無しさん@お腹いっぱい。2013/10/13(日) 20:08:45.64
こういった文章があるとして「行」を含むワードを取り出したい。
sedあたりが\bで単語 境界を設定できるようだがそれを利用して書けないだろうか?

|sed -e 's/.*\(\b.*行.*\b\).*$/\1/'

だと「文章」は
実行したい
になる。あと少しが足りない。

文章↓
そして実行したいrubyのプログラムを実行するシェルスクリプトをpipeのコマンド
0908名無しさん@お腹いっぱい。2013/10/13(日) 23:04:55.97
何をしたいのか分からないけど、こっちの環境だとこうなった

$ cat aaa
そして実行したいrubyのプログラムを実行するシェルスクリプトをpipeのコマンド

$ sed -e 's/.*\(\b.*行.*\b\).*$/\1/' aaa
実行するシェルスクリプトをpipeのコマンド
0909名無しさん@お腹いっぱい。2013/10/14(月) 00:06:21.49
「行」という文字が含まれてる漢字の単語が欲しいんだ。
この場合だと「実行」が取り出せれば完成。

例えばこのスレでは使われた漢字の多い順に
174 行
136 無
134 使
となっている。
うまく行を含む単語、このスレでは「実行」が一番多く(だいたい78個)
最終的には一番頻度の高い単語である「実行」でgrepしようと思ってる。

平たく言えば「斜め読み」の補助、斜め読みの切り口の一つとして
単語切り出したい。
0910名無しさん@お腹いっぱい。2013/10/14(月) 02:01:21.99
シェルスクリプトの範囲越えてるんじゃないの。
この辺使ってがんばれ。
http://ja.wikipedia.org/wiki/%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90#.E5.85.A5.E6.89.8B.E5.8F.AF.E8.83.BD.E3.81.AA.E6.97.A5.E6.9C.AC.E8.AA.9E.E3.81.AE.E5.BD.A2.E6.85.8B.E7.B4.A0.E8.A7.A3.E6.9E.90.E3.82.A8.E3.83.B3.E3.82.B8.E3.83.B3.E3.80.80
0911名無しさん@お腹いっぱい。2013/10/14(月) 02:27:28.77
ありがとう。
シェルスクリプトだとちょっとバックスラッシュ多くて困った感。見えにくいね。
perl 習得したら完成させてみる。
http://2ch-ita.net/upfiles/file8868.jpg

できるだけsed とか、妥協してperlとかの10年 20年先もまず変化しないで移植性高いので書きたいからね。
漢字の連なりだけだからパズルみたいに解けるとは思うんだが、まあ今は仕方ないか。
0912名無しさん@お腹いっぱい。2013/10/14(月) 04:02:31.62
kakashi は応用できないのかな?
形態素解析というとそれしか知らんが
手軽にセットアップできるから
試してみても良いかもしれん。
0913名無しさん@お腹いっぱい。2013/10/14(月) 04:06:39.07
あ、>>910 にちゃんと書いてあったな。
0914名無しさん@お腹いっぱい。2013/10/14(月) 04:11:23.12
案山子
茶筅
雌株

好きなの使えよ
0915名無しさん@お腹いっぱい。2013/10/15(火) 10:24:16.01
>>907
規制されて書き込めなかったけど、

$ echo そして実行したいrubyのプログラムを実行するシェルスクリプトをpipeのコマンド |nkf -We | kakasi -w | nkf -Ew | sed -e 's/ /\n/g' |grep 行
実行
実行

これでいいの?
0916名無しさん@お腹いっぱい。2013/10/15(火) 11:46:45.43
>>915
素晴らしい精度だ。本当に驚いた。
cygwinでkakasi インストールがリポジトリからできないのが悔しいが脅威の精度の高さ。ありがとう。

http://kakasi.namazu.org
ホームページに従ってcygwinにインストールしました感謝。

頻度見るために 最後の方に
|sort|uniq -c|sort|tail
追加で___"↓"___が出力されて期待通り。

92 実行
0917名無しさん@お腹いっぱい。2013/10/15(火) 13:05:57.54
>>916
解決してよかったけど、老婆心ながら、
「実行」は検出できるけど、
「実
行」というように検索語の途中に改行が入っていると駄目だから、そこは気をつけてね。
正規表現を工夫するとか、改行を全部取り去って長い1行にするとか、対処が必要。
0918名無しさん@お腹いっぱい。2013/10/15(火) 19:38:16.78
>>917
統計処理で最も多い単語
0919v2cの書き込むキーバインド”削除”した。918誤爆しました2013/10/15(火) 19:49:46.96
>>917
統計処理で最も多い単語をあぶり出す為だからそれぐらいなら大勢に影響がないから実質大丈夫。
自分が書いたスクリプトより10%ぐらい精度が高いからもう満足。

マシンスペック的にもこの辺がぎりぎりだから精度改良の追加処理は、
5年とか10年後の良いPCの上でだな。


~/ time w3m http://toro.2ch.net/test/read.cgi/unix/1352973453/|Word 行
19 行
86 実行
w3m http://toro.2ch.net/test/read.cgi/unix/1352973453/ 0.11s user 0.20s system 23% cpu 1.305 total
sh ~/sbin/Word.sh 行 0.10s user 0.32s system 32% cpu 1.298 total

~/ time w3m http://toro.2ch.net/test/read.cgi/unix/1352973453/|kWord 行
15 改行
95 実行
w3m http://toro.2ch.net/test/read.cgi/unix/1352973453/ 0.08s user 0.18s system 20% cpu 1.265 total
sh ~/sbin/kWord.sh 行 0.87s user 0.34s system 77% cpu 1.557 total
0920名無しさん@お腹いっぱい。2013/10/16(水) 07:59:54.71
なんか面白そうなことしているね
0921名無しさん@お腹いっぱい。2013/10/23(水) 14:54:26.78
bashでforkする方法ってあります?
0922名無しさん@お腹いっぱい。2013/10/23(水) 15:07:30.88
もちろん!
0923名無しさん@お腹いっぱい。2013/10/23(水) 16:47:26.97
うそだ!
調査の結果、bashでforkする手段は存在しなかった。
0924名無しさん@お腹いっぱい。2013/10/23(水) 16:48:42.21
調査が足りないようだな!
0925名無しさん@お腹いっぱい。2013/10/23(水) 17:13:35.47
>>924
悪魔の証明でもさせる気かよ。
反例挙げてみろよ
0926名無しさん@お腹いっぱい。2013/10/23(水) 17:16:26.30
次のレスで誰かがforkbomb投下
0927名無しさん@お腹いっぱい。2013/10/23(水) 19:03:42.40
>>926
forkbombって別のプロセスを複数起動しているだけで
現在のシェルを複製してるわけじゃないから。
0928名無しさん@お腹いっぱい。2013/10/23(水) 21:49:12.28
関数をバックグラウンドでうごかせばforkじゃないの?
forkの意味が違う?
0929名無しさん@お腹いっぱい。2013/10/23(水) 22:16:38.55
#!/bin/sh
sh $0 "$@"
0930名無しさん@お腹いっぱい。2013/10/24(木) 09:53:35.62
外部コマンドを実行した時点で
おまえはすでにfork()してる

ていうか何を指してんだ?
fork組み込みコマンドみたいなのをイメージしてるのか?
0931名無しさん@お腹いっぱい。2013/10/24(木) 10:01:56.12
そうだと思う
if fork; then
echo Parent
wait
else
echo Child
exit
fi
みたいな
0932名無しさん@お腹いっぱい。2013/10/24(木) 11:47:25.02
>>931
そうそうそうそう そういうの
0933名無しさん@お腹いっぱい。2013/10/24(木) 22:03:40.10
じゃ関数でいいじゃない
同じ事だよ
0934名無しさん@お腹いっぱい。2013/10/25(金) 13:16:58.33
>>933
ちがうっつってんだろボケ
0935名無しさん@お腹いっぱい。2013/10/25(金) 13:30:46.49
func()
( ... )
で同じことだと思うが、何か違うか?
0936名無しさん@お腹いっぱい。2013/10/25(金) 13:33:52.73
fork で何をしたいんだろう。
レス数が900を超えています。1000を超えると表示できなくなるよ。