のように、コマンドラインから呼び出すことができるプログラムを作成しています./prog arg1 arg2
。システムのどこからでも実行できるようにするにはどうすればよいのでしょうか。私はに入れることができることを知っていprog
ます/usr/bin/
が、私のプログラムがそのインストールディレクトリ(ユーザーがそれをダウンロードした場所ならどこでも可能です)からのリソースを必要とする場合はどうなりますか?
4 に答える
プログラムが存在するディレクトリをpath
環境変数に配置するか、プログラムをすでに存在するディレクトリの1つに移動しますpath
(通常、スーパーユーザーのアクセス許可が必要です。これは、あなたが持っていないので、この質問はしません)。
検索パスの前にディレクトリを追加し、システムにデータベースを更新させるにはtcsh
、
setenv "my/directory:"$PATH
rehash
にbash
、私は思う、それは
PATH=/my/directory:$PATH
export PATH
(再ハッシュする必要はありません)。上記のコマンドは、ディレクトリを検索パスの一番上に配置することに注意してください。つまり、これらは他のどのコマンドよりも先に検索されます。したがって、プログラムが「gcc」と呼ばれる場合、GNUCコンパイラではなくプログラムが実行されます。または、検索パスの最後にディレクトリを追加することもできます。この場合、検索パスの他のディレクトリに同じ名前の他のプログラムが見つからない場合にのみ、プログラムが選択されます。
また、 Linuxファイルシステム階層(「何がどこに行くか」の標準的な定義)についても理解したいと思うかもしれません。詳細は次のとおりです。
環境変数は、グローバルに(「すべての人に」など/etc/profile
)、またはローカルに(「ユーザーごとに」など)定義できます~/.bashrc
。ここにあなたのオプションのいくつかの良い要約があります:
を使用してプログラムを実行する場合prog arg1 arg2
、シェルのおかげで、プログラムが存在するフォルダーを$PATH環境変数で検索します。(env | grep PATH
それらのフォルダーを表示してみてください)。
この変数に新しいディレクトリを追加するか(export PATH="/new/directory/path/:$PATH"
bashの下にあるsetenv PATH "/new/directory/path/:$PATH"
場合、tcshを使用している場合)、プログラムと実行する必要のあるすべてのファイルをPATHフォルダーの1つにコピーする必要があります。
これに対処するには2つの方法があります(Makefileはそれらとは何の関係もありません)
インストーラーはファイルを必要な場所に配置できるため、プログラムは検索する必要がなく、ハードコードされたパスを使用できます。または、データディレクトリへのパスを、ハードコードされた別のファイル(/etc/programname.configなど)に配置することもできます。
すべてのものを1つのディレクトリ(多くの場合、/ opt / programnameなど)に配置します。もちろん、それをハードコーディングすることもできますし、プログラムで/ proc / pid / exeファイルをreadlink()することもできます(ただし、保証はありません。特に、たとえばシンボリックリンクを使用して/を指す場合に機能します。 usr / bin/programnameから/opt/ programname / bin / programnameなどに変更しますが、実行可能ファイルへのパスを取得するためのハードリンクの場合は機能しません。そこから、データファイルにアクセスできるはずです。
2番目の解決策を好む場合でも、それは私だけです。最初のソリューションはパッケージマネージャーでうまく機能し、実際に多くのデータファイルがない場合でもやり過ぎは少なくなります。