天使と悪魔選手権

bashスクリプト内で、あるコマンドの出力内容自体がbashコマンドの羅列となっており、
これをコマンドとして実行したいです。

より正確に言うと、コマンドの出力内容は外部コマンドでなく、変数の設定文になっています。
したがって、同じシェル内で実行できないと意味がありません。

以下の方法なら間違いなくできるはずですが、
もっとスマートな方法を知りたいです。

あるコマンド > テンポラリファイル
source テンポラリファイル
rm テンポラリファイル

A 回答 (3件)

ご質問のような使い方を想定したコマンドに resize(1) があります。


https://www.x.org/archive//X11R6.8.2/doc/resize. …

これは
eval `resize`
等として使うことを想定してます。

そのまま実行すると、例えば次のように出力されます。
COLUMNS=92;
LINES=48;
export COLUMNS LINES;

バッククオートで、改行が空白になっても、 セミコロンがあるので、
COLUMNS=92; LINES=48; export COLUMNS LINES;
と、改行有りのときと同じコマンドを実行することになります。


あなたのスクリプトも同様にセミコロンを付けて出力するとか、 sed等で行末にセミコロンを追加するとかするのはどうでしょうか?

# なお、コメントはセミコロンも無効にしてしまうので、出力しないようにするか、sed等で取り除いておくのがよいでしょう
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ありません。
改行をセミコロンに置き換えてしまえば、一行ごとに解釈の必要はそもそもない。という発想には気づきませんでした。すでにreadで一行づつ読み込んでevalするという実装をしてしまいましたが、こちらのほうがスマートそうです。
改行とセミコロンの置き換えもbashなら外部コマンド使わずに完結できそうですね。

お礼日時:2016/08/27 12:36

ばっくくぉーとってつかえる?

    • good
    • 0
この回答へのお礼

やって出来ないことはなさそうですね。
テストしてみました。

bash-3.2$ COMMAND=`echo "ls -l"`
bash-3.2$ $COMMAND
total 8
-rwxr-xr-x 1 dbc staff 768 8 23 11:49 edit-log.sh
bash-3.2$

エスケープとかややこしくなりそうなので、もっと直接的にできる方法があればと思いますが。

お礼日時:2016/08/23 12:28

eval

    • good
    • 0
この回答へのお礼

ありがとうございます。

STDINから一行ずつ読んでevalに食わせる感じですかね。
もっとシンプルな方法(改行ごと一気に食べさせる方法)がないかとも思いましたが、
この方法で行きたいと思います。

以下テスト

bash-3.2$ COMMAND=`echo 'PARAM="VALUE"'`
bash-3.2$ echo $COMMAND
PARAM="VALUE"
bash-3.2$ eval "$COMMAND"
bash-3.2$ echo $PARAM
VALUE
bash-3.2$

お礼日時:2016/08/23 12:34

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


おすすめ情報