1 :
名無しさん@お腹いっぱい。 :
2009/07/01(水) 09:42:48
2 :
名無しさん@お腹いっぱい。 :2009/07/01(水) 09:45:39
3 :
名無しさん@お腹いっぱい。 :2009/07/01(水) 09:46:30
4 :
名無しさん@お腹いっぱい。 :2009/07/01(水) 09:48:31
5 :
名無しさん@お腹いっぱい。 :2009/07/01(水) 09:49:46
□関連書籍と関連リンク:
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
(スペースなどを含むファイル名を正しく処理するため、
findは -exec command {} + を推奨。
他に -print0、xargsは -0オプションという方法もあるがSolaris非対応)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
回答者側の心得: エスパー以外回答禁止 わからないなら無理に回答せず、黙っていましょう あなたが回答しなくても、もっと詳しい回答者がより的確に回答してくれます 無理に中途半端な回答をすると、回答者同士で叩き合いが始まり、スレのS/N比が悪化します
2005年は、最近ですか?
地球の歴史からすれば一瞬
中国の歴史からしても1‰
中国400年の歴史?
‰を知らないゆとり乙
中国は建国60年 つまり >中国の歴史からしても1‰ は0.6年、61日
219日だw
句点の。に見えたわorz
ftpであるディレクトリ配下をまるまるダウンロードするために、 ローカルに同じディレクトリ構造を作りながらファイルを1個づつダウンロードしていくシェルをつくりたいんですが ftpでのdir結果をファイルに落としてそれを読んでって感じになりますかね? 簡単そうな方法があるとうれしいんですが?
簡単な方法なら wget -r だが
>>17 円周率を3と習う世代に無理を言っちゃいかん。
シェルの本で定番は何ですか?
「たった3日でシェルが書ける、シェル自作入門」 〜 シェルで始める Hello World 〜 とか?
「ゲームで極める シェルスクリプトスーパーテクニック 」 シェルスクリプトでここまでできる。ゲームを作ってシェルスクリプトの超技を学べ。
おもわずググっちまったorz
いや、自作の方な
25 :
名無しさん@お腹いっぱい。 :2009/07/10(金) 00:53:20
質問です。 たとえば、以下のような仮のhogeコマンドを実行すると、 $ hoge -12 hoge.dat foo.dat bar.dat パラメタで指定したファイル(hoge.dat、foo.dat、bar.dat)の12行目だけをリストするようなコマンドはないでしょうか? よろしくお願いします。
シェルスクリプトスレなのに、単一のコマンドでないといかんのか? でないなら for i in hoge.dat foo.dat bar.dat; do sed -n 12p "$i"; done とか、 cat -n hoge.dat foo.dat bar.dat | egrep '^ *12^I' とか。 「コマンド」風にしたいなら、関数にするなり、別のスクリプトにするなり。
>>26 シェルスクリプトスレで質問してるんだから、
$ hoge -行番号 ファイル...
という形式の引数を渡せるようなシェルを書いて回答してやれよ。
例えば、-12 で渡された引数を、sedの中に 12p の形に渡すためには
文字列の変換処理とかがちょっと必要になるだろ。
そのあたりも含めての質問だと思うが。
シェルを書いて回答してやれよ(笑)
>>26 2つ目の、cat -n の例、それじゃ駄目だろ。
全部のファイルに通し番号で番号が付いちゃうから。
俺のcatはファイルごとに1から始まるぞ
どこの方言OSのcatですか?
OpenSolarisとFreeBSDとNetBSDです。おたくはどちらのご出身で?
>>25 awk 'FNR==12{print}'
が単純でエレガントでは。パイプやループが要らないし。
あ、シェルにするには、 #!/bin/sh n=$1 shift awk "FNR==-($n){print}" "$@" ね。-12とかの引数をマイナスの数とみなして、awkの中で符合反転してる。
シェルにする、とな!
>>32 みえすいた嘘付くな。
$ uname -a
SunOS opensolaris 5.11 snv_111b i86pc i386 i86pc Solaris
$ cat hoge
boke
kasu
$ cat -n hoge hoge
1 boke
2 kasu
3 boke
4 kasu
>>36 $ uname -a
FreeBSD freebsd.example.com 7.2-RELEASE FreeBSD 7.2-RELEASE #2: Fri May 22 10:29:03 JST 2009
[email protected] :/usr/obj/usr/src/sys/GENERIC i386
$ cat -n /etc/ntp.conf /etc/ntp.conf
1 server ntp1.jst.mfeed.ad.jp
2 server ntp2.jst.mfeed.ad.jp
3 server ntp3.jst.mfeed.ad.jp
1 server ntp1.jst.mfeed.ad.jp
2 server ntp2.jst.mfeed.ad.jp
3 server ntp3.jst.mfeed.ad.jp
ちなみに GNU の cat だと連続する。 $ gcat -n /etc/ntp.conf /etc/ntp.conf 1 server ntp1.jst.mfeed.ad.jp 2 server ntp2.jst.mfeed.ad.jp 3 server ntp3.jst.mfeed.ad.jp 4 server ntp1.jst.mfeed.ad.jp 5 server ntp2.jst.mfeed.ad.jp 6 server ntp3.jst.mfeed.ad.jp
ntp.nict.jp 使ってやれよ!
40 :
名無しさん@お腹いっぱい。 :2009/07/10(金) 21:51:19
41 :
名無しさん@お腹いっぱい。 :2009/07/11(土) 14:58:42
>>36 > みえすいた嘘付くな。
デフォルトだと/usr/gnu/binにあるcatが動くのも知らんのか。
わざわざインストールしてみたりしたんだろうか。
GNU以外でcat -nの番号が連続する実装ってある?
>>33 >>34 のエレガントな解が出た今となっては、
cat -n(笑)を使うようなかっこ悪い解はどうでもよい。
かっこ悪(笑)
(command) って command ってやるのと何か違います?
デヴャブ
>>44 一例
cd / ; cd /tmp ; pwd
cd / ; ( cd /tmp ) ; pwd
>>47 それは当然知ってる。
コマンド1個だけの場合に、
command と (command) に違いがあるかどうかを聞いてるんだが。
>>44 シェルによっては、シェル自身の最適化で、
( ) を付けていてもサブシェルの必要がない場合はサブシェルにはしないため、
(command) と command に違いはない。
ash zsh ksh では (command) と command に違いはないようだ。(トレースして確認)
それらにおいても unset PATH と (unset PATH) は動作が違う気がする
>>52 それはあたりまえ。で、そんなことは聞いてない。
>>49 > 「サブシェルの必要がない場合はサブシェルにはしない」
欲嫁。
>>48 そこまでいくと実装依存的な話になる気がするけど
誰かに " (command) と command に違いは無い " とでも言って欲しいの?
で誰かがそういったところで保証される訳でもなし
" (command) と command " に違いはないから今後は " command "で書こうって話にはならない
逆に " (command) と command " に違いがないから作成中のスクリプトで「今困ってる」っていうなら
そこまで動作を調べられる
>>48 なら解決方法も分かってるだろ?
バカなの?
バカで〜す
>>54 > 実装依存的な話になる気がするけど
すでに、
>>51 が、
> ash zsh ksh では (command) と command に違いはないようだ。
って(実装依存を前提として)答えてるのに、いまさら「気がするけど」って何?
補足したいなら、
>>51 が調べた以外のシェルではどうなってるか試して
レポートするべきじゃないの?
___ モシャモシャ / \ / ⌒ ⌒ \ / (●) (●) \ >56なに言ってんだこいつ | 、" ゙)(__人__)" .)| ___________ \ 。` ⌒゚:j´ ,/ j゙~~| | | | __/ \ |__| | | | | | / , \n|| | | | | | / / r. ( こ) | | | | | | ⌒ ーnnn |\ (⊆ソ .|_|___________|  ̄ \__、("二) ̄ ̄ ̄ ̄ ̄l二二l二二 _|_|__|_
58 :
amatsuno ◆Z7H81aEWFM :2009/07/13(月) 12:42:35
テストします。 次で質問させて下さい
59 :
amatsuno ◆y1bfd53lWE :2009/07/13(月) 13:02:32
質問させて下さい。 AIX(ksh)で、以下を行おうとしています。 コマンドなどわかりましたら、教えて下さい。 やりたいこと) csvファイルを読み込んで、データを抜きだす。 csvファイル) A_table,3,DEF_ind,JKL_ind,TUV_ind,out.txt のように書かれたリストが複数行有ります。 出力ルール) csvファイルの第1カラム目に書かれたテーブルを見て、 その中から該当の文字列を呼び出します。 該当の文字列は、 第2カラムで指定された数字分、第3カラム目から先のカラムに書かれたものになります。 (上記の場合、第2カラム目が3なので、第3カラム目から第5カラム目までとなります) そしてその出力を最終カラムで指定したファイルに出力します。 上記の出力結果は、 DEF_ind JKL_ind TUV_ind をout.txtに出力します。 すいませんが、 わかるかた、宜しくお願いいたします。
>>59 ほれ、
awk -F, '$1=="A_table"{out=$($2+3);for(i=1;i<=$2;i++)print $(i+2)>>out}'
61 :
amatsuno ◆y1bfd53lWE :2009/07/13(月) 13:47:11
>60 ありがとうございます。 ただこれを実行したところ、1箇所だけ問題があるようで、 3カラム目から先が永遠に出力されてしまい、ひたすら空白行が出ます。 第2カラム目で指定しらカラム数で止めるには、 どうすれば良いのでしょうか? たびたびで申し訳ございませんが、宜しくお願いいたします。
62 :
amatsuno ◆y1bfd53lWE :2009/07/13(月) 13:51:46
>60 もうしわけございません。 61はデータ側の問題でした。 スクリプトは完璧でした。 誠に申し訳ございません。 ありがとうございました。
不正なデータとして、 第2カラムが数値以外だと、ループがおかしくなるな。 そういう場合でも安全なように、 for(i=1;i<=$2;i++) を、 for(i=1;i<=$2+0;i++) にしておいた方がいいかも。
>>59 >>60 awkはシェルにあらず。
シェルスレならシェルで解決。
#!/bin/sh
IFS=,
while read line
do
set $line
case $1 in A_table):;;*)continue;;esac
shift
max=$1
shift
eval out=?$$#
i=1
while [ $i -le $max ]; do
echo "$1"
shift
i=`expr $i + 1`
done > "$out"
done
awkも可だよ。
66 :
amatsuno ◆y1bfd53lWE :2009/07/13(月) 14:33:33
>>64 このawkを含んだ処理のkshは、
1.リストからデータの抜き出し
2.抜いたデータのインデックス検索
3.インデックス検索でたデータのバックアップ
4.バックアップデータのソート
になります。
その一部でしたので、
ここで質問させていただきました。
67 :
名無しさん@お腹いっぱい。 :2009/07/13(月) 23:23:55
質問させてください。 テキストファイルの最後からN行を削除するにはどうしたらいいでしょうか? 例えばa.txtの最後から2行を削除して保存したいです。よろしくお願いします。
>>67 head -n `expr ?`wc -l < a.txt?` - 2` a.txt
>>68 「保存」してねえぞ
(echo '$-1,$d'; echo wq) | ed -s a.txt
>>69 printfコマンドって、使えない環境もあるのかな。
あと「wq」は使えなくて「w」と「q」の2コマンドなら
OKという環境はよくあるね。
>>69 ありがとうございます。
でも結構難しいですね。もうちょっと簡単に短くできませんでしたっけ?
度々すみません。 たしかheadで出来たと思うのですが a.txtの最後から2行を削除して保存。とか出来ませんでしたっけ?
保存はともかく、 末尾の指定行数をカットできるのはGNUのおせっかいheadくらいじゃないか
>>70 半角バックスラッシュが?に化ける模様。
そう解釈すれば
>>68 が正解。
Safari@Macかね?
>>71 >printfコマンドって、使えない環境もあるのかな。
SunOS4 とか。
78 :
amatsuno ◆y1bfd53lWE :2009/07/14(火) 17:52:11
この前はありがとうございました。 もうひとつ教えて下さい。 前回教えていただきましたリストを1行にまとめる方法を教えて下さい。 変更前のファイル(b_ind)の中身);0 DEF_ind JKL_ind TUV_ind 変更後のファイル(a_ind)の中身); DEF_ind,JKL_ind,TUV_ind 上記では3行ですが、実際は1-8のいずれかの行数となります。 このような複数行をカンマ区切りの1行にしたいのです。 DBからバックアップを取る時の指定のインデックスのため、 カンマ区切りの1行記載が必要となりました。 すいませんが知っている方、 宜しくお願いいたします。
>>78 >>60 のスクリプトをちょっと修正すればいいだけだよ。
awk -F, '$1=="A_table"{out=$($2+3);for(i=1;i<$2+0;i++){printf $(i+2) ",">>out}print $(i+2)>>out}'
>>78-79 awkはシェルにあらず。
シェルスレならシェルで解決。
#!/bin/sh
IFS=,
while read line
do
set $line
case $1 in A_table):;;*)continue;;esac
shift
max=$1
shift
eval out='$'$#
i=1
while [ $i -lt $max ]; do
echo -n "$1",
shift
i=`expr $i + 1`
done > "$out"
echo "$1" >> "$out"
done
経験的にsedとawkはrcスクリプトで使われてるのでOK
経験的にイマドキのOSはrcスクリプト自体を使わないのでNG
83 :
amatsuno ◆y1bfd53lWE :2009/07/15(水) 09:40:43
>>82 テンプレ読み直してこい
あまりキチガイめいたこと言うなよ
#!/bin/rc もベル研純正シェル
>>34 awkはシェルにあらず。
シェルスレならシェルで解決。
#!/bin/bash
n=$((-$1))
shift
for file in "$@"; {
i=1
while IFS= read -r line
do
((i++ == n)) && {
echo "$line"
break
}
done < "$file"
}
bash使うなよ
bashはLinux板でやれ
>>87-88 bashに過剰反応するな。
kshでもzshでも動くから、bash依存とまでは言えない。
#!/bin/ksh
n=$((- $1))
shift
for file in "$@"; {
i=1
while IFS= read -r line
do
((i++ == n)) && {
echo "$line"
break
}
done < "$file"
}
POSIX準拠だから#!/bin/shでもいいはず、といってみる
/bin/shにはPOSIX shellを置く、なんてことはPOSIXに書いてない
シェルスクリプトでドラッグアンドドロップできる?
>>93 目的がわかっても答えられないのに逆質すんな。
あぁ、釣りか。 つられちゃったw てへっ?☆
96 :
92 :2009/07/21(火) 15:19:06
ちょっと思いついたので聞いてみただけです。目的はありません。
シェルスクリプトで手マンできますか?
99 :
sage :2009/07/22(水) 15:28:06
質問させてください。 標準入力から入力した値を処理するシェルスクリプト(Bシェル)を作成しています。 入力値に\(バックスラッシュ)が入る可能性があるので、 readのオプションに「-r」を付けて、入力値をすべて受け取れるようにしようと思ったのですが、 「-r」オプションをつけると「英数字以外の文字が使用されています。」というメッセージが出力され オプションが使えないようです。 例) OS:Solaris10 $ cat aaa.sh #!/bin/sh read aaa echo $aaa read -r ppp echo $ppp $ $ ./aaa.sh III ←コマンドラインから入力 III ←出力 ./aaa.sh: -r: 英数字以外の文字が使用されています。 ←オプションを付けたreadに対してのエラーメッセージ 質問ですが、Bシェルでは、readに「-r」オプションは使えないのでしょうか? (manを見る限り使えないとは言ってないように思われたのですが) もし、使えないとすると、何か他に方法をご教授頂けないでしょうか? (出来る限りBシェルでしたいと考えているのでこのコマンドだけkshで実行するなどでしょうか) よろしくお願いします。
>>99 Solarisの/bin/shのreadは、-rには対応していません。
bashか、zshか、kshを使いましょう。
>>99 どうしても /bin/sh だけでやりたい場合、
read -r aaa
の代わりに、
aaa=`head -1`
とやる方法がある。
103 :
sage :2009/07/22(水) 16:32:21
なるほどねえ
docs.sun.com に書いてあるのは、外部コマンド版の /usr/bin/readじゃん。 中身はkshスクリプト。 これって、結局シェル変数が親プロセスに渡らないから意味ないし、 外部コマンド版の /usr/bin/cd と並んで意味不明コマンドのひとつなんだよな。
>>106 いや、/usr/bin/read 以外にシェルの内部コマンドについても書いてあるよ。
>>107 そんなことは知ってるよ。
そうじゃなくて、/usr/bin/readのアフォさ加減について話題を振りたいわけだが。
>>106 の書き方じゃ知ってたかどうかわからんよ。
質問者の
>>99 が、shの内部コマンドのreadは使えなくても、
shから/usr/bin/readを呼び出せば使える、と勘違いしていた可能性もあるわな。
>>108 POSIX標準では、
・$0 "$@"で実装できるからシステムの負担にはならない
・いい使い方があるかも知れない
・対称性のため
などと存在理由を説明しています。
>>111 >・対称性のため
なら、なぜ、eval exit export wait などについては
外部コマンド版がないのか合理的な説明をお願いします。
POSIX仕様には書いてありません。
POSIX標準がそう決めた理由を聞いているのに、 「POSIX仕様には書いてありません」は循環論法。
使えない外部コマンドがあるくせに、 Solarisでは /usr/bin/[ が削除されてるんだよなぁ。 ほんとわけわからん。
v7shをもってきて使いたくなるかもしれないじゃないか
>>117 使いたいかどうかじゃなくて、
/usr/bin/[ は、呼び出せば動作する。
一方、/usr/bin/read とか、/usr/bin/umask とかは readや umaskの動作はしない。
動作するものを削除して、動作しないものを配置することの馬鹿さを言ってるんだが。
あってもなくても害がないならどっちでもいいじゃん。 馬鹿と非難するほどのことでもないと思うけど。
マニュアルのバグだね。send-prしといてね。
AIX5.2,5.3で2Gを超えるディレクトリをtarで固めるにはどうすればいいのでしょうか?
man tarとすると、ustarヘッダーの書式を使用すると、ファイルサイズを最大8GBにできます。 とあるのですが、具体的にどうすれば2GB以上のファイルをtarで扱えるようになるのでしょうか?
まず、適切な質問の方法を学びましょう。
>>125 まず、適切な回答の方法を学びましょう。
わからないなら黙っていましょう。
AIXスレ行け。
>>123 の質問がとくに不適切とも不備な質問とも思えない。
実際にAIXで2GB超のファイルをtarで固めた経験がある者なら
>>123 を見ただけで即答できるはずだ。
質問の仕方に注文を付けたり、さらに「○○の結果は?」とか追加情報を求める回答者は
その追加情報があっても答えられないダメ回答者。
おかしな煽り野郎が張り付いている模様です。 しばらく放置しましょう。てか、元の質問がシェルスクリプトの質問じゃねぇし。
シェルスクリプトスレで質問するのは適切ではない。言い訳してないで。消えろ。
その tarを シェルスクリプトの中で使う予定なんですぅ、、
言い訳してないで。消えろ。カス。
AIX5.2とAIX5.3です。 以下のようなシェルを発行したところ、 dir以下に2GBを越えるファイルがあるとエラーになります。 どのように修正すればよろしいか? #!/bin/sh tar cvf hoge.tar dir
詰まらん。消えろ。クズ。
>>126 ありがとうございます。
USTARの文字ははいっていました。
TMPには空きがあります。
ファイルシステムについては、よくわかりません。
>>137 2G制限ならulimitを確認。
8G制限はどうにもならないのでGNU tarでも使ったら?
で「シェルスクリプトで必要だから」という理由で環境依存の
質問をシェルスクリプト一般のスレでやっても煙たがられるだけ
というありがたい指摘を、そろそろ受けいれたらどうかな?
>>138 ありがとうございます。
今帰りなので、週末に調べてみます。
ulimitはunlimitedでした。引続きお願いします。
スレ違いだと何度いったらわかるんだ。池沼。消えろ。
すみません、お力を貸してください。 aaa.txtの中身が、 aa\n bb\n cc\n として、これをシェルスクリプトで unko=$(cat aaa.txt) echo ${unko} とすると、 aa bb cc と改行がスペースに置換されていますが、これを改行のまま格納することはできないでしょうか。 上記はあまりいい例ではないので「cat aaa.txt」でいいだろ、と思われるかと思いますが。。。 ftp -nvとかの標準出力を一旦変数に入れといて、後から結果解析及び出力したく、しかも、諸事情でtmpファイル(←すみません、ちんぽファイルではなくて一時ファイルです)を作るのはNGなので、なんとか改行をスペースに置換させないで変数に入れて実現したいのです。 どなたか、ご教示お願いいたします。OSは、HP-UX、Bashです。よろしくお願いします。
144 :
名無しさん@お腹いっぱい。 :2009/08/01(土) 23:50:17
シェルを2つ以上コマンドで開くことは出来る? 今はパネルからクリックしてるので大変。 でも、コマンド売っても出てこない>< ちなみに端末エルミネーターはBASH。
はいはい 15点
>>142 配列(パイオツじゃないよ)使うんじゃだめなの?
>>142 シェル変数の展開時は、ダブルクォートでくくるのが原則。
それで、改行もスペースもそのまま保存される。
逆に、単純に展開する場合は ${ } でくくる必要はない。
. や source で起動されても、自分の名前を取れる方法ありますか? 当然$0だとだめなわけですが [root@miu tmp]# cat a.sh #!/bin/sh echo $0 [root@miu tmp]# source a.sh bash [root@miu tmp]#
. や source は起動されてないし
そこをなんとか・・
bash依存 $ echo 'echo $BASH_SOURCE' > /tmp/t.sh $ . /tmp/t.sh /tmp/t.sh
>>152 bash3以降依存だね。bash2だと動作しない。
>>154 全然解決になりません。
同じスクリプトを複数のファイル名でハードリンクしていて、
呼ばれた名前によって動作を切替えたいので。
もう $BASH_VERSION チェックして $BASH_SOURCE 使えよ。
157 :
名無しさん@お腹いっぱい。 :2009/08/03(月) 08:19:17
そもそも.でもsourceでも名前わかってなきゃ呼べないよね 呼べるってことは名前わかってるじゃん あほじゃないの? $_とかでもいいんじゃないの?
>>157 惜しいけど、
hoge=file
source $hoge
みたいに、変数経由で呼ぶと、
$_ では名前を取得できないから NG。
>>157 シェル依存。
ashとかでは、sourceファイル内一発目の $_ は、$0 と同じ値になってる。よって不可。
>>155 >同じスクリプトを複数のファイル名でハードリンクしていて、
>呼ばれた名前によって動作を切替えたいので。
それは(+sourceした時にまで対応したいという)発想に無理があるのでは
シェル非依存な方法はないから。
関数内のexitをreturnと同じように振舞わせる方法はないでしょうか。 現場で共通利用している共通関数の定義ファイルを . で読込んで使っているのですが、、、 お目当ての共通関数は、関数内でエラーだった場合、ログ吐いてexitまでしてしまい、困りました。 エラーコードで返してくれさえすれば、処理自体はそのまんま使いたいのですが。。。 その共通関数の戻り値はreturnでは返されず、共通関数内で定義した変数に格納され、呼び元でその変数を使う作りになっています。 何卒よろしくお願いします。
164 :
名無しさん@お腹いっぱい。 :2009/08/04(火) 01:02:56
質問です。 以下のようなファイルhoge.datがあるとします。 ------------------------ ~$ cat hoge.dat usa\newyork japan\tokyo korea soul ------------------------ このhoge.datを、以下のようなスクリプトで読み込んでから、出力してみたのですが、 円マーク(\)が表示されなくなります。 ------------------------ ~$ cat hoge.sh #!/bin/sh IFS=' ' while read line do echo "$line" done < hoge.dat --------------------------- 実行結果 --------------------------- ~$ ./hoge.sh usanewyork japantokyo korea soul --------------------------- 円マーク(¥)も表示されるようにするにはどうしたらよいでしょうか?
>>164 read -r
あと、円マークじゃなくてバックスラッシュが表示されるように設定しろ
>>163 alias exit=return
. hoge
unalias exit
>>163 result=`. hoge;echo \$result`
>>167 「.」でソースしてるファイル内で「関数定義」をしているので、
それだとサブシェル扱いになるので、リターンすると関数定義が消えてしまうので
解決になりません。(戻り値が必要なのではありません)
条件後出しすんなよ。そういうことなら (共通関数) 条件後出しのお代りか?
>>166 で解決でしょ。
sourceしたファイル内で returnできるshには、aliasもあるから。
見てきたように嘘をつくなあ、純正shはreturnあって、alias無い。
>>172 > 「sourceしたファイル内で return」
純正shは、関数の中でしかreturnできない。
sourceしたファイル内で returnすると、純正シェルではエラーになる。
嘘はお前。
嘘つきはどちらでしょうか? > お目当ての共通関数は、関数内でエラーだった場合、ログ吐いてexitまでしてしまい、困りました。
175 :
163 :2009/08/04(火) 12:35:58
みなさんたくさんのレスありがとうございます。
>>166 を使って相談してみたところ怪訝な顔をされてしまい、
結局「共通関数のコピペで別の関数(exit→returnだけ)を作れ」
となってしまいました。。。
※個人的には、その方がよっぽど怪訝な顔したいですが。。。
とても勉強になりました。ありがとうございました!
たまたま使えただけ。↓は赤っ恥全開の嘘。 > sourceしたファイル内で returnできるshには、aliasもあるから。
>>177 「sourceしたファイル内で returnできるshには、aliasもある」は正しいが。
恥の上塗りミットも茄子。 シェル関数内でのexitを書き換える為には↓これでは十分じゃないから。 > sourceしたファイル内で returnできるshには、aliasもあるから。
>>179 おまえ、意味取り違えてるよ。
シェル関数じゃなくて、sourceしたファイルを中途終了するときに、
returnが使えるんだよ。(純正シェルだと使えない)
(exitを使うとsourceした元のシェル自体が終了するので使えない)
そういう新しい機能のreturnが使えるシェルなら、aliasも使える。
>>180 とぼけようと必死だな。質問者のお題(
>>163 )は関数内のexitを再定義すること。
> 関数内のexitをreturnと同じように振舞わせる方法はないでしょうか。
「sourceしたファイル内でのreturn」は全然関係ない。
>>172 は、
>>171 「sourceしたファイル内で returnできるshには、aliasもある」
のことを「嘘」だと言った。
その
>>172 は間違い。
(
>>172 では、元の質問のことには触れられていないから、
>>171 自体を質問に関係なく「嘘」と決めつけている。それは当然間違い)
「sourceしたファイル内で returnできるshには、aliasもある」は正しい。
彼らは何のために戦っているのだろう。
なぜ「彼」と限定できるんですか? エスパーですか?
エスパーですよ。
>>173 に指摘されるまでは、
>>172 は関数外での returnの用法を知らなかったんだろう。
>>187 一般的に、
>>187 みたいに論理的な指摘が一切含まれていない暴言を先に吐いた方が
議論の負け。
>>190 「一般的に」の日本語の用法を間違っています。
一般的に、「日本語の用法」とか関係ないところにケチ付け始めたところで負け。
用法、容量を守ってご使用ください。
YO! HO!
用法・用量な
追試してみるから純正shってのがどれなのか教えてくれ
>>180 が言うところの「そういう新しい機能のreturnが使えるシェルなら、
aliasも使える。」じゃないシェルだろ。
>>196 そりゃ純正というくらいだから Sixth Edition とか Seventh Edition とかについてきたやつじゃないの
純正シェルには、return以前にシェル関数自体がないから。
Solaris10の/bin/sh: ×「.」の中でのreturn / × alias FreeBSDの/bin/sh: ○「.」の中でのreturn / ○ alias bash: ○「.」の中でのreturn / ○ alias zsh: ○「.」の中でのreturn / ○ alias ksh: ○「.」の中でのreturn / ○ alias
FreeBSDの/bin/shってボーンシェルじゃないの?もしかして
もしかしても糞もなくボーンシェルじゃありません
BシェルというのはBourne Shell=/bin/sh だと思ってたけど違うの? ボーンシェルでない/bin/shというのはBシェルでもなく一体なんなんですか?
Bourne Shell ≠ ボーンシェル Bourne Shell = ブールネシェル
>>201 >>203 どのバージョンからかだったかは忘れたが、
FreeBSD や NetBSD の /bin/sh は Bourne Shell ではなくその互換再実装の Almquist Shell だよ
>AUTHORS
> This version of sh was originally written by Kenneth Almquist.
386BSDはすでにashだった。
>>206 なるほど、ashはbourne shellであってはいけないのか。
http://en.wikipedia.org/wiki/Bourne_shell > Due to copyright issues surrounding the Bourne Shell as it was
> used in historic CSRG BSD releases, Kenneth Almquist developed
> a clone of the Bourne Shell
209 :
名無しさん@お腹いっぱい。 :2009/08/06(木) 15:38:32
44,555 34,567 0 143,456 1,235,004 44 0 0 55 みたいな数字の列があるのですが、これのトータルを計算したいと思ってます。 問題は数字の3桁ごとに,が入ってることなのですが、Bashスクリプトでこれを取りつつ合計を計算 する方法ってあるでしょうか? どうかよろしくお願いします。
210 :
名無しさん@お腹いっぱい。 :2009/08/06(木) 15:54:06
sed -e "s/,//g" で出来ましたが、合計の計算ができません。 44555 34567 0 143456 1235004 44 0 0 55 から、全部の合計を出したいです。
211 :
名無しさん@お腹いっぱい。 :2009/08/06(木) 15:57:01
sed -e "s/,//g" | xargs echo | sed -e "s/ /+/g" | bc これで出来た。
何万行もあると破綻しそうな
>>209 #!/bin/bash
n=0
while IFS=, read line
do
((n += line))
done
echo $n
>>213 それ、カンマの除去処理がおかしい
>>209 #!/bin/bash
n=0
while read line
do
((n += ${line//,/}))
done
echo $n
{ echo 0; sed -e 's/,//g' -e 's/$/+/'; echo p; } |dc
sed 's/,//g'| paste -s -d+ | bc
>>215 それだったら、
sed 's/,//g; s/$/+/; $s/$/0/' | bc
の方が簡潔。
>>217 bcだと、途中改行できないから不可。
sedでさらに行末にバックスラッシュを付加してやればそれでも動くかな。
>>215 echoとsedと一緒に使うと無駄。
sed '1s/^/0 /; s/,//g; s/$/+/; $s/$/p/' | dc
でいいだろ。
>>217 実行してから因縁つけろ。カス
sed 's/,//g; s/$/+/; $s/$/0/' file| bc
(standard_in) 2: syntax error
(standard_in) 3: syntax error
(standard_in) 4: syntax error
(standard_in) 5: syntax error
(standard_in) 6: syntax error
(standard_in) 7: syntax error
(standard_in) 8: syntax error
(standard_in) 9: syntax error
みなさん、質問を良く読みましょうね。
>>209 さんは、
> Bashスクリプトで
って言ってますよ。
よって、
>>214 が正解ですね。
すでに正解が出ているのに
>>215 以降に何か書いてるおともだちがいますが、
Bashも使っていないし、質問の答としてはふさわしくありませんね。
Bash: not found だから
>>214 は不正解だな。
223 :
名無しさん@お腹いっぱい。 :2009/08/06(木) 23:36:58
>>218 それで処理すると、
dc: stack empty
dc: stack empty
dc: stack empty
と出ます。
シェルスクリプトって、ほんとツンデレだよな。 理解するまで四苦八苦ツンツンしてるくせに、一旦わかってしまうと、とたんにデレデレ。
別にそれはシェルスクリプトに限ったことでもなかろう
しばらく使わないと忘れちゃってまたツン期に入るのが…
bashで変数の置換と切り出しとかを一緒にできないですかね? echo ${HOGE//a/A} echo ${HOGE:0:8} これをひとつにしたい感じです
もちろん、できません
bash です。 date | read HOGE これやっても変数 HOGE が空なんだけど、どうして?
readはサブシェルで実行されて瞬殺で終了するから。
232 :
230 :2009/08/15(土) 16:05:15
>>231 即答サンクス!
そうだった、パイプラインはそれぞれサブシェルで動くんだった。
つーことは、date 出力を変数に入れるには、素直に
HOGE=`date`
でよい、と。
>>232 × パイプラインはそれぞれサブシェルで動く
○ 1個以上のパイプを含んだパイプラインはそれぞれサブシェルで動く
普通のコマンド1個だけでも「パイプライン」なので。
234 :
232 :2009/08/15(土) 17:37:04
>>233 訂正サンクス!
確かに。
サブシェルと「環境」について、いまいち理解できない…
バッドノウハウよりもっと有用な事を覚えよう
バッドノウハウを覚えることは有益 バッドノウハウをあれこれ考えることは無益
バッドノウハウって、具体的に何のこと言ってるの?
定義にこだわるふりをして、干されている現実から目をそらす
>>233 の手法。
la -Alでファイルサイズとファイル名のみほしいので la -Al | cut -d " " -f 5,9 とかやるとうまくいきません。どうすればいいですか?
>>239 cutでうまういかないのは、複数のスペースがすべて「区切り」とみなされるから。
awk使った方がいい
↓
ls -Al | awk '{print $5 " " $9}'
>>240 awkはシェルにあらず。
シェルスレなんだからシェルでやれ
ls -lA | while read line; do set -- $line; echo $5 $9; done
>>239 >>240 あざーす
もうひとつ聞きたいのですが
文字列の先頭の1文字目のみ切り出す
ってどうやればいいでしょうか?
val1=abc
val1=`expr "$val1" : "\(.\).*"`
とかでいいですか?
>>242 bashなら、
var=abc
echo "${var:0:1}"
>>241 > awkはシェルにあらず。
> シェルスレなんだからシェルでやれ
濡れた。
アッーーーー
便乗質問。
>>241 の手法に感心したんだけど、わざわざ set で位置パラメータを再設定して
使うっていう方法は、普通にアリなの?
set はシェル動作制御用コマンドの側面が強くないですか? そうでもない?
>>246 set使わずに、
↓でもいいんだけどね
ls -lA | while read x x x x s x x x f x; do echo $s $f; done
(純正シェルで)使える機能は何でも使うのがシェルプログラミングの作法。
249 :
246 :2009/08/17(月) 23:51:47
>>247 これはすげえ! 強引!w
>>248 そうかあ。使えるものは使う、と。自分専用ツールならなおさらだね。
ううむ、シェルは深いなあ。でも楽しい。
覚えると明らかに生産性が上がる。
>>247 はわりとよく見かけると思うが……。
>>241 の方法は元々の$@が破壊されるのでよほどのことがないかぎりやらない。
>>251 >>241 の方法を使っても、readのパイプがサブシェルだから、
それを抜けたら $@ は破壊されていない。
echo に渡すのがスマートでないですか? ls -Al | xargs -l echo | cut -d" " -f5,9
というか ls -Al | xargs -l | cut -d" " -f5,9 これでよかった・・・・
で、改行、空白を含むファイル名を正しく扱えるのはどの回答?
>>255 ls 使ってる時点で改行、空白を含むファイル名は最初から考えられてない。
コマンドなしのxargsってどういう意味?
echoの省略形
だから2個以上のスペースを1個にするんだって。
そもそも human readableな ls の output を filtering するというのが bad design なんんだよな。 次期 ls には是非、 --format='%f %s' 的な optionを appendしていただくことを wishする。
stat(1)あたりをposixに入れる方が早くないか?
ルー語はカッコよかったんか
csh の存在価値はなんだろう。 bash でいいじゃん。
bashが無駄に重くなっていってくれたおかげで tcshは無難に使えるログインシェルという位置を確保できたw そしていろいろと便利な設定をするためにcshスクリプトの書き方を知る必要がある。
ksh93を使ってる俺は勝ち組
270 :
名無しさん@お腹いっぱい。 :2009/08/25(火) 17:34:40
質問です 1 12 123 1 2 23 のようなテキストを xx1xx12x123 xx1xxx2xx23 (x=空白) のように幅を揃えるにはどうすればいいですか?
awk '{printf("%3d%3d%4d\n",$1,$2,$3);}' < test.txt
>>271 勝手に桁数決め打ちしていいのか?
同じカラム上にある最大桁数をサーチした上で %*d (*は数字)に
しなければならないという質問だと思うが。
それは質問者が言うべきこと。
274 :
270 :2009/08/25(火) 18:09:22
すいません。実際の数字は一行に数千あって行も数千あります。 でも一つの区切りの中の数字は三桁までです。
絵に描いたような後出しw
>>274 一行にある数字の数は固定している?それとも変動もある?
>>270 >>274 #!/bin/sh
while read line
do
set $line
while [ $# -ge 1 ]
do
printf '%3d ' $1
shift
done
echo
done
>>277 だったら forの方がいい。
#!/bin/sh
while read line
do
for n in $line
do
printf '%3d ' $n
done
echo
done
>>278 直前の回答読めよ。
すいませんリロードしてませんでした。 上手く行きそうです。みなさんありがとうございました。
>>279 いや、行末のスペースを取ることを考えると、
>>277 の方式の方がいいんだよ。
#!/bin/sh
while read line; do
set -- $line
while [ $# -ge 2 ]; do
printf '%3d ' $1
shift
done
if [ $# -eq 1 ]; then
printf '%3d' $1
fi
echo
done
execute.shellを実行し、psコマンドを実行すると以下のように表示されます。 PID TTY TIME CMD 13219 pts/1 00:00:00 bash 17938 pts/1 00:00:30 java 17222 pts/1 00:00:37 java 25353 pts/1 00:00:00 ps CMDのjavaがexecute.shellのプロセス名みたいなんですが、 これをexcecuteと表示させることは可能ですか?
>>283 コマンド自身がargv[0]を書き換えてるか、
またはexecute.shellは単なる起動スクリプトで、実際にjavaがexecされてるから、
元のコマンドのexcecuteを表示させることは無理。
コマンドライン引数にかけらが有るかもしれない。 ps -a
>>284 了解です。レスありがとうございます。
>>285 ありがとうございます。
ps -aしてみましたが表示は変わらなかったです。
2重起動を防止するため、プロセス名を取得しようとしていたのですが無理のようなのであきらめました。
PID番号付きのファイルを作成することにしました。ファイルはなるべく作りたくなかったのですが。
287 :
名無しさん@お腹いっぱい。 :2009/08/27(木) 17:29:53
sedコマンドをつかって aaa|abc|bef|efg||||aa の文字列(|は区切り文字)の一番最後のフィールドのaaの部分をbcdに変えて aaa|abc|bef|efg||||bcd と出力させるにはどのようにすればよいのでしょうか?
最後はどれもbcdに変えるのか、aaになってるものだけ変えるのか
>>287 sed 's/|[^|]*$/bcd/'
291 :
名無しさん@お腹いっぱい。 :2009/08/27(木) 17:58:17
sygwinでのbashなんですが declare -a userhome userhome=($(cut -d":" -f6 /etc/passwd)) とすると、/etc/passwdの6番目の要素がnullの場合 配列に何も代入されません。 何か文字を代入したい場合はどうすればいいんでしょうか?
>>291 userhome=($(cut -d":" -f6 /etc/passwd | sed 's/^$/none/'))
293 :
名無しさん@お腹いっぱい。 :2009/08/27(木) 18:10:41
#!/bin/sh s="~/work/" ls $s としても、 No such file or directoryと言われます。 たぶん~が展開されていないと思うのですが、 どうすれば展開できますか?
>>294 eval ls $s
または、最初から
s=?/work/
で代入。(ダブルクォートなし)
>>288 > 最後はどれもbcdに変えるのか、aaになってるものだけ変えるのか
↑
そんなの質問の意図を読めばわかる。
>>290 みたいに回答した方が早い。
>>294 由緒正しきshは~は使えない。$HOME使え。
トホホの自民 生き残れるのはひと握り
大マスコミの選挙予測によると、自民党は壊滅状態で、当確を数えたほうが早いほど。
小選挙区で確実に生き残れるのは元・現閣僚が7人ほど、石原伸晃など地盤が強固な世襲議員が6人ほど、重鎮が3人。
ほかに5人程度のひと握り。自民党が少数政党に転落し、永田町の勢力図が一変する可能性だってある。
http://gendai.net/?m=view&c=010&no=22639
便乗質問だけど、
>>298 チルダ展開は bash だけなの? sh は展開してくれない?
sh の種類による。
>>300 bashだけではない。
Solarisなどの純正sh以外、
ash ksh zsh dash 等、みんなチルダ展開には対応してる。
でも $HOMEを使う方がお勧め。
posix sh ならやってくれるはず ~ だけなら $HOME で間に合うが、~user はどうしようもないし
posix(笑)
>>303 IFS=:
set `getent passwd user`
echo $6
306 :
300 :2009/08/27(木) 21:42:19
サンクス。 アムロ「マ ~ さーん!」 ……すまん。
>>305 getent が使える環境で ~user の展開をしてくれないシェルって何があるの?
可搬性を求めると csh -fc 'echo ~user' になるかな?
$ csh -fc 'echo ~user' csh: not found
最近のLinuxの鳥はデフォではcsh入ってないからな
可搬性を求めてるから getentだろ。
可搬性なんて幻想
シェルスクリプトは奥が深すぎて、きりがない。 どこらへんまで身に付いたら、「シェルスクリプトは理解した」と納得していいのかな?
316 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 19:19:46
実行できたら出いいよ
すみませんが詳しい方のみ回答をお願いします
>>315 それが、公での質問の仕方として相応しい、と自分で納得し、的確な回答を期待できる質問文だ、と納得して書き込んだキミ。
>>316 はキミの「納得していい」レベルに的確にあわせてくれたんだろwwww
結論、キミ次第。
別の回答がほしければ、他人の立場で
>>315 を読み直すことから始めよう。
319 :
315 :2009/08/31(月) 21:53:35
なんだ? 俺の知らんうちに。
>>317 は誰だよ?w
>>318 自分次第、そうだねぇ。
いや、たとえば C とかなら、ポインタ、構造体を理解すれば初心者卒業とか、
具体的に言っているのをよく見かけるでしょ。そんなのを期待してたんだ、スマン。
とりあえず、元々 bash にある、起動まわりのスクリプトを読み解くことにするよ。
>>319 > なんだ? 俺の知らんうちに。
1ヶ月ROMってろ
「元々 bash にある、起動まわりのスクリプト」って何だ?
>>319 > いや、たとえば C とかなら、ポインタ、構造体を理解すれば初心者卒業とか、
> 具体的に言っているのをよく見かけるでしょ。そんなのを期待してたんだ、スマン。
そういった「目的」を明示しなかったのが問題だったのだよ。
きっと皆の脳裏には、破滅に向かうプロジェクトの上流工程が彷彿したお。
・パラメータ展開の修飾子を使いこなす ・リダイレクトを使いこなす 他には?
・evalを使いこなす
× evalを使いこなす ○ evalを使いこなしていばる
◎ evalは俺の嫁。
>>324 リダイレクトというより、ファイルディスクリプタを使いこなせるようになりたい。
初 evalる事覚える 中 evalらない事を覚える 上 たまにevalる事を覚える
あんまりおもしろくないからその辺で。
ls $dirの結果を変数sに格納するにはどうすればいいですか?
>>332 s=`ls $dir`
ってこと?
なんか罠がありそうな質問だ。
それを1個ずつとりだしたいとか、スペース・タブが入ってるとか…
後のこと考えるなら、-1オプション付けといたほうが無難かもね。
337 :
名無しさん@お腹いっぱい。 :2009/09/02(水) 14:19:12
俺も初心者なんだけど、 ls -1 . | while read s do done てことでしょ?何で釣り?
>>337 ls -1
ls | cat
s=`ls`
echo "$s"
違いを述べよ。
よって、釣りじゃなければ「無知」。
>>337 ls | while ...
みたいに、lsの出力がパイプとかリダイレクト(端末以外)の場合は、
-1 オプションを付けなくてもデフォルトで勝手に -1が付くんだよ。
s=`ls $dir` の場合でも同じ。
「-1付けろ」なんて言ってる
>>335 はアフォ。
340 :
337 :2009/09/02(水) 14:53:59
なるほど・・・勉強になった!
「付く」わけではない。
>>341 「勝手に -1の効果が付く」と言って欲しいのかよww
344 :
332 :2009/09/02(水) 16:52:09
返事が遅くなって申し訳ありません。
>>333 さんのレスが欲しかった答えでした。
346 :
名無しさん@お腹いっぱい。 :2009/09/03(木) 17:03:44
質問させて下さい。 #!/bin/bash echo $"文字列$hensu" のような記述がありました。 $"〜"という表現を初めて見たのですが、 クォートの左の$は何の役割ですか?
bash依存だから、覚えない方がよろしい
>>346 bash$ echo $"FAILED"
FAILED
bash$ TEXTDOMAIN=initscripts
bash$ echo $"FAILED"
失敗
349 :
346 :2009/09/03(木) 20:06:49
>>348 ああ、*.poだか*.moだかですか。
ありがとうございます。
350 :
335 :2009/09/04(金) 09:29:19
シェルスクリプト初心者です。 全てのファイル名の最後の余計な部分を一括して取り除くにはどうしたらいいんでしょうか? $ ls hoge.hog;piyo fuga.fug;piyo foo.fo;piyo bar.ba;piyo この ;piyo を取り除きたいんです。 とっさに for hoge in *\;piyo; do mv $hoge まで打ち込みましたが、これ以上解りません… どなたか教えていただけないでしょうか
>>351 for hoge in *';piyo'; do mv "$hoge" `basename "$hoge" ';piyo'`; done
できました ありがとうございます。 文字列の操作 少し勉強します…
どうせbashだろうから、 ↓の方が簡単だろうけどな。 for hoge in *';piyo'; do mv "$hoge" "${hoge%;piyo}"; done
posixをbashと言っちゃう恥知らず。
posix(笑)
なんでposixをbashと言ってると思ったんだろう。
>>358 >>5 このスレはシェルスクリプトについてのスレです。
シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
使い方の質問などはスレ違いなので無用に願います。
1レスくらいどうってことないだろ。 器量が狭いな
つまんねー記事貼りつけるな。しかもbash専用。
俺はbashですが何か?
>>360 「器量」の意味を間違えて使っています。
どういう意味?
器量は良かったり悪かったりするもので狭かったり広かったりするのは心とか懐だろ。ちなみに大きかったり小さかったりするのは度量だ。
語源は「器の量」なのだから、大きいでも間違いではあるまい。
そういうことじゃなくて、 「器量が良い」=「顔が良い」(美人) という意味。 「狭い」じゃ意味をなさない。
女の器量はすなわち女性器なので狭いで正解。
き‐りょう【器量】 ‥リヤウ (「器」は材の在る所、「量」は徳のみつる所の意) (1)その地位・役目にふさわしい才能・人柄。保元物語「合戦の場には兄弟といふ差別候ふまじ。ただ―により候」。「人の上に立つ―がある」「―を上げる」 (2)才能・力量のすぐれていること。ものの上手。平家物語(4)「笛の御―たるによつてこの宮御相伝ありけり」 (3)(「縹緻」とも書く)顔だち。みめ。また、容姿のすぐれていること。狂、猿座頭「そなたの様な好い―で」。「十人並みの―」
>>368 それも意味の一つってだけだぞ
それしか知らずにそれだけだと思い込んで更に他人に意見するお前は馬鹿
器量
人の器の量だ。大きい小さい狭い広いであってるんだよ。
才能や心の広さ
度量というのは心意気を指して使う。
これは大きい小さいと使う
いわゆる男気のように心の大きさ
例えば人を許すという時に慈悲深い気持ちと我慢強さからくる二通りがある。
前者は器量、後者は度量。
勉強になりますお スレ違いの
無駄な改行うざ ひょっとしてスクロールしなきゃ見えないとでも? お前の頭、いつから時代が止まってんだ
黙ってろ。禿げ。
>>371 「古語辞典」使って誤魔化すんじゃねーよ。
(現代の)「国語辞典」でちゃんと意味調べてから出直せ。
あと、どちらにしても「?が狭い」なんて用法はないから。
旧カナ遣いは「古語」ではない。知らない奴は黙ってろ。
板名とスレタイトルを確認してください。
>>378 平家物語や保元物語は何時代に書かれたんだよww
知らないなら黙ってろ。
>>372 >器量
>人の器の量だ。大きい小さい狭い広いであってるんだよ。
>才能や心の広さ
ミスリードしてるね。
「才能」の意味はあるが、「心の広さ」の意味はない。
「器量を上げる(下げる)」=「才能、能力を上げる(下げる)」
といういい方は正しいが、
「器量が狭い(広い)」といういい方は間違い。
おそらく「器(うつわ)が小さい」(←これは正しい)の、
「器(うつわ)」と「器量」を混同して間違えて覚えているのだろう。
平家物語が引用されている辞書が全部「古語辞典」かよ。 馬鹿は黙ってろ。
>>382 少なくとも(
>>378 )が、「古語ではない」ただの「旧カナ遣い」だ、
って言ってるのは間違いだろ。
>>383 広辞苑が古語辞典かよ。どんだけ未来から来たんだ。引っ込んでろ禿げ。
斬新なキャラ語尾だな
>>384 広辞苑の話の前に、
「合戦の場には兄弟といふ差別候ふまじ。」
という文章が、
(1)古語
(2)古語ではないただの旧カナ遣い
のどちらなのか決着を付けようぜ。
>>386 そんな事誰も言っていない。
諦めて「
>>377 は間違いでした。ごめんなさい」って謝れよ。
>>381 でFAだな。
「器量が狭い」(
>>360 )は間違い。
あとから出てきて議論してる人は「器量」の他の意味を挙げてるけど、
どれも「狭い」につながる意味はない。
>>378 の謝罪は?
> 旧カナ遣いは「古語」ではない。
論点を整理すると、
「器量」に「心の広さ」「包容力」という意味があるかどうかってことだろ。
広辞苑(
>>371 ) にも「包容力」という意味は載ってなかったわけだし、
>>371 は自殺点を入れたな。
まあ、
>>371 は「器量には顔の良さ以外の意味もある」ということを
言いたかったんだろうけど、それを主張しても、
「器量が狭い」(
>>360 )を正当化することにはならない。
Results 1 - 10 of about 44,900 Japanese pages for 器量が狭い. (0.14 seconds) Results 1 - 10 of about 71,300 Japanese pages for 器量が小さい. (0.09 seconds) Results 1 - 10 of about 42,600 Japanese pages for 器量が広い. (0.14 seconds) Results 1 - 10 of about 76,900 Japanese pages for 器量が大きい. (0.28 seconds)
おまえら器量がないな
ヲタクは100%の確率で度量が小さい リアルでは常にビクビクしてる鼠みたいなやつ
397 :
名無しさん@お腹いっぱい。 :2009/09/11(金) 19:05:21
httpdが生きてるか否かを監視するスクリプトどなたか作ってください。
GETして200が返ればOK
返らなきゃ
[email protected] にメールを投げる
みたいな簡単なのでいいです。
>>371 は
>>368 の
> 「器量が良い」=「顔が良い」(美人) という意味。
に対する反証だろ。無様な言い逃れまだ続ける気?
どうでもいい、だまれ
>>400 かわいそうなくらい頭悪いな。お前もう死んだ方が良い。
>>363 スレに関係無いところ突っ込んで、無知を晒す事になった感想は?
止めときゃよかったと思ってる? 死にたくならない?
狭量なやつらでいっぱいのスレ
>>389 で大辞泉に
> しょう懼じょうふ【小丈夫】
> 2 器量の狭い人物。小人物。
という用例を例示されてるのに、まだ醜態晒し続けるの? 死にたくならない?
「才能が狭い」 「技量が狭い」 「面目が狭い」 どれもおかしい。 よって「器量が狭い」は誤用。
>>411 また捏造かよ。恥知らず。
>>371 の「リヤウ」を指して「旧カナ遣いは『古語』ではない」と言ったんだよ。わかるか? 馬鹿。
広辞苑を「古語辞典」といった本当の理由は
>>377 の馬鹿じゃないと分らないが、
「リヤウ」をみて古語辞典と誤解したと思ったんだよ。
他に広辞苑を「古語辞典」という理由がお前は思い当たるのか?
>>377 はもう出てこないだろうから真相は藪の中だが。
逃亡するくらいならしゃしゃりでてこなきゃ良いのに。馬鹿を自覚しつーの。
>>414 >「リヤウ」をみて古語辞典と誤解したと思ったんだよ。
ハハハ、そんなところ見てないよ。
古語と言ったのは用例の平家物語とかのところだよ。
結局古語でしか用例を示せてない辞書だから古語辞典だと思ったのだろう。
古語が載ってれば「古語辞典」と思うような馬鹿が存在するとは想定の範囲外だ。
>>377 お前は馬鹿過ぎ。出入り禁止。二度と発言すんな。
辞書に載ってるのは、
「顔立ち」「才能、技量」「面目」の3点なのに、
>>372 が「才能」の意味に「心の広さ」を勝手に追加してる件に付いて。
=================器量の話は終了================= =================器量の話は終了================= =================器量の話は終了================= =================器量の話は終了================= =================器量の話は終了================= =================器量の話は終了=================
UNIX使う人ってどうでもいいことで延々と語るのが好きな人が多いのなだよもんだよもんだよもん *BSDのマスコットは
ゆとりは器量が狭いのぅ
器量良しの意味しか無いと思い込んでた馬鹿が悪い
>>363 の事だが
>>423 その補足説明は「器量」という熟語自体の意味の説明にはなっていないよ。
補足説明は「器」と「量」の単漢字の意味の説明だから。
熟語になると意味が変わる。
俺は器量が広く度量があり、そして器量良しの女房がいる。 お前らカスと一緒にすんな。
431 :
名無しさん@お腹いっぱい。 :2009/09/12(土) 10:40:12
有識者諸兄殿 シェルスクリプトの勉強中で、教えていただきたい。 @while read AAA ; do 〜 ; done < fileX Afor AAA in `cat fileX`; do 〜 ; done の違いを教えて下さい。 処理スピードや処理(do 〜 )での柔軟性、fileXが小さい場合と大きい場合での違いなど。 よろしくお願いします。
普段から言葉を大事に使わないからイザとなったら慌てて辞書に頼り表面の意味だけを捉えて赤っ恥をかく。
>>363 ,368,377がその例だろう。
>>430 だれも「小丈夫」の話なんかしてないよ。的はずれな指摘。
「器量」の項目を引いて出直せ。
>>431 機種依存文字使うな。
whileの方は、1行毎にループ処理される。
forの方は、改行だけでなく、スペース・タブでも区切られて
それぞれに付いてループ処理される。
>>433 >慌てて辞書に頼り表面の意味だけを捉えて
一つ上のレスの意味すら理解できないんだな。
お前につける薬は無いな
>>431 シェルスクリプトスレで訊けよ
ひとこと言うなら、スペースの有無とかfileXの大きさとかより
(1)の do〜doneがサブシェルになることが注意
>>368 を書いた時点では、器量には容貌という意味しかないと信じ切っていたようだ。惨め過ぎる。
>>436 ダウト。
単なるファイル入力のリダイレクトだから、while read でも
サブシェルにはならない。
サブシェルになるのは、echo hoge | while read みたいな
パイプの場合。
>>437 違うよ。
容貌、才能、面目のすべての意味を知っていたが、
判例を挙げるにはひとつだけで十分だから、
一番意味がはっきり違う容貌を挙げただけ。
440 :
431 :2009/09/12(土) 11:10:07
>>434 >>436 >>438 なるほど!
forはfileXの行にスペース・タブ(IFS?)がある場合、行単位にならないのですね。
行単位に処理させたい場合はwhileの方が確実ですね。
勉強になりました。
サブシェルになる場合とその注意点などまだ自分にはピンと来ませんので
ちょっと勉強してみます。
ありがとうございました。
>>440 サブシェルで代入したシェル変数は親シェルには伝わらない。
>>439 残念ながら「狭い」という用法が*無い事*を示すためには、他の例をあげるだけ
では不十分なんだ。*有る*事をしめすなら一つだけ挙げればいいがな。
恥の上塗りまだ続けるのか? 惨め惨め惨め惨め。
いいかげんバカは放置しようよ
>>444 いや、
>>360 が、「器量」を「懐」あたりの意味と取り違えていて、
「器量」にはその意味しかないと思い込んでいると思われたので、
その反例として
>>368 で「器量」の意味のひとつを挙げた。
反例にはなっている。
>>446 お前が基地害だというのは充分判ったから
もういいだろ。どう足掻いてもお前に勝ち目は無いよ
「器量が狭い」を認められない器量の狭さワロス
>>450 そういうのは「懐が狭い」って言うんだよ。覚えとけ。
>>445 >>439 のような馬鹿は半端に叩くと粘着するから。「器量」を見ただけでPTSD起こす
くらいまで叩いて置かないといけない。
>>446 なってねーよ。馬鹿。たった、「1レスくらいどうってことないだろ。器量が狭いな」だけの
発言から
> 「器量」にはその意味しかないと思い込んでいると思われたので、
このように思うって、お前が馬鹿であるという証明にしかならない。
しかも、*無い*事を示すために他の例を挙げれば済むとか。
どんだけ低脳なんだよ。惨め惨め惨めの三重奏だぜ。
>>453 あほか、
懐が深い/浅いだと意味が違う。反例になってない。
一般的に、
>>454 >>456 みたいに「恥の上塗り」とかだけ書いて
具体的な反論を書かなくなった方が議論の負けなんだよ。
>>457 そのルールだとファビョったほうの勝ちか?
お前のように(笑)
まだ続くのか日本語講座
自作自演飽きた。
自演だと思うのは自分が自演してるからだ。
全部おれの自演でした
>>438 Solarisの/bin/shだとファイルリダイレクトでもサブシェルになる。
>>464 「サブシェルになる」ことをどうやって確認した?
まさか、while read AAA の、ループを抜けた時、
AAAの内容が空になるのを見て「サブシェルだ」と思ってないだろな。
readは最後に EOF を読み込んで while を抜けるから、
ループを抜けた時 AAA は空になるが、サブシェルではない。
while read AAA
do
BBB=$AAA
done < file
echo $BBB
で試してみろ。
SunOS4 当時の /bin/sh はどう振舞うの?
>>465 試したけど Solarisの /bin/shだとやっぱりサブシェルだよ。
469 :
名無しさん@お腹いっぱい。 :2009/09/13(日) 01:00:33
シェルスクリプトの実行者に対しy/n等で確認を求めたい場合 通常readで止めて入力を促しているのですが while read のループの中でそれをやろうとすると上手くいきません。 while read 〜 echo "Y or N" read YESNO ←ここで止まってくれない 〜判定処理〜 done < fileHoge whileのreadと入力要求のreadが干渉しているのが原因のように思っています。 よい方法はありますでしょうか? (ddやselectなども試しましたがダメでした)
read YESNO < /dev/tty かな?
ありがとう それやってみます!
472 :
名無しさん@お腹いっぱい。 :2009/09/13(日) 17:59:13
よく commandA | tee LOGFILE などのやり方で表示しつつログをとる事があると思いますが commandAの終了ステータスを判断したい時、この場合だと$?がteeの結果になり commandAの終了ステータスが分りません bashなら環境変数${PIPESTATUS[パイプライン中のコマンド位置]} で取れることを調べられたのですが、あいにく改造母体のファイルはkshなんです。 よい方法はありますでしょうか?
>>472 ((commandA; echo $? 1>&3) | tee LOGFILE ) 3>&1
474 :
472 :2009/09/13(日) 18:22:57
>>473 ありがとうございます!
明日試してみます!
>>473 この書き方すぐ忘れるんで、そんな時はcsh-whynotでググるんだ
csh(笑)
csh-whynotを知らずにcshを笑うとは… 爆笑だぜ。
ここだけ20世紀
479 :
名無しさん@お腹いっぱい。 :2009/09/20(日) 15:13:01
コマンドの引数に別のコマンド実行結果を利用する時 commandA `commandB` とやりますが、さらにその実行結果をコマンドの引数に利用したい場合、 変数にcommandA `commandB`を入れてcommandC $変数 などとやってるのですが、 変数を使わずに出来る手法はありますでしょうか。 イメージ的には「commandC `commandA `commandB``」みたいな感じ。
commandC $(commandA $(commandB)) 純正シェルの人は苦行に耐えて頑張ってください。
commandC `commandA ¥`commandB¥``
あるフォルダの中の*.cというファイルを~/srcというフォルダにコピーするにはどうすればいいですかね?
484 :
名無しさん@お腹いっぱい。 :2009/09/20(日) 18:47:47
スクリプト使わない質問はスレ違い
485 :
483 :2009/09/20(日) 18:49:13
申し訳ありませんでした。。
cp *.c ~/src/
>>486 説明不足でした。。
いくつかの階層に分かれていたのでできなかったのです。
情報後出しとか氏んどけって話ですよね。。
mv `find -name *.c` ~/src/
上のレスみて何とかなりました
もう本当にスレ汚し失礼しました。
>>486 やってみましたが、どうもホームフォルダの下の/srcにコピーされるようです。
?/srcというフォルダにコピーしたいんですが。
>>487 それだと同じ名前ぶつかってると上書きされるぞ。
スクリプトの中で使う場合って~と$HOMEってどっちが一般的なんですか?
もちろん $HOME チルダは純正では使えない
492 :
名無しさん@お腹いっぱい。 :2009/09/20(日) 20:46:49
bash又はkshで長さが一定でないファイル名からある位置の文字を取り出したい。 具体的にはhogehoge〜XX.txtのXXの2文字。後ろから5,6文字目。 前からの位置であればcutで簡単だったのだが後ろからで行き詰った。 考えた挙句、echo ファイル名 | wc -c等で長さを取って、 それをexprで6減算した値をcutの開始位置にしてやったりして出来たのだが たかが2文字取り出すだけなのにスマートじゃない。 もっとシンプルに行かないものでしょうか?
>>492 expr 'hogehoge〜XX.txt' : '.*¥(..¥).txt'
>>493 ありがとう今度やってみます
でもちょっと難しくて今時点でなんで期待の結果が得れるか把握しきれてないです。
exprのそういった使い方を勉強します。
revは環境依存?
>>492 fにファイル名が入っているとして
a=${f#${f%??.txt}}
echo ${a%.txt}
ではどうか。
bashでいいなら、 ↓で一発じゃん (fileにファイル名が入っているとして) echo ${file:$((${#file}-6)):2}
498 :
名無しさん@お腹いっぱい。 :2009/09/21(月) 14:38:10
対話的なスクリプトが二つあって それをスクリプト同士対話させたいのですが どのように相手の出力をもう片方の入力につなげるのでしょうか?
>>5 > シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
> 使い方の質問などはスレ違いなので無用に願います。
502 :
492 :2009/09/26(土) 20:45:00
503 :
名無しさん@お腹いっぱい。 :2009/09/27(日) 00:28:00
スクリプトの中で他ユーザにしか実行権の無い別のスクリプトを実行するため、 su - USER -c COMMAND としたいのですが、パスワードを求められます。 今時点ではパスワード入力をスクリプトの実行者に入力させてますが このパスワード入力をスクリプトの中で自動で出来る方法はありますか? ご教授お願いします。
バッククォートで実行するコマンドの標準出力と標準エラーをそれぞれ 別の変数に入れることってできますか? やりたいことは以下と等価なんだけど、一時ファイルを作らずにやりたいんです。 stdout=`command 2>stderr.tmp` stderr=`cat stderr.tmp`
>>504 すみません、Solarisなので両方とも使えませんでした。
>>506 Solarisでsudoもexpectも使えないなんてことを書いてしまうとは・・・
ろくに調べもしないでコマンド入れ替えただけとしか思えん。
混ぜ物を一切していない純血Solaris
あるコマンドの標準出力を一行ずつ見ていって、それがある正規表現Xにマッチしてたら コマンドAの標準入力にいれて、その標準出力を取得、それ以外なら、コマンドBの 標準入力に入れて、その標準出力を取得、その2つの標準出力を、標準入力の 順番と同じ順番でそろえて出力を得たいのですが、方法はありますでしょうか? わかる方いたら教えていただけませんでしょうか。よろしくお願いいたします。。。
>>510 #!/bin/sh
while IFS= read line
do
if echo "$line" | grep -q XXX
then
a=`echo "$line" | command_A`
echo "$a"
else
a=`echo "$line" | command_B`
echo "$a"
fi
done
>>511 ありがとうございます。
でもこれだと、command_A、command_Bは毎入力行ごとに起動しなおすことに
なりませんでしょうか。
command_A, command_Bともに入力に応じて、内部で状態が変化するので、
ずっと起動しっぱなしにしたいのですが、そういうことはできますか?
後出し乙。 ハイ、次の方どうぞ ↓
>>510 #!/bin/sh
(
(
while IFS= read line
do
if echo "$line" | grep -q XXX
then
echo "$line"
else
echo "$line" 1>&3
fi
done | command_A 1>&4
) 3>&1 | command_B
) 4>&1
command_A, command_Bに確実に一行ずつ出力させる事が出来なければ不可能。
>>514 素早い回答、ありがとうございます。
ファイルディスクリプタんの複製なんて、10年振りに見ました。
このスレは初探訪なのですが、スレ住人の方々はみな、このような
スクリプトを自在に操る変態さんばかりなのでしょうか。
まだまだ精進が足りないと痛切に思いました。
自在にこんなスクリプトが書けるまで、精進したいと思います....
ところで、この"grep -q" って、入力毎に起動しているようですが、
これはずっと起動しっぱなしに比べて、パフォーマンス的にはどうなんでしょう。
実はgrepのこういう多数回の起動(fork())ってそんなに大変なことではない??
>>515 うーむ、さきにcommand_Aの方が処理された後に、command_Bの方が
実行されるみたいですね。やっぱり無理かなぁ。
>>516 正規表現じゃなくて、単なるパターンマッチで良ければ、
grep -q の代わりに case文を使えば、
内部コマンドだけになるから速くなるよ。
シェルスクリプトを、別のシェルスクリプトの中からをバックグラウンドで実行すると SIGINTが無視されてしまうんだけど、何とかSIGINTをトラップできる ようにする方法ありませんか? 例えば以下のようなシェルスクリプト command.sh を作って、 #!/bin/sh trap 'echo sigint' INT trap -p インタラクティブなシェルから command.sh & すれば期待通り動くんですが、 別のシェルスクリプトの中から command.sh & で呼び出すと SIGINT のハンドラが 設定されないんです。 この動作自体は一応 bsh 系の仕様っぽいですが… Linux 上の bash 限定でも良いので、何か解決法があったら教えてください。
>>519 シェルスクリプトの中から、
sh -c 'set -m; command.sh &'
で呼び出す。
521 :
名無しさん@お腹いっぱい。 :2009/10/03(土) 09:28:17
>>481 のやり方ってネストは2個まで?
commandD `commandC \`commandA \`commandB\`\``
でやったら上手くいかなかったような。。。(bash)
あたりまえ。\もエスケープしなければダメ。
>521 commandD `commandC ¥`commandA ¥¥¥`commandB¥¥¥`¥``
>>521 3個でもできるよ。
commandD `commandC ¥`commandB ¥¥¥`commandA¥¥¥`¥``
527 :
名無しさん@お腹いっぱい。 :2009/10/04(日) 17:20:27
時々シェルスクリプトで簡単なツールを作ったりしてるのですが
perlを勉強してみたくなりました。
>>1 に
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
とありますが、具体的にどのような観点でシェルスクリプトとperlを使い分けするのでしょうか?
このような処理ケースではperlを使う方が効果的みたいな例を教授
(もしくはそのような事が記載されているサイトに誘導)していただけたら幸いです。
現状でシェルスクリプトで問題なくやってるなら、 perlなんて覚えない方がいい。
529 :
527 :2009/10/04(日) 17:27:13
少し調べてみてるのですがPerlは文字列処理等が得意であるというのを見ますが、 そうするとsedやawkを使う場面なんかがperlでやった方がよりよいでしょうか?
530 :
527 :2009/10/04(日) 17:34:22
>>528 現状、何とか目的の機能は達成してるって感じですが、
同じ事がperlなら断然簡潔かつ高速処理で出来たりするのかな?なんて思うもので。。。
3項演算子は両方とも評価するのか?
>>529 例えば一行の処理毎に、シェルスクリプトでは外部コマンドを起動する必要がある、
perlでは不要。というような場合、データが大きくなればperlの方が速くなる。
533 :
529 :2009/10/04(日) 18:31:28
>>532 それはテキストの一行に対して処理する事に対し、シェルスクリプトならその行数分外部コマンドが実行、
つまりシェルスクリプトでテキストの1行に1コマンド処理実行させてる場合、
100行なら100回外部コマンドが実行される事になるが
perlなら1コマンド?で処理が終了するので大きいテキストに対してだと
処理スピードに差がでるって事でしょうか?
テキストの一行じゃないんじゃないの。sedもawkも複数行を処理できるでしょ。 あとマルチコアプロセッサとかだと、プロセスが分かれていた方が処理が早く 終わったりもするね。 キッチンシンクアプローチとツールボックスアプローチを調べてみると良いと思うよ。
>>533 そう。プロセスの生成は非常にハイコスト。
536 :
529 :2009/10/04(日) 19:12:23
>>534-535 ありがとう。
うーん、でも完全に理解し切れてない。
何かを実現させる時、シェルスクリプトの場合複数のコマンド発行(プロセス起動)が
perlなら少プロセスで可能な場合(主にテキスト処理などで)があるって事でしょうか?
>キッチンシンクアプローチとツールボックスアプローチを調べてみると良いと思うよ。
調べてみます。
python
オライリーのミニマルPerlって本があって、 sh&sed&awk の粗探しをして Perl への移行を薦めるような内容なんだが、 これ読むと逆に、とくに大規模でもないテキスト処理なら シェルで無問題じゃんって感じなんだよね。 Perlが受けたのは、第一に実装が優秀で速かったのと、 あと Perl はベル研系の厳格な雰囲気がないというか、 何となく書いて動いちゃうとこがある。そのへんの寛容さが人気の秘密かと
結局適材適所と、それを判断出来る能力の問題だと思うよ。 シェルスクリプトで遅いなら、perlなりでやる。それでも遅いならCとか。
echoで最後に改行したくない場合、 echo -n "unko" では期待通りに出力されるのですが、 echo "unko\c" だとunko\cと改行して出力されてしまいます。 Cygwinで\cに対応させるにはどうしたらよいでしょうか。 よろしくお願いいたします。
>>541 CygwinということはGNU coreutilsのechoか。
-e オプション?
542 :
540 :2009/10/05(月) 19:05:48
>>541 おおお、ありがとうございます。
$ echo -e "unko\c"
で期待通り
unko$
と出力ができました。
本番の環境はHP-UXを使用しておりまして、
逆に-eオプションが無い(?)ため、
$ echo -e "unko\c"
とした場合、
-e unko$
と出力されてしまいすが、とりあえず、
alias echo='echo -e'
で解決いたしました。
ありがとうございました!!!!
そのへんの移植性に関するバッドノウハウはGNU autotoolsに詰まってる。
544 :
名無しさん@お腹いっぱい。 :2009/10/21(水) 12:16:25
RCSで、チェックイン済みの最新リビジョンと、そのひとつ前のリビジョンを比較 ということをよくやります。 今は、rlog -r fileで最新リビジョン番号を調べて、たとえば 1.123 だったとすると、 頭の中でリビジョンを1引いて、rcsdiff -r -r1.122 file みたいに実行しています。 これを1発でやるシェルはできませんか? あ、sed/awk等でゴニョゴニョやる方法じゃなく(それしかないなら自分でやるので)、 奇麗にエレガントにやる方法を希望します。
よく知らないで申し訳ないが current=`rlog -r file | grep 'なんとか'` current=`expr $current - 0.001` rcsdiff -r -$current file 空白とか改行とか考慮せずかなり適当に書いたけど。 exprでできないならbc使えばできるかもしれない。
それはエレガントじゃないらしいよ
シェルってゆうな。クズ。
エレガントさが求められていたのか 知らんかったよ、すまん
奇麗でエレガントな質問を募集します。
>>545 エレガント云々を除いてもそれじゃ駄目だよ。
リビジョン番号は、 1.8 1.9 1.10 1.11 ... 1.99 1.100 1.101 ...
って進むから、expr で 0.001 引くのは全然見当違い。
どうしてもわからないので質問させてください。 #!/bin/sh DIR=`pwd` cd $DIR/file ./play のようにC言語で記述したplayファイルを実行しているのですが play内では簡単に表すと以下のような処理をしています while(true){ ファイルの読み込み処理 sleep(1); } このように1秒ごとにファイルを監視してるのですが シェルスクリプトで実行すると1秒待たずにwhileループが回っているのですが どうすればよいのでしょうか?
>>551 そのwhileループの具体的なスクリプトを出さずに質問したいなら、
エスパースレに池。
sleepコマンド自体が文法またはオプションエラーになってて
1秒待ててないんじゃないの?
問題点を人に伝える能力が欠けすぎ
>>552 whileループはC言語で書いてるんだろ。(プログラムは出てるじゃん)
コマンドラインで直接 ./play を実行すると1秒毎に処理されるのに、
>>551 のシェルスクリプト経由で ./play を実行すると1秒待たずにループする、
という話だろ。
で、答えは?
>>551 sleep()関数はシグナルで中断される可能性がある。
シグナルが到着すればsleep(1)は1秒未満で終了する。
代わりにnanosleep()使え。
たぶん、シェルスクリプト経由の時だけシグナルが発生するような
別の条件が加わってるんだろ。
>>551 play コマンド側は特に何もせずシェルスクリプト側で sleep 1; すればいいんじゃね?
>>556 ありがとうございます。
試してみましたが同じ状態になりました。
説明が不足していてすみません
GNU Chessを改造していたので、その部分のコードを切り抜いても分かりづらいので自分なりに説明したのですが、説明力がなくてすみません。
ファイルの読み込み部分の処理は
while(true){
sleep(1);
if(rlogfp=fopen("./black.log","r")){
fgets(inp, MAXSTR, rlogfp);
fclose(rlogfp);
remove("./black.log");
break;
}
}
black.logというのは次の手を指定した文字列が収められているファイルです。
C言語で書くのもうまくないので下手なコードですが、ご了承ください。
>>557 whileで監視しているのでsleep(1)がないとファイル作成時に読み込みが実行されるのか、うまくデータが受け取れないので
sleep(1)を追加している次第です。
後からこんなことを追加するのはすみませんが どうやら監視しているファイルが存在しないのに、ファイルがあるように動いているみたいで、 ファイル読み込む→whileを抜け出す→間違った手だと解釈→whileに入りファイルを読み込む を繰り返すようになっているみたいです。 シェルスクリプトではなくターム上で実行するとうまくいくのに スクリプトだとこの現象がおこるのはどういったわけでしょうか?
>>560 シェルスクリプトの cd $DIR/file あたりがうまく行ってないとか。
別のディレクトリの black.logを読んでループしてるとか。
>>561 レスありがとうございます
他のディレクトリではblack.logは生成していないのでそのケースはないかと思います
ディレクトリの場所も間違いはないです
sleepはループの先頭なの?それなら確実に1秒待つでしょ? 説明に一貫性がないと回答者も混乱するし、いいことないよ。 あとは、fgets, fclose, removeの戻り値をちゃんとチェックしてみる。
ぱおーん ってそれはエレファント
>>551 >シェルスクリプトで実行すると1秒待たずにwhileループが回っている
これはどうやって確認したの?
原因を切り分ける為に、問題を再現出来る最小限の
プログラムを作ってみると良いと思うよ。
>>563 ,565
アドバイス通り明日調べてみます。
>>559 > whileで監視しているのでsleep(1)がないと
> ファイル作成時に読み込みが実行されるのか、
> うまくデータが受け取れないので
busy waitになるだけでちゃんと動くはずだろ。
だから動かないのは、sleep()以外のところがおかしい。
そのファイル、NFS かなんかの領域に置いてないか? おかしなキャッシュが効いてるような気がする。
569 :
名無しさん@お腹いっぱい。 :2009/10/27(火) 11:38:40
>>568 特に変わった場所には置いてません。
とりあえずthreadやwhileループとファイルの読み込みの部分だけ同じ形でtestファイルを作ってみたのですが
直接実行、シェルスクリプトで実行で共に問題がなかったので、もっと別の場所だと分かりました。
もう少し試行錯誤してみたいと思います。
input_threadが動き出す前にwait_for_inputに入ると、 input_statusが初期値(INPUT_NONE)のままなので、whileを抜けてしまう。
test が表示されないという現象はウチでは一度も再現しませんでした。 Dual Core の Mac です。 外してたらスマソ。 test.sh を実行する Ctrl-C で test.sh を止める a.out のプロセスは残ったまま とかじゃないよね? まあそれでも test が表示されない理由にはなりませんけど。
一度目がその症状があって
もう一度試したら治っていました
>>571 どのように記述すれば回避できるのでしょうか?
丸投げのようですみません^^;
以前動作していたスクリプトが動かなくなってしまいました… ここ最近kshのアップデートを行ったのが原因なのでしょうか… 何か情報をお持ちの方いらっしゃいましたらご教授願います。 <事象> 特に問題なく見えるkshがsyntax Error `(' unexpectedで異常終了 コメント内のスペースを1つ削除or2つ追加すると正常に動作する <やったこと> kshとbashのアップデート ksh 20060214-1.4 → 20080202-14.el5 bash bash3.1-16.1 → bash3.2-21.el5 <環境> redhat Linux 5.1 uname -a結果 Linuc 2.6.18-53.el5 #1 SMP Wed Oct 10 16:34:19 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux <備考> ksh -nで構文チェックをかけると、構文エラー以外に「" quote may be missing」という警告が必ずついてきます。 コメントを弄ってエラーを抑止するとこの警告も発生しなくなります。
575 :
551 :2009/10/28(水) 00:05:16
. play.shで実行したらうまく動きました。 結局原因はわかりませんでしたが、サブシェルだと何か環境とちがったのかな?と素人ながら思います。 お騒がせしてすみませんでした。
それたまたまだから
while(true)なんてしないで、openの返り値でなんとかならんの?
>>574 おいおい、redhat 5.1というのは10年くらい前のOSで、
カーネルは2.0の時代のもの。(libc5からやっとglibc2に変わった時代)
カーネル2.6で動くわけがない。
579 :
574 :2009/10/28(水) 11:18:44
>>578 今確認したところ、redhat 5.1ではなく
RHEL 5.1でした
redhatLINUXとRHELを混同していました
申し訳ありません
libc5なつかしいな。 glibc2(libc6)になってようやくLANG関係がマトモになったんだっけ
どうせShift_JISのコメントだろ。
583 :
574 :2009/10/28(水) 23:54:47
>>580 手元にスクリプトがない上に動く動かないの条件がよく分からないので再現できず…
申し訳ないです。
>>582 コメント等もう一度文字コードを見直しましたが、すべてUTF-8でした。
手元にスクリプトがないのにコメント等見直した?意味が分からんのだが
不思議な話だなw
586 :
名無しさん@お腹いっぱい。 :2009/10/29(木) 22:50:29
LOTO6用の数字列を生成する for x in $(seq 1 5); do echo $(seq 1 43 | shuf | head -6 | sort -n); done
>>586 for((i=0;i++<5;)){ echo `shuf -i 1-43 -n 6 | sort`; }
↑の方が簡単
588 :
名無しさん@お腹いっぱい。 :2009/11/10(火) 09:10:20
質問です。記法1と2では違いがありますか?どちらが正しいとか… doの後に改行入れるべきかどうなのか,ということですが。 記法1 for i in * do echo $i done 記法2 for i in * do \ echo $i done
>>588 記法2は間違いではないがバックスラッシュが余分。
もともと do の直後には、空白、タブまたは改行の区切り文字があればなんでも良い。
「行の継続」をする必要はないので、バックスラッシュは不要。
590 :
588 :2009/11/10(火) 11:02:41
今のトレンドは↓の書き方。 bash依存じゃないぞ。純正シェルでもちゃんと動くから安心して使え。 for i in * { echo $i }
どこのトレンドだよwwwww
for は { ... } でもいいけど、 while は do ... done じゃないといかんというのがアレ。
kshで標準出力と標準エラーをデフォルトでファイル&画面に出力するやり方はありますか? 毎行、| tee -a hoge.log を書くのが大変なので。
>>594 (
command1
command2
command3
:
) 2>&1 | tee -a hoge.log
俺はそういうとき telnet localhost | tee hoge.log ってやってる
自分よりいい答えが出たのがそんなに悔しかったのか
> 毎行、| tee -a hoge.log を書くのが大変なので。 毎行と言っているし、ここはシェルスクリプトスレなのでスクリプトの中での記述に 関しての質問だと言う事が容易に予想できる。 スクリプトに関しての質問にscript使えだの、telnetをリダイレクトしろだの、 ボケまくりの回答してる奴らは何なのだろう? 匿名掲示板だからボケ回答も恥ずかしくないのだろうか?
必死だなw
>>599 只の知ったかだろ
半角数字とか学生の分際で早くも理系気取りかよ
> 半角数字とか学生の分際で早くも理系気取りかよ これは新コピペになりそうな気がする
>>604 新コピペとか学生の分際で早くも理系気取りかよ
…こんな感じ?
bashを使用しています。 数字が入っている変数に3桁毎にカンマを入れる方法が分かりません。 どうやれば3桁毎にカンマを入れれるようになりますか?
>>606 printf "%'d" "$var"
>>607 これはいいことを聞いたと、試してみたができないぞ?
$ bash --version
GNU bash, version 4.0.28(2)-release (i686-pc-linux-gnu)
>>607 では printfの書式に改行が入ってないから、
シェルのプロンプト設定によってはprintfの出力をプロンプトが上書きしてしまう
とエスパー。
それとは別に、zshの内蔵printfでは動作しないね。
611 :
606 :2009/11/21(土) 23:23:18
>>607 さん
有難うございました。ウチの環境ではうまくいきました。
$ printf "%'d\n" "123456" 123456 $ var="12345667" $ printf "%'d\n" "$var" 12345667 なにがいけないのかねー
$ printf "%aqd\n" "123456"
>>612 localeの設定じゃない?
printf(3)によると、
>>printf("%'.2f", 1234567.89);
>>results in '1234567.89' in the POSIX locale, in '1234567,89' in the nl_NL locale,
>>and in '1.234.567,89' in the da_DK locale.
>>614 ロケールの問題でした。ありがとう。
ちょっと気になるのは、printfコマンドする時に
LC_ALLを明示的に与えても上手く動作しなかったんですよね
組み込みコマンドだと伝わらないのかな?
$ locale
LANG=ja_JP.eucJP
LC_CTYPE="ja_JP.eucJP"
LC_NUMERIC=C
LC_TIME=C
LC_COLLATE="ja_JP.eucJP"
LC_MONETARY="ja_JP.eucJP"
LC_MESSAGES=C
LC_PAPER="ja_JP.eucJP"
LC_NAME="ja_JP.eucJP"
LC_ADDRESS="ja_JP.eucJP"
LC_TELEPHONE="ja_JP.eucJP"
LC_MEASUREMENT="ja_JP.eucJP"
LC_IDENTIFICATION="ja_JP.eucJP"
LC_ALL=
$ LC_ALL=da_DK printf "%'d\n" "123456789"
123456789
$ LC_ALL=da_DK bash
$ locale
LANG=ja_JP.eucJP
LC_CTYPE="da_DK"
(省略)
LC_ALL=da_DK
$ printf "%'d\n" "123456789"
123.456.789
$ printf "%'d" "123456789" printf: %': invalid directive
>>615 >>$ LC_ALL=da_DK printf "%'d\n" "123456789"
LC_ALL を LC_NUMERIC にしてもダメ?
(優先される)強さは、 強 LC_ALL > LC_個別 > LANG 弱 のはずだから、LC_ALL があってダメなら LC_NUMERIC でもダメな希ガス。
>>617 ダメでした。
というかlocale(7)に書いてあるロケールの決定順序を見る限り
$ LC_ALL=da_DK printf "%'d\n" "123456789"
で動かなければ、LC_NUMERICを使っても同じなのではないかと。
ところで、
$ LC_ALL=da_DK locale
の結果は$ LC_ALL=da_DK bashで作ったシェル上でlocaleした
(参考
>>615 の2個目のlocale)のと同じ結果になります。
(つまりLC_ALLも、LC_NUMERICもda_DK)
その癖に、
$ LC_ALL=da_DK printf "%s\n" "$LC_NUMERIC" と
$ LC_ALL=da_DK echo "$LC_NUMERIC" はどちらも「C」が出力
(参考
>>615 の1個目のlocale)になるんですよね。LC_ALLはもちろん、改行のみです。
環境変数の伝わり方が変ですよね?
つまり、
localeだとLC_ALL(もしくはLC_NUMERIC)がexportされてて、
printfとechoはexportされない。
それと、
>>615 で「組み込みコマンドだと・・・」といいましたが、
$ type -a echo したら、builtinと/bin/echoの2つのエントリがあったので、
どちらも試してみましたが、exportされませんでした。
どういうメカニズムでこうなっちゃうんでしょう。
>>618 とレスが一部被ってしまった
連レスですみませんが、
コマンドの前に環境変数定義をつけるシンタックスって
なんという名前で呼ばれていますか?
そもそもどういうものなのかを調べたいのですが、ググりづらくて。
>>620 shじゃなくてbashのマニュアルで申し訳ないが、
A simple command is a sequence of optional variable assignments
followed by blank-separated words and redirections, and terminated
by a control operator.
だそうな。
optional variable assignments (省略可能な変数代入)
>>621 ありがとう。man bash読みました。
組み込みコマンドでの、optional variable assignmentの挙動についてまとめてみました。
COMMAND EXECUTION ENVIRONMENT節に以下の記述があります。
When a simple command other than a builtin or shell function is to be
executed, it is invoked in a separate execution environment
つまり組み込みコマンドはseparate execution environmentで呼び出されない。
これは当たり前のことで、組み込みコマンドは別シェルで実行されないということですよね。
そして個人的に新たに知ったのは、optional variable assignmentは別シェルにしか
伝えられないということです。(現在のシェル変数には代入されない)
だから、
>>615 で $ LC_ALL=da_DK printf "%'d\n" "123456789"
がコンマ区切りにならなかったんですね。
だったら、敢えてシェル変数を伝えられた実行環境を作って、printfするとどうなるか。
#include <stdlib.h>
int main()
{
system("printf \"%s\n\" \"$LC_NUMERIC\"");
system("printf \"%'d\n\" \"123456789\"");
return 0;
}
をコンパイルしたa.outに対して試してみました。
(a.outは組み込みコマンドではないので別シェルで実行され、
optional variable assignmentが伝えられる)
$ ./a.out
C
123456789
$ LC_NUMERIC=da_DK ./a.out
da_DK
123.456.789
$ LC_ALL=da_DK ./a.out
C
123.456.789
となりました。
>>615 の後半のようにLC_ALL=da_DK bashで環境作ってからやる方が楽なので、
本末転倒になりましたが。。。
ところで、これで興味深いのは、LC_ALLはLC_NUMERICに影響を及ぼさないことです。
>>615 では LC_ALL=da_DK bash 後にlocaleすると、LC_ALL=LC_NUMERIC=da_DKになりますが、
bashの初期化処理でLC_ALLの値をLC_NUMERICにコピーしているのかも?
最後に。619の訂正。
SIMPLE COMMAND EXPANSIONの節の 4.にあるように、
parameter expansionされてからコマンドが実行されるようなので、
$ LC_NUMERIC=da_DK printf "%s\n" "$LC_NUMERIC"
はコマンドが実行される前に引数の$LC_NUMERICが「C」(参考
>>615 )と展開される。
そのため、Cが表示される。
長文失礼しました。
組み込みコマンドがseparate execution environmentで呼び出されないのは bashの場合の話。 kshでは組み込みコマンドでもseparate execution environmentで動作する。
やはり、sh系といえども、何を使っているかは明示すべきなんだな。
確かにその通りですね。
上は全部
>>608 の環境で試してた。
627 :
名無しさん@お腹いっぱい。 :2009/11/26(木) 14:47:50
"aa-1125.txt" "aa-0001.txt" "aa bb-1125.txt" "aa bb-0001.txt" "aa bb cc-1125.txt" "aa bb cc-0001.txt" 同じディレクトリにこの6ファイルがあるとします。 この中から「aa bb-????.txt」の形式で且つ最も新しいファイルを 探したいんですが、 (当然のことですが)ls -ltr "aa bb-????.txt"|tail -1とやるとエラーになってしまいます。 どうすればいいでしょうか?シェルはbashです。
ls -ltr (ここに6個のファイル名を羅列)|tail -1
ls -lt aa\ bb-????.txt | head -1
bbの無いファイルもあるぞ
あるよ だから?
632 :
名無しさん@お腹いっぱい。 :2009/11/26(木) 15:49:56
申し遅れましたが、
実際にはファイル数、ハイフンより前の部分のファイル名は不定です。
>>627 は単純化した例です。
>>627 の時点で知りたかったことは自動でエスケイプする方法もしくはそのコマンドです。
一体何がしたいんだよ 何とマッチさせたいんだ?
634 :
名無しさん@お腹いっぱい。 :2009/11/26(木) 16:07:04
>>627 の下から2行めをエスケイプしたものが
>>629 なわけですが、(実質的に)
そのようなことをスクリプト内で自動でおこないたいということです。
sed,awkを使うのかなと思いますが、インタラクティブだと[tab]キーを押すと
できるようなことなので、bash内部でも出来ないかなとも思います。
ハイフンより前にスペースが含まれていようがいまいが
*-????.txt で
>>627 の6ファイル全てにマッチするんだけど
それで何か困るのか
636 :
名無しさん@お腹いっぱい。 :2009/11/26(木) 17:03:15
unix超ど素人です。 本を参照しても見つからないので、 質問させてください。 ちなみにここで推奨されてないcshを使っています。 例えば80.0というように小数点がある数字を 80といった整数に書き直すスクリプトをつくりたいのですが、 うまくいきません。 #!/bin/csh set y_info = 80.0 echo int($y_info) > aaa.dat どうすれば解決できますでしょうか?
解決の第一歩は、cshを捨てる事だ。
>>627 スペースだけをクォートすればいい。シングルクォートの方がお勧め
ls -ltr ??' '??-????.txt | tail -1
>>636 cshは捨てさせていただくので、shでどうぞ。
#!/bin/sh
y_info=80.0
printf '%.0f¥n' $y_info
>>636 cshなら拡張子を削る機能が組み込まれてるので、
悪くないチョイスだよ
#!/bin/csh
set y_info=80.0
echo $y_inf:r > aaa.dat
なんと :r を付けるだけで小数点以下を削れるんだぜ
echo $y_info:r > aaa.dat のミス
あと、csh スクリプトは #!/bin/csh -f にした方がなにかと幸せ
>>640 それだと、 .5 みたいに頭の 0が省略されてる小数で誤動作する。
>>640 (数値じゃなく)拡張子とみなして削る方式なら shでもできる。
#!/bin/sh
y_info=80.0
echo ${y_info%.*}
csh(笑)の出番なし。
645 :
636 :2009/11/26(木) 21:13:03
>>640 うまくいきました
トンクス
他の方もレスありがとうございます
シミュレーションで得られたデータを出力する際にスクリプトを使用しています。
周りがcsh使ってたので、それを使ってましたが、
shの方が問題点が少なそうなので、
そっちにシフトしてみようと思います。
半導体屋か? あいつら何でcsh好きなんだ?
以前にcshで作って、それですんでりゃそうなるだろう。
tcsh以外に便利なインタラクティブシェルがなかった時代の負債といえようか
ちょっとしたスクリプトの場合、cshの方が書きやすい場合もある。 四則演算が出来るとか配列が使えるとか、要はケースバイケース
>>650 四則演算も配列も、今時のsh(系)でできる。
ケースバイケースでcshスクリプトなんて混ぜられちゃ迷惑だ
コピペで数千行を超えるのcshスクリプト作るんだぜ。 ちょっとしたを遥かに超越している。
実績があります、とか言ったりなんかしちゃったりして
655 :
名無しさん@お腹いっぱい。 :2009/11/28(土) 17:21:38
UNIXド素人です。 手詰り状態なのでアドバイス頂けると幸いです。 ◆処理内容 Aディレクトリから、Bディレクトリにファイルをコピーする。 (コピーオプション:-p -f) ◆コピー条件 Bディレクトリのファイルの更新時間とAディレクトリのファイルの 更新時間が異なる場合。 ◆その他 更新時間が異ならない場合は、エラーとし、1を戻り値とする。 上記のようなスクリプトを作成したいのですが どのような処理にしたらよろしいのでしょうか?
書いてあるとおりに処理しよう
657 :
655 :2009/11/28(土) 18:21:04
すいません。。 意味わからない質問になっていました。。 やり方がわからない処理は「更新時間を比較する」点です。 お互いの更新時間を変数に入れ、同じ場合と違う場合で処理を決めれば いいことはわかるのですが、更新時間を比較することなどできるので しょうか?
>>655 要点だけ書くよ。
if [ "$file1" -nt "$file2" ]; then
cp -pf "$file1" "$file2"
fi
659 :
655 :2009/11/28(土) 18:43:33
>>658 ありがとうございます。
ファイルが更新された場合、サイズや更新時間で比較するしかないと思われるのですが
更新時間や、ファイルの詳細?を変数に格納することは可能なのでしょうか?
>>659 md5sumとかでハッシュ値を見たら?
>>659 せっかく回答もらってるのに意味をちゃんと理解しろよ。
[ A -nt B ]
ってやったら、これで更新時間を比較してるんだよ。
別に更新時間を変数に入れる必要なんかない。
-nt は、"newer than" ね。
662 :
655 :2009/11/28(土) 19:16:35
>>658 >>661 そういうことですね!!
ファイルの更新時間ではなく、ファイル自体を比較すればいいのですね!!
理解力が無く、ご迷惑おかけいたしました・・・
アドバイスを参考にスクリプトを作成してみたいと思います。
ありがとうございました。
>>662 違うよ。
ファイル自体なんて比較してない。
更新時間を比較してるの。
if [ fileA -nt fileB ]; then ...
ってやると、fileA と fileBの更新時刻を比較して、
その結果で動作が決まるんだよ。
fileA/fileBの中身は読んでない。
md5sumとかハッシュとか言ってる回答者の言うことはここでは無視しとけ。 単純にシェルスクリプトから [ ] (testコマンド)で時刻比較できるんだから。
更新時刻が異なる場合、なのに、newer than だけでいいんだろうか
668 :
655 :2009/11/28(土) 19:36:40
>>663 少し調べてみましたところ、ファイルのタイムスタンプ、つまり更新時間
を比較しているのですね。
ファイルの比較には -nt -ot の2種類があるようですが
"="や"!="で比較することは無理と理解してよろしいのでしょうか?
>>667 だから
>>658 は「要点だけ」って言ってるんだよ。
せっかく
>>668 が -nt と -ot を調べたんだから、
それを -o すれば 時刻の "!=" を条件を記述できることに気づくはず。
>>668 > ファイルの比較には -nt -ot の2種類があるようですが
>>663 を読み直せ…
rsync 使え、で終わる気がする
>>668 > "="や"!="で比較することは無理と理解してよろしいのでしょうか?
そう考えていいよ。「異なる場合」って言ってるんだから、
「「新しい場合」または「古い場合」」
っていう条件が必要なんでしょ?
それぞれ
>>663 の書式を使って-ntと-otでできるよ。君の言うとおりだよ。
あとは二つをつなぐ「または」を調べてみてごらん。
>>669 もそう言ってるけどね。
>>671 俺もそう思う。
673 :
655 :2009/11/29(日) 00:32:15
>>672 if [ FILE1 -nt FILE2 -o FILE1 -ot FILE2 ] ; then
cp -p -f …
exit 0
else
exit 1
fi
とすればいいのですね!
>>658 >>663 そこまで読み取ることができず、ご迷惑おかけいたしました。。
sed -e 's@\([^:]\)//*@\1/@g'
マジキチ
678 :
名無しさん@お腹いっぱい。 :2009/12/05(土) 19:23:28
複雑多数のサブディレクトリを持つディレクトリAを複製したい 但し、いくつかのサブディレクトリについては複製対象外としたい。 現状以下のようにやってます。 cp -rp A B rm -rf B/a/b/c rm -rf B/bb/aa/cc ・・・消したい対象分ひたすら羅列。 サブディレクトリ内のサイズが大きく、cp,rmで余計な時間が掛かってしまいます。 AをBとして複製する場合に、「このサブディレクトリ以外すべてコピー」 またいな記述方法はありますでしょうか? sh,bashでお願いします。
cd A tar cf - . --exclude a/b/c --exclude bb/aa/cc | tar xf - -C /path/to/B
>>679 なるほど、tarのアーカイブファイルを経由させるのですね。
ありがとう。やってみます。
find . -print |egrep -f exlude-pattern-file |cpio -pumd destdir さらに、コピーでなくてハードリンクで済ませられるなら、高速、省スペース。 find . -print |egrep -f exlude-pattern-file |cpio -pumdl destdir
ありがとう。一考してみます。
findの判別式を単独のファイルに適用して、真偽値だけほしいんだけど どうしたらいい?
例えば [ -n "`find /path/to/file -mtime 7 ...`" ] みたいな感じか?
いや、 find /path/to/file -mtime 7 2> /dev/null; echo $? だろ。
ファイルが正常に処理されれば、判定結果にかかわらず戻り値はいつも0だよ
>>686 マッチしてもしなくても$?は0なのよ
>>685 なるほど文字列の長さを見るのか
とりあえずこれでやってみるわ超サンクス
他サーバ上のtar.gzファイルを解凍する方法はないでしょうか?
sshとか可能なら普通に解凍できるから、そうじゃない質問だとして、 エスパー募集だな
>>690 たとえばftpで他サーバに接続して、gzip -cd | tar xvf -
のようなことはできないでしょうか?
>>692 ありがとうございます。
ちょっと試してみます。
すみません、スクリプト内で使用されている変数について教えてください。 使用しているOSはCentOS5.3です。 今、勉強がてら/etc/init.d/functionsを読んでいるのですが、 functions内で使用されている変数$LSBの意味がわかりません。 使用例 :[ "$BOOTUP" = "verbose" -a -z "${LSB:-}" ] のように記述されています。 例えば、上記例の$BOOTUPは、/etc/sysconfig/init内で定義されているのを確認できました。 しかし$LSBは/etc/sysconfigや、/etc内のファイルをざっと検索してみても大本の定義が発見できません。 setにもenvにもありません。 $LSBは、意味ありげに見えるだけで、単になんでもない、普通の変数なんでしょうか? それとも、ちゃんとどこかで定義されているんでしょうか? もしかしたら、変数ではなく別のものなんでしょうか? しょうもない質問で申し訳ありませんが、ご教授ください。よろしくお願いします。
教授はあげません。
Linux Standard Base準拠なら定義しておく、ってやつかな?
「ご教授」で正しいんだよ。
そして、それに対する
>>696 の返しは絶妙だったな。
いや、正しくない。 「教授する」というのは体系だててきちんと教えるという意味なので、 どこの馬の骨かわからない匿名掲示板の単発質問者には「教授」しない。
>>700 だから「体系だててきちんと教え」てください、って
>>695 が言ってるんだから
言葉として正しいじゃん。
それに対して、
>>696 は「教授する」自体が間違いだと勘違いして
恥を晒しちゃったね。
恥を晒してる奴がいると思うとすかさず飛びつく奴って流石だよな。 楽しい休日の午後のひとときって感じ。
>>701 メクラ?
>>695 のどこに「体系だててきちんと教えてください」と書いてあるんだ?
揚げ足とったつもりが恥晒して惨め過ぎ。
>>695 定義してない可能性があるから:-なんやで!
>>703 「ご教授ください」=「体系だててきちんと教えてください」(同値)
>>695 には「ご教授ください」と書いてある、
イコール
>>695 は「体系だててきちんと教えてください」と言っている
けんかをやめて〜 ふたりをとめて〜 わたし〜の〜ために〜 あらそ〜わない〜で もう こ〜れ〜い〜じょ〜う〜♪
じゃあ体系だてて回答してやれ
${LSB:-} :- ってどういう意味?だれか教えて。 #一瞬 :-) かと思ったけど違ったので :-p
・・・と書いておいてなんだけど、man bashに書いてあった ${parameter:-word} デフォルトの値を使います。 parameter が設定されていないか空文 字 列であれば、 word を展開したものに置換されます。そうでなければ、 parameter の値に置換されます。 へー。しらなかった。
:-)
>>705 バカメ。「ご教授ください」と「体系だててきちんと教えてください」は同値だが、
>>695 は誤用だから同値じゃ無いという指摘だ。
論理的思考の出来ないバカは恥を晒すだけだから引っ込んでろ。
日曜日最後のレスがそれじゃあな…
ご教示ください とすればおkだったような予感w
>>714 ご教授くださいだろ、バーカ!
こんな展開だと予想
>>712 そうじゃなくて、
あくまで誤用であって、「ご教授する」という言葉は日本語として正しい、
というのが主張。
(誤用だけど、言葉自体は正しいの)
ところが、
>>696 曰く、
>教授はあげません。
↑
という突っ込みは、「ご教授する」という言葉自体も間違っていると
思い込んでいる。
もし、「誤用」に対する突っ込みなら、
「(こんな掲示版では)ご教授はできません」
となるはずで、
「教授はあげません」みたいには言わないはず。
よって、
>>696 は、「ご教授する」という言葉自体を知らなかったという天で
恥を晒したんだよ。
なにそれこわい
うわ、まだ続けてるのかよ
>>716 アホ丸出しの言い訳止めろ。
>>695 の用法も正しいと言うのがお前の主張(
>>705 )。
>>696 はオレじゃないが、誤用に対して「あげない」とからかっている。
お前は用法を知らずに揚げ足とったつもりで恥を晒したうえに、小学生並みの見苦
しい言い逃れを続けている単なるバカ。お前の負け。
>>705 > 「ご教授ください」=「体系だててきちんと教えてください」(同値)
>
>>695 には「ご教授ください」と書いてある、
> イコール
>
>>695 は「体系だててきちんと教えてください」と言っている
関係ない話はくだらないからやめようぜ。
>>695 の質問の本質はLSBはどんな意味をもつ変数なの?ってことだろ
LSBについてまともに答えてるの
>>697 くらいじゃねーか
レスありがとうございます と書くだけでスレが荒れるのと同じだな
724 :
名無しさん@お腹いっぱい。 :2009/12/23(水) 17:35:56
cshについて質問させてください 変数の中身が文字列か数字か判断して処理をしたいのですがどうやったらわかりますか? if ($1 == [0-9]*) こんな感じでいけるのかなっておもったけどうまくいかずで…
回答が欲しいなら「ご教授ください」って書かないと誰も答えないよ。
パイプラインについて質問です. % ls foo.txt bar.txt baz.txt の状態で, % ls | wc -l とやると3が返ってきます. これは,パイプラインを通すとlsの結果に改行が挿入されるということなのでしょうか? % ls | xargs echo | wc -l とすると1が返ってくるので,この結果の違いが不思議です.
まずは ls | cat して確かめてみなさい 一応、はまりそうなので正解を言っておくと、ls が、出力先がパイプか端末かを 調べて、出力を変えています。パイプが変えてるのではありません。
728 :
名無しさん@お腹いっぱい。 :2009/12/23(水) 19:26:27
724です。 是非ともご教授いただきたいです。 よろしくお願いいたします。
>>724 先頭が数字かどうかなら
if ( $1 =~ [0-9]* )
でいけるけど、より正確に数値かどうか判定するとなると
cshでは難しいかもしれない
教授は付けないほうがいい
「ご教授」で正しいんだよ。
>>727 lsが状況に応じて出力を変えてるとは思いませんでした.
ありがとうございます.
732 :
724 :2009/12/23(水) 20:42:48
>729さん cshでは難しいですか。。。 回答ありがとうございます。
>724 if ( { ( echo -n "$1" | grep '^[0-9][0-9]*$' > /dev/null ) } ) echo yes,yes,yes
>>724 にかなり近いのですが、質問します。
kshで「変数の中身が半角英数14桁」であることを確認したいのですが、上手くいきません。
if [ `expr $hoge : [a-zA-Z0-9]+` -ne 14 ] ; then
# 半角英数14桁以外
fi
と書いてみたのですが、+が正規表現になってくれず。
[a-zA-Z0-9][a-zA-Z0-9]*も最初2桁分しかチェックできず。
上手く正規表現でチェックできる術はないでしょうか?
お分かりの方、ご教授お願いします。
$ echo "foo" | if egrep -qs '^[a-zA-Z0-9]+$'; then echo yes; fi yes $ echo "_foo" | if egrep -qs '^[a-zA-Z0-9]+$'; then echo yes; fi $
>>734 if [ `expr $hoge : "[a-zA-Z0-9]\+"` -ne 14 ]
737 :
734 :2009/12/25(金) 07:48:46
>>735 >>736 アドバイスありがとうございます。
見た目に単純な736の記述を試して上手く動作したので、この形で実装したいと思います。
\でエスケープすると正規表現になるとは知りませんでした。完全に逆だと思ってました。
エスケープもダブルクオートも試したのですが、両方やるとは思いつかず…
ありがとうございました。
えーと、複数ファイルを結合したいのですが、 ・ファイル名の一部が一致している ・結合すべきファイルの数は分かっている ・一致している部分の文字数、箇所も分かっている ・このようなファイルの組がディレクトリ内に複数組ある というような条件で、例えば file01abc.txt file02abc.txt file03abc.txt file01def.txt file02def.txt file03def.txt file...... で、わざわざ cat file??abc.txt > fileabc.txt cat file??def.txt > fileabc.txt cat............ などと書かずに一致部分を判別して全ての組を結合させたいのです。うまく出来る方法はあるでしょうか?
>>738 普通に、
for f in abc def
do
cat file??"$f".txt > file"$f".txt
done
すみません、ちょっと説明足りませんでした。 そのabc、defってのが異なる組がかなり大量にあって、かつその文字列が そこそこ長いこと、毎回その生成される文字列が異なることから、いちいちinの後の部分を 書き出さずに出来るようにしたいのです。つまりこの場合、7,8,9文字目が (具体的な文字列は何だか分からないけれど)一致しているファイル全てを結合する、 というような指定は出来ないでしょうか?
>>738 普通に、
for ff in *
do
f=${ff:6:3}
cat file??"$f".txt > file"$f".txt
done
>>740 これで合ってる?
ls | sed -n 's/^......//p' | sed 's/....$//' | sort | uniq | while read i
do cat file*${i}.txt > file${i}.txt
done
743 :
名無しさん@お腹いっぱい。 :2009/12/26(土) 19:36:00
10 22 3 11 25 90 12 ・ ・ ・ ってあるTextで平均から飛び出る奴(今回は90)切りたいんだけど ヒントないっすか?
偏差値求めて標準偏差の何倍とかで検出だな
>>741 >>742 ありがとうございます。どっちも動作は完璧です。
さらにお手数をおかけしますが後学のために、
軽く何をやってるのか教えてもらえないでしょうか。
741はワイルドカードの挙動がよく分からないので3行目の時点で
ffに何が入っているのかよくわかりません。ffの6バイト目から3文字分を
fに代入し直しているって理解は合っていますか?
742は-n以降何をやってるか全く分かりません…
特に並んでいるドットの意味を教えてもらえないでしょうか?
察するに文字数ですよね?
>>745 >ffに何が入っているのかよくわかりません。ffの6バイト目から3文字分を
>fに代入し直しているって理解は合っていますか?
あってる
>742は-n以降何をやってるか全く分かりません…
>特に並んでいるドットの意味を教えてもらえないでしょうか?
sedの正規表現です
>>745 's/^......//p'
s は sbustitution == 文字の置換。s/aaa/bbb/ で aaa を bbb に置き換える。
^...... は正規表現。^ は行頭を表していて、. は文字一つ分を表している。
p は print == 印字。s で置き換えた後の文字列を表示する。
sed 's/....$//'
さっきと基本は同じ。
$ は行末を表している。....$ は行末の任意の4文字にマッチする正規表現。
sort | uniq
入力をソートして重複を除去する。
ここまでの処理結果は abc, def 等がファイル数分重複しているので、
重複を取り除く。
while read i; do ...
read で一行ずつ読み込んで、変数 i に格納する。i には abc や def 等が入る。
シェルスクリプトは普段それほど使っていないので、多分、もっと良い
方法があると思います。
スマソ。 s/sbustitution/substitution/
>>744 そか、いったん合計して偏差値出すしかないか
d
751 :
正月前 :2009/12/29(火) 21:51:50
シェルスクリプトの中で以下のようにperlで重複部分の文字を削除する場合は、最後の文字は消されない理由はなんでしょうか? perlの中で同じことをすると、最後の文字は消されるのに。 教えて頂ければ、ありがたいです。 -------------------------- hoge='a:b:c:d:a:b:c:d:a' echo $hoge echo " " echo $hoge | perl -F: -ane 'chop;foreach(@F){$s{$_}++ or push(@b,$_)}print join(":",@b)' echo " " --------------------------
753 :
正月前 :2009/12/29(火) 22:45:31
ありがとうございました!!! perlの中でchopではだめで、echo -n で改行を消さないといけないんですね!
auto-split後だからchopするとしたら chop($F[$#F]);
run.shファイルの中で、script_file.shをsourceした場合。 sourceされているscript_fileの中でscript_file自身の絶対パスを得る方法を調べています。 bashの場合はscript_fileの中で$BASH_SOURCEから得られるが、他のシェル(zsh/tcsh/ksh)でscript_file.shのパスを得られる方法を 教えていただけませんか? >>>>>>>>>>>>>>>>>>>>>> script_file.shファイルのある場所 /path/to/script_file.sh >>>>>>>>>>>>>>>>>>>>>> 実行例: %./run.sh 期待結果: /path/to/ ファイル <run.sh>の中身 ------------- #!/bin/(sh/zsh/tcsh...) source $path/script_file.sh ------------- ファイル script_file: ------------- script_file_path=`******` echo $script_file_path; -------------
>>755 他のシェルのソースを改造して $BASH_SOURCEの機能を実装すれば桶。
>>756 早速のレスありがとうございます。今環境がないので明日試してみます。
こりゃ、わかって無いな。
759 :
名無しさん@お腹いっぱい。 :2010/01/08(金) 13:35:29
制限時間を設定して、2つのプロセスを実行して、時間内に1つでもプロセスが終了しなかったら2つともキルして、もう一度最初から実行するにはどのように記述すれば良いのでしょうか? ご教授ねがいます
どこの馬の骨かわからん奴に教授はしない。
>>759 同条件で、最初から再実行したら、また時間内に
プロセスが終了しないのでループしちゃうのでは?
>>716 ループしてもいいから、まずはやり方を教授しろよ
>>761 ネットとか、I/Oポートとか、外的要因が絡んでるのなら
同条件で、最初から再実行してもループしない。
>>762 だから、誤用だけど言葉として正しい
と言ってるだろバカ
>>764 誤用する奴には教えないと言っているのだ。バカ。
うるせー馬鹿
いい加減ウザイよ。
>>765 仮に誤用してなかったとしても肝心の質問の答を知らないくせに
煽って答えがもらえるのは小学生まで
>>768 惨めだなあ。馬鹿丸出しの言い逃れを↓で完璧にのされたのを忘れてまた出てきやがった。
From: [719] 名無しさん@お腹いっぱい。 <sage>
Date: 2009/12/21(月) 18:25:12
>>716 アホ丸出しの言い訳止めろ。
>>695 の用法も正しいと言うのがお前の主張(
>>705 )。
>>696 はオレじゃないが、誤用に対して「あげない」とからかっている。
お前は用法を知らずに揚げ足とったつもりで恥を晒したうえに、小学生並みの見苦
しい言い逃れを続けている単なるバカ。お前の負け。
>>705 > 「ご教授ください」=「体系だててきちんと教えてください」(同値)
>
>>695 には「ご教授ください」と書いてある、
> イコール
>
>>695 は「体系だててきちんと教えてください」と言っている
>>759 #!/bin/sh
program1 &
p1=$!
program2 &
p2=$!
sleep 60
kill -0 $p1; is_p1=$?
kill -0 $p2; is_p2=$?
if [ $is_p1 = 0 -o $is_p2 = 0 ]
then
kill -9 $p1 $p2
sh $0
fi
1 SIGKILLは安易に使ってはいけない。 2 exec sh $0
シェルをexecし直すのは効率が悪い。while文で書ける。 #!/bin/sh while : do program1 & p1=$! program2 & p2=$! sleep 60 kill -0 $p1; is_p1=$? kill -0 $p2; is_p2=$? if [ $is_p1 = 0 -o $is_p2 = 0 ] then kill -9 $p1 $p2 continue fi break done
SIGTERM と SIGINT のどちらを使うべきか いまだによくわからないのはオレだけでいい
SIGKILLでおk
>>771 >>773 program1やprogram2が 60秒以内に正常終了した場合には、
sleep 60 せずにスクリプトもすぐ終了したいんですが、、
「ご教授ねがいます」なんていう奴は、これだよ
ご教授ねがえります
ご教授ねがえったか
謀反でござる! 謀反でござる!
女教授おながいします
質問
>>759 >>776 について、
「ご教授」の突っ込みと誤答ばかりで、
==== ここまで正解ゼロ ====
釣り板の釣りスレでマジ回答したら負け
784 :
771 :2010/01/09(土) 14:46:50
>>776 sleep 60の代わりに、それらのプロセスが終了したか
チェックすればいい
t=0
while t=`expr $t + 1`; [ $t -lt 60 ]
do
kill -0 $p1; is_p1=$?
kill -0 $p2; is_p2=$?
if [ $is_p1 != 0 -a $is_p2 != 0 ]
then
break
fi
sleep 1
done
お題を良く読みましょう。「制限時間」 オレはご教授しないけどな。
>>784 それ、1秒間隔でポーリングしてるだけなので、
やっぱり最大1秒遅れるので、ダメです。
#!/bin/sh T1=`date "+%s"` T2=0 T3=0 STS=1 while t=`expr $T3 - $T1`; [ $t -lt 最大制限時間 ] do program1 & p1=$! program2 & p2=$! T2=`date "+%s"` T3=0 while t=`expr $T3 - $T2`; [ $t -lt 制限時間 ] do kill -0 $p1; is_p1=$? kill -0 $p2; is_p2=$? if [ $is_p1 != 0 -a $is_p2 != 0 ]; then STS=0 break 2 fi T3=`date "+%s"` done kill -9 $p1 $p2 done exit $STS もっとスマートに書けると思う ご教授しる
いやです
>>787 それ、ビージーループになってて重いのでNGです
waitすればいいやん sleep 60 &して、これも含めた三つのpidをwait。 コードは書かないでおくが。
>>790 複数のプロセスをwaitすると、全部が終了するまで返って来ないという仕様なのでNG
ソケット通信でprogram1,2の終了を 管理プロセスに通知する仕組みにすれば 何とかなるかもしれないが、 シェルだけでは無理だね
んなぁこたー無いが、ご教授はしない。
下の input.txt から output.txt を作るにはどうすればよいでしょうか? input.txt は1列のデータで、output.txt は、 input.txt の1列目から1行目を削除して2列目に並べたものです perl か何かに全部読み込んで・・・という方法しか思いつかないのですが ワンライナーでさくっとやる方法あったら教えてください ### input.txt 1 2 3 5 6 ### output.txt 1 2 2 3 3 5 5 6
(read a; while read b; do echo $a $b; a=$b; done) <input.txt >output.txt
>>794 横方向に連結する場合、 paste を使うのが基本
paste - - < input.txt
あ、よく読んでなかった。こうか # tail -n +2 input.txt | paste input.txt - > output.txt
あ、いや、特に考え無しに・・。 $ が一般ユーザで、# が root だっけ
801 :
759 :2010/01/11(月) 14:32:31
放置してしまってすみません。
みなさんありがとうございます。
>>776 さんは自分ではありません、まったくレスしていないので逆に失礼ですが。
>>800 古くはさらに、$と%をそれぞれBourne ShellとC Shellの一般ユーザー
プロンプトとしたものだけれど、いまはそこまで厳密に使う人はいない
かもなー。
zshは基本的には$系のはずなのにデフォルトが%なのはちょっと不思議。
以下の処理のリダイレクトについて教えていただけますでしょうか? もしくは、よくある処理のようなので解説しているサイトを教えていただけますでしょうか? commandの結果を取得しつつ、画面及びファイルに出力 status=`exec 3>&1; { command 2>&1 3>&-; echo $? 1>&3; } | tee command.log 1>&2 3>&-` echo $status @execにより3で1を指した後にcommand実行時に3を閉じてるのは何故でしょうか? 必要性がよくわからないです。 同時に1が閉じられることはないですよね? Aどういう経路でcommandの結果はstatusに格納されているのでしょうか? Btee実行時に行っているリダイレクトの意味はどのようなものでしょうか? 正直言って全体的によく分からないです。
>>803 機種依存文字は書き換えました
(1)commandが3に出力しないように念のため
(2) echo $? が 3に出る。3には、あらかじめexec 3>&1 によって、
パイプではなく、コマンド置換(バッククォート)に通じる標準出力が
複製されている。よって、echoが 3に出せば 変数statusに入る。
(3)teeがcommandの出力をcommand.logに書くと同時に
同じものを 1に出そうとするが、1にそのまま出すと変数statusに入ってしまうので
2にリダイレクトして画面に表示されるようにしている。
3>&-は(1)と同じく念のため。
以上、ご教授しましたw
>>804 ありがとうございました。
command時に3を閉じてるので、echo時に1>&3としても出力されないと勘違いしておりました。
それと(3)について、command時に2>&1としていますが、
これはtee時の2には引き継がれないのでしょうか?
引き継がれていると、1>&2とすると元に戻って1に出力して
statusに上書きしてしまうように見えます。
>>805 commandとechoは無関係。
exec 3>&1したものが、commandとechoに並列して引き継がれる。
command側では3は不要なので閉じてるだけ。
commandの2とteeの2は無関係。
commandの1はパイプにつながっているので、
commandの2もパイプに流すためにcommand 2>&1 してるだけ。
teeはそのパイプを0で受けとる。
teeの1や2はcommandとは無関係で、デフォルトのまま。
そこで tee 1>&2 で画面に出す。
以上、俺もご教授しましたw
>>806 ありがとうございました。
全て理解できました。
つまり要約すると「ご教授」で正しかったのですね。 全て理解できました。
つまり要約すると「ご教授」で正しかったのですね。 全て理解できました。
大事なことなので二度言いましたよ
>>803 ではありませんが・・・
パイプがあっても1 2ともにデフォルト
(パイプの左側で1 2が書き換えられていても、右側ではデフォルトに戻る)
ただし新しいfdが作られていると、その先も残ったまま。
(パイプの左側で3が作られていると、右側でも3が作られている状態)
パイプの左側では標準出力がパイプに渡される
パイプの右側ではパイプから標準入力を受け取る
コマンド置換は、最初のパイプの前までの標準出力を受け取る
これで理解できてますか?
>>811 違うね。
>(パイプの左側で1 2が書き換えられていても、右側ではデフォルトに戻る)
↑
「右側ではデフォルトに戻る」のではなく、
そもそも最初からデフォルトのまま変化しない。
>ただし新しいfdが作られていると、その先も残ったまま。
↑
パイプの左側で新しいfdが作られても、その先には無関係(残らない)。
>>803 では、あらかじめ execでfdを作っているから、
それを全体が受け継いでいるだけ。これと混同してはいけない。
>コマンド置換は、最初のパイプの前までの標準出力を受け取る
↑
「最初のパイプの前」じゃなく、パイプラインの最後のコマンドの標準出力を受け取る
で、お約束の「ご教授しました」
誤教授しましたと言うべき。
>>812 thx
おおよそ理解しましたが、
2個目と3個目のレスが気になります。
> パイプの左側で新しいfdが作られても
新しいfdを作るにはexecしかないと思っていたのですが、これ以外で作れるのですか? ・・@
それとも、シェルから呼び出されたコマンドの中で作られたfdでは
> 無関係(残らない)
だけど、execで作っているときは受け継ぐという意味ですか?・・・・・・・・・・・・・・・・・・・・・・・・・A
それと
> それを全体が受け継いでいるだけ。
というのはそのシェル内で n>&- するまで有効という意味でよいですか?・・・・・・・・・・・・・・B
更にサブシェルにも受け継がれますか?・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・C
3個目の方は
> パイプラインの最後のコマンドの標準出力
とありますが、これはteeの標準出力ではないのですか?・・・・・・・・・・・・・・・・・・・・・・・・・・・・・D
(でも1>&2しているので、どうなるんだろう。teeは標準出力がなくなるので、3に書き込んだechoということなのかしら)
質問ばかりですみません。
C更にサブシェルにも受け継がれますか? forkするプログラム書いたことあるのを思い出しました。 たしか親からfd受け継いだはずなので、これは受け継がれますよね。
>>814 だから、機種依存文字を使うなと、、
(1)exec以外でも勝手に新しいfdを使えるよ。
ただ、そのコマンド1つだけに有効になる。
(ここでいうコマンドには、サブシェルなどのコマンド群全体も含む)
(2)execでは、シェル自体のfdが変わるので、以降のコマンドすべてに影響。
(ただし、サブシェル内でexecした時はそのサブシェル内のみ)
(3)いいよ。あと、n>&-だけじゃなく、n>&mで別の値を複製しなおすと
execの影響は無関係になる。
(4)サブシェルにも受け継がれる
(5)teeの標準出力だよ。で、標準出力に出ないように 1>&2してる。
3に書き込んだechoもパイプライン全体の標準出力だからコマンド置換に取り込まれる。
teeで1>&2するのと、echoとは無関係。
丁寧なご説明ありがとうございます!
しかしほんとに「機種」依存文字なのか? 乗っかってるソフトウェア依存文字じゃないのか? とりあえず俺は読めるし、歴史的に俺の使っている機種が Cを表示できるはずは無いのだけれど、表示出来ているわけよ。 (どのようにタイプしたらその字が出せるか解らんが、とりあえずコピペは出来る) FreeBSD で LANG eucJP なのだが、2ちゃんねるビューワだとCが読めるし コピペで転記できるよ。(書き方は不明) ほんとに機種に依存するの?
ググレカス
丸数字やローマ数字を機種依存文字と呼ぶのは おかんが家庭用ゲーム機ならPS3も360もファミコンと呼ぶのと同じで 言葉にこだわる必要はありません
丸数字が機種依存とか言われたのは歴史的経緯だわな 今や機種依存どころかUnicodeというれっきとした国際標準に含まれてる 2chで今更丸数字使うなっても化石じみてて何だかな
2chが化石Shift_JIS使ってるかぎり言われつづける
2chはcp932だろ
時代は UTF-8 ですよ
いまどきの機種依存文字といえば「〜」かな
>>825 誰もがWindows-31JとShift_JISの区別を付けるようになれば
片が付くのにね……
うちのMacちゃんでは2chのカキコのローマ数字が化けるざんす。
この板の住人ならOSは関係ないってことくらい分かるだろ MacJapaneseの代わりにWindows-31Jで処理するようなライブラリ使って FirefoxでもChromiumでも何でもビルドすればいいだけ
半角カナは使ってもいいと思う
>>828 じゃあsafariをビルドする方法を教えてください。
フィルタリングプロキシを立てて Windows_31JくさいShift_JISなページをUTF-8に変換してやるのが楽じゃないかな
それはクライアント側でフォントいじれよっていうのと等価では?
丸数字使うな。カス。と言う方が楽だしecoだな。
エコロジストならスレ違いネタでスレを消費しないでくれ
bashでif〜とする時、[ と [[ ができますが [ は 外部のtestコマンドで、[[が内部コマンドなんですよね? [ ではなく [[ を使った方が 速度が速いのでしょうか?
bash の [ と test は builtin。[[ は compound command。 [[、[、外部コマンドの test の順に速い。 外部コマンドを呼んだ場合がダントツで遅くて、他の50倍ぐらい遅い。[[ と [ は大して変わらん。
837 :
835 :2010/01/16(土) 02:16:10
お答えありがとう。
839 :
名無しさん@お腹いっぱい。 :2010/01/26(火) 12:21:42
●やりたいこと カレントディレクトリ以下の全ファイル(レギュラーファイル,かなり大量,何百万単位)を 検索し,ファイル名,ファイルサイズ,MD5ハッシュ値を出力したい。 1ファイルにつき1行。 ※効率よくやりたいのでファイルの数ごとにstatやmd5プロセスを起動する,という ことは避けたい。 ●やったこと ファイルサイズだけ,とかMD5だけなら下記の方法で満足な早さで出力が得られます。 環境はMac OS Xです。 find . -type f | xargs stat -f '%N,%z' > outputfile.txt find . -type f | xargs md5 $1 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt 上の二つを合わせたようなことをしたいのですが,うまい方法を教えて下さい。
840 :
名無しさん@お腹いっぱい。 :2010/01/26(火) 12:24:01
補足 各行が ファイル名,ファイルサイズ,MD5ハッシュ値 という出力にしたいです。
841 :
名無しさん@お腹いっぱい。 :2010/01/26(火) 12:27:06
コピペミスです。
>>839 の2つ目のfindは正しくは
find . -type f | xargs md5 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt
でした。
perlかpythonかrubyで書きなよ。
●解答 joinすればいいだけ。 ●補足 箇条書での質問は失礼
●傍観者の感想 ワロタ
pasteというコマンドがあってだな。
sed が起動するのは気にならないのかw
次スレのテンプレに↓入れとけよ ●解答 perlかpythonかrubyで書きなよ。
>>848 >>1 ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
Pythonも入れればよいわけだな。
で、今回の質問の場合 perlもpythonもruby関係なくて、 joinかpasteで済む問題だったわけだが、、
join, pasteは中間ファイルを作るわけだが、数百万ファイルになるとかなりのオーバーヘッドになる。 実行時間はファイルIOが支配的なのでインタプリタが消費するCPUは隠される。 従ってLLでの実装を勧めたわけだが、初心者にはわからないらしい。覚えておく事だ。
>>851 中間ファイルを作らずにnamed pipeでやる方法を知らない初心者らしい、、
この件では I/O にかかる時間でいちばん支配的なのは find, md5, stat,(+ join を使う場合は sort)であって、 中間ファイルを使うことによるオーバーヘッドなんぞ誤差にしかならんよ。
中間ファイルって、MS-DOSじゃないんだから・・・
find × 2 → named pipe → paste で、中間ファイルなしでメデタシメデタシ
一部のシェルの diff <(command) <(command2) みたいなのは中間ファイル作るのかしらん?
>>856 だから、それが named pipeなんだよw
mknod で作らなくてもいいのかー
findは全てのファイルにstatかけるのを知らない初心者? w
っつーか
>>839 と
>>842 をそれぞれ時間計測して比べりゃすむ話だろ
漏れは後者の勝ちだと思う
漏れww
2ch初心者発見。 漏れ、とかで煽られても、、、 半年ROMってれば。
2ch上級者(;´Д`)
今時漏れなんて使わねぇよw
>>839 自身、find×2 を個別に実行した状態で
「満足な早さで出力が得られます」
と言っているのだから、それがすべて。
問題はそこじゃなくて、2つの出力を効率良くまとめる方法が質問点。
で、そのベストアンサーはpaste。
自演乙
>>859 ここではstatは問題にならないんだよ、初心者クン
>>860 >後者の勝ちだと思う
「思う」だけじゃ間違ったことでも言えてしまうねw
>>861 パイプのI/Oでは物理I/Oは発生しないんだよ、初心者クン
>>870 良く良め。869 は 「named pipe+paste の方が速い」という主張を一貫してしてるぞ
(1)シェルスクリプトでの多少高度な質問がなされる ↓ (2)「それはPerlかPythonかRuby使った方が速い」と誰かが投稿 ↓ (3)別の人からシェルスクリプトでのマトモな回答が投稿される ↓ (4)質問者、傍観者とも納得 ↓ (5) (2)が発狂 ← 今ココ
>>871 アルツハイマー?
>>853 > find, md5, stat,(+ join を使う場合は sort)であって、
>>853 が言ってる statは、xargsから起動されるstatコマンドのことであって、
find内部のstatのことじゃないだろ。
LL: ディレクトリ読み込み 1回 stat(i-node読み込み) ファイル個数 MD5 ファイル個数 出力 paste: ディレクトリ読み込み 2回 stat(i-node読み込み) ファイル個数×3 MD5 ファイル個数 中間ファイル(パイプ)書き出し/読み込み 出力 ファイル数が多くてiノードのキャッシュは期待できない。 MD5はCでの実装もあるから、インタープリターのオーバー ヘッド見込んでも、おそらくLLの方が速いね。
>>876 はいはい、「おそらく」と書いとけば何でも言えるねw
perl/python/ruby自体のオーバーヘッド(結構大きい)も良く考えて出直してね
マルチコアなCPU環境だと、 同じことやる場合でもパイプで複数のプロセスに分けた方がかえって速かったりする
議論してる時間で問題を解決してしまった人の勝ち。
>>877 ぷぷっ。そのレスはそのまま返してやるよ。w
find ->(パイプ)-> md5 の場合、ファイル1個あたりにかかる時間はmd5の方がはるかに大きく、 find自体の動作はmd5の実行の裏プロセス(別CPU)で行なうから、 findの実行時間はすべてmd5の実行時間内に吸収されてしまって、 結局findの時間は無関係になる。 例: sleep 1 | sleep 10 ってやると、10秒で終了する。 左側のsleep 1は無関係になる。 もう1本のfindの、 find ->(パイプ)-> statコマンド の方は、find->md5の方よりはるかに速いから、 2つのfindを名前付きパイプでpasteに接続する場合、 実行速度は遅い方の上流パイプであるmd5だけによって決まる。 よって、stat云々は一切関係なくなり、 名前付きパイプ+pasteが高速で動作する。
LLが遅いと因縁つけてる奴は実測して証拠出せよ。w
>>860 が言うようにtimeで計測すれば済む話なのになぜ誰もやらないのか
あ、俺はrubyとか知らないからパスね^^
誰かfindとperl/python/rubyでベンチ取ってよ
適当に試してみたよ
http://pastebin.com/f1130c0e8 $ time test.bash >/dev/null
real 1m50.762s
user 0m17.992s
sys 0m4.473s
$ time test.py >/dev/null
real 1m49.994s
user 0m19.045s
sys 0m5.523s
>>884 そのPythonのソースだと、各ファイルに対してstat()が最大3回呼ばれるのかな
ま、どう考えてもMD5sum取る部分のI/O律速になるので stat()の回数減らしたところで誤差程度だろうけど
1000倍以上違うだろうね
>>839 > find . -type f | xargs stat -f '%N,%z' > outputfile.txt
> find . -type f | xargs md5 $1 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt
findは -print0でxrgsに渡し、xargsは -0で受け取るようにしましょう。
> find . -type f -print0 | xargs -0 stat -f '%N,%z' > outputfile.txt
> find . -type f | xargs -0 md5 | sed -E 's/^MD5 \((.*)\) = (.*)/\1,\2/' > outputfile.txt
http://www.otsune.com/diary/2007/03/29/1.html
こんなのfind + perl のワンライナーでいいじゃん > find . -type f -print | perl -l0ne 'use Digest::MD5 qw(md5_hex);$s=-s $_;print $_ ." $s " . md5_hex($_) ."\n"'
>>889 アフォか、ファイル名の md5 計算してどうする www
>>888 日記だからある意味しょうがないのだが。そういう古臭いページなんとかならないもんかね。
>>890 おー、いまperldocしたら
calculate the MD5 digest of this "message"
ってかいてあったwwはずかしいwwwしぬかも
今書くなら「xargs捨てろ。 -exec {} +使え」
-exec だと正しく受け取れないファイルがある。 -print0 |xargs -0のほうが安全
へー知らんかった
どっちだよ気になるだろ
-exec の + ターミネータ(;でなく)を知らないで答えていたりしてな。
それにしても「正しく受け取れない」は原理的にない。
いや、あるから -0 オプションが後から追加されたんですが。
って、xargs じゃなくて find の方か。ならないや。ごめん。
結局
>>896 は本当なのかどうなのか答えてくれ
つまり実際に-exec +だと受けとれないファイルがあるのか
それとも単に-exec ;と-exec +を混同してただけなのか
それと
>>894 の-exec +のほうが良いという根拠は何だ?
-print0 | xargs -0じゃいかんのか?
このままじゃ気になって寝れやしない
>>904 > それと
>>894 の-exec +のほうが良いという根拠は何だ?
exec +がある環境ならxargsはレガシーコマンド。webで解説する必要は無い。
そもそも、exec +が無い環境がレガシー。 xargsはジジイの胸の奥にしまっておいてくれ。
GNU findutilsにxargs付いてくるじゃない
ジジイの懐古趣味
xargs がいつobsolete になったの? なんか文書ある?
-exec + のデメリット コマンドに渡すファイルの数を制御できない(xargs -n) 並列実行できない(xargs -P) -exec + のメリット find でひっかかったファイルが存在しなければコマンドが実行されない (GNU xargs は入力がゼロでもなぜか1回は実行する; xargs -r で抑制可) つーか、 ps ax | awk '/なんか条件/{print $1}' | xargs -r kill みたいに find とは無関係に使う場合も多いから、obsolete のはずがない。
findの-execはひとつひとつ実行するから遅いだろ。 grep /dev/null というバッドノウハウもアレだけど。(-h使えって?)
>>910 find -exec + の 「+」の意味を理解していない方は発言を御遠慮ください
MacのTimeMachineのようなことをするスクリプトを教えて
pdumpfs Rubyスクリプトだけどな。
> -exec utility [argument ...] {} + > Same as -exec, except that ``{}'' is replaced with as many path- > names as possible for each invocation of utility. This behaviour > is similar to that of xargs(1). うおっ。-execに+なんて何時からあったんだ。
-exec {} + テンプレに入ってるじゃねえかww
ほんとだ。テンプレにあるな。 >findは -exec command {} + を推奨。 >他に -print0、xargsは -0オプションという方法もあるがSolaris非対応) まるで -exec + ならば solaris でも使えるように書いてあるが、 実際は使えなかったような記憶が…
>>920 そのマニュアル、肝心なところを誤訳してるね。
日本語訳マニュアルは信用してはいけない。
sunでもあるんだな。日本誤訳マニュアル
原語は技術者が書いてても 翻訳は非技術者に丸投げだからね
924 :
名無しさん@お腹いっぱい。 :2010/02/02(火) 23:57:42
このスレ参考にファイル数が膨大なディレクトリで paste -d, <(find $i -type f -exec stat -f '%N,%z' {} +) \ <(find $i -type f -exec md5 {} + | sed -E 's/^MD5 \(.*\) = (.*)/\1/') \ > output.txt やったら find: fts_read cannot allocate memory 出ました。Mac OSX なぜ? find のバグ?
libftsのバグじゃね?
ファイルAのタイムスタンプとファイルBのタイムスタンプを一致させるには?
touch -r でatimeとmtimeは設定できるよ。ctimeはできないけど
928 :
名無しさん@お腹いっぱい。 :2010/02/08(月) 11:41:37
複数の数字に,同じ四則演算(+,−,*,/)を繰り返した計算結果を表示するシェルスクリプトを,cshシェルスクリプトで書け。 (基本仕様) @ コマンドとして実行できる.(シェルコマンドである.) A 入力した数字を計算できる. B 入力できる数字の個数は2以上とする. C 四則演算子(+,−,*,/)を選択,または直接入力して 数字1□数字2□・・・□数字N (□=+ or − or * or /,N≧2) の計算結果を出力する. D 四則演算子以外の記号が入力された場合,エラーメッセージを出力する. (ポイント) ? シェルコマンドにするには,スクリプトの最初に(#!で始まる)おまじないを書く. ? 標準入力から文字列を入力するには $< を用いる. ? コマンドラインに引数を指定した場合は,その引数は変数$argvに格納されている.その各要素を参照するには,$argv[1],$argv[2](または$1,$2)などとする. ? 四則演算には @ コマンドが使用できる.(ただし,整数しか扱えない.) 誰かわかるひとおねがいします
cshで宿題出すって時代遅れな専門学校だなw
>>928 偶然にも、プログラミング質問スレに同じ問題抱えてる人がいるから、
彼と協力して解くと良いと思うよ。
#!/usr/bin/csh exec bc
'`,、'`,、'`,、'`,、(´▽`) '`,、'`,、'`,、'`,、
>>929 文脈上は「*shの基本機能だけ使え」っていう意味しかないでしょ。
特に問題は無いんじゃないか?
zsh使えとか言い出すキチガイよりはマシでしょう。田中、おめーだよ
935 :
名無しさん@お腹いっぱい。 :2010/02/08(月) 16:44:01
シェルスクリプトだったとは思うんだが スターウォーズっぽい物語を文字ベースでやってるのなかったっけ 探してるんだが見つからない
>>934 欲嫁w
>>928 より、
> 四則演算には @ コマンドが使用できる.
どう見ても cshです。本当にありがとうございました。
937 :
935 :2010/02/08(月) 16:48:38
あまりCシェルを目の敵にしなくても良いんだよ。 ちゃんと理解して、欠点に関わらない範囲で使えばいいんだし。 さらにCの利点も生かせば良い。 Cシェルで組まれた多くのスクリプトは何十年も問題なく 多くの処理をしてるのも事実なんだから、それを否定する こたぁない。 コンパクトなスプリクトでこまけーこたぁ良いんだよ。 血眼になってボーンに拘る方が痛い
>>938 今のOSの起動スクリプトとか、/usr/binその他にインストールされてる
スクリプトコマンドで、cshで書かれてるのはひとつもありませんが、、
(もちろん、/bin/shスクリプトは多数存在)
あ、ヘボなシステム管理者が何十年も前に書いたまま放置されてる
ローカルなスクリプトのことは知らんけどねw
>>939 で?
何十年も前に書いたまま放置されたスクリプトに何の
問題があるんだ?
Bシェルで書き換えないと不味いのか?
多くのスクリプトは、日常のローカルツールという
位置づけでもあるだろ?
数値を代入して四則演算をしたり(w
必要があれば適材適所でシェルを使い分ければ良いんだよ。
>>940 おまえ、cshの擁護してるが、cshについてもよく知らないで言ってるだろ。
>>928 で、
> 標準入力から文字列を入力するには $< を用いる.
> 四則演算には @ コマンドが使用できる.
みたいにはっきりcsh独自機能について書いてるのに、
>>934 では、
>文脈上は「*shの基本機能だけ使え」っていう意味しかないでしょ。
みたいな大間違い、見当外れ、馬鹿丸出し、なこと言ってるし、、
クズ学生が通うクズ大学ではcshを教材に使うという事実が明らかになった。
>>928 みたいな奴のせいで最近規制ラッシュなんだな
たぶん,両方で対応状況を比較してみてるんだよ. どれくらいで解が出せるかとか(笑)
ならなんで投稿時刻ずらしてるんだろ。
スレッドを探し歩いていたとかね
948 :
名無しさん@お腹いっぱい。 :2010/02/08(月) 23:38:43
928ですすいません。 よくわからないんですが、一応国立大学です。 誰か答えわかりませんか?
>>941 Cの機能使わなければCシェル使う意味無いだろ
cshの機能つかったら練習問題の意味ないだろ
アイディアを求めるとか、どうしても解決できないバグがあるってなら話しわかるけど 問題(仕様)丸投げして他人にスクリプト書いてください、なんて頼んでる時点でプログラマやSEの資質はないし 大学入れても社会に出てから技術屋としては使い物にならんクチだな
954 :
名無しさん@お腹いっぱい。 :2010/02/09(火) 05:52:16
授業でほとんど答えみたいのやってたのに 情報処理概論は必修なんだからがんばれよ
必修科目で csh 教えてるのか… どこの大学?
北関東の納豆がおいしいあたりです。
国立大学と言っても、地方の国立大学だろ
>>953 逆だよ、技術屋だって管理職も要るし
効率も必要。
丸投げで処理できる人間が最後には勝つ。
オマエの廻りを見てみ
高収入で一流の技術屋=丸投げだから。
>>958 わかったからこのスレから出て行けよ
ここはシェルスクリプトのスレだ
丸投げだとその場はよくてもあとあと困るよ。
マルハゲだとどうなりますか?
>>963 シェルスクリプトがなんだか解らない、覚える気もない
=丸投げ
シェルスクリプトについて少しは理解している、細部は分からない
=外注
シェルスクリプトを理解しているが、自分で書くとコスト(時間、金額)が合わない
=アウトソーシング
つーか このての技術屋って結局は誰かに、丸投げ仕事ありませんか?って 仕事貰って喰ってるんだよね。 丸投げがなかったら餓死してる。 丸投げを蔑視してるやつは結局のところ技術屋じゃない。
粘着くん、さっさと別スレに移動してくれや
―┼‐ ノ / | --ヒ_/ / \ヽヽ ー―''7 `」 ┼, 二Z二 レ / /´レ' \ ―7 ̄} | ー-、 / (__ (|フ) (__ノ _ノ ∨` ノ / / _ノ \_ ─┼- / | ‐┼- | ー|― ─┼─ | \ レ /  ̄Tー / ノ -─ (二フヽ \/ _ノ (二フ\ ヽ_ノ / 、__ i';i /__Y ||真|| /⌒彡 _ ||露|| /⌒\ /冫、 ) ・・・・・・。 \ || || ̄ ̄ ̄ ̄ ̄ ̄ ̄\ `./⌒ i ` /ゝ _,,..,,,,_ ||\`~~´ (十万石) \( > ('\\ ./ ,' 3 `ヽーっ ・・・・・・。 ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄\`つ ⌒ _) l ⊃ ⌒_つ .|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| `'ー---‐ ( 'A) ・・・。 〃∩ ∧_∧ <⌒/ヽ___ /(ヘ)ヘ ⊂⌒( ・ω・) ・・・。 <_/____/ zzzz・・・ `ヽ_っ⌒/⌒c
はじめまして。 簡単な収益計算のスクリプトを書きたいのですが。 Aは1回仕事を請け負うと6時間1万円がカウントされます。 必要経費は6%掛かります。 Bは1回仕事を請け負うと8時間2万円がカウントされます。 必要経費は9%掛かります Cは1回仕事を発注すると15分かかります。 発注の口銭は50%乗りますのでAには0.5万、Bには1万の口銭が 入ります。 必要経費は0.1%です。 この時、C氏がA,Bに発注する回数を指定して 三者の収益と作業時間を表示するスクリプトが書きたいです。
線形計画法か?
>>969 shellよりJavaScriptで書いてブラウザで実行するのが使いやすいと思う。
975 :
名無しさん@お腹いっぱい。 :2010/02/16(火) 17:44:26
すみません。質問させてください。 hoo.csvというテキストファイルがあるとします。内容は: alpha, num A, 1 B, 2 C, 3 だとします。このCSVファイルに"hoo.csv"といったファイル名のコラムを付け加えたいです。 つまり: alpha, num, file A, 1, hoo.csv B, 2, hoo.csv C, 3, hoo.csv もしくは、 file, alpha, num hoo.csv, A, 1 hoo.csv, B, 2 hoo.csv, C, 3 になるといいです。 そして、このようなファイルが100ぐらいあるので、自動的に全てのCSVにファイル名の コラムが入るようにしたいです。 エキスパートの方、よろしくお願いいたします。
>>975 できたよ。ただしGNU sedが使える環境で実行すること。
↓
#!/bin/sh
for f in *.csv
do
sed -i '1s/$/, file/; 2,$s/$/, '"$f"'/' "$f"
done
977 :
名無しさん@お腹いっぱい。 :2010/02/16(火) 19:02:27
>>976 エキスパート様、ありがとうございます。
sedの環境はありますので、試してみます。
結果は後ほど、報告いたします。
978 :
975 :2010/02/16(火) 21:46:24
>>976 思ったとおりのアウトプットが得られました。
自分で何時間も試行錯誤していたのが、数分で終わり、なんだったのか思いました。
再度、ありがとうございます。
カラムな
同じだな そういや、こないだツリー状って論文に書いたら、 トリー状に直して掲載しやがったぜまったく
ググってみたら Tree をトリーと書く人も居るんだね どうせ正確な音写なんて出来ないんだから、一般的じゃない書き方をしても混乱するだけの様な… まぁ、自分は Trie の読み方がトリーだと思ってたけどw
何を言うTrieはトライじゃ
>>982 そうみたいね。それさっき初めて知ったんだ…
NULL、Trie、Alt、ISA、false・・・ 英語って言語はできが悪いんじゃないか・・・
何をいまさら 単語レベルの綴りと読みの例外の多さは異常
英語も元々は発音と綴りが一致してたらしいけどね 普段ネイティブとの接触が少ない日本人には辛いわな
昔は name と書いて ナーメだった、とかね。 活版印刷の発明で書き言葉が普及(固定化)するタイミングと、 発音の大きな変化タイミングが重なった不幸な結果らしい。
He
まず英語を耳で聞いて、口で話して その後に記述を覚えるとき、その文字法則に発音と 違和感が出るのだろうが、そんなのは漢字を覚える 労力に比べたらたやすい
意味不明もいいとこ
英語がめちゃくちゃなのは ドイツ語とフランス語とウェールズ語とアイルランド語が混ざってるから って学校の先生が逝ってた
ラテン語とギリシャ語もいれろ。
ラテン語の語彙はだいたいフランス語経由だな。 ノルマンコンクェストばんじゃーい。
#!/usr/local/bin/bash count=1 while [ $count -lt 16 ];do let num=`printf %02d ${count}` echo num=${num} sleep 1 let count="${count}+1" done
違う、 let num=08 か。
bashだと0で始まる数値はoctalとして扱われるから。 echo $(( 010 )) としてみると判る
10# を前置すればいいじゃん
.
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。