Bash script: bad interpreter

2019-01-05 04:39发布

Question: I get this error message:

export: bad interpreter: No such file or directory

when I execute this bash script:

#!/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 @ "

But the bash path seems to be correct:

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#

What am I doing wrong? Or is this a Lucid Lynx bug?

I did chmod + x

7条回答
Juvenile、少年°
2楼-- · 2019-01-05 05:10

The first line, #!/bin/bash, tells Linux where to find the interpreter. The script should also be executable with chmod +x script.sh, which it appears you did.

It is highly likely that you created this file with a windows editor, which will place a <cr><lf> at the end of each line. This is the standard under dos / windows. OS X will place a <cr> at the end of each line. However, under Unix / Linux, the standard is to just put a <lf> at the end of the line.

Linux is now looking for a file called /bin/bash<cr> to interpret the file, where <cr> is a carriage return character, which is a valid file character under Linux. Such a file doesn't exist. Hence the error.

Solution: Edit the file with an editor on Linux and get rid of the extra <cr>. One tool that usually works when the file is edited on Windows is dos2unix.

查看更多
叼着烟拽天下
3楼-- · 2019-01-05 05:12

what worked for me was when dos2Unix wasn't on the system I was working with:

sed -i s/{ctrl+v}{ctrl+m}// filename
查看更多
混吃等死
4楼-- · 2019-01-05 05:22

Had the same problem. Used brute force:

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

& this did the trick

(Of course I'd like to know why)

查看更多
三岁会撩人
5楼-- · 2019-01-05 05:25

It looks like things have been configured to override the export builtin somehow. This can be done via an exported function or the enable builtin, for example. Try putting type export in the script to check. If you are setting BASH_ENV, you probably shouldn't.

If bash is called as sh, it enables POSIX mode and does not allow export to be overridden with a function, as required by POSIX. Likewise, most other shells installed as /bin/sh follow POSIX in this and/or do not allow the execution environment of a script to be messed up so strongly as through importing functions from the environment.

By the way, the script seems designed to be sourced, i.e. . ./mono-2.6-environment instead of ./mono-2.6-environment.

查看更多
贼婆χ
6楼-- · 2019-01-05 05:25

This happens sometimes when file system goes funny. Try to move or rename the file. If you see "Stale file handle" error this is your problem.

e.g. happened us with CentOS docker

$ ./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

You can copy the file and read it. But not move it! Nor remove it. Some weird docker file-system thing maybe.

Solution: re-create the docker container OR maybe file system repair disk would help OR of course format c: :-D :-o

查看更多
ゆ 、 Hurt°
7楼-- · 2019-01-05 05:30

Did you run it like this (you did mention chmod +x)

. /path/to/it

or like this:

./it

?

I have a sneaking suspicion that your code executed in a new process, and everything you told it was lost. Hence, variables will not be expanded in your current shell. However, this does not explain the bad interpreter error that you saw. I think you also have a terminal problem (as in terminal, what you used to talk to cat).

The fact that your prompt did not do what this said:

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

Makes me think you ran, not sourced the code. There is a difference. I could not get what you posted to break.

查看更多
登录 后发表回答