hello_world.c
単純なファイルがあります。ここ。私はそれを行う方法を見つけました。
gcc -Wall -g hello_world.c -o hello
動作していますが、実行するとbash hello
エラーが発生します。hello: hello: cannot execute binary file
sh hello
その後、エラー:hello: 1: Syntax error: "(" unexpected
./hello
予想される行が印刷されました。
3人は全く同じだと思いましたが、結果からではありません。なぜ他の2つは動作しないのですか?これに加えて、./hello
このファイルを呼び出す他の方法はありますかhello
?
答え1
最初の2回の試みbash hello
では、ファイルがシェル実行可能ファイルであることをこれらのシェル(およびsh hello
それぞれ)に確実にしようとします。バイナリファイルなので、シェルはファイルを実行するように指示され、何をすべきかわからないため、これらのエラーメッセージが表示されます。 3番目の例では、シェルが実行を期待するようにバイナリをバイナリとして実行します。これは、単に現在のディレクトリ()でバイナリを見つけることができる場所を示す表示にすぎません。なぜ必要ですか?ほとんどの場合、「現在の作業ディレクトリ」は変数の一部ではないため、単に実行しても実行可能ファイルをどこにも見つけることはできません。bash
sh
hello
hello
./
.
./
$PATH
hello
答え2
Linuxスクリプトを実行するために./(ドットスラッシュ)を使用するのはなぜですか?
Unix ./script構文は3つの部分で説明できます。
Linux./表記では、アプリケーションPATHの役割は、現在のディレクトリが既存のコマンドとの競合を避ける必要があることを示しています。
Unix ドットスラッシュと PATH 各コンピュータにはアプリケーションパスがあります。これは、実行可能コマンドまたは実行可能スクリプトが呼び出されたときにオペレーティングシステムが見つけるディレクトリの集まりです。
使い慣れた組み込みコマンド(ls、cat、echo、touch、chmodなど)はアプリケーションPATHにあります。ユーザーは通常、JDKまたはGitで一般的に使用されるプログラムをアプリケーションPATHに入れます。
問題は、自分で作成したスクリプトを呼び出そうとすると、そのスクリプトがアプリケーションパスに含まれているフォルダに保存されないことがあります。つまり、PATHでコマンドなどのカスタムスクリプトを実行すると、Linuxオペレーティングシステムはそのスクリプトを見つけることができません。
Linuxでは./の意味 ここにドットスラッシュ./記号が入るところです。これは「現在のディレクトリで検索」を意味します。 ./を使用すると、Ubuntu、Fedora、SUSE、または使用しているすべてのLinuxディストリビューションで実行するコマンドを現在のディレクトリで見つけ、アプリケーションPATの内容を完全に無視するように指示します。