web-dev-qa-db-ja.com

環境変数からコマンドを実行して、内部の末尾のアンパサンドを機能させるにはどうすればよいですか?

Prompt-to-runと呼ぶこの小さなスクリプトがあります。

Prompt_acc=''

read -p 'run `'"$1"'`
' -i "$1" -e Prompt_acc

$Prompt_acc

コマンドを入力するスクリプトを作成できますが、スクリプト全体を停止することなく、編集したり、実行をスキップしたりすることができます。

long-running-scriptを呼び出すことができる別のスクリプトがあります。実行したいのは自分のターミナルで実行したいのです。入力を受け取った後、そこに座ってより多くのテキストを継続的に出力するからです。いくつかのPrompt-to-run呼び出しを含むスクリプトから実行を開始できるようにしてから、次のPrompt-to-run呼び出しを実行できるように元の端末に戻ります。

long-running-scriptを内部で新しい端末を開くようにしたので、手動で入力します

long-running-script &

実行したいプログラムを起動し、元の端末でプロンプトを返します。ただし、Prompt-to-run 'long-running-script &'はターミナルプロンプトを返しません。これは、コマンドが環境変数$Prompt_acc内から実行されているため、希望どおりに解釈されていないためだと思います。

Prompt-to-runまたはlong-running-scriptの一方または両方を変更して、必要なものを取得する方法はありますか?

4
Ryan1729

変数の展開で実行される唯一の処理は、ワード分割とワイルドカード展開です。他のシェルメタ文字は無視されます。

コマンドを入力したかのように変数の内容を実行したい場合は、evalコマンドを使用します。

eval "$Prompt_acc"

これにより、引用符処理、;で区切られた複数のコマンドの実行、&によるバックグラウンド、I/Oリダイレクトなど、コマンドの通常のシェル処理がすべて実行されます。

ところで、Prompt_accは通常のシェル変数であり、環境変数ではありません。 exportコマンドは、環境に変数を配置する方法です。

1
Barmar

あなたが正しいです、理由はそれが環境変数の内部から実行されているからです。したがって、&を含む後続のテキスト全体が、long-running-scriptへの引数として渡されます。

それを回避する方法は、$Prompt_acc &ファイルに$Prompt_accではなくPrompt-to-runを呼び出すことです。このように、スクリプトを実行したくない場合は、&が邪魔になりません。

2
Alex