Bash betiği ile ilgili sorun: 'declare: not found'


23

İyi çalışan bir senaryo vardı ama bugün çalıştırdığımda yazıyor declare: not found. Komut başlangıcında bash kabuk ve yol kullanıyorum doğru.

Komut dosyasımdaki iki işaretli satır aşağıdaki gibidir:

declare -a RESPONSE
RESPONSE=($RESULT)

Ayrıca (beklenmeyen diyor ama sanırım ilk hata yüzünden geliyor. Bahsetmem gereken nokta, yazdığımda doğrudan doğruya çalıştığımdır.

declare | grep USER gösterileri

USER=ashfame
USERNAME=ashfame
           values="$SVN_BASH_USERNAME";

Peki, burada yanlış olan ne?

Yanıtlar:


27

Kullandığınız shyerine bash? sh(bağlantılı dash) declareanahtar kelimeyi veya sözdizimini desteklemiyor

VAR=(list) 

dizileri başlatmak için.


Shebang hattım #!/bin/bashsadece. Bunu nasıl yürüttüğümü mü demek istedin? Sadece çalıştırmayı denedim ./script.shve işe yaradı. Ancak, bu şekilde çalışmaz script.shya sh script.shda bir hafta önce oluşturduğumda yalnızca son iki yöntemi kullandığımdan eminim. Bunu ne açıklayabilir?
— Ashfame

@Ashfame: belki bir hafta önce, şimdi sahip olduğunuz bash'a özgü özellikleri kaçırdı, bu yüzden sh script.sh
— enzotib ile

Hayır, tam olarak bu senaryoyu bir ya da iki hafta önce çalışmak için kullanmıştım. Veya bazı güncellemelerin bir değişiklik yapmış olabileceğini mi kastettiniz?
— Ashfame

@Affame: Bilmiyorum, bu komut dosyası, şimdi gösterdiğiniz gibi, sh script.sh ile çalışamaz.
— enzotib

11

"Shebang" satırınızın (dosyanın isteğe bağlı ilk satırı) shyerine referans olduğundan şüpheleniyorum bash. Olmalı

#!/bin/bash

bash scriptleri için. Komut dosyanızın ilk satırı ise

#!/bin/sh

o zaman bu kesinlikle bir bourne uyumlu kabuğun kullanılması gerektiğini gösterir; Ubuntu durumunda dash, kullanılır. Onlar bağlantı sağladığı diğer birçok dağılımları, bu, bir soruna neden olmaz /bin/shiçin /bin/bash; ancak ubuntu /bin/dashsistem komut dosyalarının daha hızlı çalışmasını sağlamak için bağlantı kurar .

declareYerleşik biridir bashBourne kabuğu komut şartnamesine bireyin birçok uzantıları; dashsadece bu şartnameyi uzantı olmadan uygular.


Benim shebang çizgidir #!/bin/bashsadece
— Ashfame

@Ashfame: betiği nasıl çalıştırıyorsunuz? Sadece komut dosyasının adını yazarak çağırıyorsanız, shebang satırı hangi tercümanın çalıştığını belirler. Ancak, açıkça üzerinden çağırırsanız sh thescript.sh, shkabuk - yani dashyorumlayacaktır.
— intuited

1
@intuited Üzerinden geçiyordum sh script.sh. Ne dediğini anlıyorum ama bir yerde bu yöntemle bashyorumlayacağını okudum . Neden dashburada rolü olsun ki? Sadece Ubuntu ile mi? Genelde linux için okuduğum şey olabilir.
— Ashfame

2
@Ashfame sh script, komutu sh, sh'in scripto dosyadaki komutları okumasını ve çalıştırmasını sağlayan argümanıyla çalıştırıyor. Shebang sh ile okunmuyor, bir ile başlıyor #, bu yüzden yorum olarak kabul ediliyor. Bunun yerine ./script#!/bin/bash/bin/bash ./script
— kaçarsanız

@geirha evet, nasıl çalıştığını bildiğimden ama @intuited 'in kullanacağından bahsettiğimden, dashaçıklığa kavuşturmam gerekiyor
— Ashfame

3

Yukarıdaki hatayı yeniden nasıl üretilir:

Ubuntu 14.04 64 bit kullanıyorum. Bu kodu bir dosyaya yerleştirin:

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

Bu şekilde çalıştırın:

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

Düzeltmek için bunu yapın:

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

Baskılar:

el@apollo:~$ ./06.sh 
12

1

Aynı sorunu yaşadım ve sonra kabuk betiğini çalıştırmak için doğru izinleri vermeniz gerektiğini hatırladım.

Komut dosyasının iznini değiştirin, örneğin:

chmod 755 script.sh

1

/bin/bashKomut satırınızı kullanarak komut dosyanızı çalıştırmayı deneyin sh( eğer :

Yerine :

    sh Instagram Hesabındaki Resim ve Videoları script.sh

Deneyin :

    / bin / bash

1

Ubuntu'da, içinde çalıştığım diğer komut dosyalarını çalıştıran bir komut dosyanız olabilir.

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"

Hepsini düzeltmek sh some_script.shiçin değiştiriyorum $SHELL some_script.sh.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.