$ PATHにスペースを含むファイルにコマンドを適用するには?

$ PATHにスペースを含むファイルにコマンドを適用するには?

私の$ PATHには/a/path/with space/in/itがあります。

そのパスにある実行可能ファイルを実行するには、実行可能ファイル名を入力するだけです。

ただし、コマンドを適用しようとすると、「見つかりません」エラーで失敗します。

例えば。私のパスにprog.pyというPythonスクリプトがあります。

prog.pyと入力すると、シェルはそれを実行しようとします。したがって、このパスは有効です。しかし:

$ python3 prog.py

python3: can't open file 'prog.py': [Errno 2] No such file or directory

$ file prog.py

prog.py: cannot open `prog.py' (No such file or directory)

prog.pyの実際の場所に移動して同じコマンドを試してみると、期待どおりに実行されます。

$ file ./prog.py

./prog.py: Python script, ASCII text executable

$ python3 ./prog.py

True

なぜこれが起こるのですか?どこにいても(特にpython3)、これらのコマンドを実行するにはどうすればよいですか?

答え1

これは、スペースを含むディレクトリ名とは関係ありません。相対パスを実行またはpython3 prog.py指定するfile prog.pyと、標準のUnixセマンティクスは現在の作業ディレクトリで開かれることを意味します。これを変える合理的な方法はありません。

しかし、スクリプトを実行可能にして()上部に正しい行があることをchmod +x /path/to/prog.py確認したら(おそらく)、(いいえ)と言ってどこでも実行できます。#!#! /usr/bin/python3prog.pypython3 prog.py

$PATHところで、通常、プログラムが実装を指定する拡張を含めないことをお勧めします。これは事実上階層化違反だからです。prog代わりに(適切な置換を使用して)呼び出すことをお勧めしますprog.py

答え2

問題はスペースではないと思います。スペースなしでパスを試してみましたか?

重要なのは$PATH、任意のファイルタイプではなく実行可能ファイルのパスを見つけることです。

たとえば、不足しているライブラリに対して文句を言う実行可能ファイルがある場合、$LD_LIBRARY_PATHファイルは 。ファイルの場所を追加しても$PATH役に立ちません。一方、コンパイル時に見つからないライブラリが見つかった場合は、他の変数(例$LIBRARY_PATH:。

したがって、最善の解決策は、Pythonスクリプトに適切なshebangを追加し、$PATH必要に応じてインポートできるようにすることです$PYTHONPATH

答え3

prog.pyファイルを参照する方法は次のとおりです。

python3 prog.py「現在の作業ディレクトリにprog.pyというファイルがあります」と言います。

2番目の例 - 使用する場所./prog.py- 「現在のディレクトリにprog.pyというプログラムを見つけることができます」と明示的に指定します。

$ PATHは、引数ではなくコマンドに対してのみ検索されます。

catPythonバイナリ(またはorまたはsedor ...などの他のバイナリ)を呼び出すには、less$ PATHにする必要があります。他のファイルを参照するには、常にファイルへのフル相対パスまたは絶対パス全体を指定する必要があります。

関連情報