#! / bin / bash - такого файлу чи каталогу немає


69

Я створив сценарій bash, але коли я намагаюся його виконати, я отримую

#!/bin/bash no such file or directory

Мені потрібно запустити команду: bash script.shщоб вона працювала.

Як я можу це виправити?


У мене зараз ця проблема під cygwin зі сценарієм, за який я можу присягнути, що вже працює без проблем. Я перевірив усі відповіді, але жодна, здається, не підходить. В інших питаннях і відповідях також згадувалося про 32/64 бітові проблеми, але для скриптів оболонки це можна виключити, правда?
січень

Знайдено причина, додав деталі в новому Anwer unix.stackexchange.com/a/450389/62636 в разі , якщо хто - то також використовується #!/usr/bin/env bashзамість #!/bin/bashа також шукає тут ...
Січень

Відповіді:


100

Повідомлення такого типу зазвичай пов'язані з хибною лінією shebang, або з додатковим поверненням перевезення в кінці першого рядка, або з BOM на початку.

Виконати:

$ head -1 yourscript | od -c

і подивіться, як це закінчується.

Це неправильно:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Це теж неправильно:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

Це правильно:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

Використання dos2unix(або sed, tr, awk, perl, python...) , щоб виправити сценарій , якщо це питання.

Ось такий, який видалить і КР, і КР:

sed -i '1s/^.*#//;s/\r$//' brokenScript


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

Ось три сценарії, що лише показують їх ім’я ( echo $0) та мають такі відповідні рядки:

правильний сценарій:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithBom:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithCRLF:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Під bash, запуск їх покаже наступні повідомлення:

$ ./correctScript
./correctScript
$ ./scriptWithCRLF
bash: ./scriptWithCRLF: /bin/bash^M: bad interpreter: No such file or directory
$ ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Запуск фальшивих файлів шляхом чіткого виклику інтерпретатора дозволяє запускати сценарій CRLF без жодних проблем:

$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Ось поведінка, яка спостерігається під ksh:

$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom

і під dash:

$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom

2
Ще один спосіб виявити, чи це проблема hexdump -C yourscript | head -n 1. Я все одно використовував dos2unix yourscriptби це, щоб виправити це.
Кевін М

Так, це дуже могло бути. Я редагував у Windows. Речі для підказки.
Ніколя де Фонтеней

1
Якби це проблема CRLF, ви б не побачили #!/bin/bash no such file or directoryповідомлення про помилку, оскільки немає причин, щоб щось намагалося виконати чи відкрити #!/bin/bash. Це /bin/bash<CR>те , що було б страчено.
Стефан Шазелас

1
@StephaneChazelas Оскільки проблему вирішив dos2unix, мало сумнівів, що це не проблема CRLF. Повідомлення про помилку, ймовірно, було просто невірно
записано

6
dos2unixтакож видаляє BOM UTF-8. BOM UTF-8 міг пояснити повідомлення про помилку.
Стефан Шазелас

17

Це також може бути спричинене BOM у сценарії UTF-8. Якщо ви створюєте скрипт у Windows, іноді у вас на початку файлу з'являється якийсь небажаний файл.


Специфікації можуть бути легко видалені з допомогою AWK, як і в stackoverflow.com/questions/1068650 / ...
pauxu

1
Зауважте, що Visual Studio для Mac вставить BOM.
Чіткіший

9

Насправді, правильний шебанг для баш сценарію:

#!/usr/bin/env bash

Тому що у freeBSD bash знаходиться в /usr/local/bin/bash


13
"правильно" - важке слово, яке можна вживати в таких випадках. Можливо, кращою фразою було б "менш схильні до помилок".
HalosGhost

1
Це теж страшно; припущення, що / usr існує, є поганим ІМО. Наприклад, Haiku не має / usr.
jessicah

9

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

vi <your_file>
:set ff=unix
:set nobomb
:wq

Відповіді повинні бути максимально самостійними. У цьому питанні не згадуються дві проблеми; якщо ви збираєтесь спиратися на інші відповіді, вам слід принаймні сказати, що вони є. А ще краще пояснити, як це відповідає на питання.
G-Man

Дуже швидке виправлення без завантаження більше інструментів Windows, дякую!
парі

1
@ G-Man Інші відповіді вже згадують про це набагато краще, ніж я хотів би піти. Не потрібно повторювати, але якщо це не болісно очевидно, у вас може закінчитися рядок WIndows та прихований символ BOM для Windows. Я думаю, що багато людей, які сканують відповіді, цінують стислість, а не самодостатню, особливо коли в інших відповідях є значно більше деталей.
cwash

4

Якщо у вас немає dos2unix, це спосіб вирішити цю проблему.

cp script _p4 && tr -d '\r' < _p4 > script && rm _p4

3

Позначення байтів (BOM)

Це може бути спричинене BOM. З Вікіпедії, BOM - це

Марка порядку байтів (BOM) - символ Unicode, U + FEFF байт порядку (BOM), поява якого як магічне число на початку текстового потоку може сигналізувати про кілька речей для програми, що споживає текст

На жаль, воно нічого не сигналізує ядро ​​Linux, яке обробляє лінію she-bang. Ви можете підтвердити наявність у вас BOM, використовуючи file,

file /tmp/foo 
/tmp/foo: UTF-8 Unicode (with BOM) text

Або ви можете зробити дванадцять перших символів і побачити, чи вони відповідають одному з символів BOM вручну

Ви можете зняти символи BOM, як тільки ви їх знаєте,

sed -i '1 s/^\xef\xbb\xbf//' *.txt

0

У мене виникла проблема, випадково додавши неправильний виконуваний файл bash до PATHі тому, що в моєму сценарії #!/usr/bin/env bashбуло використано більш гнучку shebang (візьміть перший bash виконуваний з шляху).

command -v bash
/cygdrive/c/Program Files/Git/bin//bash

Я встановив GIT, щоб Windows працював cygwinспільно з графічними інтерфейсами Windows GIT (не працював із нативними git cygwin ...). Я вирішив це зараз, перейшовши на #!/bin/bashsheband і видаливши GIT для Windows PATH.


-3

Спробуйте #!/bin/bash

Друга річ: find / -name bash
Третя річ:ls -al /bin/bash


Або просто which bash. Ми знаємо, що це знайти, тому що він працює bash script.sh.
Кевін

Правда. Як вже згадувалося, існує набагато більш портативний / usr / bin / env метод, який має програму пошуку bash (або іншого інтерпретатора) для вас. Не потрібно жорсткого коду, так.
Геннес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.