Скрипт Bash друкує "Команда не знайдена" на порожніх рядках


111

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

Сценарій працює, але завжди є Command Not Foundповідомлення, що друкується на екрані для кожного порожнього рядка. Кожен порожній рядок призводить до того, що команда не знайдена.

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

Ось сценарій:

#!/bin/bash

echo Hello World

Я запускаю його, ввівши наступне:

bash testscript.sh

Чому це сталося?


Серйозно, мережа сповнена таких скарг. Шелл дуже слабкий і кульгавий перекладач. Мало тут і там і не вдається. Ви повинні переглянути навіть усі пробіли в сценарії. Мій сценарій вийшов з ладу через невидимий характер подачі рядків. Напевно, це лише сценарій мови, де білі пробіли мають значення!
— Атул

1
Використовуйте bash -x scriptname.shдля відстеження помилки. - У моєму випадку це був sh-файл, збережений під Windows з VSCode та закінченнями рядків як "CRLF". У VSCode в правому нижньому куті ви можете змінити термінатор лінії з "CRLF" на "LF". Завантажили цей файл і могли остаточно виконати його bash scriptname.sh.
— Кай Ноак

Це, безумовно, дублікат stackoverflow.com/questions/39527571/…, але багато відповідей тут пояснюють ряд інших ситуацій, коли ви отримуєте "команду не знайдено" з інших причин. Відвідувачам рекомендується прочитати всі відповіді, якщо ваша проблема стосується не лише порожніх рядків.
— tripleee

Відповіді:


161

Переконайтесь, що ваш перший рядок:

#!/bin/bash

Введіть свій шлях до удару, якщо його немає /bin/bash


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

dos2unix script.sh

Це перетворить закінчення рядків тощо з Windows у формат Unix. тобто знімає \ r (CR) від закінчень рядків, щоб змінити їх \r\n (CR+LF)на \n (LF).

Детальніше про dos2unixкоманду (man page)


Ще один спосіб визначити, чи ваш файл у форматі dos / Win:

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

Вихід буде виглядати приблизно так:

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

Це виведе весь текст файлу з <CR>відображенням для кожного \rсимволу у файлі.


Це, мабуть, не потрібно, оскільки він працює безпосередньо з цим bash scriptname.sh(але, звичайно, це все-таки є хорошою практикою).
— paxdiablo

1
Привіт #! / Bin / bash - це перший рядок мого сценарію
— Девід

1
@chown - У мене була та сама проблема на Mac. Я наткнувся на цю посаду. Я не впевнений, допоміг це ОП чи ні. Але ваше рішення допомогло мені.
— Прашант

1
Дякую. Це саме те питання, з яким я стикався. Ці відповіді спрацювали.
— вбивствоблуцифер

5
Як можна написати відповідь на питання програмування під час руху?
— Омар Тарік


47

Я також зіткнувся з подібним питанням. Здається, проблема полягає в дозволах. Якщо ви зробите це ls -l, ви можете виявити, що у вашому файлі НЕ може бути включений біт виконання. Це НЕ дозволить виконати сценарій. :)

Як @artooro додав у коментарі:

Щоб виправити цю проблему, запустіть chmod +x testscript.sh


4
Щоб виправити цю проблему, запустітьchmod +x testscript.sh
— artooro

Це була відповідь, яка працювала на мене. Завжди мені говорили, що я не маю дозволу, тому я судо'дав його, і команду не дали. Я не думав перевіряти дозволи.
— DiamondDrake

1
Дякую Lypso345, це вирішило проблему, з якою у мене виникло.
— ammills01

chmod 777 testcript.sh FTW
— GeneCode

16

Це може бути тривіально і не пов'язане з питанням про ОП, але я часто помилявся на початку, коли вивчав сценарії

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

Це призведе до відповіді "команда не знайдена". Правильний спосіб - усунути пробіли

VAR_NAME=$(hostname)

11

