Jika skrip Anda mulai dengan baris, skrip #!/bin/bashtersebut masih akan dijalankan menggunakan bash, bahkan jika shell default Anda adalah zsh.
Saya telah menemukan sintaks zsh sangat dekat dengan bash, dan saya tidak memperhatikan jika benar-benar ada beberapa ketidakcocokan. Saya beralih 6 tahun yang lalu dari bash ke zsh mulus.
Tidak ada Script pribadi saya menambahkan referensi yang tepat untuk bash dan saya telah menemukan .zshrc yang baik untuk memulai. Zsh dan bash cukup mirip sehingga saya tidak benar-benar merasa sulit.
Huygens
4
dapatkah Anda mencantumkan .zshrc:)
neaumusic
Tetapi apakah baris #!/bin/bashtersebut akan diabaikan jika menjalankan file skrip suka source ./script.sh?
LCB
3
Hardg-coding jalur ke shell adalah saran yang buruk, bahkan jika itu sering dilakukan. Anda harus menggunakannya #!/usr/bin/env bashsebagai gantinya, terutama pada macOS, di mana bash default sudah sangat usang dan versi baru hampir selalu diinstal ke jalur yang berbeda.
Konrad Rudolph
29
Zsh dapat menjalankan sebagian besar skrip Bourne, POSIX atau ksh88 jika Anda meletakkannya dalam mode emulasi yang tepat ( emulate shatau emulate ksh). Itu tidak mendukung semua fitur bash atau ksh93. Zsh memiliki sebagian besar fitur bash, tetapi dalam banyak kasus dengan sintaks yang berbeda.
Shell yang Anda gunakan secara interaktif tidak relevan untuk skrip apa pun yang Anda miliki. Shell yang menjalankan skrip adalah yang ditunjukkan pada baris pertama, baris shebang . Misalnya, jika skrip dimulai dengan #!/bin/bash, itu akan dieksekusi oleh bash.
Jika Anda telah menyesuaikan bash, Anda tidak akan dapat mengubah nama Anda .bashrcmenjadi .zshrc. Beberapa hal dapat dibagikan, misalnya alias dan fungsi, selama Anda tetap berpotongan dengan persimpangan antara dua shell (persimpangan dekat dengan ksh88 dan pdksh ). Hal-hal lain, seperti pengaturan prompt, fungsi penyelesaian dan sebagian besar opsi, harus sepenuhnya ditulis ulang.
Jika Anda menulis cuplikan untuk diambil orang dari .bashrcatau atau .zshrcAnda tidak ingin mempertahankan dua versi, patuhi subset umum fitur bash dan zsh, yang mencakup sebagian besar fitur pemrograman bash. Masukkan seluruh kode Anda dalam fungsi, dan letakkan baris berikut di bagian atas setiap fungsi:
if[-n "$ZSH_VERSION"];then emulate -L ksh;fi
Anda dapat menggunakan emulate shalih-alih emulate kshlebih dekat dengan sintaks sh polos, yang merupakan apa yang Anda butuhkan .profile.
Jika suatu fungsi memanggil fungsi lain, fungsi lainnya mewarisi pengaturan emulasi, jadi Anda tidak perlu meletakkan baris ini dalam fungsi internal, hanya dalam fungsi yang dipanggil oleh pengguna akhir.
Shell yang Anda gunakan tidak relevan jika Anda menjalankan skrip Anda sebagai ./my_script.sh. source my_script.shdan . my_script.shakan menjalankannya seperti shell saat ini, mengabaikan shebang apa pun.
BallpointBen
3
Jika shebang #!/bin/bashdan Anda memulai skrip sebagai ./scriptskrip akan dieksekusi oleh bash. Sama sekali tidak ada masalah di sini.
Namun, jika Anda mengeksekusi zsh ./scriptatau sumbernya . ./scriptke instance zsh yang berjalan, cukup umum bahwa sintaks bash dan zsh tidak akan cocok.
Sebagai contoh, zsh tidak membagi ekspansi parameter secara default, bash memiliki builtin bantuan, tidak ada read -p promptdi zsh (sintaksnya sangat berbeda, baca cmd \? , arrays start on 1 (not 0) in zsh,Command prompt only search for external commands in zsh, or there is no (simple) equivalent to$ {foo ^} `(huruf besar hanya karakter pertama) di zsh , antara lain, ini adalah daftar panjang (kebanyakan) kesamaan dan beberapa perbedaan .
Dalam beberapa kasus, zsh dapat diminta untuk meniru shell lainnya. Dalam beberapa kasus, tidak ada sintaksis portable yang memungkinkan untuk kedua shell (tanpa menggunakan alias atau fungsi untuk meniru solusi portabel).
Namun, zsh memiliki banyak (banyak) ekstensi yang memudahkan untuk bekerja secara interaktif. Pada saat yang sama alasan yang sangat baik untuk beralih dan masalah:
Sangat menyenangkan untuk dapat melihat opsi sintaks perintah menekan tab.
Manfaat utama lain dari zsh adalah koreksi kesalahan saat Anda membuat kesalahan ketik. Daripada hanya menampilkan kesalahan: perintah tidak ditemukan, zsh akan mencoba menafsirkan apa yang Anda coba ketik. zsh akan menerima input ini sebagai perintah yang valid.
Jawaban:
Jika skrip Anda mulai dengan baris, skrip
#!/bin/bash
tersebut masih akan dijalankan menggunakan bash, bahkan jika shell default Anda adalah zsh.Saya telah menemukan sintaks zsh sangat dekat dengan bash, dan saya tidak memperhatikan jika benar-benar ada beberapa ketidakcocokan. Saya beralih 6 tahun yang lalu dari bash ke zsh mulus.
sumber
.zshrc
:)#!/bin/bash
tersebut akan diabaikan jika menjalankan file skrip sukasource ./script.sh
?#!/usr/bin/env bash
sebagai gantinya, terutama pada macOS, di mana bash default sudah sangat usang dan versi baru hampir selalu diinstal ke jalur yang berbeda.Zsh dapat menjalankan sebagian besar skrip Bourne, POSIX atau ksh88 jika Anda meletakkannya dalam mode emulasi yang tepat (
emulate sh
atauemulate ksh
). Itu tidak mendukung semua fitur bash atau ksh93. Zsh memiliki sebagian besar fitur bash, tetapi dalam banyak kasus dengan sintaks yang berbeda.Shell yang Anda gunakan secara interaktif tidak relevan untuk skrip apa pun yang Anda miliki. Shell yang menjalankan skrip adalah yang ditunjukkan pada baris pertama, baris shebang . Misalnya, jika skrip dimulai dengan
#!/bin/bash
, itu akan dieksekusi oleh bash.Jika Anda telah menyesuaikan bash, Anda tidak akan dapat mengubah nama Anda
.bashrc
menjadi.zshrc
. Beberapa hal dapat dibagikan, misalnya alias dan fungsi, selama Anda tetap berpotongan dengan persimpangan antara dua shell (persimpangan dekat dengan ksh88 dan pdksh ). Hal-hal lain, seperti pengaturan prompt, fungsi penyelesaian dan sebagian besar opsi, harus sepenuhnya ditulis ulang.Jika Anda menulis cuplikan untuk diambil orang dari
.bashrc
atau atau.zshrc
Anda tidak ingin mempertahankan dua versi, patuhi subset umum fitur bash dan zsh, yang mencakup sebagian besar fitur pemrograman bash. Masukkan seluruh kode Anda dalam fungsi, dan letakkan baris berikut di bagian atas setiap fungsi:Anda dapat menggunakan
emulate sh
alih-alihemulate ksh
lebih dekat dengan sintaks sh polos, yang merupakan apa yang Anda butuhkan.profile
.Jika suatu fungsi memanggil fungsi lain, fungsi lainnya mewarisi pengaturan emulasi, jadi Anda tidak perlu meletakkan baris ini dalam fungsi internal, hanya dalam fungsi yang dipanggil oleh pengguna akhir.
sumber
./my_script.sh
.source my_script.sh
dan. my_script.sh
akan menjalankannya seperti shell saat ini, mengabaikan shebang apa pun.Jika shebang
#!/bin/bash
dan Anda memulai skrip sebagai./script
skrip akan dieksekusi oleh bash. Sama sekali tidak ada masalah di sini.Namun, jika Anda mengeksekusi
zsh ./script
atau sumbernya. ./script
ke instance zsh yang berjalan, cukup umum bahwa sintaks bash dan zsh tidak akan cocok.Sebagai contoh, zsh tidak membagi ekspansi parameter secara default, bash memiliki builtin bantuan, tidak ada
read -p prompt
di zsh (sintaksnya sangat berbeda, baca cmd \?, arrays start on 1 (not 0) in zsh,
Command promptonly search for external commands in zsh, or there is no (simple) equivalent to
$ {foo ^} `(huruf besar hanya karakter pertama) di zsh , antara lain, ini adalah daftar panjang (kebanyakan) kesamaan dan beberapa perbedaan .Dalam beberapa kasus, zsh dapat diminta untuk meniru shell lainnya. Dalam beberapa kasus, tidak ada sintaksis portable yang memungkinkan untuk kedua shell (tanpa menggunakan alias atau fungsi untuk meniru solusi portabel).
Namun, zsh memiliki banyak (banyak) ekstensi yang memudahkan untuk bekerja secara interaktif. Pada saat yang sama alasan yang sangat baik untuk beralih dan masalah:
Pro zsh
ls *(.)
(yang sulit dengan shell lain). Bahkan jika ketika melihat cukup dalam, jawabannya menjadi kompleks di zsh (print -rl -- *(/)
) .Con zsh:
Pada akhirnya, itu adalah pilihan Anda, dan, saya selalu suka lebih banyak pilihan.
sumber