Masalah dengan skrip Bash: 'nyatakan: tidak ditemukan'

23

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?

Asfame
sumber

Jawaban:

27

Apakah Anda menggunakan shbukan bash? sh(ditautkan dash) tidak mendukung declarekata kunci, atau sintaksis

VAR=(list) 

untuk menginisialisasi array.

enzotib
sumber
Baris shebang saya #!/bin/bashhanya. Apakah maksud Anda bagaimana saya menjalankannya? Saya hanya mencoba menjalankannya ./script.shdan berhasil. Tapi itu tidak berfungsi sebagai script.shatau sh script.shdan saya cukup yakin saya dulu hanya menggunakan dua metode terakhir sementara saya membuatnya seminggu yang lalu. Apa yang bisa menjelaskan itu?
Ashfame
@Ashfame: mungkin seminggu yang lalu ia melewatkan fitur khusus untuk bash yang Anda miliki sekarang, jadi itu bekerja juga dengan sh script.sh
enzotib
Tidak, maksud saya persis skrip ini digunakan untuk bekerja seminggu atau dua minggu yang lalu. Atau maksud Anda beberapa pembaruan mungkin telah membuat perubahan?
Ashfame
@Ashfame: Saya tidak tahu, skrip ini, seperti yang Anda tunjukkan sekarang, tidak dapat bekerja dengan sh script.sh.
enzotib
11

Saya menduga bahwa baris "shebang" Anda (baris pertama opsional dari file) merujuk shbukan bash. Harus

#!/bin/bash

untuk skrip bash. Jika baris pertama skrip Anda adalah

#!/bin/sh

maka itu akan menunjukkan bahwa shell yang kompatibel dengan bourne akan digunakan; dalam hal Ubuntu, dashdigunakan. Dalam banyak distribusi lainnya, ini tidak menyebabkan masalah, karena mereka terhubung /bin/shke /bin/bash; namun tautan ubuntu /bin/dashuntuk memungkinkan skrip sistem berjalan lebih cepat.

The declarebuiltin adalah salah satu bash's banyak ekstensi untuk script spesifikasi Bourne shell; dashhanya mengimplementasikan spesifikasi itu tanpa ekstensi.

intuisi
sumber
Baris shebang saya #!/bin/bashhanya
Ashfame
@Ashfame: bagaimana Anda menjalankan skrip? Jika Anda memintanya dengan hanya mengetik nama skrip, baris shebang akan menentukan penerjemah mana yang menjalankannya. Namun, jika Anda secara eksplisit menjalankannya sh thescript.sh, shshell - ie dashakan menafsirkannya.
intuited
1
@intuited saya menjalankannya sh script.sh. Saya mengerti apa yang Anda katakan, tetapi saya telah membaca di suatu tempat bahwa dengan metode ini, bashakan menafsirkannya. Mengapa dashperan itu di sini? Apakah hanya dengan Ubuntu? Mungkin yang saya baca adalah untuk linux secara umum.
Ashfame
2
@Ashfame dengan sh scriptAnda menjalankan perintah shdengan argumen script, 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
geirha
@geirha ya itulah bagaimana saya tahu ini bekerja tetapi @ menyebutkan hal yang dashakan digunakan, jadi saya perlu mengklarifikasi itu
Ashfame
3

Cara mereproduksi kesalahan di atas:

Saya menggunakan Ubuntu 14.04 64 bit. Masukkan kode ini ke dalam file:

#!/bin/sh 
declare -i FOOBAR=12; 
echo $FOOBAR; 

Jalankan seperti ini:

el@apollo:~$ ./06.sh 
./test.sh: 2: ./test.sh: declare: not found

Untuk memperbaikinya, lakukan ini sebagai gantinya:

#!/bin/bash
declare -i FOOBAR=12;
echo $FOOBAR;

Cetakan:

el@apollo:~$ ./06.sh 
12
Eric Leschinski
sumber
1

Saya memiliki masalah yang sama, dan kemudian saya ingat bahwa Anda perlu menetapkan izin yang tepat untuk menjalankan skrip shell.

Ubah izin skrip, misalnya:

chmod 755 script.sh
Edgard Padilla
sumber
1

Coba jalankan skrip Anda menggunakan /bin/bashbaris perintah sebagai gantinya jika sh(:

Dari pada :

    sh script.sh

Coba:

    / bin / bash script.sh
Berjalan
sumber
1

Di Ubuntu, Anda mungkin memiliki skrip yang menjalankan skrip lain di dalamnya, yang saya temui.

some_dir/  
        | main.sh  
        | shhh.sh

#!/bin/bash -e

echo "file? $0"
# file? ./main.sh

echo "shell? $SHELL" 
# shell? /bin/bash

# sh shhh.sh
# file? shhh.sh
# shell? /bin/bash
# shhh.sh: 5: shhh.sh: declare: not found

$SHELL shhh.sh
# file? shhh.sh
# shell? /bin/bash
# foo? bar

#!/bin/bash -e

echo "file? $0"
# shhh.sh

echo "shell? $SHELL"
# shell? /bin/bash

declare foo="bar"

echo "foo? $foo"

Mengubah semua sh some_script.shuntuk $SHELL some_script.shmemperbaikinya.

Rahman Malik
sumber