Проблема зі сценарієм Bash: 'заявити: не знайдено'


23

У мене був сценарій, який працював нормально, але коли я запускав його сьогодні, він говорить declare: not found . Я використовую оболонку bash і шлях на початку сценарію є правильним.

У моєму сценарії два мітки:

declare -a RESPONSE
RESPONSE=($RESULT)

Це також говорить, що (це несподівано, але я думаю, що це виникає через першу помилку. Варто згадати те, що коли я ввожу декларувати, працює добре.

declare | grep USER показує

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

Отже, що тут не так?

Відповіді:


27

Ви використовуєте shзамість bash? sh(пов'язано з dash) не підтримує declareключове слово, ні синтаксис

VAR=(list) 

для ініціалізації масивів.


Моя лінія shebang #!/bin/bashлише. Ви мали на увазі, як я це виконую? Я просто спробував виконати його так, як ./script.shце спрацювало. Але це не працює script.shабо , sh script.shі я в значній мірі впевнений , що я мав звичай використовувати тільки два останніх методу , коли я створив його тиждень тому. Що може пояснити це?
Ashfame

@Ashfame: можливо, тиждень тому він пропустив функції, характерні для bash у вас зараз, тому він також працював з sh script.sh
enzotib

Ні, я мав на увазі саме цей сценарій, який працював тиждень-два тижні тому. Або ви мали на увазі, що якесь оновлення могло внести зміни?
Ashfame

@Ashfame: Я не знаю, цей скрипт, як ви його показуєте зараз, не може працювати з sh script.sh.
enzotib

11

Я підозрюю, що ваш рядок "shebang" (необов'язковий перший рядок файлу) посилається на shзамість bash. Вона повинна бути

#!/bin/bash

для скриптів bash. Якщо перший рядок вашого сценарію є

#!/bin/sh

то це вказувало б на те, що слід використовувати суворо сумісну оболонку; у випадку з Ubuntu, dashвикористовується. У багатьох інших дистрибутивах це не викликає проблем, оскільки вони посилаються /bin/shна/bin/bash ; однак ubuntu посилається на те /bin/dash, щоб дозволити швидшому запуску системних скриптів.

declareВбудований в один з bash«S багатьох розширень специфікації сценаріїв Bourne оболонки; dashпросто реалізує цю специфікацію без розширень.


Моя лінія shebang #!/bin/bashлише
Ashfame

@Ashfame: як ти запускаєш сценарій? Якщо ви посилаєтесь на нього, просто ввівши назву сценарію, рядок shebang визначить, яким інтерпретатором керує. Однак, якщо ви явно викликаєте його через sh thescript.sh, shоболонка - тобто dashінтерпретуватиме її.
інтуїтоване

1
@intuited Я запускав це через sh script.sh. Я розумію, що ви сказали, але я десь прочитав, що за допомогою цього методу bashбуде тлумачити це. Чому б dashдістати йому цю роль? Це тільки з Ubuntu? Можливо, те, що я читав, було для Linux взагалі.
Ashfame

2
@Ashfame з sh scriptвами запускає команду shз аргументом script, який змушує sh читати та виконувати команди у цьому файлі. Шебанг не читається ш, він починається з а #, тому він трактується як коментар. Якщо ви замість цього запустите ./script, ядро ​​прочитає шебанг, який у вашому випадку є #!/bin/bash, і так він виконується/bin/bash ./script
geirha

@geirha Так ось, як я знаю, це працює, але @intuited згадка, яка dashбуде використана, тому мені потрібно уточнити це
Ashfame

3

Як відтворити вищевказану помилку:

Я використовую 64-розрядний Ubuntu 14.04. Помістіть цей код у файл:

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

Виконайте це так:

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

Щоб виправити це, зробіть це замість цього:

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

Друкує:

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

1

У мене була така ж проблема, і тоді я згадав, що вам потрібно призначити правильні дозволи для виконання сценарію оболонки.

Змініть дозвіл сценарію, наприклад:

chmod 755 script.sh

1

Спробуйте запустити сценарій, використовуючи /bin/bashкомандний рядок, якщо, якщоsh (:

Замість :

    sh script.sh

Спробуйте:

    / bin / bash script.sh

1

У Ubuntu у вас може бути сценарій, який виконує інші сценарії всередині нього, в які я зіткнувся.

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"

Змінивши все, sh some_script.shщоб $SHELL some_script.shвиправити це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.