ソフトウェアをインストールできなかったときに疑問が生じたので、。/について知らなかったため、「コマンドが見つかりません」という出力が実際にコマンドが何であるかを混乱させていたため、私は本当に./について尋ねています。
ファイルtruecrypt-7.2-setup-x86
をインストールしたいと思います。
命令はコマンドを使用するように言います:
Sudo ./truecrypt-7.2-setup-x86
しかし、出力は次のとおりです。
Sudo: ./truecrypt-7.2-setup-x86: command not found
更新:完全を期すため、テストではファイルフォルダーにいましたが、まだファイルを実行可能にしていませんでした(chmod + x)。
./
はコマンドではありません。コマンドは./truecrypt-7.2-setup-x86
です。シェルとSudo
などのプログラムは、少なくとも1つの/
文字が含まれている場合、コマンドを pathname として扱います。 .
は現在のディレクトリを表しているため、./truecrypt-7.2-setup-x86
は現在のディレクトリにあるファイルtruecrypt-7.2-setup-x86
に名前を付けます。そのようなファイルが存在しない場合、または存在してもファイルを実行できない場合は、エラーメッセージが表示されます。
コマンドにスラッシュが含まれていない場合、 Sergiy Kolodyazhnyyが のように、 $PATH
にリストされているディレクトリが検索されます。現在のディレクトリは自動的に検索されません。また、not.
を$PATH
に入れることをお勧めします。そのようにすると、cd
dをそれらを含むディレクトリに。
現在のディレクトリ 一般的な方法 の実行可能ファイルの名前の前に./
を記述して実行しますが、これは実際には特別な構文ではありません。たとえば、$PATH
を台無しにして、ls
などのコマンドを実行する必要がある場合は、/bin/ls
と書くことができます。その場合または一般に、.
は必要ありません。必要なのは、パス名のどこかに/
があり、それがパス名であることを意味しています。
.
は常に現在のディレクトリであり、/
は単なるディレクトリセパレータであるため、最初に行うことは、指定したファイルが現在のディレクトリに実際に存在することを確認することです。 (もしそうなら、 パーミッション をチェックしてください、 Charles Greenが を説明します。しかし、アーカイブからファイルを抽出した場合、それは通常はすでに実行することを意図している場合は、実行可能権限があります。)
コマンドの./部分は、「現在のディレクトリを見て、ここからコマンド「truecrypt-7.2-setup-x86」を実行します」と言っています。ファイルを解凍したディレクトリからこのコマンドを実行する必要があります。
これはテストできます:コマンドを試行しているのと同じ端末ウィンドウで、コマンドls -l true*
を入力します-ファイルが現在の作業ディレクトリに存在する場合、ファイルを示すリスト(および追加情報の束) )が表示されます。
Zannaがコメントで指摘したように、ファイルには実行権限がない可能性があります-これは簡単に修正できます。テストケースとして、私のディレクトリは
chick@dad:~/test$ ls -l
total 4
-rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$
ファイル "rFullBack"には、ファイルの読み取りと書き込みの許可として「-rw-」がリストされています。コマンドchmod +x rFullBack
を実行すると、ディレクトリリストの変更が
chick@dad:~/test$ ls -l
total 4
-rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$
そこで、私の許可は「-rwx」になり、ファイルを実行できることを示します。
要するに、ファイルがディレクトリに存在する場合
コマンドを実行する
chmod +x ./truecrypt-7.2-setup-x86
そして、コマンド
Sudo ./truecrypt-7.2-setup-x86
いいえ、コマンドではありません。シェルの動作方法は、テキスト行を入力すると、最初のWordがコマンドとして扱われ、コマンドがシェルの組み込みコマンドのいずれでもない場合、シェルはPATH
環境にリストされているすべての場所を調べます変数。
実行したいコマンドが現在のディレクトリと同じディレクトリにあるが、そのディレクトリがPATH
ディレクトリのリストにない場合はどうなりますか? ./
を使用する必要があるときです。これは/bin/bash
を実行するのとまったく同じ方法です-目的のコマンドがどこにあるのか、それへのフルパスをシェルに伝えています。 ..の場合、シェルに「このディレクトリを検索」と言っています。重要な部分は、ファイルが置かれているのと同じディレクトリにいる必要があるということです。
もちろん、実行可能ファイルを実際に実行するには、実行可能ファイルのビットが設定されている必要があるため、chmod +x ./my_file
が必要です。
重要なステップ:
cd
ファイルを保存した場所; ~/Downloads
にある場合、cd ~/Downloads
chmod +x ./truecrypt-7.2-setup-x86
を実行します。これは、「thisディレクトリ実行可能ファイルにあるファイルtruecrypt-7.2-setup-x86を作成します」と言います。Sudo ./truecrypt-7.2-setup-x86
./
の使用はランダムな動作ではなく、実際には Portable Operating System Interface standard(aka POSIX) で指定された標準であることに注意してください。具体的には「コマンドの検索と実行」を参照してください。
$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh
/home/xieerqi/Downloads/my_script.sh
$ # if I run Sudo ./my_script.sh, we get an error
$ Sudo ./my_script.sh
[Sudo] password for xieerqi:
Sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not Sudo's problem
$ # but Sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/
$ Sudo ./my_script.sh
[Sudo] password for xieerqi:
Sudo: ./my_script.sh: command not found
NOTE:Sudo
で表示されるエラーメッセージは明らかに誤解を招く可能性があるため、注意が必要です。ただし、このはOPが求めている問題の核心ではないことに注意してください。
bash
4.3マニュアルの「COMMAND EXECUTION」セクションから:
名前がシェル関数でも組み込み関数でもなく、スラッシュが含まれていない場合、bashはPATHの各要素で、その名前の実行可能ファイルを含むディレクトリを検索します。
bashで実行するためにスクリプト名の前に./(ドットスラッシュ)が必要な理由 :
POSIX指定 を含むコマンド名がファイル名として直接使用され、$ PATHでの検索が抑制されるため、。/で機能します。まったく同じ効果を得るためにフルパスを使用することもできますが、。/は短く、記述しやすいです。