Skrip shell biasanya diperlakukan seolah-olah mereka sama dengan jenis file executable lainnya, seperti binari, skrip Python, skrip Perl, atau skrip jenis apa pun. Mereka memiliki shebang di bagian atas yang mengarahkan kernel untuk menjalankannya melalui shell. Mereka diharapkan dipanggil dengan cara yang sama seperti perintah lainnya.
Dengan demikian, sebuah shell baru dimulai setiap kali script dipanggil, dan pengaturan apa pun seperti yang set -f
ada di shell yang dijalankan atau dalam instance shell lain dalam sistem tidak relevan.
Tentu saja mungkin bagi pengguna untuk sumber skrip Anda daripada menjalankannya, misalnya seperti ini:
. /path/to/your/script
atau untuk menjalankannya di shell yang memiliki pengaturan non-default seperti ini:
sh -f /path/to/your/script
tetapi itu tidak dianggap sebagai cara normal atau menjalankan skrip Anda, dan pengguna yang melakukannya harus mengharapkan apa pun yang mereka dapatkan sebagai hasilnya.
Perhatikan bahwa ada beberapa skrip yang dimaksudkan untuk dipasok, tidak dieksekusi, karena tujuannya adalah untuk hal-hal seperti mengubah cwd atau mengatur variabel lingkungan yang harus tercermin dalam lingkungan shell sumber, tetapi ini adalah minoritas dan biasanya dilakukan sebagai bagian dari protokol yang disepakati. File-file ini dapat dianggap lebih seperti "plugin" untuk sistem apa pun yang mereka harapkan bersumber, tidak sebanyak skrip independen. Sebagai contoh, file /etc/rc*.d
dengan nama yang berakhir .sh
bersumber dari subsistem skrip startup, tidak dieksekusi, dan didokumentasikan bahwa inilah yang akan terjadi jika Anda menempatkan file dengan nama seperti itu di/etc/rc*.d
dan ketika itu selesai itu dilakukan dengan sengaja. Konvensi penamaan file yang dimaksudkan bersumber alih-alih dieksekusi dengan cara ini juga diikuti di tempat lain, tetapi tidak secara universal.
Memang benar bahwa file-file yang dimaksudkan bersumber dengan cara ini harus memperhatikan pengaturan apa yang mungkin ada di lingkungan pemanggil mereka yang mungkin mempengaruhi perilaku shell, tetapi kemudian protokol yang disepakati idealnya menjanjikan lingkungan eksekusi yang dapat diprediksi.
shell_state=$(set +o)
... skrip ...eval "$shell_state"