出産前後の痔にはご注意!

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

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

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

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

このQ&Aに関連する最新のQ&A

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で質問しましょう!

このQ&Aと関連する良く見られている質問

Q[シェルスクリプト内で bashコマンド後のコマンドが実行されない]

[シェルスクリプト内で bashコマンド後のコマンドが実行されない]
以下の様にシェルスクリプトを記述するとコマンド2が実行されません。

#! /bin/sh
コマンド1
bash
コマンド2

bash環境でコマンド2を実行させるにはどうしたら良いのでしょうか?

Aベストアンサー

> bash
ここで、bashが対話モードで起動してプロンプトを表示するので、コマンド2を実行しないで終了しているように見えるだけです。
スクリプト実行前、スクリプト中のコマンド1の前、「実行後」(正確には「実行中」ですが)で ps コマンドを実行して、動いているプロセスの確認してください。スクリプトが実行中で、bashが増えているのが確認できると思います。
exit と入力してbashを終了されば続きが実行されます

>bash環境でコマンド2を実行させるにはどうしたら良いのでしょうか?

#-cオプションを使う
bash -c コマンド2

# コマンド2がbashのスクリプトなら-cは不要
bash コマンド2

# 標準入力を使う
echo 'コマンド 2' | bash

# 標準入力を使う:複数あるならヒアドキュメントを使う
bash << EOCOMMAND
コマンド2
EOCOMMAND

# shでやらなければならない理由がないのなら
# bashで動作するスクリプトにしてしまう

#!/bin/bash
#↑パスは実際のにあわせること

> bash
ここで、bashが対話モードで起動してプロンプトを表示するので、コマンド2を実行しないで終了しているように見えるだけです。
スクリプト実行前、スクリプト中のコマンド1の前、「実行後」(正確には「実行中」ですが)で ps コマンドを実行して、動いているプロセスの確認してください。スクリプトが実行中で、bashが増えているのが確認できると思います。
exit と入力してbashを終了されば続きが実行されます

>bash環境でコマンド2を実行させるにはどうしたら良いのでしょうか?

#-cオプションを...続きを読む


人気Q&Aランキング