質問:次のエラーメッセージが表示されます。
エクスポート:不正なインタープリター:そのようなファイルまたはディレクトリーはありません
この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
最初の行#!/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
です。
スクリプトでDos改行を使用できますか?
その上でdos2unixを実行してみてください。
何かがexport
組み込みをオーバーライドするように設定されているようです。これは、たとえば、エクスポートされた関数またはenable
ビルトインを介して行うことができます。スクリプトにtype export
を入れて確認してください。 BASH_ENV
を設定している場合は、設定しないでください。
Bashがsh
として呼び出された場合、POSIXモードが有効になり、POSIXの必要に応じて、export
を関数でオーバーライドすることができなくなります。同様に、/bin/sh
としてインストールされた他のほとんどのシェルは、これでPOSIXに従い、および/またはスクリプトの実行環境を、環境から関数をインポートする場合ほど強く混乱させることができません。
ちなみに、スクリプトは. ./mono-2.6-environment
ではなく./mono-2.6-environment
のように設計されているようです。
同じ問題があった。使用されたブルートフォース:
/bin/sh /full/path/to/configure --options
&これはトリックをしました
(もちろん、その理由を知りたい)
これは、ファイルシステムがおかしくなったときに時々起こります。ファイルを移動するか名前を変更してください。 「古いファイルハンドル」エラーが表示される場合は、これが問題です。
例えば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:
:-行う
私にとってうまくいったのは、dos2Unixが私が使用していたシステム上にないときでした:
sed -i s/{ctrl+v}{ctrl+m}// filename
このように実行しましたか(chmod + xについて言及しました)
. /path/to/it
またはこのように:
./it
?
私はあなたのコードが新しいプロセスで実行され、あなたが言ったすべてのものが失われたのではないかと疑っています。したがって、変数はcurrentシェルでは展開されません。ただし、これはあなたが見たbad interpreterエラーを説明するものではありません。端末の問題もあると思います(端末の場合と同様、cat
と話していたものです)。
あなたのプロンプトがこれが言ったことをしなかったという事実:
`PS1="[mono-2.6] \w @` "
コードを調達したのではなく、実行したと思います。違いがあります。あなたが投稿したものを壊すことができませんでした。