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