Bash-скрипт выводит "Команду не найдено" в пустых строках

Каждый раз, когда я запускаю сценарий, используя bash scriptname.sh из командной строки в Debian, я получаю Command Not found и затем результат сценария.

Сценарий работает, но для каждой пустой строки на экране всегда есть оператор Command Not Found. Каждая пустая строка приводит к тому, что команда не найдена.

Я запускаю скрипт из папки /var.

Вот сценарий:

#!/bin/bash

echo Hello World

Я запускаю его, набрав следующее:

bash testscript.sh

Почему это произошло?

Ответ 1

Убедитесь, что ваша первая строка:

#!/bin/bash

Введите путь к bash, если это не /bin/bash


Попробуйте запустить:

dos2unix script.sh

Это преобразует окончания строк и т.д. Из Windows в формат Unix. то есть он обрезает \r (CR) от концов строк, чтобы изменить их с \r\n (CR+LF) на \n (LF).

Подробнее о команде dos2unix (страница man)


Еще один способ узнать, находится ли ваш файл в формате dos/Win:

cat scriptname.sh | sed 's/\r/<CR>/'

Вывод будет выглядеть примерно так:

#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>

Это выведет весь текст файла с <CR> отображаемым для каждого символа \r в файле.

Ответ 2

Вы можете использовать bash -x scriptname.sh для его прокрутки.

Ответ 3

Я также столкнулся с подобной проблемой. Кажется, что проблема связана с разрешениями. Если вы выполните ls -l, вы можете определить, что ваш файл может НЕ включать бит выполнения. Это НЕ разрешит выполнение script.:)

Как @artooro добавил в комментарий:

Чтобы исправить эту проблему, запустите chmod +x testscript.sh

Ответ 4

Если script выполняет свою работу (относительно) хорошо, тогда он работает нормально. Вероятно, ваша проблема - это одна строка в файле, ссылающаяся на программу, которая либо не на пути, не установлена, не написана с ошибкой, либо что-то подобное.

Один из способов - разместить set -x в верхней части вашего script или запустить его с помощью bash -x вместо bash - это приведет к выходу строк перед их исполнением, и вам обычно просто нужно посмотреть команда выводит непосредственно перед ошибкой, чтобы увидеть, что вызывает проблему

Если, как вы говорите, это пустые строки, вызывающие проблемы, вы можете проверить, что в них действует. Run:

od -xcb testscript.sh

и убедитесь, что нет "невидимых" забавных символов, таких как CTRL-M (возврат каретки), которые вы можете получить, используя редактор типа Windows.

Ответ 5

используйте dos2unix в вашем файле script.

Ответ 6

Если у вас есть Notepad ++, и вы получите это сообщение об ошибке .sh: "команда не найдена или это сообщение об ошибке autoconf "строка 615: .. /../autoconf/bin/autom4te: Нет такого файла или каталога ".

На своем Notepad ++ перейдите в Изменить Преобразование EOL, затем отметьте Macintos (CR). Это отредактирует ваши файлы. Я также рекомендую проверять все файлы с помощью этой команды, потому что вскоре такая ошибка произойдет.

Ответ 7

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

VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"  

Это вызовет ответ "команда не найден". Правильный способ - исключить пробелы

VAR_NAME=$(hostname)

Ответ 9

для выполнения того, что вы должны предоставить полный путь этого например

/home/Manuel/mywrittenscript

Ответ 10

Была та же проблема. К сожалению

dos2unix winfile.sh
bash: dos2unix: command not found

поэтому я сделал это для преобразования.

 awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh

а затем

bash unixfile.sh

Ответ 11

На Bash для Windows я попытался неправильно запустить

run_me.sh 

без./в начале и получил ту же ошибку.

Для людей с фоном Windows правильная форма выглядит излишней:

./run_me.sh

Ответ 12

Проблемы с запущенными скриптами также могут быть связаны с плохим форматированием многострочных команд, например, если у вас есть пробельный символ после разрыва строки "\". Например. это:

./run_me.sh \ 
--with-some parameter

(обратите внимание, что дополнительное пространство после "\" ) вызовет проблемы, но когда вы удалите это пространство, оно будет работать отлично.

Ответ 13

У меня также была часть Cannot execute command. Все выглядело правильно, но на самом деле у меня было непроницаемое пространство &nbsp; прямо перед моей командой, которая, конечно же, не могла быть обнаружена невооруженным глазом:

if [[ "true" ]]; then
  &nbsp;highlight --syntax js "var i = 0;"
fi

Что, в Vim, выглядело так:

if [[ "true" ]]; then
  highlight --syntax js "var i = 0;"
fi

Только после запуска Bash script checker shellcheck я нашел проблему.

Ответ 14

Добавьте текущий каталог (.) в PATH, чтобы иметь возможность выполнить script, просто набрав его имя, которое находится в текущем каталоге:

PATH=.:$PATH

Ответ 15

Я столкнулся с этим сегодня, рассеянно копируя командную строку доллара $ (впереди командной строки) в script.

Ответ 16

Возможно, вы захотите обновить файлы .bashrc и .bash_profile псевдонимами, чтобы распознать вводимую вами команду.

Файлы .bashrc и .bash_profile - это скрытые файлы, которые, вероятно, находятся на вашем диске C :, где вы сохраняете свои программные файлы.