1 名前:1様 [2009/04/03(金) 22:17:43 ID:0qFlvOW9] UNIX板のスレを見ている方も多数おられるかと思いますが、 まあそれはそれとして、BASHウゼーとか言われる心配なく 平和にLINUX的スクリプト談義しましょうよ。 初めての自作スクリプト、自信ないから見てください。な初心者から トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで いろいろな人に参加して頂けると嬉しいです。 perlやらPythonやらの話が混ざっても良いんでない? Part4 : pc11.2ch.net/test/read.cgi/linux/1210999497/ Part3 : pc11.2ch.net/test/read.cgi/linux/1184077033/ Part2 : pc11.2ch.net/test/read.cgi/linux/1154578200/ Part1 : pc8.2ch.net/test/read.cgi/linux/1121994321/ >>2-5 あたりに色々と。
85 名前:login:Penguin mailto:sage [2009/05/21(木) 18:45:00 ID:50DHcUbO] じつを言うと>>76 は俺 信じてくれなくても良い
86 名前:login:Penguin [2009/05/28(木) 23:08:08 ID:MG6SQpHS] ディレクトリ構造を保持して特定のファイルをコピーするにはどうすれば良いでしょうか? cp -a a/b/c/d.txt e/ とやると e/d.txt となってしまいます。 e/a/b/c/d.txt となって欲しいのですが。
87 名前:login:Penguin mailto:sage [2009/05/28(木) 23:14:48 ID:OYPHtyPP] >>86 tar cvz a/b/c/d.txt | tar xvzf -C e/ -
88 名前:86 mailto:sage [2009/05/28(木) 23:50:32 ID:MG6SQpHS] >>87 Thx!
89 名前:login:Penguin mailto:sage [2009/05/29(金) 00:01:04 ID:rPFmiLnc] 一方ロシアは--parentsを使った
90 名前:login:Penguin mailto:sage [2009/05/29(金) 01:25:22 ID:H2hlYKbU] 出遅れた echo a/b/c/d.txt|cpio -p e
91 名前:login:Penguin mailto:sage [2009/05/29(金) 20:09:43 ID:ZTU2Uga5] rsync -aR a/b/c/d.txt e/
92 名前:login:Penguin mailto:sage [2009/06/15(月) 15:03:52 ID:An1qKLCY] くだスレから移動してきました。 bashで (for i in a b c d; do X done) | A | xargs B ; C; のような処理を行ったとき、B の処理をまだやっているうちに Cの処理に移ってしまうのですが、Bの処理が終わるのを 待つようにするにはどのようにすればよいのでしょうか? これまではそんな動作はありえない思っていたのですが、Cで ps で確認すると、B がまだ動いています。 もしバグだとすると、bash,libc,kernelのどのあたりになるでしょうか。 その確認方法はなにかありますか?
93 名前:login:Penguin mailto:sage [2009/06/15(月) 15:51:41 ID:FRq6RhHc] >>92 bashが待つのはBじゃなくてxargsの終了だからその辺でなんかあるのかもしれんが、 とりあえずその状態のときの各プロセスの親プロセス番号を確認したいところだな。
94 名前:login:Penguin mailto:sage [2009/06/15(月) 17:00:15 ID:An1qKLCY] >>93 ありがとうございます。Bの親はinitになってました。 xargsが勝手に終了してしまうのが問題みたいですね。 その辺調べてみます。
95 名前:login:Penguin [2009/06/15(月) 20:49:11 ID:oAD3AKfh] 初歩的な質問ですみません。readコマンドについてです。 #!/bin/bash ls * | while read result do echo $result done と書くとカレントディレクトリの内容がechoで表示されます。 これを ls * | read result ; echo $result と書いても同じように出力されそうな気がするのですが、 空行がでて終わってしまいます。 何が違うのでしょうか?
96 名前:login:Penguin mailto:sage [2009/06/15(月) 22:25:53 ID:FILO8IMv] 後者は1行しか読んでないんじゃない?
97 名前:login:Penguin mailto:sage [2009/06/16(火) 01:01:11 ID:nzUvvcuW] >>95 www.faqs.org/faqs/unix-faq/faq/part3/section-8.html
98 名前:login:Penguin mailto:sage [2009/06/18(木) 15:45:23 ID:dQ4OojSv] #!/bin/sh for FILE in "$@" do if [ -f $FILE ]; then echo "$FILE is a file" fi done だと、$FILE変数には、引数の記述により、相対パスも絶対パスもありえます。 $FILE変数を絶対パスに変換する方法はあるでしょうか?
99 名前:login:Penguin mailto:sage [2009/06/18(木) 15:53:07 ID:s3sHtQVu] >>98 あれば realpath
100 名前:login:Penguin mailto:sage [2009/06/18(木) 15:59:02 ID:dQ4OojSv] >>99 ないっす。
101 名前:login:Penguin [2009/06/18(木) 16:21:59 ID:0zcffroC] >>98 readlink -f
102 名前:login:Penguin mailto:sage [2009/06/18(木) 16:44:51 ID:dQ4OojSv] >>101 古いLinuxでreadlinkはシンボリックリンクのときのみ動作でした。 #!/bin/sh W_PWD=`pwd` for FILE in "$@" do if [ -f $FILE ]; then cd $W_PWD abpath=$(cd $(dirname $FILE) && pwd)/$(basename $FILE) echo "$abpath is a file" fi done しょうがないので、プログラムしてみた。 これで、$abpath に絶対パスが入るようになった。 シェルスクリプト暦浅いのだが、ベテランから見て問題なさそう?
103 名前:login:Penguin mailto:sage [2009/06/18(木) 17:05:37 ID:aPpB1FUW] kshだとrealpathはビルトインなのね
104 名前:login:Penguin mailto:sage [2009/06/18(木) 17:09:36 ID:aPpB1FUW] 無かったスマソ
105 名前:login:Penguin mailto:sage [2009/06/18(木) 17:23:14 ID:dQ4OojSv] #!/bin/sh for FILE in "$@" do if [ -f $FILE ]; then abpath=$(cd $(dirname $FILE) && pwd)/$(basename $FILE) echo "$abpath is a file" fi done これでいいんだ。
106 名前:login:Penguin mailto:sage [2009/06/18(木) 17:49:22 ID:S07Tjv1V] いや、ファイル名に空白あったらアウト 変数は基本""で囲む お兄さんとの約束だ
107 名前:login:Penguin mailto:sage [2009/06/18(木) 18:59:36 ID:dQ4OojSv] なるほど。 ありがとうございました。
108 名前:login:Penguin mailto:sage [2009/06/18(木) 19:18:06 ID:dQ4OojSv] おっと、ひとつ質問良いですか? abpath=$(cd $(dirname $FILE) && pwd)/$(basename $FILE) この後、カレントディレクトリ変わらないのはなぜですか?
109 名前:login:Penguin mailto:sage [2009/06/18(木) 20:19:19 ID:S07Tjv1V] cdしているのはサブシェルだから
110 名前:login:Penguin mailto:sage [2009/06/18(木) 20:26:28 ID:dQ4OojSv] 調べてました。 ()の中はサブシェルによって実行されるんですね。
111 名前:login:Penguin mailto:sage [2009/06/18(木) 22:56:25 ID:dQ4OojSv] >>98 です。 諸兄のおかげで、無事目的通りのスクリプトが組めました。 今後かなり作業効率が向上します。 感謝
112 名前:login:Penguin mailto:sage [2009/06/23(火) 22:19:47 ID:c8G3nrDU] bashの勉強のために、JMの該当するmanページをw3mで見るスクリプトを書いています。 ダブルクォーテーションの使い方など、細かいところも添削お願いできますでしょうか。 #!/bin/bash # @(#) man on linux.or.jp # COMMAND=`which w3m` PAGE= SECTION= SECT=("on" "on" "on" "on" "on" "on" "on" "on") SECTURL= BASEURL="search.linux.or.jp/cgi-bin/JM/man.cgi? " URL= if [ \( ! -e "$COMMAND" \) -o \( ! -x "$COMMAND" \) ]; then echo "not installed w3m" exit 1 fi while getopts S:h OPT do case $OPT in S) SECT=("off" "off" "off" "off" "off" "off" "off" "off") SECTION=$(expr $OPTARG - 1 2>/dev/null) if [ $? = 2 ]; then echo "secion number is invalid. exit." exit 2 fi SECT[$SECTION]="on";; h | ?) printf "Usage: %s: [-S secion] page\n" $0 exit 2;; esac done
113 名前:112 mailto:sage [2009/06/23(火) 22:21:09 ID:c8G3nrDU] shift $(($OPTIND - 1)) PAGE="$1" if [ x$PAGE == x ]; then echo "What manual page do you want?" exit 1 fi i=1 for onoff in ${SECT[@]}; do if [ x"$onoff" = x"on" ]; then SECTURL="$SECTURL"'&Sec'"$i"'='"$onoff" fi i=$(expr $i + 1) done URL="${BASEURL}"'Pagename='"${PAGE}"'&submit=Search%21'$SECTURL $COMMAND "$URL" よろしくお願いします。
114 名前:login:Penguin mailto:sage [2009/06/23(火) 23:37:11 ID:iNYrdW4A] 120点
115 名前:login:Penguin mailto:sage [2009/06/23(火) 23:41:00 ID:9feAjnJ4] bash限定(shで使わない)なら、外部コマンドよりbashの内部コマンドを使った方が速くなりますよ。 i=$(expr $i + 1) → ((i++)) とか。
116 名前:login:Penguin mailto:sage [2009/06/24(水) 00:57:03 ID:23DWLrsu] for (( expr1 ; expr2 ; expr3 )) ; do list ; done
117 名前:112 mailto:sage [2009/06/24(水) 01:41:57 ID:B7cQg4Om] >>114-116 ありがとうございます。 早速、(( ))を使って書き直しました。 10万までインクリメントしていくだけのスクリプトで 速度を計測してみたのですが、全然違うのですね! ./tmp.sh 4.64s user 0.10s system 99% cpu 4.788 total ./tmp.sh 92.07s user 111.03s system 96% cpu 3:31.31 total exprの方(下の方)が遅いです。 それと一貫性が無いように感じたので、1行目のwhichの文を$(which w3m)としました。 また、bashを見てみると[[ ]]という組み込みの評価式があったので、 if [ \( ! -e "$COMMAND" \) -o \( ! -x "$COMMAND" \) ]; then という部分を変更しました。 if [[ ( ! -e "$COMMAND" ) || ( ! -x "$COMMAND" ) ]]; then これも計測してみたら、若干ですが[[ ]]の方が速かったです。 >>116 で挙げられた記法を使用したことで変数が1つ減りました。 こんな感じになりました。 #!/bin/bash # @(#) man on linux.or.jp # COMMAND=$(which w3m) PAGE= SECTION= SECT=("on" "on" "on" "on" "on" "on" "on" "on") SECTURL= BASEURL="search.linux.or.jp/cgi-bin/JM/man.cgi? " URL= if [[ ( ! -e "$COMMAND" ) || ( ! -x "$COMMAND" ) ]]; then echo "not installed w3m" exit 1 fi
118 名前:112 mailto:sage [2009/06/24(水) 01:45:08 ID:B7cQg4Om] while getopts S:h OPT do case $OPT in S) SECT=("off" "off" "off" "off" "off" "off" "off" "off") SECTION=$(expr $OPTARG - 1 2>/dev/null) if [[ $? == 2 ]]; then echo "secion number is invalid. exit." exit 2 fi SECT[$SECTION]="on";; h | ?) printf "Usage: %s: [-S secion] page\n" $0 exit 2;; esac done shift $(($OPTIND - 1)) PAGE="$1" if [[ x$PAGE == x ]]; then echo "What manual page do you want?" exit 1 fi for ((i=1; i<${#SECT[@]}; i++)) do if [[ x"${SECT[i-1]}" = x"on" ]]; then SECTURL="$SECTURL"'&Sec'"$i"'='"${SECT[$((i-1))]}" fi done URL="${BASEURL}"'Pagename='"${PAGE}"'&submit=Search%21'"$SECTURL" $COMMAND "$URL" 変数が空の場合だったらとかスペースが含まれていたらとか、その辺りをよく理解しておらず、 とりあえずダブルクォートしてたりするのですが、無駄な部分があったりしますでしょうか。 細かい部分でも構いませんので、訂正していただけると嬉しいです。長文失礼しました。
119 名前:login:Penguin mailto:sage [2009/06/24(水) 02:04:47 ID:aKYWDWvt] そのままでも全然いいと思うよ(^_^)
120 名前:login:Penguin mailto:sage [2009/06/24(水) 08:42:54 ID:CrOO7ztU] COMMAND=$(which w3m) は COMMAND=$(command -v w3m) で外部コマンドはサヨウナラ SECTION=$(expr $OPTARG - 1 2>/dev/null) if [[ $? == 2 ]]; then echo "secion number is invalid. exit." exit 2 fi も let SECTION="OPTARG - 1" 2>/dev/null case $SECTION in [0-7]) :;; *) echo "secion number is invalid. exit." exit 1;; esac で外部コマンドはサヨウナラ if [[ ( ! -e "$COMMAND" ) || ( ! -x "$COMMAND" ) ]]; then は if [[ ! -x "$COMMAND" ]]; then で十分だと思うが
121 名前:login:Penguin mailto:sage [2009/06/24(水) 09:19:46 ID:aKYWDWvt] >>120 > COMMAND=$(command -v w3m) w3mがaliasされてたらwhichと結果がかわるよ
122 名前:login:Penguin mailto:sage [2009/06/24(水) 09:37:52 ID:BWmtmrUC] bashってtypeないの?
123 名前:112 mailto:sage [2009/06/24(水) 13:57:32 ID:qAybS9Ki] >119-122 レスありがとうございます。 今回作ったスクリプトでJMのbashを見ながら、こんな風にしてみました。 INTERRUPT=0 COMMAND=$( if [[ $(builtin type -t w3m) != "file" ]]; then echo "may not installed w3m" >&2 INTERRUPT=1 exit 1 fi IFS=' ' set $(builtin type w3m) echo $3 ) if [[ $INTERRUPT == 1 ]]; then exit 1 fi unset INTERRUPT こんなトリッキーなものを書いたのは初めてですが、これでエイリアスの場合も大丈夫でしょうか? # .bashrcにalias w3m='ls -l'と書いてみたのですが、 # type -tの結果がaliasになりませんでした。何故なのでしょうか... letは目から鱗でした。 「数字じゃない文字列が入力された時」(例えば"aaa"とか) をキャッチするために$?==2を使いたかったので、敢えて$(( ))を使えず、$( )を使っていました。 ですが、「セクション番号以外が入力された時」とまとめてしまえば、もっと安全ですね。 一貫性持たせるためにletを使わずにSECTION=$((OPTARG - 1));case云々...esac; とできるか、と思いましたが、letも数字から始まっている文字列("3aa"とか) だったりすると標準エラーに吐くのですね。便利です。let。 ファイルテストの部分は仰る通りです。わたしの勘違いです。 ご意見ありがとうございます。
124 名前:login:Penguin mailto:sage [2009/06/24(水) 14:40:30 ID:BWmtmrUC] >>123 そんな面倒なことはせんでもええ if ! type -P w3m >/dev/null; then echo '(# ゚Д゚)' fi
125 名前:112 mailto:sage [2009/06/24(水) 17:05:52 ID:qAybS9Ki] 何度もすみません。 Pオプションが、原文のman bashにしか書いようで、 書いてある英語がよく分からないのですけれど (-_-A; こういうことが書いてあるんでしょうか? pオプションは、エイリアスとか関数があったら何も返さないけれど、 そういう時でもPオプションは、ファイルだけを対象にしてそのパスを表示する。 間違ってたら恥ずかしいです。 if ! COMMAND=$(builtin type -P w3m 2> /dev/null); then if [[ ! -x $COMMAND ]]; then echo "not installed w3m" >&2 exit 1 fi fi ファイルテストと合わせて、COMMANDを取得するところはこんな感じになりました。 他は、>>117 ,118と同じです。
126 名前:login:Penguin mailto:sage [2009/06/24(水) 19:01:09 ID:h5ARTQfu] aliasにするには同シェルスクリプトファイル内に書くか.を使うか 例えばこう shopt -s expand_aliases . ~/.bashrc type -t w3m SECTURL="$SECTURL"'&Sec'"$i"'='"${SECT[$((i-1))]}" みたいなのは SECTURL="$SECTURL"\&Sec"$i"\="${SECT[$((i - 1))]}" とエスケープ使ったほうが読みやすいかもな
127 名前:login:Penguin mailto:sage [2009/06/24(水) 19:29:28 ID:w4EkT5LC] >>126 俺は関数化して環境登録することが多いです。 function w3m() { ls -l } export -f w3m
128 名前:login:Penguin mailto:sage [2009/06/26(金) 01:44:08 ID:+M5S3VDp] 質問です。前処理をして、 www.youtube.com/get_video?video_id=-AKQ6CUJa90&t=vjVQa1PpcFP1kWNkoPQ7xks6cfYQ2Ttsd-nzkuvfQsw=&el=detailpage&ps= のようなURLを列挙したファイル(you.txt)を用意してあり、 yt=$(cat you.txt | sed -e "s/&t.*//g; s/^.*video_id=//g") && \ wget -O $yt.flv -c -i you.txt で動作させた場合、 思惑通り一個目は、-AKQ6CUJa90.flv というファイル名で取ってこれるのですが、 二個目以降はファイル名の抽出が働かず、 ローカルに保存されるのは同名のファイル名となってしまいます。 どのようにすれば思惑通りファイルを取ってこれるのでしょうか?
129 名前:login:Penguin mailto:sage [2009/06/26(金) 02:55:31 ID:5uTursO/] for
130 名前:login:Penguin mailto:sage [2009/06/26(金) 03:43:24 ID:5uTursO/] for youtube_url in `cat you.txt`; do wget -c -O "`echo "$youtube_url" | sed 's/video_id=\(.*\)&t\1/g'`.flv" "$youtube_url" sleep 5 done でどうでしょうか
131 名前:login:Penguin mailto:sage [2009/06/26(金) 06:18:01 ID:3RE4KePV] for youtube_url in `cat you.txt`; do wget -c -O "`echo "$youtube_url" | sed 's/^.*video_id=\(.*\)&t.*$/\1/'`.flv" "$youtube_url" sleep 5 done …でどうでしょうか(^_^;)
132 名前:login:Penguin mailto:sage [2009/06/26(金) 06:31:57 ID:3RE4KePV] id変わってる…(^_^;;)
133 名前:128 mailto:sage [2009/06/26(金) 11:30:36 ID:WtRHx5He] >>130 , 131 お知恵を元にして、目的を果たせました。ありがとうございます。 感謝しています。 なお、自分の書き込んだ内容でも、いちおうファイル名の抽出には成功する模様? 試行錯誤してみるのも、面白いですね。ではでは。
134 名前:login:Penguin [2009/06/30(火) 11:41:15 ID:Iil9pev3] 質問です。 現在、kshを使用してテストをしているのですが、 ステップが多すぎて(1k↑)カバレッジを求められてます。 カバレッジツールが無いかグーグル先生に聞いてみましたが 全く引っかからなく・・・ シェルのカバレッジを求めている人はどんな方法で求めていますか?
135 名前:128 mailto:sage [2009/07/01(水) 04:20:50 ID:3OeIBl6N] echo "What terms?"; read terms; terms="${terms// /+}" T="$HOME" mkdir -p $T/${terms} for n in $(seq 0 10); do w3m -dump_source \ "images.google.com/images?hl=en&lr=&safe=off&um=1&sa=1&q=${terms}&svnum=30&start=${n} " \ | sed -e 's/","http/\n","http/g; s/","/\n","/g' | grep -E -w "\",\"http:.*.jpg" | sed -e 's/^.*http/http/g' | wget -P $T/${terms} -r -l 1 --timeout=60 --tries=3 -c -e robots=off -U 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' -i - done
136 名前:login:Penguin mailto:sage [2009/07/06(月) 22:31:23 ID:tHSUGfrq] ( sleep 1h; echo "hello" ) > file ってやると、fileは1時間openしっ放しになるンすかね?
137 名前:login:Penguin mailto:sage [2009/07/07(火) 09:03:43 ID:jQkxOO5Q] >>136 なるだろ。lsofとか使って観察してみるといい。
138 名前:login:Penguin mailto:sage [2009/07/08(水) 01:51:04 ID:SE49fktK] sleep 3600 > file でよくないか?
139 名前:login:Penguin mailto:sage [2009/07/08(水) 02:18:59 ID:VRCFK11t] お前は何を言っているんだ
140 名前:136 mailto:sage [2009/07/08(水) 07:54:59 ID:77+BAR3B] >>137 だおうもありまとう >>138 なんでもいいよ!!
141 名前:login:Penguin [2009/07/12(日) 10:36:19 ID:KKJfcIYB] 質問があります. 直接スクリプトの話ではないんですが, あるファイルに xxx という文字が含まれていなければ xxx を末尾に追記したい, という場合みなさんどうされています? grep とか使って条件分けすればできるのはわかるんですが,もっとスマートに やる方法があれば教えてください.
142 名前:login:Penguin mailto:sage [2009/07/12(日) 10:37:35 ID:1p3v2qzF] sed
143 名前:login:Penguin mailto:sage [2009/07/12(日) 10:41:49 ID:1p3v2qzF] ああファイルの話だったか じゃあ素直にgrep
144 名前:141 mailto:sage [2009/07/12(日) 10:44:36 ID:KKJfcIYB] >>142 それよりは % grep XXX file || echo XXX >> file の方がわかりやすい気が. 質問の意図としては,下記のように記述できる nanika コマンドのようなもの がないか知りたかったです. % nanika XXX file
145 名前:login:Penguin mailto:sage [2009/07/12(日) 12:20:21 ID:2S8ITALR] ない
146 名前:login:Penguin mailto:sage [2009/07/12(日) 12:53:03 ID:VHWHiWuB] >>144 ない。 なぜ nanika XXX file がスマートなのか知りたい。
147 名前:login:Penguin mailto:sage [2009/07/12(日) 18:16:12 ID:elf51XSl] grep --creeping-deth
148 名前:login:Penguin mailto:sage [2009/07/12(日) 19:44:16 ID:o8qLTMAv] death じゃないのか。
149 名前:login:Penguin mailto:sage [2009/07/12(日) 20:31:41 ID:elf51XSl] >>148 --orz
150 名前:login:Penguin mailto:sage [2009/07/14(火) 14:57:37 ID:gyyoowtT] nanika() { while read line do case "$line" in *$1*) return esac done <"$2" echo $1 >>"$2" }
151 名前:login:Penguin mailto:sage [2009/07/14(火) 15:44:41 ID:CH7bWn6s] つまらん。
152 名前:login:Penguin mailto:sage [2009/07/14(火) 21:42:07 ID:LzAZSljQ] :(){ :|:& };:
153 名前:login:Penguin [2009/07/20(月) 15:40:26 ID:K8L8w1qf] age
154 名前:login:Penguin [2009/07/20(月) 21:55:40 ID:ae6hxCnx] ps aux | grep processA でグレップしたプロセスのIDを変数に格納するにはどうかいてやればいいでしょうか?
155 名前:login:Penguin mailto:sage [2009/07/20(月) 22:11:42 ID:ODKc/pMj] 変数=`ps aux | grep processA | gawk '{print $2}'`
156 名前:login:Penguin [2009/07/20(月) 22:32:09 ID:ae6hxCnx] >>155 ありがとう 特定のプロセスAが起動したら、date >> /home/log としたいと考えています。ただし、プロセスAは、 grep で把握できるとして、 複数の場合があります。 この場合方法ですが、 ps aux | grep processA | gawk '{print $2}'` | wc -l でこの帰り値が、0でないとき として if 分で、制御すべきでしょうか?(Whileなどで無限ループしたなかにif を配置) なにかもっとシンプルな方法ないでしょうか?
157 名前:login:Penguin mailto:sage [2009/07/20(月) 22:49:46 ID:ODKc/pMj] ああ、改めて見たら >>154 にレスしてるみたいに見えるな。
158 名前:login:Penguin mailto:sage [2009/07/20(月) 23:01:27 ID:iUvo3V7o] >>156 以下でできるかも 変数=`pgrep プロセスA` [ -n $変数 ] && date >> /home/log
159 名前:login:Penguin [2009/07/21(火) 10:43:13 ID:BO90gQOW] >>156 変数に入れる必要あるの? pgrep processA >/dev/null && date >> /home/log
160 名前:login:Penguin mailto:sage [2009/07/21(火) 23:11:34 ID:xGYTho7h] pidof とか使わんの?
161 名前:login:Penguin mailto:sage [2009/07/23(木) 17:30:46 ID:WFggSjQ8] ここで聞くべきか若干怪しいかと思うのですが、 sudo 経由した場合のみ、特定コマンド(たとえばps)を 一般ユーザ権限で利用させる方法ってないでしょうか? ps をパーミッション700にしておき、 root以外は使用できなくなる状態へしたいのですが、 sudo 経由した場合のみ使わせたいと思ってます。
162 名前:login:Penguin mailto:sage [2009/07/23(木) 18:06:19 ID:P+5ig7CA] くだ質池
163 名前:login:Penguin [2009/07/26(日) 07:44:48 ID:FW8uMlXc] ttaファイルを再生するスクリプトを作ってみました。 一応ちゃんと動くのですが、、、 バックグラウンドで動かしているttaencがエラーで死んだ場合に (単純な例では$1のファイルがない、とか) playコマンドが入力を待ち続けてしまうのです。 何かよい方法ないですか? #! /bin/sh -e WAV=`mktemp -t $$.wav` rm -f $WAV mknod $WAV p trap "rm -f $WAV" 0 ttaenc -o $WAV "$1" > /dev/null 2>&1 & play -q $WAV > /dev/null 2>&1
164 名前:login:Penguin mailto:sage [2009/07/26(日) 08:26:44 ID:BwoYtVgZ] >>163 ifで$?を判定すればいいんじゃないかな
165 名前:login:Penguin mailto:sage [2009/07/26(日) 09:00:23 ID:VmbGTICm] >>164 コア吐いたらダメっしょ。 trapしたほうがよくね?
166 名前:163 mailto:sage [2009/07/26(日) 09:07:33 ID:FW8uMlXc] >>163 自己レス playとttaencを両方ともバックグラウンドにし、 ttaencをwaitすることでエラーを捕捉、必要ならplayを停止。 これで解決しました。 #! /bin/sh -e WAV=`mktemp -t $$.wav` rm -f $WAV mknod $WAV p trap "rm -f $WAV" 0 ttaenc -o $WAV "$1" & DECODE_PID=$! play -q $WAV > /dev/null 2>&1 & PLAY_PID=$! exec 2> /dev/null wait $DECODE_PID || (kill -10 $PLAY_PID) >>164 $?について調べたのですが、バックグラウンドプロセスには効かないようです。 でも、調べる過程で解決の発想を得られました。ありがとう!
167 名前:login:Penguin [2009/07/30(木) 18:32:54 ID:8kF2jsLv] シェルスクリプト初めて数日ですが、ファイルの書き換えやなんかは検索すると出てくるんですが 選択肢形式の作り方がいまいちわかりません。 lokkitやsystem-config-networkみたいな選択形式を作りたいのですが 何かヒントをいただけないでしょうか?
168 名前:login:Penguin mailto:sage [2009/07/30(木) 18:37:48 ID:3Jkdy3aR] >>167 whiptail とか?
169 名前:login:Penguin mailto:sage [2009/07/30(木) 19:33:48 ID:1ZQVAEXh] dialog
170 名前:login:Penguin mailto:sage [2009/07/30(木) 19:43:13 ID:fH5JNdXj] $ lokkit bash: lokkit: command not found $ system-config-network bash: system-config-network: command not found $ whiptail bash: whiptail: command not found はう?? $ xmessage -button 'nipple,ass' 'which?'
171 名前:login:Penguin mailto:sage [2009/07/30(木) 20:01:21 ID:3Jkdy3aR] >>170 何が言いたいんだ?
172 名前:167 [2009/07/30(木) 20:08:32 ID:8kF2jsLv] >>168-169 ありがとうございます。 両方とも試してみましたがどちらもライブラリを追加しないと機能しないっぽいですね。 はじめて数日の私にはなかなか敷居が高いようです。 うーん・・・今さわってる環境でライブラリ追加させてもらえると大丈夫だと思いますが ダメって言われたらアウトっぽいですね・・・。
173 名前:login:Penguin mailto:sage [2009/07/30(木) 20:10:01 ID:3Jkdy3aR] 引き数で渡すとかじゃだめなん?
174 名前:167 [2009/07/30(木) 20:21:04 ID:8kF2jsLv] 引数で渡してもいいんですが 項目が少し多いので引数を渡すまでに選択肢で絞りたかったというのがあります。 関連ライブラリがいまいちまだ特定できないですが、道のりは遠そうです・・・
175 名前:login:Penguin mailto:sage [2009/07/30(木) 20:37:05 ID:w4YhvOQC] >>172 両方とも試してみたって、どうやって試したん?
176 名前:login:Penguin mailto:sage [2009/07/30(木) 21:09:43 ID:neY1QnOU] シェルスクリプトに詳しいみなさんに聞きたいのですが、 ユーザ追加して第三者に利用させるときに これ禁止させておけばよい、といったコマンドありますか? 例えば find などです。
177 名前:login:Penguin mailto:sage [2009/07/30(木) 21:17:05 ID:otd/7QOf] >>176 シェルの内部コマンドだけで相当できるから考えるだけ無駄。
178 名前:login:Penguin mailto:sage [2009/07/30(木) 21:17:21 ID:uCTsIRNg] なんでfindはだめなの? TOMOYO入れたら?
179 名前:login:Penguin mailto:sage [2009/07/30(木) 21:25:06 ID:wVBjHvC9] >>174 コマンドラインに収まらなくてもいいのなら、zenityは? echo -e "選択肢1\n選択肢2\n選択肢3" | zenity --list --column="項目"
180 名前:login:Penguin mailto:sage [2009/07/30(木) 23:35:05 ID:zSR6vlNV] >>174 bash 限定でいいなら、 select i in "Yes" "No" "Cancel"; do [ -n "$i" ] && break done case "$i" in Yes) echo "$i, we can.";; No) echo "$i, it's so hard.";; Cancel) echo "...";; esac
181 名前:login:Penguin mailto:sage [2009/07/31(金) 00:19:11 ID:eB5hWQQH] $(ls) と `ls` は同じと考えていいの?
182 名前:login:Penguin mailto:sage [2009/07/31(金) 01:07:21 ID:dqFrtp13] よくない
183 名前:login:Penguin mailto:sage [2009/07/31(金) 08:21:07 ID:Q0h6j6GB] 同じじゃないのか?
184 名前:174 [2009/07/31(金) 10:38:52 ID:unqMPfm1] >>179 zenityもcommand not foundって言われてしまったので入ってないようです。 ですが選択肢としていろいろと勉強になりました。 ありがとうございます。 >>180 サンプルありがとうございます。 大変勉強になりました。 bash限定ならこのあたりが限界っぽいですね。せめて項目の文字を色分け出来るくらいはしたかったですが モジュール追加出来ないからって事で先方にはあきらめてもらうようにします。
185 名前:login:Penguin mailto:sage [2009/07/31(金) 10:47:53 ID:dFOhVUdW] >>182 どう違うの?