Скрипт 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.