web-dev-qa-db-ja.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パスは正しいようです:

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

20
Stefan Steiger

最初の行#!/bin/bashは、インタープリターの場所をLinuxに指示します。スクリプトはchmod +x script.shでも実行可能である必要があります。

このファイルは、各行の終わりに<cr><lf>を配置するWindowsエディターで作成した可能性が高いです。これは、DOS/Windowsでの標準です。 OS Xは、各行の終わりに<cr>を配置します。ただし、Unix/Linuxの場合、標準は<lf>を行末に置くだけです。

Linuxは現在、ファイルを解釈するために/bin/bash<cr>というファイルを探しています。ここで、<cr>は、Linuxで有効なファイル文字であるキャリッジリターン文字です。そのようなファイルは存在しません。したがってエラー。

ソリューション: Linuxのエディターでファイルを編集し、余分な<cr>を削除します。 Windowsでファイルを編集するときに通常機能するツールの1つはdos2unixです。

39
Matthias Wandel

スクリプトでDos改行を使用できますか?

その上でdos2unixを実行してみてください。

8
Anton

何かがexport組み込みをオーバーライドするように設定されているようです。これは、たとえば、エクスポートされた関数またはenableビルトインを介して行うことができます。スクリプトにtype exportを入れて確認してください。 BASH_ENVを設定している場合は、設定しないでください。

Bashがshとして呼び出された場合、POSIXモードが有効になり、POSIXの必要に応じて、exportを関数でオーバーライドすることができなくなります。同様に、/bin/shとしてインストールされた他のほとんどのシェルは、これでPOSIXに従い、および/またはスクリプトの実行環境を、環境から関数をインポートする場合ほど強く混乱させることができません。

ちなみに、スクリプトは. ./mono-2.6-environmentではなく./mono-2.6-environmentのように設計されているようです。

2
jilles

同じ問題があった。使用されたブルートフォース:

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

&これはトリックをしました

(もちろん、その理由を知りたい)

1
pol

これは、ファイルシステムがおかしくなったときに時々起こります。ファイルを移動するか名前を変更してください。 「古いファイルハンドル」エラーが表示される場合は、これが問題です。

例えば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

ファイルをコピーして読み取ることができます。しかし、動かさないでください!それも削除しません。たぶん奇妙なドッカーファイルシステムのことかもしれません。

解決策: Dockerコンテナを再作成するORファイルシステムの修復ディスクが役立つORもちろんformat c: :-行う

0
gaoithe

私にとってうまくいったのは、dos2Unixが私が使用していたシステム上にないときでした:

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

このように実行しましたか(chmod + xについて言及しました)

. /path/to/it

またはこのように:

./it

私はあなたのコードが新しいプロセスで実行され、あなたが言ったすべてのものが失われたのではないかと疑っています。したがって、変数はcurrentシェルでは展開されません。ただし、これはあなたが見たbad interpreterエラーを説明するものではありません。端末の問題もあると思います(端末の場合と同様、catと話していたものです)。

あなたのプロンプトがこれが言ったことをしなかったという事実:

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

コードを調達したのではなく、実行したと思います。違いがあります。あなたが投稿したものを壊すことができませんでした。

0
Tim Post