Menjalankan skrip bash dari shell zsh

11

Saya mengalami masalah menjalankan skrip bash di zsh. Script mirip dengan yang di bawah ini dan seharusnya dijalankan di bawah bash:

#!/bin/bash
echo "<235234>"  | egrep -oe [0-9]+

Namun, shell saya secara default aktif zsh, jadi untuk menjalankan skrip di atas apa yang saya lakukan adalah mengetik /bin/bashpada zshprompt saya , dan kemudian saya jalankan . script.sh.

Namun, ini menghasilkan kesalahan, dan saya mendapatkan:

zsh: no matches found: [0-9]+

(Saya harus mendapatkan 235234sebagai gantinya).

Pada titik ini saya bingung dan memiliki pertanyaan-pertanyaan berikut:

  1. Jika saya masuk bash, mengapa saya mendapatkan kesalahan yang dilaporkan zsh?
  2. Mengapa egrepregexp gagal? Ekspresi reguler terlihat benar bagi saya.

Catatan: Jika itu penting, saya tidak seharusnya memodifikasi skrip (skrip dibagikan oleh banyak pengguna dan kami tidak seharusnya melakukan perubahan padanya).

Terima kasih

Amelio Vazquez-Reina
sumber

Jawaban:

19

Jika skrip dimulai dengan benar #!/bin/bash(Anda tidak dapat memiliki komentar lain sebelum itu), Anda cukup menjalankannya dengan mengetik /path/to/script.sh, tanpa itu .di awal. Ini .adalah pernyataan sertakan, artinya “jalankan konten file ini seolah-olah telah diketik di sini di baris perintah” (ini disebut “sumber” di jargon shell unix).

Menjalankan bash dan sumber skrip harus berhasil. Saya menduga bahwa karena Anda memiliki bash secara otomatis dimulai dalam beberapa keadaan, tetapi Anda lebih suka zsh, Anda telah mengatur bash untuk secara otomatis beralih ke zsh - mungkin dengan exec zshAnda ~/.bashrc. Jangan lakukan itu: sebaliknya Anda harus beralih ke zsh di file yang dieksekusi ketika Anda masuk, yaitu ~/.profile, dan biarkan .bashrcsaja. Untuk zshdieksekusi di terminal, setel SHELLvariabel lingkungan:

# in ~/.profile
export SHELL=/bin/zsh
if [ -t 1 ]; then exec $SHELL; fi

Sangat disayangkan bahwa Anda tidak dapat memodifikasi skrip, karena itu buggy. Tanda kurung harus dikutip, bahkan dalam bash. Jika ada file yang dipanggil 3+dalam direktori saat ini, panggilan untuk egrepakan mencari satu atau lebih kemunculan digit 3alih-alih urutan angka acak. Jika ada file yang dipanggil 3+dan file yang dipanggil 4+, panggilan untuk egrepakan mencari huruf 3s dalam file tersebut 4+. Di sini, perbedaan antara bash dan zsh hanya berlaku ketika tidak ada file yang cocok dengan pola yang disediakan: bash menjalankan perintah dengan diam-diam dengan pola yang tidak disubstitusi, sedangkan zsh memberi sinyal kesalahan (secara default).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih @Guilles. Ini sangat membantu. Yang aneh adalah bahwa saya tidak punya exec zshdi saya ~/.bashrc, atau di saya ~/.profile(saya bahkan tidak punya .profiledi direktori rumah saya). Saya tidak ingat bagaimana saya berhasil membuat zshshell default saya. Juga, maaf atas kebingungannya, tetapi baris pertama pada skrip saya adalah shebang #!/bin/bash. Dengan ini, saya masih tidak tahu mengapa sumber file zshtidak berfungsi (jika Anda memiliki pemikiran tentang hal ini, beri tahu saya). Dalam kedua kasus, saya akan menghubungi administrator untuk memperbarui skrip untuk menambahkan tanda kutip ke regexp.
Amelio Vazquez-Reina
Masalah dengan sumbernya di zsh adalah argumen kedua egrep.
Ignacio Vazquez-Abrams