web-dev-qa-db-ja.com

#!/ usr / bin / env bashがシステムで動作しないのはなぜですか?

bad interpreterについて不満を言うインストールスクリプトを実行すると、いくつかの問題が発生しました。

ささいな例を作りましたが、何が問題なのかわかりません。以下を参照してください。

#!/usr/bin/env bash
echo "hello"

上記のスクリプトを実行すると、次のエラーが発生します

[root@ech-10-24-130-154 dc-user]# ./junk.sh
bash: ./junk.sh: /usr/bin/env: bad interpreter: No such file or directory

/usr/bin/envファイルが存在します。以下を参照してください:

[root@ech-10-24-130-154 dc-user]# ls -l /usr/bin/env
lrwxrwxrwx 1 root root 13 Jan 27 04:14 /usr/bin/env -> ../../bin/env
[root@ech-10-24-130-154 dc-user]# ls -l /bin/env
-rwxr-xr-x 1 root root 23832 Jul 16  2014 /bin/env
[root@ech-10-24-130-154 dc-user]#

通常のシバン#!/bin/bashを使用するようにスクリプトを変更しても問題ありません。 #!/bin/env bashも機能します。

ポータブルシバンを機能させるために、環境に欠けているものは何ですか?

ls -lL /usr/bin/envls: cannot access /usr/bin/env: No such file or directoryを返すので、シンボリックリンクを変更する必要があると思いますか? /bin/envをポイントできますか?

env --versionは8.4で、OSはRed Hat Enterprise Linux Serverリリース6.6です。

10
conorgriffin

ls -lL /usr/bin/envは、シンボリックリンクが壊れていることを示します。これが、Shebang行が機能しない理由を説明しています。カーネルは、ぶら下がっているシンボリックリンクを実行しようとし、明らかに失敗しています。

/usr/bin/env -> ../../bin/envは、/usrおよび/usr/binが両方とも実際のディレクトリ(シンボリックリンクではない)である場合に正しいです。明らかに、これはあなたのマシンには当てはまりません。多分/usrはシンボリックリンクですか? (明らかに、これは/へのシンボリックリンクではありません。そうでない場合、/usr/bin/env/bin/envと同じファイルであり、シンボリックリンクではありません)。

そのシンボリックリンクを修正する必要があります。あなたはそれを絶対リンクにすることができます:

Sudo ln -snf /bin/env /usr/bin/env

相対リンクにすることもできますが、行う場合は、それが正しいことを確認してください。 /usr/binに切り替えてls -l relative/path/to/bin/envを実行し、シンボリックリンクを作成する前にそれが正しいことを確認します。

これはデフォルトのRHELセットアップではないため、ローカルで何かを変更している必要があります。あなたが何をしたのか、それが他の同様の問題を引き起こしていたのかどうかを調べてみてください。