シェルでコマンドを呼び出す方法
いいえ、コマンドではありません。シェルが機能する方法は、テキスト行を入力すると、最初の単語がコマンドとして扱われ、コマンドがシェル組み込みコマンドのいずれでもない場合、シェルはPATH
環境変数にリストされているすべての場所を検索します。
実行したいコマンドが現在のディレクトリと同じディレクトリにあるが、そのディレクトリがディレクトリのリストにない場合はPATH
どうなりますか?使用する必要があるときです./
。方法とまったく同じ/bin/bash
です。目的のコマンドがどこにあるのか、それへのフルパスをシェルに伝えています。..の場合、シェルに「このディレクトリを見て」と言っています。重要な部分は、ファイルが置かれているのと同じディレクトリにいる必要があるということです。
もちろん、実行可能ファイルを実際に実行するには、実行可能ビットが設定されている必要があるため、を実行する必要がありますchmod +x ./my_file
。
重要なステップ:
cd
ファイルを保存した場所。にある場合~/Downloads
、cd ~/Downloads
- 実行
chmod +x ./truecrypt-7.2-setup-x86
、これは「このディレクトリの実行可能ファイルにあるファイルtruecrypt-7.2-setup-x86を作成する」と言います
- そして今やる
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が求めている問題の中核ではないことに注意してください。
ドキュメントとリファレンス
bash
4.3マニュアル、「コマンド実行」セクション:
名前がシェル関数でも組み込み関数でもなく、スラッシュが含まれていない場合、bashはPATHの各要素で、その名前の実行可能ファイルを含むディレクトリを検索します。
からbashで実行するには、スクリプト名の前に./(ドットスラッシュ)が必要なのはなぜですか?:
それはで動作します./ため、POSIXの指定 /が含まれているコマンド名が$ PATHで検索を抑制し、直接ファイル名として使用されること。まったく同じ効果を得るためにフルパスを使用することもできますが、。/は短く、記述しやすいです。
./
コマンドの一部は、「現在のディレクトリを見て、ここからコマンド「truecrypt-7.2-setup-x86」を実行する」と言っています。ファイルを解凍したディレクトリからこのコマンドを実行する必要があります。