1 名前:デフォルトの名無しさん [2005/04/04(月) 03:43:03 ] シェルスクリプトに関する質問・回答や議論等を行う相談室スレッド。
756 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 05:20:05 ] >>755 すでに解決しているようだが、こんな書き方もできる。 until /sbin/ping -t $TIMEOUT -o $HOST do : done
757 名前:デフォルトの名無しさん [2008/02/09(土) 17:00:30 ] 自分に渡されたコマンドオプションをそのままほかのコマンドに渡したいのですが うまくいきません runruby.shに cmd=ruby ${cmd}" $@" と書いて ./runruby -e 'puts "Hello"'を実行すると ruby: No such file or directory -- -e (LoadError)と言われてしまいます
758 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:11:50 ] >runruby.shに : : >./runruby -e 'puts "Hello"'を実行すると runruby.shはどこに行った? それと、そのrunruby.shによるとrubyに" -e"を渡すことになるぞ。
759 名前:757 mailto:sage [2008/02/09(土) 17:18:29 ] >>758 申し訳ございません 間違いました ./runruby.sh -e 'puts "Hello"'でした runruby.shの内容を cmd=ruby ${cmd} ${@} にしてみたらエラーメッセージはでなくなったのですがHelloも表示されず終了しましたorz
760 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:22:54 ] なんで"$@"にしないの?
761 名前:757 mailto:sage [2008/02/09(土) 17:31:24 ] >>760 できました!! ありがとうございます
762 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:33:10 ] つまり、rubyコマンドはコマンドライン引き数の先頭が空白だとファイル名と看做すってことか。
763 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:39:39 ] bashでしか試してないけど、、、 ${cmd}" $@" -> "ruby\ -e" "puts \"Hello\"" $cmd "$@" -> "ruby" "-e" "puts \"Hello\"" "${cmd} $@" -> "ruby -e" "puts \"Hello\"" "${cmd}" "$@" -> "ruby" "-e" "puts \"Hello\"" "$@" -> "$1" "$2" ... "str$@" -> "str$1" "$2" ... "str $@" -> "str $1" "$2" ... って感じで展開されているのかな?
764 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:42:01 ] 3つ目、 x "${cmd} $@" -> "ruby -e" "puts \"Hello\"" o "${cmd} $@" -> "ruby\ -e" "puts \"Hello\""
765 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:59:05 ] よく見たら、 "$@" じゃなくて " $@" なのかよ。
766 名前:デフォルトの名無しさん [2008/02/11(月) 18:09:03 ] configureでif test x"$enable_shared" = xyes; thenっていうふうに xを付け加えて比較してるのをよく見るのですがxはなんのためですか?
767 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:12:40 ] 空文字列のときも大丈夫にするためかな xつけないとtestで構文エラー出ちゃうでしょ?
768 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:13:32 ] $enable_sharedがマイナスで始まってる場合を考慮……はconfigureでは不要か。
769 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 01:38:48 ] 変数をクォートしないとこうなるけど、この場合は関係ないか $ x='-n 3 -o 1' $ if test $x = 1; then echo ok; fi ok
770 名前:デフォルトの名無しさん [2008/02/15(金) 18:24:02 ] echo `df` だと1行で出力されて echo "`df`" だと複数行出力になるのはなんででしょうか?
771 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:00:26 ] >>770 echo "foo bar" のようにダブルクォートの中では、改行が区切り文字にならなくなるから
772 名前:デフォルトの名無しさん [2008/02/15(金) 19:44:39 ] >>771 ああ、そうか。改行って""の中だと改行として有効なのか。 ふむ、""がないと、単なる区切りになっちゃうわけですね。
773 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 22:27:13 ] >>767-768 configure普通autoconfで自動生成するから、 ハイフンで始まっていたり=だったりするのを考慮したコードが 不必要な部分でも出てくるだけ。
774 名前:デフォルトの名無しさん [2008/02/16(土) 02:22:13 ] 自分が所持している映画のDVDのリストを整理しているのですが、 CSV形式で、例えば次のようになっている時に、 "jean-luc godard","1967 week end" "jean-luc godard","1965 pierrot le fou" "jean-luc godard","1960 a bout de souffle" を "Jean-Luc Godard","1967","Week End" "Jean-Luc Godard","1965","Pierrot Le Fou" "Jean-Luc Godard","1960","A Bout De Souffle" と一括変換したいのですが、どのようにすればいいのでしょうか? やりたいことは、 1). まず、2番目のフィールドが"制作年 タイトル"となっているのを"制作年","タイトル"に分けたいのと、 2). 次に、総ての単語の頭文字を大文字にしたい、 ということなんです。 1). は sed で何とかなりそうなのですが、2). が分かりません。 どなたかお助け下さい。 あるいは他に正しいスレがあるようでしたら誘導をお願いします。
775 名前:デフォルトの名無しさん [2008/02/16(土) 02:24:27 ] すみません。やはり 1). もよく分かりません。 どなたか助けてください。お願いします。
776 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 02:34:45 ] 手抜きですが perl -pe 's/\b(\w+)/\u$1/g; s/"(\d+)\s*/"$1","/'
777 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 03:11:07 ] ただシェルじゃないんだよなそれだと。。。 俺もPerlとかでしか思いつかないけど
778 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 03:14:45 ] >>774 シェルスクリプトだけでは無理でも(1)も(2)もawkでできますね。 取り敢えず(1)はこんな感じ。 awk -F, '{$2 = substr($2, 1, 5) "\",\"" substr($2, 6);} {print;}'
779 名前:デフォルトの名無しさん [2008/02/18(月) 01:45:59 ] [root@hoge admin]# ls -l | grep forward -rwsr-xr-x 1 root admin 300 2月 18 01:16 setforward.sh [root@ibm admin]# cat setforward.sh #!/bin/bash # set variable PATH=/home/ USER=$1 ADDRESS=$2 cd $PATH$1 cat << EOF > .forward "|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1" EOF cat << EOF > .procmailrc :0 c ! $ADDRESS EOF [root@hoge admin]# ./setforward.sh admin test@example.jp ./setforward.sh: line 14: cat: command not found ./setforward.sh: line 20: cat: command not found CentOS5.0です。 一般ユーザに、他のユーザの転送設定をさせたいと考えています。 こんな感じでcatコマンドが無いと言われてしまいます。 そのくせ、空っぽの.forwardと.procmailrcファイルが作成されます。 なぜcommand not foundになってしまうんでしょうか?
780 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:51:29 ] PATHは使っちゃだめよ
781 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:05:32 ] 環境変数PATHはコマンド(実行ファイル)を検索するためのものだから、 違う変数名にしないと駄目よ。
782 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:13:29 ] >>779 大文字の変数は環境変数で使われる事が多いから 小文字を使った方がいいよ。
783 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:42:13 ] >>779 自分で勝手にサーチパスを潰しておいて、見つけてくれないと文句を言うとはなんてぇゆとりだ。
784 名前:779 [2008/02/18(月) 13:10:40 ] >780-783 ありがとうございます。 m(_ _)m 続けてもう一つ・・・ -rwsr-xr-x 1 root root 300 2月 18 01:16 setforward.sh このシェルを動かして、一般ユーザで 他の一般ユーザの転送設定をしようとすると、 「cd」のところで"/home/user: 許可がありません"と 弾かれてしまいます。 SUIDをつけてあるのに、何がいけないんでしょうか? またまたよろしくお願いします。
785 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:26:00 ] mount nosuid されてるとか。
786 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:38:28 ] >>784 別に cd する必要ないんじゃないか? #!/bin/bash # set variable path=/home/ user=$1 address=$2 cat << EOF > "$path/$user/.forward" "|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1" EOF cat << EOF > "$path/$user/.procmailrc" :0 c ! $address EOF
787 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 21:46:42 ] OSによってはスクリプトのsuidを意図的に無視するモノがある。 Linuxとか。
788 名前:779,784 mailto:age [2008/02/19(火) 01:49:15 ] >785-787 ありがとうございます。 /etc/fstabのマウントオプションは、「defaults」でした。 明示的に「async、auto、dev、exec、nouser、rw、suid」 としてみましたが、ダメです。 そして>786氏のスクリプトもダメでした。 最初のcatで弾かれます。 しかも786氏スクリプトは、ユーザ自身の転送設定を しようとすると、.forwardファイルが 「"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1" EOF cat << EOF > "$path/$user/.procmailrc" :0 c ! $address EOF」となってしまい、 .procmailrcファイルは作成されませんでした。 引き続きよろしくお願いします。
789 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 04:03:08 ] >>788 最初の EOF の前後にごみが入ったんじゃないか? まあ、見栄えを気にしないのなら echo でもいいけどな。 echo > "$path/$user/.forward" "\"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1\"" echo > "$path/$user/.procmailrc" ":0 c ! $address" > 最初のcatで弾かれます。 原因は多分 >>787
790 名前:779,784 [2008/02/20(水) 04:11:45 ] さっき本屋で分かっちゃいました。 CentOS徹底入門 第2版 www.amazon.co.jp/dp/4798114626/ に書いてありました。 >787さんの通りでした。 なんとかならんものか、CentOSスレッドででも 質問してみます。 ありがとうございました。
791 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 10:25:28 ] >>790 sudo を(きちんと設定して)使えば。 ていうか、一般ユーザに他のユーザの転送設定をさせる理由がわからん。
792 名前:779,784 [2008/02/20(水) 14:07:08 ] >791 ありがとうございます。 自社でちっさいデータセンタを持っています。 で、その中に他の会社のドメインと同居してるんです。 複数ドメインを管理するGUIのソフトが未熟で、 会社に届いたメールを携帯に転送する場合があるんですが、 転送すると全部そっちに転送されちゃうんです。 それを回避するには、今のところCUIで手書きして あげるしかないんです。 私は情シス部隊所属、DCは開発部隊のもの。 与えられたドメインごとの管理者ユーザは、CUIだと 他のユーザの$HOMEに入れないんですよ。 それで、SUIDつけたスクリプトならイケるんじゃないかと 考えた次第です。 なんか表現が未熟ですがご理解いただけましたでしょうか?
793 名前:デフォルトの名無しさん [2008/02/27(水) 12:09:36 ] 教えてください 日付の切り出しかたわかりません data.txt 2/1 XXXXXXXX 2/2〜2/5 XXXXXXXXX 2/7〜2/8 XXXXXXX 2/12 XXXXXXXXXX 2/20〜2/28 XXXXXXXXX と書かれた行があり 今日より以前の日付の行を削除するにはどうすればいいですか 正規表現板で聞いたのですが正規表現の問題と言うよりプログラムの方でたずねる みたいナノデ 日付に〜が入っているためなおさら難しくさっぱりわかりません
794 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 13:02:15 ] シェルスクリプトで実装するのか?そうでないならスレ違いだが
795 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:19:20 ] >>792 今日より以前を削除とは? 今日が2/27で 2/5〜2/28 xxxxxx というデータを 2/27〜2/28 xxxx にしちゃうのか、そのまま生かすのか?
796 名前:デフォルトの名無しさん [2008/02/27(水) 16:57:32 ] 初心者な質問ですみません。 あるディレクトリの中に数百のファイルがあり、 AAA_01.txt AAA_02.txt ... のようなファイル名になっています。 それを、下記のように、AAAの箇所をDATE関数で日付を取得したいのです。 20080226_01.txt 20080226_02.txt ... どのようにすればよろしいでしょうか。
797 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 17:15:22 ] >>796 日本語で
798 名前:デフォルトの名無しさん [2008/02/27(水) 17:27:00 ] >>795 今日が2/27だと 2/20〜2/28 XXXXXXXXX の行を残してそれ以前の日付の行を削除したいのです。
799 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:02:38 ] あーなるほど、PIMのスケジューラみたいなものを考えているってことか。 シェルスクリプトだけでどうこうできるフォーマットじゃないし、チルダの所為で awkかなんかの一行野郎で済ませることも難しそうだ。
800 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:11:01 ] バカみたいにawk使えばいけそうじゃない? 実行して試してないけど下みたいな感じで。 DATE=`date +"%m/%d"` M=`echo ${DATE} | awk 'BEGIN{FS="/"};{print $1}' ` D=`echo ${DATE} | awk 'BEGIN{FS="/"};{print $2}' ` while read LINE;do if [[ `echo ${LINE} | awk '{print $1}'` = [*][〜][*] ]] ;then MM=`echo ${LINE} | awk 'BEGIN{FS="〜"};{print $2}' | awk 'BEGIN{FS="/"};{print $1}'` DD=`echo ${LINE} | awk 'BEGIN{FS="〜"};{print $2}' | awk 'BEGIN{FS="/"};{print $2}'` else MM=`echo ${LINE} | awk 'BEGIN{FS="/"};{print $1}'` DD=`echo ${LINE} | awk 'BEGIN{FS="/"};{print $2}'` fi if [[ ${M}=<${MM} && ${D}=<${DD} ]] ;then echo ${LINE} >> ${OUT_FILE} fi done < ${IN_FILE} みたいな。
801 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:14:11 ] あ、dateコマンドで出てきた数値の頭に0がついてたらだめかも。 そのへんは0区切りで$2を取るとか適当にやってください。
802 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:51:41 ] bashで数値を10桁程の数値をカンマ区切りにしたいのですが、どのような書き方をしたらできるでしょうか?
803 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:57:06 ] >>800 それはOneLinerとは言えないんじゃ……と突っ込もうと思ったら OneLinerを腐るほど呼んでたのねw
804 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 05:18:51 ] >>802 標準のコマンドで何かありそうなきもするし、 awk とか sed とか perl とかなら OneLiner で済みそうだが あえて bash 限定で書いてみたぞ。 expr 使えば bourne sh でも動くようになると思う。 #! /usr/bin/env bash num=$1 result='' figure=$[ ${#num} % 3 ] (( figure > 0 )) && read -n "$figure" result <<< "$num" while read -n 3 i ; do [[ -n "$i" ]] && result="${result},${i}" done <<< "${num:$figure}" echo "${result#,}
805 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 20:41:18 ] expr使っていいんだったらexpr $num : '.*\(...\)'で済んじゃうだろ。 以下1行に詰め込めないこともないawk解。 { out="" for (l=length(src=$0) - 3; l>0; l-=3) { out="," substr(src,l+1,3) out; src=substr(src,0,l); } print src out; }
806 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 21:28:47 ] >>804 >>805 なるほど、さまざまな方法があるんですね。 とても参考になりました、ありがとうございました。
807 名前:デフォルトの名無しさん [2008/03/04(火) 17:15:40 ] cシェルについて質問させてください。 /(スラッシュ)一文字にマッチさせるには どのように記述すれば良いでしょうか。 以下のようにやりましたが、うまくいきません。 よろしくお願い致します。 #!/bin/csh -f set etc = / echo $etc if ($etc =~ ^/$) then echo ok else echo ng endif
808 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:24:54 ] sh系みたいにtestコマンドを使って、if [ -$etc == -/ ] then としたらどうだろう。
809 名前:デフォルトの名無しさん [2008/03/04(火) 17:36:26 ] >>808 即レスありがとうございます! 出来ました<(_ _)>
810 名前:デフォルトの名無しさん [2008/03/10(月) 15:02:33 ] while read lineでファイルを読み込んで その行にABCと言う文字があるかないか判定して あれば 処理1 なければ 処理2という if文での書き方教えてください
811 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 21:33:37 ] case $line in *ABC*) 処理1 ;; *) 処理2 ;; esac ってif文でかよ!
812 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:20:20 ] grepと組み合わせないと無理か。 1行ごとにgrepなんか起動したくないが。
813 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:24:46 ] line2=${line%%ABC*}${line##*ABC} # で削って if [ ${line} = ${line2} ]; then # 処理1 else # 処理2 fi # とか?
814 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:49:58 ] if [[ $line =~ ABC ]]; then echo matched else echo did not match fi こういうこと?
815 名前:デフォルトの名無しさん [2008/03/12(水) 23:35:10 ] 1レコードのXMLを、シェルを使って字下げなどを自動で行って表示させたいのですが、 なにかうまい方法はないでしょうか? --------------------------- <all><a>123</a><b><c>456</c><d>789</d></b></all> ↓ <all> <a>123</a> <b> <c>456</c> <d>789</d> </b> </all> ------------------------ というような感じで・・・
816 名前:デフォルトの名無しさん [2008/03/12(水) 23:37:16 ] ↑ すいません、4タブで字下げされてると思ってください。
817 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:48:55 ] 整形式XML全般を扱うというのは、かなり難しいんじゃないか? perlとかrubyとか使うべき。 よほど単純化されてるんなら、まずはタグ1個が1行になるように改行して、 開始タグなら字下げを増やして、終了タグなら字下げを減らして、って感じか。 ただこれでは <c>456</c> とか無理だが。
818 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 03:26:53 ] >>815 おおざっぱに手順を考えてみた。 めんどくさそうなので実装はまかせた。 1. 行の最初にあるタグとその閉じタグの間に他のタグがあれば、タグの頭で改行する。 この時にインデントの深さをタブ幅文プラスしてタグ名を記録する。 2. インデントの深さが 0 以上ならインデントする 3. タグの間にタグが無いなら閉じタグで改行 4. 記録したタグの閉じタグを見つけたらインデントの深さを減らして記録から削除。 5. 1-4 繰り返し
819 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 03:29:03 ] xmllint --format に食わせればおk
820 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:13:44 ] cron などによってある時刻に自動的に起動させるプロセスで、 実行開始から xxxx秒 とか経過してもまだ終了しない場合 強制的に終了させる方法にはどんな方法があるでしょうか? そして、その方法で注意しておかなければならない 点とかあれば教えてください
821 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 15:00:29 ] 起動したいプロセスをバックグランドで起動して、 必要な秒数sleepしたら問答無用でkillするとか。 そのプロセスが、適切な後処理のために特殊なシグナルを利用できるのなら、 killでそのシグナルを指定すればいい。
822 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 16:33:55 ] >>820 ロックファイルを作るタイプはプロセスだけ殺しちゃうと 困った事になるかもしれない。
823 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 16:44:02 ] だからそういうプロセスは適切なシグナルハンドラを用意するべきなんだよね。
824 名前:デフォルトの名無しさん [2008/03/25(火) 22:12:46 ] Cシェル(ソラリス)について教えてください。 test.txtに、helloが入っていたら、OK、 無ければ、NGと判定させたいのですが、 以下のようにしてもIF文が不正ですと言われます。 Bシェルでは、うまくいくのですが、Cシェル用の記述方法等 ありましたらアドバイスください。 if ( cat test.txt | grep "hello" ) then echo OK else echo NG endif
825 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 22:14:58 ] $status
826 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 00:19:08 ] >cat test.txt | grep "hello" なんでgrep "hello" test.txtにしないんだ?
827 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 08:23:26 ] B shell 使えばいいじゃん。
828 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:06:37 ] ファイル 1.txt 2.txt 3.txt test.bash が存在するディレクトリで以下の 内容を実行するとなぜ1が返ってきますか?4になぜならないのかわかりません。 --test.bash-- #!/bin/bash current_files=$(ls) echo ${#current_files[@]}
829 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:32:48 ] for で current_files の中身を見てみると分かるかと。 for file in "${current_files[@]}"; do echo "[[[$file]]]"; done
830 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:59:01 ] >>828 × current_files=$(ls) ○ current_files=( $(ls) ) 空白入りのファイル名があると期待通り動かないから気をつけろ
831 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:19:09 ] いつもそこで悩むんだけど、 空白入りのファイル名があっても大丈夫な方法ってないの?
832 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:46:20 ] >>831 つperl つruby つpython
833 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 02:49:45 ] つzsh
834 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 02:54:25 ] >>831 あるにはあるが、正直面倒。 1) 一時的 IFS 変更 IFS=$'\n' current_files=( $(ls) ) 2) for + ワイルドカード for file in * ; do current_files[${#current_files[@]}]=$file done 3) while + read + here strings (パイプは不可) while read file ; do current_files[${#current_files[@]}]=$file done <<< "$(ls -1)"
835 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:18:29 ] >>834 ほうほう・・・。3 とか凄いですな。
836 名前:828 mailto:sage [2008/03/28(金) 09:29:29 ] うぉぉ・・!激しく助かりました。 シェルなんて初めてなんでw奥が深いな。
837 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 23:14:01 ] ファイルから読んだ文字列をfindに引数として渡して、 ファイル一覧を取得するスクリプトを作りたいのですが、うまくいきません。 以下の内容でおかしな部分があったら指摘をお願いします。 ディレクトリ構成 dir +---nkf_args +---filelist.sh +---a.cpp +---b.cpp +---a.h +---b.h ---------------------------- nkf_argsファイル -name "*.cpp" -or -name "*.h" ---------------------------- filelist.shファイル #!/bin/sh #nkf_argsファイルから引数文字列取得 nkf_args=`cat nkf_args` #findで条件に一致したファイルリスト取得 files=`find ./ $nkf_args` for filename in files do echo "$filename" done
838 名前:837 mailto:sage [2008/03/30(日) 23:16:40 ] 続き スクリプト実行結果 予想値 a.cpp a.h b.cpp b.h 結果 出力無し ここまで --------------------------------
839 名前:837 mailto:sage [2008/03/30(日) 23:19:28 ] ちなみに引数ファイルに書かれているものの ダブルクォーテーションを外すことで *.cppに関する結果は得られましたが、 *.hに関する結果は得られませんでした。
840 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 00:03:22 ] 取り敢えず、filelist.shの1行目を#!/bin/sh -xにして実行してみたら?
841 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 00:32:52 ] そのfindでのORって-oだったりしませんか?
842 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 00:35:38 ] >>841 POSIXのfindなら、-orは-oと同じ(とmanに書かれている)だから大丈夫。
843 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 01:12:40 ] >>839 そのやり方を試してみました。 -------------------------------------- 出力 ++ cat nkf_args + nkf_args='-name "*.c" -or -name "*.cpp"' ++ find ./ -name '"*.c"' -or -name '"*.cpp"' + files= -------------------------------------- 出力結果を見るとダブルクォーテーション部分が、 さらにシングルクォーテーションで囲まれるから駄目なのかと思い、 ダブルクォーテーションを外してやってみました。 -------------------------------------- 出力 ++ cat nkf_args + nkf_args='-name *.cpp -or -name *.h' ++ find ./ -name a.cpp b.cpp -or -name a.h b.h find: paths must precede expression Usage: find [path...] [expression] + files= -------------------------------------- ダブルクォーテーションを外した結果は 作業ディレクトリにあったファイル名に置き換えられて 無効な引数になってしまいました。 以上の結果を踏まえて、条件に合うファイルがないディレクトリから スクリプトを実行した結果、想定していた結果が得られました。 ただ、根本的な解決になっていない(どういう動作をするか分かっていないと、正しい結果が得られない)ので、 これをディレクトリ状態に依存しないようにしたいのですが、どういう方法があるのでしょうか? よろしくお願いします。
844 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 02:42:39 ] files=`find ./ $nkf_args` を files=`eval find ./ $nkf_args` としたらうちでは上手くいったよ。
845 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 02:56:20 ] >>844 試してみたところ、想定している結果が得られました。 皆さんありがとうございました。
846 名前:デフォルトの名無しさん [2008/04/02(水) 09:40:50 ] Cシェルで、以下のようなテキストファイルに保存した内容と コマンドを組み合わせた処理をしたいと考えています。 ・command.txtの内容 grep httpd /bin/csh -f set command = `cat command.txt` ps -ef | "command" > kekka.txt 上記のように試したのですが、書式が不正の為、 エラーとなります。 ps -ef | grep httpdの実行結果を、kekka.txtに保存したのですが、 どのようにすれば良いでしょうか。アドバイスお願いいたします。
847 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 09:51:35 ] "command" → $command
848 名前:デフォルトの名無しさん [2008/04/02(水) 10:44:30 ] >>847 即レスありがとうございます。 ps -ef | "$command" > kekka.txt としても grep httpd: コマンドが見つかりません。という エラーが発生します。 ps -ef | grep httpdの実行は可能です。 何が問題となっていますでしょうか。
849 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 10:52:50 ] アホ
850 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 11:38:28 ] 847のすべての文字を100回音読しなさい
851 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 11:38:37 ] >>848 #!/bin/sh command=`cat command.txt` ps -ef | $command > kekka.txt
852 名前:848 [2008/04/02(水) 16:06:20 ] すみません。よく読んでダブルクォーテーションを外したところ、 正常に実行できました。ありがとうございます。 恥の書き捨てでもう一つ質問させてください。 コマンドにパイプ繋ぎで複数の指定をしたいと思ってます。 command.txtの内容が、grep httpdであれば実行できるのですが、 grep httpd | grep -v grepとすると、以下のようなエラーになります。 > grep httpd | grep -v grep > grep: | をオープンできません。 > grep: grep をオープンできません。 > grep: -v をオープンできません。 > grep: grep をオープンできません。 これを防ぐ方法は無いでしょうか。 もしくは、command.txtに「ps -ef | grep httpd | grep -v grep > kekka.txt」と 書いてあって、それをそのまま、Cシェルで実行する方法は無いでしょうか。
853 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 16:13:03 ] csh -f command.txt csh -fc "$command" csh -fc "`cat command.txt`"
854 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 16:14:04 ] >>852 ttp://www.kiso.tsukuba.ac.jp/~makimura/text/node239.html
855 名前:848 [2008/04/02(水) 17:07:37 ] >>853 ありがとうございます。<(_ _)>
856 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 00:08:25 ] >>848 source command.txt