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
の一方または両方を変更して、必要なものを取得する方法はありますか?
変数の展開で実行される唯一の処理は、ワード分割とワイルドカード展開です。他のシェルメタ文字は無視されます。
コマンドを入力したかのように変数の内容を実行したい場合は、eval
コマンドを使用します。
eval "$Prompt_acc"
これにより、引用符処理、;
で区切られた複数のコマンドの実行、&
によるバックグラウンド、I/Oリダイレクトなど、コマンドの通常のシェル処理がすべて実行されます。
ところで、Prompt_acc
は通常のシェル変数であり、環境変数ではありません。 export
コマンドは、環境に変数を配置する方法です。
あなたが正しいです、理由はそれが環境変数の内部から実行されているからです。したがって、&
を含む後続のテキスト全体が、long-running-script
への引数として渡されます。
それを回避する方法は、$Prompt_acc &
ファイルに$Prompt_acc
ではなくPrompt-to-run
を呼び出すことです。このように、スクリプトを実行したくない場合は、&
が邪魔になりません。