107

実行中にシェル スクリプトを編集して、その変更を実行中のスクリプトに反映させることはできますか?

私が持っているcshスクリプトの特定のケースに興味があります.バッチはさまざまなビルドフレーバーを実行し、一晩中実行されます. 操作中に何かが発生した場合は、コマンドを追加するか、実行されていないコマンドをコメントアウトしたいと思います。

不可能な場合、これを可能にするシェルまたはバッチメカニズムはありますか?

Of course I've tried it, but it will be hours before I see if it worked or not, and I'm curious about what's happening or not happening behind the scenes.

4

11 に答える 11

58

少なくとも私の環境では bash に影響しますが、非常不快な方法です。これらのコードを参照してください。最初a.sh

#!/bin/sh

echo "First echo"
read y

echo "$y"

echo "That's all."

b.sh:

#!/bin/sh

echo "First echo"
read y

echo "Inserted"

echo "$y"

# echo "That's all."

行う

$ cp a.sh run.sh
$ ./run.sh
$ # open another terminal
$ cp b.sh run.sh  # while 'read' is in effect
$ # Then type "hello."

私の場合、出力は常に次のようになります。

こんにちは
こんにちは
それで全部です。
それで全部です。

(もちろん、自動化する方がはるかに優れていますが、上記の例は読みやすいです。)

[編集] これは予測不可能であり、したがって危険です。最善の回避策は、 ここで説明されているよう に、すべてを中括弧で囲み、右中括弧の前に "exit" を配置することです。落とし穴を避けるために、リンクされた回答をよく読んでください。

[追加] 正確な動作は、1 つの余分な改行に依存し、おそらく Unix フレーバー、ファイルシステムなどにも依存します。単にいくつかの影響を確認したい場合は、b.sh の前および/または後に「echo foo/bar」を追加するだけです「読む」行。

于 2011-06-10T07:44:57.097 に答える
18

スクリプトを関数に分割すると、関数が呼び出されるたびsourceに、別のファイルからスクリプトが呼び出されます。その後、いつでもファイルを編集でき、実行中のスクリプトは、次にソースが取得されたときに変更を取得します。

foo() {
  source foo.sh
}
foo
于 2010-08-03T18:59:03.933 に答える
2

csh はインストールしていませんが、

#!/bin/sh
echo Waiting...
sleep 60
echo Change didn't happen

それを実行し、最後の行をすばやく編集して読み取ります

echo Change happened

出力は

Waiting...
/home/dave/tmp/change.sh: 4: Syntax error: Unterminated quoted string

うーん。

シェル スクリプトの編集は、再実行するまで反映されないと思います。

于 2010-08-03T15:57:08.500 に答える
1

If this is all in a single script, then no it will not work. However, if you set it up as a driver script calling sub-scripts, then you might be able to change a sub-script before it's called, or before it's called again if you're looping, and in that case I believe those changes would be reflected in the execution.

于 2010-08-03T16:10:00.873 に答える
0

私は聞いていません...しかし、いくつかの間接参照についてはどうですか?

BatchRunner.sh

Command1.sh
Command2.sh

Command1.sh

runSomething

Command2.sh

runSomethingElse

次に、BatchRunnerが正しく機能する前に、各コマンドファイルの内容を編集できるはずです。

また

よりクリーンなバージョンでは、BatchRunnerは一度に1行連続して実行される単一のファイルを検索します。次に、最初のファイルが正しく実行されている間に、この2番目のファイルを編集できるはずです。

于 2010-08-03T16:05:22.383 に答える
-5

通常、実行中にスクリプトを編集することは一般的ではありません。あなたがしなければならないのは、あなたの操作をコントロールチェックすることだけです。if/else ステートメントを使用して条件を確認します。何かが失敗した場合はこれを行い、そうでない場合はそれを行います。それが行く方法です。

于 2010-08-03T15:57:30.247 に答える
-86

スクリプトはそのようには機能しません。実行中のコピーは、編集中のソース ファイルから独立しています。次にスクリプトが実行されるときは、最後に保存されたソース ファイルのバージョンに基づいて実行されます。

このスクリプトを複数のファイルに分割し、個別に実行することをお勧めします。これにより、失敗するまでの実行時間が短縮されます。(つまり、バッチを 1 つのビルド フレーバー スクリプトに分割し、それぞれを個別に実行して、どれが問題を引き起こしているかを確認します)。

于 2010-08-03T15:54:28.787 に答える