web-dev-qa-db-ja.com

./(ドットスラッシュ)はコマンドですか?

質問の核:

ソフトウェアをインストールできなかったときに疑問が生じたので、。/について知らなかったため、「コマンドが見つかりません」という出力が実際にコマンドが何であるかを混乱させていたため、私は本当に./について尋ねています。

状況:

ファイルtruecrypt-7.2-setup-x86をインストールしたいと思います。

命令はコマンドを使用するように言います:

Sudo ./truecrypt-7.2-setup-x86

しかし、出力は次のとおりです。

Sudo: ./truecrypt-7.2-setup-x86: command not found

更新:完全を期すため、テストではファイルフォルダーにいましたが、まだファイルを実行可能にしていませんでした(chmod + x)。

15
ubuntubu

./はコマンドではありません。コマンドは./truecrypt-7.2-setup-x86です。

シェルとSudoなどのプログラムは、少なくとも1つの/文字が含まれている場合、コマンドを pathname として扱います。 .は現在のディレクトリを表しているため、./truecrypt-7.2-setup-x86は現在のディレクトリにあるファイルtruecrypt-7.2-setup-x86に名前を付けます。そのようなファイルが存在しない場合、または存在してもファイルを実行できない場合は、エラーメッセージが表示されます。

コマンドにスラッシュが含まれていない場合、 Sergiy Kolodyazhnyyが のように、 $PATH にリストされているディレクトリが検索されます。現在のディレクトリは自動的に検索されません。また、not.$PATHに入れることをお勧めします。そのようにすると、cddをそれらを含むディレクトリに。

現在のディレクトリ 一般的な方法 の実行可能ファイルの名前の前に./を記述して実行しますが、これは実際には特別な構文ではありません。たとえば、$PATHを台無しにして、lsなどのコマンドを実行する必要がある場合は、/bin/lsと書くことができます。その場合または一般に、.は必要ありません。必要なのは、パス名のどこかに/があり、それがパス名であることを意味しています。

.は常に現在のディレクトリであり、/は単なるディレクトリセパレータであるため、最初に行うことは、指定したファイルが現在のディレクトリに実際に存在することを確認することです。 (もしそうなら、 パーミッション をチェックしてください、 Charles Greenが を説明します。しかし、アーカイブからファイルを抽出した場合、それは通常はすでに実行することを意図している場合は、実行可能権限があります。)

24
Eliah Kagan

コマンドの./部分は、「現在のディレクトリを見て、ここからコマンド「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
21
Charles Green

シェルでコマンドを呼び出す方法

いいえ、コマンドではありません。シェルの動作方法は、テキスト行を入力すると、最初のWordがコマンドとして扱われ、コマンドがシェルの組み込みコマンドのいずれでもない場合、シェルはPATH環境にリストされているすべての場所を調べます変数。

実行したいコマンドが現在のディレクトリと同じディレクトリにあるが、そのディレクトリがPATHディレクトリのリストにない場合はどうなりますか? ./を使用する必要があるときです。これは/bin/bashを実行するのとまったく同じ方法です-目的のコマンドがどこにあるのか、それへのフルパスをシェルに伝えています。 ..の場合、シェルに「このディレクトリを検索」と言っています。重要な部分は、ファイルが置かれているのと同じディレクトリにいる必要があるということです。

もちろん、実行可能ファイルを実際に実行するには、実行可能ファイルのビットが設定されている必要があるため、chmod +x ./my_fileが必要です。

重要なステップ:

  1. cdファイルを保存した場所; ~/Downloadsにある場合、cd ~/Downloads
  2. chmod +x ./truecrypt-7.2-setup-x86を実行します。これは、「thisディレクトリ実行可能ファイルにあるファイルtruecrypt-7.2-setup-x86を作成します」と言います。
  3. そして今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

NOTESudoで表示されるエラーメッセージは明らかに誤解を招く可能性があるため、注意が必要です。ただし、このはOPが求めている問題の核心ではないことに注意してください

ドキュメントとリファレンス

bash 4.3マニュアルの「COMMAND EXECUTION」セクションから:

名前がシェル関数でも組み込み関数でもなく、スラッシュが含まれていない場合、bashはPATHの各要素で、その名前の実行可能ファイルを含むディレクトリを検索します。

bashで実行するためにスクリプト名の前に./(ドットスラッシュ)が必要な理由

POSIX指定 を含むコマンド名がファイル名として直接使用され、$ PATHでの検索が抑制されるため、。/で機能します。まったく同じ効果を得るためにフルパスを使用することもできますが、。/は短く、記述しやすいです。

8