shopt bekerja di baris perintah, tidak ditemukan saat dijalankan dalam skrip

13

Saya sedang menulis skrip untuk menyalin beberapa file di sekitar, dan mencoba menggunakan shopt -s dotglob untuk mengaktifkan cp untuk menyalin dotfiles suka .jshintdan yang lainnya.

Saya bisa menjalankan shopt -s dotgloblangsung 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?

Kurtosis
sumber
Terima kasih atas pengingatnya, jawaban yang dipilih untuk semua yang saya bisa. Masih satu selain pertanyaan ini yang belum memiliki jawaban yang baik.
Kurtosis
3
Coba dengan #!/bin/bashtajuk yang lebih sederhana ?
ish
Dan versi Ubuntu yang mana?
ish
2
@izx, itu adalah jawaban yang benar, shoptadalah bash builtin, shtidak ada shopt, dan pesan kesalahan terlihat seperti pesan kesalahan dash. Jadi, kemungkinan besar kesalahan di sini adalah menjalankan skrip bash sh(yang dashsecara default di Ubuntu ). Meskipun shsymlink adalah bash, menjalankan skrip bash dengan shtidak sama dengan menjalankannya bash.
geirha

Jawaban:

23

Untuk membentuk jawaban dari komentar:

Banyak orang yang tidak terbiasa menjalankan skrip dengan shalih - alih bash. 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:

#!/bin/bash

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.

Scott Severance
sumber
5
Untuk sepenuhnya lintas-sistem, saya lebih suka: #!/usr/bin/env bash karena merupakan tugas env untuk mengetahui bash mana yang harus digunakan (jika Anda telah menambalnya, misalnya).
shrikeh
-1

Anda harus keluar dari zsh dan mengaktifkan bash seperti yang ditunjukkan:

exec bash

Jalankan perintah

source ~/.bashrc

Setelah itu Anda dapat reaktif zsh:

exec zsh

Semoga itu bisa membantu

David Kabii
sumber
Hmmm. 1) Saya tidak berpikir OP menggunakan zsh, 2) AFAIK ~/.basrcdijalankan oleh bash saat startup dalam kasus ini sehingga tidak perlu menyebutnya secara eksplisit, 3) di mana perintah OP dijalankan? dan 4) menggunakan execdua kali membuat Anda kehilangan perubahan lingkungan yang telah Anda lakukan di shell zsh awal, yang tidak akan terjadi jika Anda hanya akan memanggil bash.
xenoid
Dalam kasus saya, diperlukan untuk mengambil perubahan lingkungan dan perubahan itu tetap ada. Saya baru saja me-restart komputer dan semua perubahan saya bertahan. Mungkin ini hanya khusus untuk anaconda yang saya coba siapkan
David Kabii