Saya memiliki skrip yang berjalan dengan baik tetapi ketika saya menjalankannya hari ini, katanya declare: not found
. Saya menggunakan bash shell dan path di awal skrip sudah benar.
Dua baris yang ditandai di skrip saya adalah sebagai berikut:
declare -a RESPONSE
RESPONSE=($RESULT)
Ia juga mengatakan (
itu tidak terduga tetapi saya kira itu akan muncul karena kesalahan pertama. Poin yang layak disebutkan adalah ketika saya mengetik menyatakan secara langsung berfungsi dengan baik.
declare | grep USER
menunjukkan
USER=ashfame
USERNAME=ashfame
values="$SVN_BASH_USERNAME";
Jadi, apa yang salah di sini?
#!/bin/bash
hanya. Apakah maksud Anda bagaimana saya menjalankannya? Saya hanya mencoba menjalankannya./script.sh
dan berhasil. Tapi itu tidak berfungsi sebagaiscript.sh
ataush script.sh
dan saya cukup yakin saya dulu hanya menggunakan dua metode terakhir sementara saya membuatnya seminggu yang lalu. Apa yang bisa menjelaskan itu?Saya menduga bahwa baris "shebang" Anda (baris pertama opsional dari file) merujuk
sh
bukanbash
. Harusuntuk skrip bash. Jika baris pertama skrip Anda adalah
maka itu akan menunjukkan bahwa shell yang kompatibel dengan bourne akan digunakan; dalam hal Ubuntu,
dash
digunakan. Dalam banyak distribusi lainnya, ini tidak menyebabkan masalah, karena mereka terhubung/bin/sh
ke/bin/bash
; namun tautan ubuntu/bin/dash
untuk memungkinkan skrip sistem berjalan lebih cepat.The
declare
builtin adalah salah satubash
's banyak ekstensi untuk script spesifikasi Bourne shell;dash
hanya mengimplementasikan spesifikasi itu tanpa ekstensi.sumber
#!/bin/bash
hanyash thescript.sh
,sh
shell - iedash
akan menafsirkannya.sh script.sh
. Saya mengerti apa yang Anda katakan, tetapi saya telah membaca di suatu tempat bahwa dengan metode ini,bash
akan menafsirkannya. Mengapadash
peran itu di sini? Apakah hanya dengan Ubuntu? Mungkin yang saya baca adalah untuk linux secara umum.sh script
Anda menjalankan perintahsh
dengan argumenscript
, yang membuat sh membaca dan menjalankan perintah dalam file itu. Shebang tidak dibaca oleh sh, itu dimulai dengan#
, jadi itu diperlakukan sebagai komentar. Jika Anda sebaliknya menjalankan./script
, maka kernel akan membaca shebang, yang dalam kasus Anda#!/bin/bash
, dan itu dijalankan/bin/bash ./script
dash
akan digunakan, jadi saya perlu mengklarifikasi ituCara mereproduksi kesalahan di atas:
Saya menggunakan Ubuntu 14.04 64 bit. Masukkan kode ini ke dalam file:
Jalankan seperti ini:
Untuk memperbaikinya, lakukan ini sebagai gantinya:
Cetakan:
sumber
Saya memiliki masalah yang sama, dan kemudian saya ingat bahwa Anda perlu menetapkan izin yang tepat untuk menjalankan skrip shell.
Ubah izin skrip, misalnya:
sumber
Coba jalankan skrip Anda menggunakan
/bin/bash
baris perintah sebagai gantinya jikash
(:Dari pada :
Coba:
sumber
Di Ubuntu, Anda mungkin memiliki skrip yang menjalankan skrip lain di dalamnya, yang saya temui.
Mengubah semua
sh some_script.sh
untuk$SHELL some_script.sh
memperbaikinya.sumber