GNU/Linux >> Belajar Linux >  >> Linux

Edit skrip shell saat sedang berjalan

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

Linux
  1. Memeriksa Skrip Apakah Berjalan?

  2. Script Shell Dengan Fungsi Dan Parameter Sebagai Variabel?

  3. Script Shell Hang Pada Perintah Mail?

  1. Waktu Habis Dalam Skrip Shell?

  2. Menjalankan skrip shell secara paralel

  3. Direktori skrip Shell saat ini?

  1. Shell mana yang saya jalankan?

  2. Perilaku Tak Terduga Dari Skrip Shell?

  3. Shell Script Wrapper Untuk Mencegah Menjalankan Perintah Tanpa Argumen?