Якщо сценарій виконує свою роботу (відносно) добре, то це працює нормально. Можливо, ваша проблема - це один рядок у файлі, що посилається на програму, яка або не стоїть на шляху, не встановлена, неправильно написана, або щось подібне.

Один із способів - розмістити a set -xу верхній частині сценарію або запустити його, bash -xа не просто bash- це виведе рядки перед їх виконанням, і вам зазвичай просто потрібно подивитися на вихід команди безпосередньо перед помилкою, щоб побачити, що викликає проблему

Якщо, як ви кажете, саме порожні рядки викликають проблеми, ви можете перевірити, що в них точно . Виконати:

od -xcb testscript.sh

і переконайтеся, що немає таких «невидимих» смішних персонажів, як CTRL-M(повернення каретки), які можна отримати за допомогою редактора типу Windows.


+1 для команди 'od'! Це здорово, я про це не знав! Дякую!
— човен

11

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

run_me.sh 

без ./ на початку і отримав ту саму помилку.

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

./run_me.sh



6

наприклад, для того, щоб виконати повний шлях, наприклад

/home/Manuel/mywrittenscript

Дійсно, оболонку взагалі не цікавить розширення файлів. Не впевнений, що це заслуговує на те, що це окрема відповідь.
— трійка

Звичайно, файлова система Linux всупереч розширенням Windows використовується лише як частина імені і нічого не говорить про вміст файлу. Я не повинен говорити про обмеження.
— Масуд Моджіні

6

Якщо у вас є Notepad ++, і ви отримуєте це .sh повідомлення про помилку: "команду не знайдено" або це повідомлення про помилку autoconf "рядок 615: ../../autoconf/bin/autom4te: такого файлу чи каталогу немає" .

На своєму Блокноті ++ перейдіть до меню Редагування -> Перетворення EOL, а потім перевірте Macinthos (CR) . Це дозволить редагувати ваші файли. Я також рекомендую перевірити всі файли з цією командою, адже незабаром відбудеться така помилка.


Дякую за це У моєму випадку я запускав сценарій на розігруванні Linux для Linuxbox. Якщо у всіх порожніх рядках у моїх сценаріях помилка "не знайдена" у нього також були проблеми з оператором if / else. змінивши EOL у Notepad ++ на Unix виправлено.
— GeneCode

4

Була така ж проблема. На жаль,

dos2unix winfile.sh
bash: dos2unix: command not found

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

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

і потім

bash unixfile.sh

2

Проблеми із запущеними сценаріями можуть також бути пов’язані з неправильним форматуванням багаторядкових команд, наприклад, якщо у вас є символ пробілу після розриву рядків "\". Наприклад:

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

(зауважте, що додатковий простір після "\") спричинить проблеми, але коли ви вилучите цей простір, він буде працювати чудово.


0

Я також мав деякі з Cannot execute command. Все виглядало правильно, але насправді я мав &nbsp;незахищений простір перед моєю командою, яку, звичайно, неможливо було помітити неозброєним оком:

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

Який у Вімі виглядав так:

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

Лише після запуску перевірки скриптів Bash shellcheckя виявив проблему.


shellcheckдоступний он-лайн, хоча, звичайно, потрібно скопіювати + вставити свій сценарій саме для того, щоб це допомогло. shellcheck.net
— tripleee

0

Я зіткнувся з цим сьогодні, заочно копіюючи командний рядок долара $(перед командним рядком) у сценарій.


-1

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

PATH=.:$PATH

1
Це вважається вразливим для безпеки. НЕ ДОДАЙТЕ .ДО ВАШОГО ШЛЯХУ.
— gniourf_gniourf

Пояснення, чому ця "відповідь" є поганою ідеєю: superuser.com/questions/156582/…
— jmng

-1

Ви можете оновити файли .bashrc та .bash_profile з псевдонімами, щоб розпізнати команду, яку ви вводите.

Файли .bashrc та .bash_profile - це приховані файли, ймовірно, розташовані на вашому C: диску, де ви зберігаєте свої програмні файли.

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