1 名前:シェルスクリプトライター mailto:sage [2011/12/10(土) 20:06:40.38 ] シェルスクリプトの総合スレです。 スクリプトのお勉強・自慢・腕試しなどにどうぞ。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 前スレ シェルスクリプト総合 その18 hibari.2ch.net/test/read.cgi/unix/1308195527/ 次スレは >>970 で。
691 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/30(金) 18:02:04.91 ] >>690 目的はロギングだな、と想像できれば、毎行にタイムスタンプつけたいんだな ということもわかる
692 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/30(金) 18:09:51.47 ] >>691 目的はロギングだな、と想像できれば、ログファイル名毎に日付を入れたいんだな と考えるのが自然
693 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/30(金) 18:15:31.04 ] まぁもう解決したんだからそれでいいんじゃね。
694 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/30(金) 18:27:01.79 ] 俺は touch -t YYMMDDhhmm /dev/stdout って意味かとオモタ
695 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/31(土) 01:35:03.44 ] 俺はプロンプトに日時を入れるのかと…
696 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/31(土) 04:56:25.93 ] 自分はdate > /dev/tty みたいなことかと思った
697 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/31(土) 17:23:45.97 ] >>680 それだと、1900年とかそれ以前とか、32bit版の場合の2038年以降が動かないし、 GNU dateに依存するのもいやだし、 dateコマンドに頼らずに20120301等のの数字を直接操作して計算する方法ないですか?
698 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/31(土) 17:42:14.02 ] 頑張って書けば可能だけど、 月の長さや閏年とか考えると、GNU dateかLL使うのがいいですよ。 コマンド組み合わせるのがシェルの得意なところだし。
699 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/31(土) 17:47:43.69 ] >>698 GNU date使っても epoch以前の日付には対応できないだろ、って言ってるのでは?
700 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/31(土) 18:35:51.33 ] 昔のこと考えたって、そもそも日本が西暦になったのは明治からだぞ calコマンドが表示してるのはイギリスの暦らしいね $ cal 9 1752 September 1752 Su Mo Tu We Th Fr Sa 1 2 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
701 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/31(土) 18:48:26.54 ] >>700 江戸時代でもそれ以前でも年表は西暦で記述されてるから無問題。 1752年の件も含め、紀元1年以降対応できれば幸いです。 紀元前までは要りません。
702 名前:名無しさん@お腹いっぱい。 [2012/03/31(土) 19:29:56.45 ] localeをイタリアにしたら1582年に暦が切り替わる実装もあるのかな。
703 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/31(土) 20:51:17.87 ] そのくらい前のデータはまだ完全に整備されてない。 ↓こういうデータがあって、Common Lisp, Mathematica, Javaのライブラリがある。 Calendrical Tabulations, 1900?2200 Edward M. Reingold, Nachum Dershowitz www.cambridgejapan.org/academicproduct.html?isbn=9780521782531 けどまあ元のお題についてはGNU dateかLLでやるのがいいかと。
704 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 12:21:49.60 ] >>701 曜日はどうなのよ・・・
705 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 12:24:17.12 ] >>704 20120301 等の数字だけ処理できればいいので、曜日は無視でいいです。
706 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 13:39:02.95 ] >>704 曜日以外はできたのか。じゃあ早く回答してやれよ。
707 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 14:01:13.24 ] >>706 曜日以外は標準で対応し照るじゃん
708 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 14:02:48.07 ] >>707 epoch以前でも?
709 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 14:05:53.14 ] $ date -d "1 years ago" 2011年 4月 1日 金曜日 14:04:49 JST $ date -d "100 years ago" 1912年 4月 1日 月曜日 14:04:55 CJT $ date -d "200 years ago" 1812年 4月 1日 月曜日 14:05:08 CJT できてんじゃん
710 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 14:09:36.73 ] >>709 環境依存なので却下
711 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 14:16:22.13 ] じゃあ環境に依存しない方法を自分で考えてくれ 「すべての環境」に対応するのは骨が折れると思うが 期待しているぞ
712 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 14:21:28.89 ] >>711 >>697 の言うように、20120301等の数字を直接演算すればそもそも環境依存しない。 その演算が場合分けとかでややこしいだけで。
713 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 14:36:54.89 ] >>709 GNU date epoch以前の閏年処理おかしいよ。 $ date -d 16000229 ← 1600年は閏年 Tue Feb 29 00:00:00 LMT 1600 $ date -d 17000229 ← 1700年は閏年 date: invalid date `17000229' ← 駄目じゃん $ cal 2 1700 February 1700 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ← 閏年だよ
714 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 16:31:55.42 ] >>713 グレゴリオ暦で1700年は平年です $ man cal > グレゴリオ暦への切り替えは 1752 年の 9 月 3 日に行われたと仮定している。 $ cal 9 1752 9月 1752 日 月 火 水 木 金 土 1 2 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
715 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 16:37:34.38 ] $ gcal --version | head -n 1 gcal (GNU cal) 3.6 $ gcal 2 1600; gcal 2 1700 ; gcal 9 1752 February 1600 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 February 1700 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 September 1752 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
716 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 16:47:02.18 ] >>714 1700年はまだグレゴリオ暦に切り替わってないのだから、 1700年は閏歳が正しい。 別の例として、 1500年は閏歳なのだが、 calでは閏歳(正しい) GNU dateでは平年(間違い) いずれにしても GNU dateでこの年代の日付処理はできない。
717 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 17:25:06.62 ] 西暦年が100の倍数の時、 1700年以前なら単純にすべて閏年にする。 1800年以降の場合は、400の倍数でない年のみ平年に戻す。 で桶? case文バリバリでだれかシェルで組んでくれ。
718 名前:名無しさん@お腹いっぱい。 [2012/04/01(日) 17:54:49.44 ] 厳密にやるためには国や宗教の情報が必要になるので あまりしゃかりきにならんでええ。 日本は1872年かな。
719 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 18:04:26.31 ] 日本においては閏年の算定を皇紀を用いて行うことが法令で定められています
720 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 18:12:40.42 ] >>717 できた気がする。思ったより場合分け簡単だった。 1752年9月も対応 s_date=20120227 # 仮 e_date=20120305 # 仮 t=$s_date while [ "$t" -le "$e_date" ]; do echo "$t" t=`expr "$t" + 1` case $t in ????0[13578]32|????1032) t=`expr "$t" + 69`;; ????1232) t=`expr "$t" + 8869`;; ????0[469]31|????1131) t=`expr "$t" + 70`;; ????0230) t=`expr "$t" + 71`;; 17520903) t=17520914 esac case $t in ????0229) y=`expr "$t" / 10000` case `expr "$y" % 4` in 0) [ "$y" -le 1700 ] && continue [ `expr "$y" % 400` = 0 ] && continue [ `expr "$y" % 100` != 0 ] && continue ;; esac t=`expr "$t" + 72`;; esac done
721 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/01(日) 19:24:47.68 ] >>720 西暦999年以前がダメ。頭に0付け加える処理が必要。
722 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/03(火) 07:17:19.37 ] >>720-721 ありがとうございました
723 名前:名無しさん@お腹いっぱい。 [2012/04/03(火) 20:05:15.60 ] ファイルがあるかないかだけを調べる標準のコマンドありますか? [ -f /tmp/unko ] よりかっこいい方法募集
724 名前:名無しさん@お腹いっぱい。 [2012/04/03(火) 20:06:28.95 ] test(マテ
725 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/03(火) 20:20:14.40 ] 「標準のコマンド」とは?
726 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/03(火) 20:44:46.90 ] >>725 まず入ってるであろうコマンドのことだよ coreutils と読み替えてもらっても結構
727 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/03(火) 20:46:12.15 ] この程度で揚げ足取ったつもりなのが笑える
728 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/03(火) 20:52:43.65 ] つまりシェルビルトインコマンドは禁止ということですね
729 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/03(火) 21:13:29.78 ] ls /tmp/unko > /dev/null 2>&1 && echo yes || echo no
730 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/03(火) 21:18:54.77 ] >>723 < /tmp/unko 2> /dev/null && echo ある
731 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/03(火) 22:18:53.41 ] (< /tmp/unko) 2> /dev/null && echo ある
732 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 10:03:23.15 ] testと[って同じだって書いてあるけど、]の立場はどうなるの?
733 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 10:04:50.22 ] >>732 ] はコマンドじゃないから
734 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 10:07:01.64 ] ] は [ の引数
735 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 10:52:50.01 ] testの引数にはならないの? $ test -f /tmp/unko ] -bash: test: /tmp/unko: binary operator expected なんかエラーでた
736 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 10:54:52.95 ] 自分が [ って名前かどうかで、 ] が最後にあるべきかどうか判断するんだよ
737 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 10:59:35.40 ] >>723 なんで [ じゃだめなの?
738 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 12:05:16.44 ] >>736 うぉぉ マジだ。 test.c ってこんなことやってんのか。 はぁー 無駄にすげぇーなー
739 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 12:15:50.42 ] 20年遅れてるスレ行けよ。何でいまさら誰でも知ってる話題でこのスレ無駄使いしてるの?
740 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 12:21:38.54 ] test -e
741 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 12:40:51.61 ] >>740 test以外でかっこいい方法で
742 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 13:12:21.67 ] かっこいい(笑)
743 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 13:21:55.37 ] 評価基準がよくわからん。
744 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 15:21:58.49 ] >>743 coolかどうかってことだよ
745 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 15:23:15.61 ] それがわからん。
746 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 15:43:57.60 ] >>739 お前2でなに言ってんだよ
747 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 16:47:37.67 ] >>746 どういう意味?
748 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 23:21:13.48 ] 教えてください TERM=$( (echo 'console() { term="$2"; for i do case $i in term=*) term=$(expr "$i" : "term=¥(.*¥)") esac done; echo "$term"; exit 0 }' というシェル関数なんですが、制御構文が良くわかりません。 for 変数 in 引数1 引数2 … do 処理 done とはかけ離れてますし(変数も引数もない)、 case 変数 in パターン1) 処理;; パターン2) 処理;; パターン3 | パターン4) 処理;; *) 処理;; esac が混じってますし... case文のどのパターンにも当てはまらない時の処理に「term=」がくっついてるし... これってどういう風に解釈すれば良いんでしょうか?
749 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/04(水) 23:30:30.61 ] set a b c for i; do echo $i; done とかやってみれ
750 名前:名無しさん@お腹いっぱい。 [2012/04/04(水) 23:31:20.38 ] for に in がない場合は位置パラメータ($1 $2 ...)を使う。 位置パラメータをiにセットしつつforループを回して、 $iが term=* のパターンにマッチしたとき、 そのなんたらの部分(*にマッチした部分)をexprで抜き出して 変数termにセットする。 位置パラメータ全周したらその時点の $term を出力。 というconsole関数。
751 名前:名無しさん@お腹いっぱい。 [2012/04/05(木) 12:29:39.61 ] 教えてください>< 以下のようなテキストファイルがあって、これを読み込んで下のような結果にするスクリプトを書きたいんですがいい方法が思いつきません; 地区、支店、名前が同じものは一番右にある数値を足しこんで出力すると言うものです。 awk のgetline を使えばどうにかなりそう・・・というイメージなんですが、どなたかご教授ください(泣 テキストファイル ---------------------------- A地区 〇支店 佐藤 5 A地区 〇支店 佐藤 9 B地区 □支店 伊東 3 B地区 □支店 木村 3 B地区 □支店 木村 5 C地区 △支店 青木 4 C地区 △支店 青木 4 C地区 △支店 野村 1 ---------------------------- 結果 ---------------------------- A地区 〇支店 佐藤 14 B地区 □支店 伊東 3 B地区 □支店 木村 8 C地区 △支店 青木 8 C地区 △支店 野村 1 ----------------------------
752 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/05(木) 12:39:50.77 ] >>751 awkで、getlineを使わずに普通にできる。 ただし、数字は半角で書いてないと計算できない。
753 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/05(木) 12:48:51.09 ] >>751 あっちスレの削除依頼出してきてよ。
754 名前:名無しさん@お腹いっぱい。 [2012/04/05(木) 13:03:00.03 ] >>753 すみません、やり方がわからないんで・・・ 後で出します;
755 名前:名無しさん@お腹いっぱい。 [2012/04/05(木) 13:06:43.25 ] >>752 getline を使わずにですか・・・ ちょっとヒントいただけますか?
756 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/05(木) 13:21:01.61 ] >>751 awk使わずにシェルだけでできるよ。 ただし、スペースは半角に、数字も半角にしてから実行すること。 標準入力から入力。 #!/bin/sh p_district= p_branch= p_name= n=0 while read district branch name val; do if [ "$district" = "$p_district" ] && [ "$branch" = "$p_branch" ] && [ "$name" = "$p_name" ]; then n=`expr "$n" + "$val"` else [ "$p_district" ] && echo "$p_district" "$p_branch" "$p_name" "$n" p_district=$district p_branch=$branch p_name=$name n=$val fi done echo "$p_district" "$p_branch" "$p_name" "$n"
757 名前:名無しさん@お腹いっぱい。 [2012/04/05(木) 13:33:45.35 ] >>756 お〜、有難うございます!大変助かります! 半角にして試して見ます。 ちなみに $0 テキストファイル といった具合に、テキストファイルを引数にして読み込み処理する、というようなことも出来るでしょうか?
758 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/05(木) 13:35:37.33 ] >>757 引数にしたかったら、 >>756 のしたから2行目の done のところを done < "$1" に修正すれば良い。 あと、入力ファイルはあらかじめソートされてること
759 名前:名無しさん@お腹いっぱい。 [2012/04/05(木) 13:42:26.55 ] >>758 すごい! 自分もこんなにあっさりスクリプトが書けるようになりたいものです・・・ 758 さん、有難うございました、大変勉強になりました。
760 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/05(木) 13:50:38.48 ] awkなんてAhoでもできることなのに
761 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/05(木) 14:44:15.71 ] だれか>>760 の座布団全部取り上げろ
762 名前:名無しさん@お腹いっぱい。 mailto:sega [2012/04/07(土) 17:42:25.29 ] ディレクトリのmvできるかどうかを事前にチェックしたい 特定のディレクトリ以下に アクセス不能とか移動不能なものが あるかどうかを調べたいんですが、findでいいですかね
763 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/07(土) 19:40:38.64 ] だめだ、難しい グループでOKになってるときのパターンがネックだ これのせいでワンライナーにならん
764 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/07(土) 22:52:59.06 ] >>762 find . ! -readable | wc -l でダメ?
765 名前:sage [2012/04/10(火) 19:58:25.17 ] for i in {1..10}; do command 1> ${i}.txt 2> ${i}.log &; done とかやると, [1] + suspended (tty output) ... とかなって処理が終了しない.なぜぇ・・・
766 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/10(火) 21:04:40.05 ] それはね…
767 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/11(水) 08:00:04.70 ] >>765 面白いと思う
768 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 09:02:11.67 ] ;が邪魔だって文句いわれたから、 はずして実行したら {1..10}.txt とかできたぞ どうしてくれる マジレスすると、commandの中身なによ
769 名前:sage [2012/04/12(木) 10:33:02.93 ] Cで書いたプログラムだね.
770 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 19:19:17.01 ] commandはシェルビルトインコマンドでしょ
771 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 19:30:36.07 ] というか、>>765 実行してもそういう現象は起きないので、 回答欲しかったらもっと具体的に "how to repeat" 書いてくれ
772 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 21:09:49.38 ] >>765 そのcommandのプログラムがSIGTTOUをSIG_DFLに戻してしまってるんだろ。 普通ならシェル側でSIGTTOUはSIG_IGNにするからsuspendはしないようになってる。
773 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 21:25:50.42 ] >>771 Steps to Reproduce だろ
774 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 21:34:14.02 ] >>773 How to repeatで合ってる。というか、そんなところに突っ込んでも面白くない。
775 名前:名無しさん@お腹いっぱい。 [2012/04/12(木) 22:19:43.60 ] 再現性の話ならreproduceがふつー
776 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 22:24:50.96 ] SIGTTOUについて答えられない奴が持論の英語を主張して話題逸そうとしてるなw
777 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 22:27:19.83 ] 「バグの出し方」と書かれてる文章に、 「バグの再現手順」だろ? と突っ込んでるようなモン。
778 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/12(木) 23:01:56.84 ] GNUのバグトラッキングシステムがHow-To-Repeatってフィールド使ってるね www.gnu.org/software/gnats/doc/3_113_1/gnats_1.html
779 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/13(金) 06:11:12.98 ] >>765 エスパーするとzshの最近のバージョンでのバグ。
780 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/13(金) 14:26:30.54 ] w3m & で起きる奴とおんなじ.どうすればいいんだろ・・
781 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/13(金) 14:34:14.58 ] 何のこと?
782 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/13(金) 14:44:26.87 ] >>781 >>768 の件.
783 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/13(金) 14:44:40.34 ] >>780 set +m で、ジョブコントロールを無効にすれば桶。 ただ、シェルスクリプト中から起動すればデフォで set +m 状態なんだがな。 コマンドラインから直接起動してるのか。
784 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:01:39.51 ] どこに書いていいのかわかんないから、ここに書いてみる。 shell script書いててはまったんだけど、 ls -l /etc | sort -k4 -n がファイルサイズでソートしてくんない。 こんな↓感じで、なんか部分的にしかソートしてくれないみたい。 dpaste.org/ri4On/ バグ? 理由を知ってる人がいたら教えてちょうだい。 環境: debian squeeze $ uname -a Linux bauhaus 3.2.0-2-rt-686-pae #1 SMP PREEMPT RT Fri Apr 13 02:23:30 JST 2012 i686 GNU/Linux $ sort --version sort (GNU coreutils) 8.5
785 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:09:58.78 ] >>784 sort -k5 -n だろ
786 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:10:24.24 ] まぁ、ls -Sで良いんじゃないのか
787 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:15:57.76 ] >>784 > 理由を知ってる人がいたら教えてちょうだい。 使い方が間違っている。
788 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:18:22.79 ] 0番目から数えたくなる気持は分からなくもない
789 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:26:12.51 ] いや、だって、man sort したら、 -k POS1[,POS2] -K POS1[,POS2] ソートフィールド指定の POSIX 形式。今後はこちらが 推奨される。行の POS1 から POS2 までのフィールドを指定する。 POS2 を含む。 POS2 が省略されたら行末まで。 フィールドと文字位置 はそれぞれ 0 から数えはじめる。 て書いてあったんだもん。 それを何も考えず信じたのでした。 LANG=C man sort だと、 -k, --key=POS1[,POS2] start a key at POS1 (origin 1), end it at POS2 (default end of line) てなってるのね。 確かに -k5ならソートしてくれたよ。 なんだかスレ汚し失礼しました。
790 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/14(土) 21:34:49.42 ] 本当だ。普段manpageは英語のものしか見ないから気付かなかった。
791 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 01:03:11.15 ] 俺もだまされた。 さすが Linux とおもた。
792 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 01:13:16.43 ] Linuxの日本語manはまったく整備されてないからなぁ
793 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 01:18:04.06 ] alias man='LANG=C man' しとくのオススメ
794 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 01:20:40.59 ] $ man sort じゃなくて $ info sort がオヌヌメ
795 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 02:33:57.03 ] Linuxの日本語 manと言えば、最近 bash 4.2の manが 翻訳されたのが嬉しかった。 GNU bash 4.2 の翻訳 linuxjm.sourceforge.jp/INDEX/gnu.html#GNU_bash
796 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 11:22:51.82 ] コマンド foo と同名の関数 foo を作成し、後者の中から前者を呼び出そうと思っています。 function foo { foo } しかし当然ながら無限ループになります。 解決策としては function foo { `which foo` } という方法があります。 しかし毎回 which コマンドを起動するのがちょっと気にかかります。 別の方法として function foo { ¥foo } というのを試しましたが、だめでした。¥foo はエイリアスには効くけど関数にはききませんでした。 というわけで、今のところ which コマンドを使う方法しかなさそうですが、もっといい方法があれば教えて下さい。
797 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 11:26:42.70 ] >>796 function foo { command foo } そのための「command」コマンド。
798 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 12:24:24.87 ] 話は変わるけど、bashには`help'という組み込み関数があって、 bash$ help function とか bash$ help command とかするとその部分の説明文だけ表示してくれる
799 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 13:24:53.76 ] 単に /usr/bin/foo とかすればいいんじゃないの?
800 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 13:34:57.91 ] >>799 最適解(>>797 )が既に出てるのに、外した回答するオマエは黙ってろ。 PATHが違ったら適応できないだろw
801 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 16:01:28.21 ] >>799 のレスは別に問題視するようなものじゃない。 〜の方が良いと書いてあれば別だが。
802 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/15(日) 16:16:51.47 ] >>801 >>796 の質問で、わざわざ `which foo` と書いてることから、 絶対PATHで書いたのでは問題の解決にならないことは読みとれる。 質問者自信も絶対PATHを使う方法は知っている(けどそれじゃ駄目)と読みとれる。 質問の回答になってないのだから問題視されてもしょうがない。
803 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/16(月) 01:51:19.72 ] >>801 >>799 みたいなトンチンカンな回答にも丁寧に答えてあげている >>800 の優しさに気づけ
804 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/17(火) 15:40:51.44 ] >>797 「command」なんて初めて知りました。完璧です。ありがとうございました。 >>802 状況としてはまったくそのとおりで、すばらしいエスパーっぷりですが、 799はそこまで敵視されるようなことを書いてるわけじゃないので、 そんなに怖がらせなくてもいいかなと思いました。 技術者同士はみんな仲良くね!戦うべき相手は別にいるよ!
805 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/17(火) 16:49:46.48 ] >>800 は常駐さんのお決まりレスです。 彼なりにイカしたレスだとお考えになっているのでしょう。 しばらくここにいれば慣れます。
806 名前:名無しさん [2012/04/23(月) 01:47:23.08 ] 検索コンプレックス
807 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/28(土) 14:15:07.91 ] 関数もexportできるようにならないかなぁ 環境変数ならぬ環境関数みたいな 便利だと思うんだけど
808 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/28(土) 14:19:23.03 ] >>807 え? できるけど。 export -f
809 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/29(日) 08:45:26.54 ] >>808 bash乙
810 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/29(日) 09:44:51.95 ] ____ / \ / _ノ ヽ、_ \ / o゚⌒ ⌒゚o \ 不毛な言い争いがまた始まるお… | (__人__) | \ ` ⌒´ /
811 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/29(日) 10:46:16.86 ] キミの好物じゃないの
812 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/29(日) 17:13:31.08 ] >>808 ほんとだ、bashだとexport -fでできるのね zshだと駄目なんだけどオプションが違うんだろうか
813 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/29(日) 17:16:47.95 ] zshは今誰も使ってないからバグが放置されてるんじゃないか?
814 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/04/29(日) 18:14:30.17 ] >>813 そうなんだぁ・・・ いっそbashに戻ろうかな
815 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 03:50:24.36 ] 質問です。 複数のコマンドの実行結果をソートしたいですが、うまくいきません。例えば、 イメージ的には以下のような感じ。 { cat FILE_A find PATH1 -print find PATH2 -print find PATH3 -print } | sort > FILE_A 以下を試しました find PATH1 -print >> FILE_A find PATH2 -print >> FILE_A find PATH3 -print >> FILE_A cat FILE_A | sort > FILE_A こうすると最後の FILE_A のファイルに結果がすべて出力されず尻切れになり ます。
816 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 03:59:02.05 ] zshかbash系だとして一行で済ますなら $ cat <(find PATH1) <(find PATH2) <(find PATH3) | sort $ cat < FILE_A | sort > FILE_A が失敗するのはまあそんなものだと思っておけばいい。 同じファイルから読み込んで出力するのは失敗する。 $ cat < FILE_A | sort > FILE_B ならおk
817 名前:名無しさん@お腹いっぱい。 [2012/05/06(日) 04:09:18.13 ] (rm FILE_A; sort > FILE_A) < FILE_A みたいな手もあるが、間違えたら泣ける。
818 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 04:15:04.88 ] 同じ条件で検索するなら find PATH1 PATH2 PATH3 | sort でいいよな。
819 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 05:15:17.42 ] >>815 > cat FILE_A | sort > FILE_A マルチタスクな OS では普通パイプやリダイレクトの際に前後の プロセスが同時に起動する。 ファイルを読むプロセスが終了するのを待ってファイルを書くプ ロセスが起動する訳ではない。 なので、上記の場合は最後に書き込むファイル名を変更しなければならない。
820 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 14:36:51.94 ] TEMP=`tempfile` cat FILE_A > "$TEMP" find PATH1 -print >> "$TEMP" find PATH2 -print >> "$TEMP" find PATH3 -print >> "$TEMP" sort "$TEMP" > FILE_A
821 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 14:53:36.25 ] すみませんが添付ファイルは梨の奉公でお願いします
822 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 15:27:35.80 ] >>815 www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html#sort-invocation cat FILE_A | sort -o FILE_A
823 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 16:20:24.14 ] >>822 catとパイプが無駄です。 sort -o FILE_A FILE_A
824 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 17:20:10.08 ] ランダルシュワルツの不要なcat添削を思いだした
825 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 18:55:31.70 ] cat議論はこのスレの>>147-213 あたりで延々やってるな。
826 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 19:22:02.88 ] 添付ファイルを使わないのは大手SIerじゃ常識だね。
827 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/06(日) 19:23:49.29 ] 思案パイプ
828 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/07(月) 19:19:08.78 ] 対話方式にならないようにシェルスクリプト自信がroot権限で実行されるようにするスクリプトって作れますか?
829 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/07(月) 21:03:44.73 ] >>828 対話的コマンドでもexpectでなんとかなる
830 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/07(月) 21:11:42.22 ] >>829 そういう意味じゃなくて、シェルスクリプト中で su -c hoge とかしないで root権限の動作をさせたいという質問かとエスパー。
831 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/07(月) 21:16:30.15 ] 基本的にsuidはシェルスクリプトでは許可されてないからねえ。 昔あったsuidperlみたいなののbash版を探してみたけどないみたいだし。 sudersに対象となるスクリプトに対してNOPASSWDを設定するぐらいしか思いつかないや。
832 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/08(火) 02:00:49.38 ] >>828 できます コマンドラインを実行するだけのプログラムを作って setuidするば
833 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/08(火) 07:52:21.31 ] >>832 >>831
834 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/09(水) 13:22:49.97 ] forum.xda-developers.com/showthread.php?t=540483 ここに書いてあるシェルスクリプトを動かしてみたんですが、 Syntax error: "do" unexpectedと返されてしまいます ヒントだけでもいいんで教えてください。
835 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/09(水) 13:28:11.27 ] -x 付けて実行してどこでエラーか見てみたら bash -x secrets.sh
836 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/09(水) 13:29:47.52 ] >>835 わからないなら黙ってろ
837 名前:835 mailto:sage [2012/05/09(水) 13:30:45.77 ] あ、スレ間違えてたorz
838 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/09(水) 15:17:41.55 ] なぜかしら、回答としては合ってる気がするぞw
839 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/10(木) 06:54:48.81 ] コピペの際に文の末尾に\rが入っちゃってるとか。
840 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/14(月) 22:36:21.02 ] alias cd=chdir function chdir { if [ -r "$1" -a -d "$1" -o "$1" = "" ] ; then local i for i in 8 7 6 5 4 3 2 1 0 ; do dirstack[$i+1]=${dirstack[$i]} done dirstack[0]=`pwd` \cd $1 fi pwd } function ds { echo "p:"`pwd` local i for i in 0 1 2 3 4 5 6 7 8 9 ; do echo "$i:${dirstack[$i]}" done } bash用のをcsh(tcshですが)に書き換えてもらえないでしょうか。
841 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/14(月) 22:36:59.98 ] function bd { dirstack[10]=`pwd` \cd ${dirstack[0]} local i for i in 0 1 2 3 4 5 6 7 8 9 ; do dirstack[$i]=${dirstack[$i+1]} done pwd } function nd { dirstack[10]=`pwd` \cd ${dirstack[9]} local i for i in 8 7 6 5 4 3 2 1 0 ; do dirstack[$i+1]=${dirstack[$i]} done dirstack[0]=${dirstack[10]} pwd }
842 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/15(火) 09:15:03.98 ] pushd じゃダメなん?
843 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/15(火) 16:36:43.46 ] >>842 体に馴染んでるんで…すいません
844 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 16:34:35.79 ] もっとマシな方法ありますか?考えても、これくらいしか思いつかない。 デフォルトのBourne Shellではチルダ展開がないようなので、posix shellにて チルダ展開が必要な場合がある、ファイル名に空白等を含んだものが、パラメータに入っているとして、 file_name="~/src/te st" echo "${file_name}をチルダ展開しlsします。\n" ls -l "$( eval echo -n ${file_name} )"
845 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 16:40:45.81 ] lsに限らず、それ以外でも扱える、方法が知りたいです。
846 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 17:10:41.70 ] >>844 例が悪い。その1番下の行の ls -l "$( eval echo -n ${file_name} )" だって、複数の空白が空白1個にまとめられちゃうし、 $ < > 等の記号が含まれると ${file_name} (クォートなし)の展開と evalの展開で大変なことになるぞ。
847 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 17:30:39.54 ] >>846 確かに、例は悪いだろうな。大変なことになる。 でも考えても、これくらいしか思いつかなかったので、 いい加減にして、聞いた方が早いかと書き込んだんだよ。
848 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 17:34:06.75 ] シェル変数内にチルダが入っている時、チルダ展開だけやって その他の空白とか * $ < > とかの解釈はさせないって方法がないんだよな。 sedでチルダを $HOME に書き換えろ。
849 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 17:46:31.95 ] >>844 file_name="~/src/te st * $ < >" ls -l "${file_name/\~/$HOME}"
850 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/16(水) 18:49:13.65 ] >>846 , >>848 , >>849 あああ!ありがとう。 ls -l "$( echo -n "${file_name}" | sed s#^~#$HOME# )"
851 名前:844 mailto:sage [2012/05/16(水) 21:00:34.05 ] しばらく考えてこうしました。 ls -l "$( [ "${file_name%%/*}" = "~" ] && echo "$HOME/${file_name#~/}" || echo "${file_name}" )" if [ "${file_name%%/*}" = "~" ] then ls -l "$HOME/${file_name#~/}" else ls -l "${file_name}" fi
852 名前:名無しさん@お腹いっぱい。 [2012/05/18(金) 05:23:42.76 ] v7shについて色々調べてるのですがどうしても関数を使用しようとすると test.sh: syntax error at line 2: `(' unexpected とエラーが出てきて使用できません。空白、頭にfunctionを付ける等いろいろ試してみましたがやはり変わらず・・・ UNIX version 7の頃のshには関数がないということでしょうか?
853 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 05:27:04.29 ] sage忘れました。申し訳ないです。
854 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 06:51:13.40 ] >>852 シェル関数はないよ。 代用として、シェル関数にしたい内容をシェル変数に入れて、その変数を実行する。 func='ls -l' $func で ls -l が実行される。引数を渡したい時は工夫して。
855 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 07:00:59.45 ] >>852 あんまり役に立たないかも知れないですが、無いと思います。 参考までに 1. Bourne Shell Tutorial www.grymoire.com/Unix/Sh.html The original version of the Bourne shell didn't have functions. If you wanted to perform an operation more than once, you either had to duplicate the code, or create a new shell script. 2. Linux におけるシェルの進化 www.ibm.com/developerworks/jp/linux/library/l-linux-shells/?cmp=dw&cpb=dwlin&ct=dwrss&cr=dwrss&ccy=jp&csr=012012 ただし、関数を定義する機能は欠けていました。 3. 知っている限りでは、ここが一番情報が多い traditional Bourne shell family / history and development www.in-ulm.de/~mascheck/bourne/ The Variants A summary of the most important changes ? Version 7 (1979) control structures, cmd substitution, () and {}, arbitrary variable names, trap, eval, special parameter substitutions, case ? System III (1981) #, [!...], colon parameter substitution, set -- ? SVR1 (1983) shift n ? SVR2 (1984) functions, built-ins: unset echo type, redirection for builtins 4. 3の下の方のSource codeにある、Nikola Vladov のマニュアルで、 man v7sh BUGS Coexists with but doesn't understand shell functions. 5. FreeBSD Portsはよく分かりませんが、 v7sh FreeBSD www.freebsdsoftware.org/shells/v7sh.html functions aren't supported and command line input is not 8 bit clean
856 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 15:41:41.74 ] >>854 >>855 ありがとうございます!やっぱりなかったんですね case文で;;を使用してもcase文抜けられないのも仕様なのかなぁ マニュアル読んだら使用できそうではあったんですけども・・・一応使用したテストスクリプト上げておきます。 #!/usr/local/bin/v7sh case $1 in a) echo "A!!" ;; b) echo "B!!" ;; c|d) echo "C or D" ;; [e-h]) echo "E kara H" ;; *) echo "NANIKORE?" ;; esac で結果が以下のようになりました。 $ test.sh a A!! NANIKORE?
857 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 16:34:52.98 ] 仕様じゃね? ソースあるんだから読んで解析してくれ 読みにくいってレベルじゃないけど
858 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 20:07:10.23 ] >>856 なんででしょうね? そのままコピペしてv7shで試しましたが、こちらでは期待通りの動作でした。 $ ./v7case.sh a A!! $
859 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 22:31:03.13 ] >>858 謎ですね・・・v7shなんて過去のものですから大差があるとは考えにくいですし 通常のコマンド待ち状態で ;; を打つとエラーが出ますから case内でしか特殊な意味を持たないと思われるんですけどね・・・
860 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/24(木) 17:44:12.51 ] msysgit(windows版git)付属のbashでログイン時のディレクトリをホーム以外にしたいんだけど、どうしたらいい? 例えば、$HOME/work/hogeでいつも作業するのでbash起動時にそこにいて欲しい。 $HOMEを書きかえると他にも影響があり過ぎるので別の方法教えてください。 適切なスレが見つからなかったので、誘導して。
861 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/24(木) 18:49:28.23 ] etc/profileの最後にcd ~/work/hoge?
862 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/24(木) 20:59:36.08 ] そんな単純なことでよかったのか... 恥ずかしいー
863 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/24(木) 21:28:32.29 ] $HOME/.bash_profileの方が良いんじゃ?
864 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/25(金) 02:08:36.57 ] かなり遅れましたが>>834 です -xをつけて実行してみたところ、 # bash -x secrets.sh + echo -n : Invalid argument: apks.txt + echo -n : Invalid argument: output.txt secrets.sh: line 5: syntax error near unexpected toke' `do 'ecrets.sh: line 5: `do 以下のようになりました。