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.