Saya sedang menulis skrip untuk menyalin beberapa file di sekitar, dan mencoba menggunakan shopt -s dotglob
untuk mengaktifkan cp untuk menyalin dotfiles suka .jshint
dan yang lainnya.
Saya bisa menjalankan shopt -s dotglob
langsung di bash prompt tanpa kesalahan. Namun, menjalankan skrip melempar kesalahan:
script.sh: 81: script.sh: shopt: not found
Saya menjalankan skrip ini di bash shell, dengan header shebang #!/usr/bin/env bash
. Baris kesalahan:
shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/
Tidak menemukan sesuatu yang bermanfaat di google, ada ide apa masalahnya di sini?
#!/bin/bash
tajuk yang lebih sederhana ?shopt
adalah bash builtin,sh
tidak adashopt
, dan pesan kesalahan terlihat seperti pesan kesalahandash
. Jadi, kemungkinan besar kesalahan di sini adalah menjalankan skrip bashsh
(yangdash
secara default di Ubuntu ). Meskipunsh
symlink adalahbash
, menjalankan skrip bash dengansh
tidak sama dengan menjalankannyabash
.Jawaban:
Untuk membentuk jawaban dari komentar:
Banyak orang yang tidak terbiasa menjalankan skrip dengan
sh
alih - alihbash
. Ini adalah praktik yang baik jika portabilitas menjadi perhatian, tetapi banyak orang melakukannya karena mereka menyalin sesuatu yang mereka lihat tanpa memahaminya.Kecuali jika skrip Anda perlu dijalankan pada sistem Linux non-desktop (mis. Menjalankan skrip shell pada perangkat Android sangat berbeda), saya sarankan menggunakan garis Bash shebang di awal:
Baris ini, ketika baris pertama dalam skrip, menentukan penerjemah mana (shell seperti bash atau sh, Python, dll.) Dipanggil untuk menjalankannya. Jika Anda menggunakan baris di atas, Anda akan mendapatkan perilaku yang sama (hampir) seperti yang Anda lakukan dari baris perintah, dengan asumsi Anda menggunakan shell default. Jika karena alasan portabilitas atau preferensi Anda menggunakan jalur shebang yang berbeda, perlu diketahui bahwa Anda harus berkonsultasi dengan dokumentasi untuk shell yang telah Anda referensikan, bahkan jika shell yang Anda referensikan adalah symlink ke Bash.
sumber
#!/usr/bin/env bash
karena merupakan tugas env untuk mengetahui bash mana yang harus digunakan (jika Anda telah menambalnya, misalnya).Anda harus keluar dari zsh dan mengaktifkan bash seperti yang ditunjukkan:
Jalankan perintah
Setelah itu Anda dapat reaktif zsh:
Semoga itu bisa membantu
sumber
~/.basrc
dijalankan oleh bash saat startup dalam kasus ini sehingga tidak perlu menyebutnya secara eksplisit, 3) di mana perintah OP dijalankan? dan 4) menggunakanexec
dua kali membuat Anda kehilangan perubahan lingkungan yang telah Anda lakukan di shell zsh awal, yang tidak akan terjadi jika Anda hanya akan memanggil bash.