アプリ版:「スタンプのみでお礼する」機能のリリースについて

パイプを含む文字列が入った変数をシェルコマンドとして実行する方法がありましたら
教えてください。

Linux環境で、bashを使って定期的にモニタリングするスクリプトを書こうとしています。
スクリプトの引数で実行するモニタリングコマンドを変えれるようにしたいのですが、
パイプが入っているとうまくいきません。

下記のようなスクリプトで、引数に "ps -ef | grep pty" と入れたら、定期的に
そのようなコマンドを実行できるようにできますでしょうか?
(引数指定時に、きちんとクォーテーションで全体を囲んで、パイプが評価されない
ようにしてもダメでした。)

変数として入ったコマンドを実行するときに、パイプがシングルクォーテーションで
囲まれて "ps -ef '|' grep pty" のようになってしまい、パイプとして実行時に認識
されないようです。

bashシェルで設けてる制約でしょうか?回避策などありますでしょうか?


<<スクリプト poll.sh>>
##
# Defs
export RUNCMD='finger'
export INTERVAL=10

##
# Getopt
while getopts "t:" OPT; do
case ${OPT} in
t) INTERVAL=${OPTARG};;
esac
done
shift $((OPTIND-1))
[ ${#} -gt 0 ] && RUNCMD="${*}"

##
# Main part

while :; do (set -x; ${RUNCMD}; sleep ${INTERVAL}); done

A 回答 (2件)

while :; do (set -x; eval "${RUNCMD}"; sleep ${INTERVAL}); done



evalは引数の内容をコマンドとみなして実行する組み込みコマンドです。
evalが実行された時点でダブルクォーテーションで括られたシェル変数が展開されるため、
RUNCMD='ps -ef | grep pty'なら、実際に実行されるコマンドは

ps -ef | grep pty

となり、期待通りの動作をするのではないでしょうか?

$ set -x
$ RUNCMD='ps -ef | grep pty'
+ RUNCMD='ps -ef | grep pty'
$ eval "$RUNCMD"
+ eval 'ps -ef | grep pty'
++ grep pty
++ ps -ef
test   32706 32559 0 10:12 pts/2  00:00:00 grep pty
    • good
    • 2
この回答へのお礼

ありがとうございます。
evalはシェル組み込みコマンドってのもいいですね。
こちらの提案を採用させていただきます。

お礼日時:2012/06/09 00:11

このスクリプトなら、


while :; do (set -x; sh -c ${RUNCMD}; sleep ${INTERVAL}); done
と、sh(またはbash)のコマンドとして実行させればよさそう
    • good
    • 0
この回答へのお礼

ありがとうございます。shコマンドの引数にそういうのがあるのを完全に忘れてました。

お礼日時:2012/06/09 00:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!