ya mempengaruhi, setidaknya bash di lingkungan saya, tetapi dengan cara yang sangat tidak menyenangkan . Lihat kode-kode ini. a.sh
pertama :
#!/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."
Lakukan
$ cp a.sh run.sh
$ ./run.sh
$ # open another terminal
$ cp b.sh run.sh # while 'read' is in effect
$ # Then type "hello."
Dalam kasus saya, hasilnya selalu:
hello hello That's all. That's all.
(Tentu saja jauh lebih baik untuk mengotomatiskannya, tetapi contoh di atas dapat dibaca.)
[sunting] Ini tidak dapat diprediksi, sehingga berbahaya. Solusi terbaik adalah , seperti yang dijelaskan di sini masukkan semua ke dalam kurung kurawal, dan sebelum kurung tutup, masukkan "keluar" . Baca jawaban tertaut dengan baik untuk menghindari perangkap.
[ditambahkan] Perilaku persisnya bergantung pada satu baris tambahan, dan mungkin juga pada varian Unix, sistem file, dll. Jika Anda hanya ingin melihat beberapa pengaruh, cukup tambahkan "echo foo/bar" ke b.sh sebelum dan/atau sesudah baris "baca".
Coba ini... buat file bernama bash-is-odd.sh
:
#!/bin/bash
echo "echo yes i do odd things" >> bash-is-odd.sh
Itu menunjukkan bahwa bash memang menafsirkan skrip "saat Anda pergi". Memang, mengedit skrip yang berjalan lama memiliki hasil yang tidak dapat diprediksi, memasukkan karakter acak, dll. Mengapa? Karena bash membaca dari posisi byte terakhir, jadi pengeditan menggeser lokasi karakter yang sedang dibaca.
Singkatnya, Bash sangat, sangat tidak aman karena "fitur" ini. svn dan rsync
ketika digunakan dengan skrip bash sangat meresahkan, karena secara default mereka "menggabungkan" hasilnya ... mengedit di tempat. rsync
memiliki mode yang memperbaiki ini. svn dan git tidak.
saya hadirkan solusinya. Buat file bernama /bin/bashx
:
#!/bin/bash
source "$1"
Sekarang gunakan #!/bin/bashx
pada skrip Anda dan selalu jalankan dengan bashx
bukannya bash
. Ini memperbaiki masalah - Anda dapat dengan aman rsync
skrip Anda.
Solusi alternatif (in-line) diusulkan/diuji oleh @AF7:
{
# your script
}
exit $?
Kurung kurawal melindungi dari pengeditan, dan keluar melindungi dari penambahan. Tentu saja, kita semua akan jauh lebih baik jika bash memiliki opsi, seperti -w
(seluruh file), atau sesuatu yang melakukan ini.
Pisahkan skrip Anda menjadi beberapa fungsi, dan setiap kali sebuah fungsi dipanggil, Anda source
dari file terpisah. Kemudian Anda dapat mengedit file kapan saja dan skrip Anda yang sedang berjalan akan mengambil perubahan saat sumbernya diambil lagi.
foo() {
source foo.sh
}
foo