GNU/Linux >> Linux の 問題 >  >> Linux

実行中にシェルスクリプトを編集する

する 少なくとも私の環境では攻撃しますが、非常に不快な方法で影響を与えます .これらのコードを参照してください。最初の 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."

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

hello
hello
That's all.
That's all.

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

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

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


これを試してください... bash-is-odd.sh というファイルを作成してください :

#!/bin/bash
echo "echo yes i do odd things" >> bash-is-odd.sh

これは、実際に bash がスクリプトを「そのまま」解釈していることを示しています。実際、実行時間の長いスクリプトを編集すると、ランダムな文字が挿入されるなど、予測できない結果が生じます。なぜですか? bash は最後のバイト位置から読み取るため、編集すると現在読み取られている文字の位置がシフトします。

つまり、この「機能」のために、Bashは非常に安全ではありません。 svn と rsync デフォルトでは結果を「マージ」するため、bashスクリプトで使用すると特に厄介です...その場で編集します。 rsync これを修正するモードがあります。 svn と git にはありません。

解決策を提示します。 /bin/bashx というファイルを作成します :

#!/bin/bash
source "$1"

#!/bin/bashx を使用するようになりました スクリプトを常に bashx で実行します bash の代わりに .これで問題が修正されます - 安全に rsync できます

@AF7 によって提案/テストされた代替 (インライン) ソリューション:

{
   # your script
} 
exit $?

中括弧は編集から保護し、終了は追加から保護します。もちろん、bash に -w のようなオプションがあれば、私たち全員がずっとうまくいくでしょう。 (ファイル全体)、またはこれを行った何か。


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

foo() {
  source foo.sh
}
foo

Linux
  1. シェルスクリプトでタイムアウトしますか?

  2. どのシェルで実行していますか?

  3. シェルスクリプトの予期しない動作?

  1. スクリプトが実行されていることを確認しますか?

  2. 関数とパラメータを変数として持つシェルスクリプト?

  3. 一致する`"‘を探しているときに予期しないEof – Bashスクリプト?

  1. シェルスクリプトを使用して HTML メールを送信する

  2. シェル スクリプトを使用してデータベース接続を確認する

  3. Linux シェルスクリプトからメールを送信する