0

私はbashの場所を見つけて、それをシバンで使用するスクリプトを設定しようとしています。私が読んだサンプルスクリプトは、そうでない場合に備えてenvシンボリックリンクを使用すると言っていたので、使用していません。それを見つけてリンクを設定するために使用できますか?私が抱えている問題は、コマンドが見つからない場合の戻り値を比較することです(-1) 編集:マニュアルを間違って読んだ場合、agrsが送信されない場合にのみ-1が返されますenvusr/binwhichbashwhichwhich

/bin/bashしかし、-1は改行であり、それを比較すると、文字列を数値-1と比較しているというエラーが発生します。

私はいくつかの異なる方法を試しましたが、それを機能させる方法を理解できません

newname=$(which bash)
echo $newname
fault=-1
if [ "$newname" = fault ] ; then
echo couldn\'t find bash shell
else
#! newname
4

4 に答える 4

3

bashの場所を見つけて、それをシバンで使用するスクリプトを設定しようとしています

あなたはそれをすることはできません。とにかく、現在起こっていることは、スクリプトがデフォルトでシェルによって実行されていることです。そうでない場合、シェルを使用してスクリプト内のシェルの場所を取得するにはどうすればよいでしょうか。名前を「script.blah」に変更してシバンを削除しても、実行可能でシェルコマンドが含まれている限り、シェルはそれを実行します。

ページの途中にシバンを置いても、何の意味もありません。コメントになります。シバンをシバンにするには、ファイルの最初の2文字である#!必要があります。これは、シェルに何にでも渡すように指示することです。それが見つからない場合は、とにかくシェルスクリプトであると見なします。その後、他のシェルまたはインタープリターを呼び出す場合は、コマンドラインで行うのと同じ方法で行う必要があります。

于 2012-05-07T06:25:33.343 に答える
2

実行していることを実行する理由がまったくないだけでなく、シェルの場所を検出しようとすると、スクリプトがすでにシェルで実行されていると想定されます。

あなたが読んだことは何でもenv間違っています。シンボリックリンクであると期待する理由はありません。アンダーを見つけるよりもアンダーを見つける可能性がわずかに高いため、人々envはシバンで使用しますが、多くの人々はそれを気にしません。おそらく、このようにフープを飛び越えている理由は、移植性のためです。この場合、非常に悪い、非標準的な選択です。代わりに、またはをkshで使用してください。例えば:env/usr/binBash/binwhichtypewhence

if x=$(type -p bash); then
    "$x" myscript
else
    echo "Not found" >&2
fi

残念ながら、正確に何をするかtypeは、あまりよく標準化されていません。コマンドを実行するだけで、シェルはその処理を実行するか、エラーをスローします。コマンドの存在を確認する必要があるのは、まれな状況の場合のみです。

于 2012-05-07T06:50:49.103 に答える
1

$?最後に実行したプロセスの戻り値を参照するために使用できます。例えば:

name=$(which bash)
if [[ $? == 0 ]]; 
    then echo "found"; 
fi

ノート

あなたの質問では、エラーは常に-1であると想定しているようです。一般的に、これは真実ではありません。プログラムはゼロ以外のエラーコードをシェルに返します。したがって、0は成功であり、他の値(-1を含む)は失敗です。

于 2012-05-07T06:20:20.423 に答える
1

あなたは走ることができます

which bash && found=true

Foundは、正常に終了した場合にのみ設定されます(つまり、見つかった場合)。

于 2012-05-07T06:26:09.587 に答える