it-roy-ru.com

Скрипт Bash: плохой интерпретатор

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

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

когда я выполняю этот скрипт 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 кажется правильным:

[email protected]:~/sources/mono-2.6# which bash
/bin/bash

[email protected]:~# cd sources/
[email protected]:~/sources# cd mono-2.6/
[email protected]:~/sources/mono-2.6# ./mono-2.6-environment
export: bad interpreter: No such file or directory
[email protected]:~/sources/mono-2.6# ls
download  mono-2.4  mono-2.4-environment  mono-2.6  mono-2.6-environment
[email protected]:~/sources/mono-2.6# cp mono-2.6-environment mono-2.6-environment.sh
[email protected]:~/sources/mono-2.6# ./mono-2.6-environment.sh
export: bad interpreter: No such file or directory
[email protected]:~/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
[email protected]:~/sources/mono-2.6# bash mono-2.6-environment
[email protected]:~/sources/mono-2.6#

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

Я сделал chmod + x

17
Stefan Steiger

Первая строка, #!/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.

35
Matthias Wandel

Может сценарий использовать Dos NewLines?

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

8
Anton

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

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

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

2
jilles

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

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

и это сделало трюк

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

1
pol

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

например случилось с нами с докос 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

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

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

0
gaoithe

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

sed -i s/{ctrl+v}{ctrl+m}// filename
0
lathomas64

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

. /path/to/it

или вот так:

./it

?

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

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

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

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

0
Tim Post