/bin
私のディレクトリには、次の行を含むシェルスクリプトがありますplay applause.mp3
。このファイルはapplause.mp3
実行可能ファイルと同じディレクトリにあります。
ただし、playコマンドでエラーが発生しましたplay FAIL formats: can't open input file 'applause.mp3': No such file or directory
。
ディレクトリから直接ファイルを開くとうまく再生されます/bin
。ファイルがディレクトリ以外の場所に.mp3
ある必要があることは明らかです。/bin
Bashはどこでファイルを探しますか?
答え1
PATH
Bashは、環境変数で指定されたディレクトリで実行するコマンドを探します。
しかし、あなたのシナリオでは、bashはすでにタスクを実行し、play
コマンドを実行しました。applause.mp3
パラメータとして渡されます。それはすべて、play
コマンドがそれをどのように解釈するかによって異なります。
コマンドがファイル名引数を使用する一般的な場合は、現在のディレクトリから始まるパスを確認します(これがスクリプトを/bin
呼び出す前にディレクトリをに変更したときに機能する理由です)。
/
問題を回避するには、パラメータに絶対パス(次から始まる)を使用する必要があります。
答え2
プログラムは、実行可能ファイルと同じディレクトリにユーザーデータファイルを見つけません。場合によっては、同じディレクトリで構成ファイルまたは静的データファイルを見つけます(ただし、これはまれです)。ただし、ユーザーデータとインストールされたプログラムが同じディレクトリにあることはほとんどありません。プログラムは通常、ユーザーが書き込めないシステムディレクトリにあり、ユーザーのファイルは通常ホームディレクトリにあります。
ファイル名をプログラムに渡すと、次のように解釈されます。現在の作業ディレクトリ。すべてのプロセスには、プロセス環境の一部であり、特定のプログラムに関連付けられていない現在の作業ディレクトリがあります。通常はホームディレクトリから始まり、シェルコマンドを使用してcd
別のディレクトリに変更できます。シェルから起動されたすべてのプログラムは、シェルの現在のディレクトリを継承します。
実行すると、現在のディレクトリから呼び出されたファイルをplay applause.mp3
見つけます。applause.mp3
実行可能ファイルがどのディレクトリにあるかは重要ではありませんplay
。
現在のディレクトリに関係なく有効なファイル名を使用するには、次のように渡します。絶対ファイル名(で始まる/
)。シェルスクリプトまたはコマンドラインでは、先頭に~
省略形を使用してホームディレクトリを表すことができます。たとえば、ホームディレクトリのサブディレクトリにあるファイルで実行しますplay ~/music/applause.mp3
。play
applause.mp3
music
1可能ですが、ほとんどそうではありません。