Скрипт Bash: плохой интерпретатор - PullRequest
18 голосов
/ 16 мая 2010

Вопрос: Я получаю это сообщение об ошибке:

экспорт: плохой интерпретатор: такого файла нет или каталог

когда я запускаю скрипт bash:

#!/bin/bash
MONO_PREFIX=/opt/mono-2.6
GNOME_PREFIX=/opt/gnome-2.6
export DYLD_LIBRARY_PATH=$MONO_PREFIX/lib:$DYLD_LIBRARY_PATH
export LD_LIBRARY_PATH=$MONO_PREFIX/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=$MONO_PREFIX/include:$GNOME_PREFIX/include
export ACLOCAL_PATH=$MONO_PREFIX/share/aclocal
export PKG_CONFIG_PATH=$MONO_PREFIX/lib/pkgconfig:$GNOME_PREFIX/lib/pkgconfig
PATH=$MONO_PREFIX/bin:$PATH
PS1="[mono-2.6] \w @ "

Но путь bash кажется правильным:

asshat@IS1300:~/sources/mono-2.6# which bash
/bin/bash

asshat@IS1300:~# cd sources/
asshat@IS1300:~/sources# cd mono-2.6/
asshat@IS1300:~/sources/mono-2.6# ./mono-2.6-environment
export: bad interpreter: No such file or directory
asshat@IS1300:~/sources/mono-2.6# ls
download  mono-2.4  mono-2.4-environment  mono-2.6  mono-2.6-environment
asshat@IS1300:~/sources/mono-2.6# cp mono-2.6-environment mono-2.6-environment.sh
asshat@IS1300:~/sources/mono-2.6# ./mono-2.6-environment.sh
export: bad interpreter: No such file or directory
asshat@IS1300:~/sources/mono-2.6# ls
download  mono-2.4-environment  mono-2.6-environment
mono-2.4  mono-2.6              mono-2.6-environment.sh
asshat@IS1300:~/sources/mono-2.6# bash mono-2.6-environment
asshat@IS1300:~/sources/mono-2.6#

Что я делаю не так? Или это ошибка Lucid Lynx?

Я сделал chmod + x

Ответы [ 7 ]

38 голосов
/ 16 мая 2010

Первая строка, #!/bin/bash, сообщает Linux, где найти интерпретатор. Сценарий также должен быть исполняемым с chmod +x script.sh, что, по-видимому, вы сделали.

Весьма вероятно, что вы создали этот файл с помощью редактора Windows, который будет помещать <cr><lf> в конце каждой строки. Это стандарт под дос / windows. OS X поместит <cr> в конце каждой строки. Однако в Unix / Linux стандарт заключается в том, чтобы просто поставить <lf> в конце строки.

Linux теперь ищет файл с именем /bin/bash<cr> для его интерпретации, где <cr> - символ возврата каретки, который является допустимым символом файла в Linux. Такой файл не существует. Отсюда и ошибка.

Решение: Отредактируйте файл с помощью редактора в Linux и избавьтесь от лишних <cr>. Одним из инструментов, который обычно работает при редактировании файла в Windows, является dos2unix.

8 голосов
/ 16 мая 2010

Может ли скрипт использовать новые строки Dos?

Попробуйте запустить на нем dos2unix.

2 голосов
/ 23 октября 2010

Похоже, все настроено так, чтобы каким-то образом переопределить встроенную export. Это можно сделать с помощью экспортированной функции или встроенной функции enable, например. Попробуйте вставить type export в скрипт, чтобы проверить. Если вы устанавливаете BASH_ENV, вы, вероятно, не должны.

Если bash вызывается как sh, он включает режим POSIX и не позволяет переопределять export с помощью функции, как того требует POSIX. Аналогичным образом, большинство других оболочек, установленных как /bin/sh, следуют POSIX в этом и / или не допускают, чтобы среда выполнения скрипта была испорчена так сильно, как при импорте функций из среды.

Кстати, сценарий, похоже, предназначен для использования, то есть . ./mono-2.6-environment вместо ./mono-2.6-environment.

1 голос
/ 02 октября 2010

Была такая же проблема. Используемая грубая сила:

/bin/sh /full/path/to/configure --options

и это помогло

(Конечно, я хотел бы знать, почему)

0 голосов
/ 21 сентября 2018

Это иногда случается, когда файловая система становится смешной. Попробуйте переместить или переименовать файл. Если вы видите ошибку «Устаревший дескриптор файла», это ваша проблема.

например. случилось у нас с CentOS докером

$ ./test.sh 
-bash: ./test.sh: /bin/bash: bad interpreter: Invalid argument
$ ls -alstr test.sh 
20 -r-xr-xr-x 0 omen omen 17874 Jun 20 01:36 test.sh
$ cp test.sh testcopy.sh
$ ./testcopy.sh
Happy Days

$ mv test.sh footest.sh
mv: cannot move ‘test.sh’ to ‘footest.sh’: Stale file handle
$ rm test.sh 
rm: cannot remove ‘test.sh’: Stale file handle

Вы можете скопировать файл и прочитать его. Но не двигайся! И не удаляй это. Может быть, какая-то странная вещь в файловой системе докера.

Решение: пересоздать Docker-контейнер ИЛИ может быть, диск восстановления файловой системы поможет ИЛИ конечно format c: :-D: -o

0 голосов
/ 03 октября 2013

у меня получилось, когда dos2Unix не было в системе, с которой я работал:

sed -i s/{ctrl+v}{ctrl+m}// filename
0 голосов
/ 16 мая 2010

Вы запускали это так (вы упомянули chmod + x)

. /path/to/it

или как это:

./it

У меня есть подозрение, что ваш код выполнен в новом процессе, и все, что вы сказали, было потеряно. Следовательно, переменные не будут расширяться в вашей текущей оболочке. Однако это не объясняет ошибку плохой интерпретатор , которую вы видели. Я думаю, что у вас также есть проблема с терминалом (как и в терминале, с которым вы говорили cat).

Тот факт, что ваша подсказка не сделала то, что это говорит:

`PS1="[mono-2.6] \w @` "

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...