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


16

質問の核:

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

環境:

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

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

sudo ./truecrypt-7.2-setup-x86

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

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

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


1
./コマンドの一部は、「現在のディレクトリを見て、ここからコマンド「truecrypt-7.2-setup-x86」を実行する」と言っています。ファイルを解凍したディレクトリからこのコマンドを実行する必要があります。
チャールズグリーン

2
@Videonauth-実際には、個人的には、答えのレベルまで上がるとは思わない。
チャールズグリーン

1
@Zanna実行権限なしでスクリプトをテストしましたが、スローされたエラーは、コマンドが見つからないことではなく、権限が見つからないというエラーでした。
チャールズグリーン

2
@ubuntubu OK、非常によく、ディレクトリに移動しました-良い。ただし、編集に関する小さなコメント。コマンドがあるべきchmod +xchmod -x反対である-それは実行権限を削除
Sergiy Kolodyazhnyy

4
質問のタイトルは本文とはまったく異なります。多分それは修正されるべきですか?
デビッドZ

回答:


24

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

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

コマンドにスラッシュが含まれていない場合、Sergiy Kolodyazhnyyが言う$PATHように、そこにリストされているディレクトリが検索されます。されて-現在のディレクトリが自動的に検索されませんではない置くことをお勧めします.$PATH。そうすることで、偶然cdそれらが含まれているディレクトリにdを持っているために、実行するはずのないものを誤って実行することはありません。

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

以来.、常に現在のディレクトリで、/ちょうどディレクトリの区切りで、まず最初に行うには、あなたが本当に現在のディレクトリに存在するファイルの名前たことチェックです。(もしそうなら、Charles Greenが説明するように、そのパーミッションをチェックします。しかし、アーカイブからファイルを抽出した場合、通常、実行することを意図している場合、すでに実行可能なパーミッションを持っています。)


21

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

1
そうでもない。それはrw-あなたの許可としてリストされます- -それがset [gu] idとスティッキービットのためにある前に。
ダンカンXシンプソン

@DuncanXSimpsonありがとう-許可の説明を少し更新しましたが、この回答のsetguidとstickyビットは無視します!
チャールズグリーン

8

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

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

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

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

重要なステップ:

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

の使用./はランダムな動作ではなく、実際にはポータブルオペレーティングシステムインターフェイス標準(別名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

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

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

bash4.3マニュアル、「コマンド実行」セクション:

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

からbashで実行するには、スクリプト名の前に./(ドットスラッシュ)が必要なのはなぜですか?

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


実際には、sudo出力は誤解を招くものです。あなたがなしで同じことをしようとした場合sudo、あなたはから別のエラーを取得しますbashPermission denied。当然のことながら、実行するためのスクリプトのアクセス許可を(経由でchmod +x)与えていないためです。
ルスラン

@Ruslanは、sudo出力が誤解を招くという事実は真実ですが、それが表示されるエラーです。それは開発者に報告し、修正できるようにするものかもしれません。ただし、これは議論の中心ではありません。このようなエラーを生成するためにOPが行ったことを確立し、正しいパスに導く必要がありました。誤解を招くかどうか-それはここの問題ではありません。
セルギーKolodyazhnyy

別の方法では、使用とまったく同じ/bin/bashではありません。実行権限がないスクリプトを実行することはできません。スクリプト名の前にを付けると/bin/bash、実行されるコマンドが実行さ/bin/bashれるため、実行可能という事実のみが重要になります。あなたがそれをしない場合は、スクリプト自体はターンリードであなたの現在のシェルまたは任意の上だのいずれかに、実行されて#!呼び出されたライン
モンティ・ハーダー

@MontyHarder /bin/bashはここの単なる例です。呼び出しているということ/bin/bash./script.sh実行されるものへのパスを指定 することは同じです。でスクリプトを巻頭bash script.sh/bin/bash script.sh完全に実行可能ファイルを実行し、引数としてスクリプトを渡す別のトピック、 -構文はシェル以外の何かのために書かれている場合によって破ることができますしている呼び出しは、言いますcsh/bin/bash実行可能ですが、実際には、まだ完全なパスを指定しています。
セルギーKolodyazhnyy

2
@SergiyKolodyazhnyyでスクリプト名を巻頭/bin/bashあるいは単にbashスクリプトの実行権限の不足を解決するための一般的な方法は。完全なスクリプトパスを指定しても、その問題解決しませ。だから、/bin/bashこの特定の場合に特に悪い例です。
モンティハーダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.