Ada beberapa cara untuk menjalankan skrip, yang saya tahu adalah:
/path/to/script # using the path (absolute or relative)
. script # using the . (dot)
source script # using the `source` command
Apakah lebih dari ini? Apa perbedaan di antara mereka? Apakah ada situasi yang harus saya gunakan satu dan bukan yang lain?
shell-script
executable
phhehehe
sumber
sumber
Jawaban:
Cara lain adalah dengan memanggil juru bahasa dan meneruskan path ke skrip untuk itu:
Titik dan sumbernya setara. (EDIT: tidak, mereka tidak: seperti yang ditunjukkan KeithB dalam komentar atas jawaban lain, "." Hanya bekerja di shell terkait bash, di mana "source" bekerja di shell terkait bash dan csh.) Ia menjalankan skrip di -place (seolah-olah Anda menyalin dan menempelkan skrip di sana). Ini berarti bahwa setiap fungsi dan variabel non-lokal dalam skrip tetap ada. Ini juga berarti jika skrip melakukan cd ke direktori, Anda akan tetap berada di sana ketika selesai.
Cara lain menjalankan skrip akan menjalankannya dalam subkulitnya sendiri. Variabel dalam skrip tidak masih hidup saat selesai. Jika skrip mengubah direktori, maka skrip tidak memengaruhi lingkungan panggilan.
/ path / to / script dan / bin / sh script sedikit berbeda. Biasanya, sebuah skrip memiliki "shebang" di awal yang terlihat seperti ini:
Ini adalah jalan menuju juru bahasa skrip. Jika ia menentukan juru bahasa yang berbeda dari yang Anda lakukan ketika Anda menjalankannya, maka itu mungkin berperilaku berbeda (atau mungkin tidak bekerja sama sekali).
Misalnya, skrip Perl dan skrip Ruby dimulai dengan (masing-masing):
dan
Jika Anda menjalankan salah satu skrip tersebut dengan menjalankan
/bin/sh script
, maka skrip tersebut tidak akan berfungsi sama sekali.Ubuntu sebenarnya tidak menggunakan bash shell, tetapi yang sangat mirip disebut dasbor. Skrip yang memerlukan bash mungkin berfungsi sedikit salah ketika dipanggil dengan melakukan
/bin/sh script
karena Anda baru saja memanggil skrip bash menggunakan penerjemah dasbor.Perbedaan kecil lainnya antara memanggil skrip secara langsung dan meneruskan path skrip ke penerjemah adalah skrip harus ditandai dapat dieksekusi untuk menjalankannya secara langsung, tetapi tidak menjalankannya dengan meneruskan path ke interpreter.
Variasi kecil lainnya: Anda dapat mengawali salah satu cara ini untuk menjalankan skrip dengan eval, jadi, Anda dapat memilikinya
dan seterusnya. Sebenarnya tidak mengubah apa pun, tapi saya pikir saya akan memasukkannya untuk ketelitian.
sumber
sh
berhubungan dengandash
, tetapi tidak untukbash
.Kebanyakan orang men-debug skrip shell dengan menambahkan flag debuging berikut ke skrip:
Tapi ini berarti Anda harus membuka file dengan editor (dengan asumsi Anda memiliki izin untuk mengedit file), menambahkan baris seperti
set -x
, menyimpan file, lalu jalankan file. Kemudian ketika Anda selesai, Anda harus mengikuti langkah-langkah yang sama dan menghapusset -x
, dll. Ini bisa membosankan.Alih-alih melakukan semua itu, Anda dapat mengatur bendera debug pada baris perintah:
sumber
emulate sh 2>/dev/null
di bagian atas skrip shell saya. Saat dijalankan dengan zsh, ini membuatnya menjadi mode yang kompatibel dengan POSIX. Ketika dijalankan dengan cangkang lain, garis tidak memiliki efek. Maka saya dapat menjalankan skrip denganzsh -x /path/to/script
. Saya suka zsh di sini karena menyediakan jejak yang lebih baik daripada bash atau ksh.Shawn J. Goff membuat banyak poin bagus, tetapi tidak memasukkan keseluruhan cerita:
Banyak skrip sistem (seperti di init.d, di / etc dan sebagainya) memiliki shebang
#!/bin/sh
, tetapi/bin/sh
sebenarnya merupakan tautan simbolis ke shell lain - di masa lalu/bin/bash
, saat ini/bin/dash
. Tetapi ketika salah satu dari mereka dipanggil sebagai/bin/sh
, mereka berperilaku berbeda, yaitu mereka tetap pada mode kompatibilitas-POSIX.bagaimana mereka melakukan ini? Yah, mereka memeriksa bagaimana mereka dipanggil.
Bisakah shellscript itu sendiri menguji bagaimana itu dipanggil, dan melakukan hal-hal yang berbeda, tergantung pada itu? Ya bisa. Jadi cara Anda memintanya selalu dapat menyebabkan hasil yang berbeda, tetapi tentu saja itu jarang dilakukan untuk mengganggu Anda. :)
Sebagai aturan praktis: Jika Anda mempelajari shell tertentu seperti bash, dan menulis perintah dari tutorial bash, masukkan
#!/bin/bash
informasi utama, bukan#!/bin/sh
, kecuali jika disebutkan sebaliknya. Jika tidak, perintah Anda mungkin gagal. Dan jika Anda belum menulis skrip sendiri, jalankan secara langsung (./foo.sh
,bar/foo.sh
) alih-alih menebak sebuah shell (sh foo.sh
,sh bar/foo.sh
). Shebang harus memanggil shell yang tepat.Dan inilah dua jenis doa lainnya:
sumber
.
dansource
setara karena mereka tidak menelurkan subproses tetapi menjalankan perintah dalam shell saat ini. Ini penting ketika skrip mengatur variabel lingkungan atau mengubah direktori kerja saat ini.Menggunakan jalur atau memberikannya untuk
/bin/sh
membuat proses baru di mana perintah dijalankan.sumber
Saya merenungkan jika ada lebih banyak ...
.
dansource
sama. Setelah eksekusi, setiap perubahan lingkunganscript
akan disimpan. Biasanya, ini akan digunakan untuk sumber perpustakaan Bash, sehingga perpustakaan dapat digunakan kembali dalam banyak skrip yang berbeda.Juga cara yang baik untuk menyimpan direktori saat ini. Jika Anda mengubah direktori dalam skrip, itu tidak akan diterapkan di shell yang Anda jalankan skrip itu. Tetapi jika Anda sumber untuk menjalankannya, setelah skrip keluar, direktori saat ini akan disimpan.
sumber
.
hanya berfungsi di sh / bash dan shell terkait.source
juga bekerja di csh dan cangkang terkait.Apakah " userland exec " dihitung sebagai cara yang berbeda? Exec Userland memuat kode dan menjalankannya tanpa menggunakan panggilan sistem execve ().
sumber
Menjalankan skrip di shell saat ini ketika direktori tidak di jalan.
sumber
. dan sumber sedikit berbeda di zsh setidaknya (itulah yang saya gunakan) karena
Bekerja, sementara
tidak, itu perlu
sumber