2016-09-18 14 views
2

source scriptまたは. scriptのようなbashスクリプトをコマンドラインから実行すると、スクリプト内のすべての行がbashの "ソースバッファ"に追加され、現在のコマンドシェルだけが続行されます。実行を停止することは不可能です(シェルを中断することは別として)、ctrl-Cを使うと現在のコマンドだけが中断されますが、次のコマンドが実行されます。bash "ソースバッファ"の消去

このバッファはどこにありますか?それをクリアすることは可能でしょうか?

スクリプト例:「ソースのスクリプト」を行わした後

echo A 
sleep 10 
echo B 
sleep 10 
echo C 
sleep 10 
echo D 

、それは「提出」された後の任意のさらなる実行を停止する方法はありますか?

+0

あなたの質問にスクリプトを追加してください。 – Cyrus

+2

なぜ 'source'を使用していますか?これらの問題がある場合は、おそらく別のプロセスとして実行する必要があります。 – cdarke

+0

スクリプトを実行した後、必要に応じてシェル内の変数を使用できるという便利さから、ソースを使用します。 問題があるわけではありませんが、私はこれに興味があります。私はreturn文が出るたびに残りのバッファは破棄されることを知っていますが、上記のようなスクリプトを提供していて、同じシェルに留まっている間に停止したい場合はどうでしょうか(現在の環境と変数)。 – PePa

答えて

0

私の知る限りでは、ソースバッファのようなものはありませんので、消去するものはありません。 sourceコマンドは、現在の環境(つまり、子プロセスではない)の引数にあるコマンドを実行するだけです。

sourceの取り扱いには特にシグナルの取り扱いには何もありません。あなたのシェルスクリプトはControl-Cを無視するように設定されていますか?犯人を見つけるために-xでスクリプトを実行することをお勧めします。

+0

私は公式の名前は(bashのmanページによると)コールスタックか実行コールスタック(grepの 'call stack'のbash manページ)だと思います。スクリプトをソース化するとき(grep bashのmanページ 'source'の場合)、その中のコマンドは現在のシェルで読み込まれて実行されます。 スクリプトの途中で行「chmod -r script」を追加しようとしましたが、実行を停止しなかったので、コマンドがバッファに読み込まれて実行されると思います。 – PePa

+0

コールスタックは、例えば、シェル関数の呼び出しやスクリプトのソースとして使用されることは間違いありません。しかし、これは実装の詳細であり、呼び出しをキャンセルできないという問題とは関係ありません。これを確認するには、 'echo x;という行を含む' sub.sh'という2つのファイルを設定します。 sleep 600; echo y'、および 'main.sh'に' source sub.sh;という行が含まれています。エコーz '。これを 'bash main.sh'で呼び出すと、* x *を出力してからスリープすることがわかります。この時点でControl-Cで中止すると、すぐに終了し、それ以上の出力はありません。 – user1934428

+0

これは、sub.shのすべてのコマンドをセミコロンで同じ行に置くからです。それぞれを別の行に置くと、yとzが印刷されます。しかしそれは面白いです...あなたがsleep 600をecho xと同じ行に置いた場合、sleep 600を置いたときと同じように停止します。エコーy これが実際にこのように起こっているのだろうかと思います。 – PePa