Проблема с скриптом Bash: 'declare: not found'

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

В моем скрипте две строки с флагом:

declare -a RESPONSE RESPONSE=($RESULT)

В нем также говорится, что ( но я думаю, что это происходит из-за первой ошибки.

declare | grep USER показывает

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

Итак, что здесь не так?

19
задан 27 February 2011 в 18:42

50 ответов

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

Изменить разрешение скрипта, например:

chmod 755 script.sh
1
ответ дан 4 August 2018 в 19:56

Как воспроизвести вышеуказанную ошибку:

Я использую Ubuntu 14.04 64 бит. Поместите этот код в файл:

#!/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
3
ответ дан 4 August 2018 в 19:56

Я подозреваю, что ваша строка «shebang» (необязательная первая строка файла) ссылается на sh вместо bash. Это должно быть

#!/bin/bash

для сценариев bash. Если первая строка вашего скрипта -

#!/bin/sh

, это указывает на то, что должна использоваться строго совместимая с борнером оболочка; в случае Ubuntu используется dash. Во многих других дистрибутивах это не вызывает проблемы, поскольку они связывают /bin/sh с /bin/bash; однако ubuntu ссылается на /bin/dash, чтобы позволить сценариям системы работать быстрее.

Встроенный declare является одним из многих расширений bash для спецификации сценария оболочки Bourne; dash просто реализует эту спецификацию без расширений.

10
ответ дан 4 August 2018 в 19:56
  • 1
    Моя строка shebang только #!/bin/bash – Ashfame 27 February 2011 в 20:06
  • 2
    @Ashfame: как вы запускаете скрипт? Если вы вызываете его, просто набрав имя скрипта, строка shebang определит, что интерпретатор запускает его. Однако, если вы явно вызываете его через sh thescript.sh, интерпретатор интерпретирует оболочку sh, то есть dash. – intuited 27 February 2011 в 20:57
  • 3
    @intuited Я запускал его через sh script.sh. Я понимаю, что вы сказали, но я где-то читал, что с помощью этого метода bash будет интерпретировать его. Зачем dash получить эту роль здесь? Это только с Ubuntu? Может быть, то, что я читал, было для Linux в целом. – Ashfame 27 February 2011 в 22:03
  • 4
    @Ashfame с sh script вы используете команду sh с аргументом script, что делает sh read и выполняет команды в этом файле. Shebang не читается sh, он начинается с #, поэтому он рассматривается как комментарий. Если вы вместо этого запустите ./script, ядро ​​будет читать shebang, который в вашем случае #!/bin/bash, и поэтому он выполняет /bin/bash ./script – geirha 27 February 2011 в 22:48
  • 5
    @geirha yes thats, как я знаю, что это работает, но @intuited упомянул, что dash будет использоваться, поэтому мне нужно его прояснить – Ashfame 28 February 2011 в 00:09

Попробуйте запустить скрипт, используя /bin/bash в командной строке, если sh (:

Вместо:

sh script.sh

Попробуйте:

/bin/bash script.sh
1
ответ дан 4 August 2018 в 19:56

Попробуйте запустить скрипт, используя / bin / bash вместо командной строки, если sh (:

Вместо:

  ] sh script.sh 

Попробуйте:

 / bin / bash script.sh 
1
ответ дан 6 August 2018 в 03:58

Как воспроизвести приведенную выше ошибку:

Я использую Ubuntu 14.04 64 бит. Поместите этот код в файл:

  #! / 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  
3
ответ дан 6 August 2018 в 03:58

Я подозреваю, что ваша строка «shebang» (необязательная первая строка файла) ссылается на sh вместо bash . Это должно быть

  #! / Bin / bash  

для сценариев bash. Если первая строка вашего скрипта -

  #! / Bin / sh  

, то это указывает на то, что должна использоваться строго борнская совместимая оболочка ; в случае Ubuntu используется тире . Во многих других дистрибутивах это не вызывает проблемы, поскольку они связывают / bin / sh с / bin / bash ; однако ubuntu ссылается на / bin / dash , чтобы позволить системным скриптам работать быстрее.

declare builtin является одним из bash - множество расширений к спецификации сценария оболочки Bourne; dash просто реализует эту спецификацию без расширений.

10
ответ дан 6 August 2018 в 03:58

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

Изменить разрешение скрипта, например:

   chmod 755 script.sh  
1
ответ дан 6 August 2018 в 03:58

Я подозреваю, что ваша строка «shebang» (необязательная первая строка файла) ссылается на sh вместо bash . Это должно быть

  #! / Bin / bash  

для сценариев bash. Если первая строка вашего скрипта -

  #! / Bin / sh  

, то это указывает на то, что должна использоваться строго борнская совместимая оболочка ; в случае Ubuntu используется тире . Во многих других дистрибутивах это не вызывает проблемы, поскольку они связывают / bin / sh с / bin / bash ; однако ubuntu ссылается на / bin / dash , чтобы позволить системным скриптам работать быстрее.

declare builtin является одним из bash - множество расширений к спецификации сценария оболочки Bourne; dash просто реализует эту спецификацию без расширений.

10
ответ дан 7 August 2018 в 21:56

Попробуйте запустить скрипт, используя / bin / bash вместо командной строки, если sh (:

Вместо:

  ] sh script.sh 

Попробуйте:

 / bin / bash script.sh 
1
ответ дан 7 August 2018 в 21:56

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

Изменить разрешение скрипта, например:

   chmod 755 script.sh  
1
ответ дан 7 August 2018 в 21:56

Как воспроизвести приведенную выше ошибку:

Я использую Ubuntu 14.04 64 бит. Поместите этот код в файл:

  #! / 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  
3
ответ дан 7 August 2018 в 21:56

Попробуйте запустить скрипт, используя / bin / bash вместо командной строки, если sh (:

Вместо:

  ] sh script.sh 

Попробуйте:

 / bin / bash script.sh 
1
ответ дан 10 August 2018 в 10:11

Как воспроизвести приведенную выше ошибку:

Я использую Ubuntu 14.04 64 бит. Поместите этот код в файл:

  #! / 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  
3
ответ дан 10 August 2018 в 10:11

Я подозреваю, что ваша строка «shebang» (необязательная первая строка файла) ссылается на sh вместо bash . Это должно быть

  #! / Bin / bash  

для сценариев bash. Если первая строка вашего скрипта -

  #! / Bin / sh  

, то это указывает на то, что должна использоваться строго борнская совместимая оболочка ; в случае Ubuntu используется тире . Во многих других дистрибутивах это не вызывает проблемы, поскольку они связывают / bin / sh с / bin / bash ; однако ubuntu ссылается на / bin / dash , чтобы позволить системным скриптам работать быстрее.

declare builtin является одним из bash - множество расширений к спецификации сценария оболочки Bourne; dash просто реализует эту спецификацию без расширений.

10
ответ дан 10 August 2018 в 10:11

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

Изменить разрешение скрипта, например:

   chmod 755 script.sh  
1
ответ дан 10 August 2018 в 10:11

Попробуйте запустить скрипт, используя / bin / bash вместо командной строки, если sh (:

Вместо:

  ] sh script.sh 

Попробуйте:

 / bin / bash script.sh 
1
ответ дан 13 August 2018 в 16:32

Я подозреваю, что ваша строка «shebang» (необязательная первая строка файла) ссылается на sh вместо bash . Это должно быть

  #! / Bin / bash  

для сценариев bash. Если первая строка вашего скрипта -

  #! / Bin / sh  

, то это указывает на то, что должна использоваться строго борнская совместимая оболочка ; в случае Ubuntu используется тире . Во многих других дистрибутивах это не вызывает проблемы, поскольку они связывают / bin / sh с / bin / bash ; однако ubuntu ссылается на / bin / dash , чтобы позволить системным скриптам работать быстрее.

declare builtin является одним из bash - множество расширений к спецификации сценария оболочки Bourne; dash просто реализует эту спецификацию без расширений.

10
ответ дан 13 August 2018 в 16:32
  • 1
    Моя линия shebang - только #! / Bin / bash – Ashfame 27 February 2011 в 20:06
  • 2
    @Ashfame: как вы запускаете скрипт? Если вы вызываете его, просто набрав имя скрипта, строка shebang определит, что интерпретатор запускает его. Однако, если вы явно вызываете его через sh thescript.sh , интерпретация его sh shell, то есть тире . – intuited 27 February 2011 в 20:57
  • 3
    @intuited Я запускал его через sh script.sh . Я понимаю, что вы сказали, но я где-то читал, что с помощью этого метода bash будет его интерпретировать. Почему dash получит здесь роль? Это только с Ubuntu? Может быть, то, что я читал, было для Linux в целом. – Ashfame 27 February 2011 в 22:03
  • 4
    @Ashfame с sh script вы используете команду sh с аргументом script , что делает sh read и выполняет команды в этом файле. Шейнг не читается sh, он начинается с # , поэтому он рассматривается как комментарий. Если вы вместо этого запустите ./ script , то ядро ​​будет читать shebang, который в вашем случае #! / Bin / bash , и поэтому он выполняет / bin / bash ./script – geirha 27 February 2011 в 22:48
  • 5
    @geirha да, я знаю, что это работает, но @intuited упомянул, что dash будет использоваться, поэтому мне нужно его прояснить – Ashfame 28 February 2011 в 00:09

Как воспроизвести приведенную выше ошибку:

Я использую Ubuntu 14.04 64 бит. Поместите этот код в файл:

  #! / 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  
3
ответ дан 13 August 2018 в 16:32

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

Изменить разрешение скрипта, например:

   chmod 755 script.sh  
1
ответ дан 13 August 2018 в 16:32

Другие вопросы по тегам:

Похожие вопросы: