私は次のような状況にあります。
私のすべてのソフトウェアはその/home/daniel/*
パスにインストールされ、内部的に参照されます。ただし、ネットワークドライブを使用すると参照がに変わり、/home/foo/daniel
ソフトウェアを使用できなくなります。
たとえば、いくつかのプログラムを呼び出すか、いくつかの環境変数を変更してgoパスを変更する方法はありますか?それとも2つのプログラムが必要ですか?
答え1
ソフトウェアがどのように機能するかによって異なります。おすすめ内部パスで。
環境変数を介してのみ実行できる場合は、次のことができます。
eval "$(export -p | sed 's|/home/daniel|/home/foo/daniel|g')"
すべての/home/daniel
sを対応/home/foo/daniel
する値に変更します。
追加/home/foo/daniel/lib
(または共有ライブラリがインストールされている場所)は、プログラム$LD_LIBRARY_PATH
でそのライブラリを見つけるのに役立ちます。ただし、一部のソフトウェアがconfファイルを見つけるか、または特定の/home/daniel/etc
データファイルを見つけるようにハードコードされている場合は、/home/daniel/share
それを上書きするように設定できる同等の標準環境変数がありません。
問題を解決するために/home/daniel
- >シンボリックリンクを追加したり、chrootまたはユーザーインストールの名前空間を作成できない場合は、たとえばソフトウェアを再コンパイルすることをお勧めします。これにより、任意の場所にいつでもシンボリックリンクを使用できます。../foo/daniel
--prefix=/var/tmp/daniel
答え2
私はあなたがシェルスクリプトについて話していると仮定します。スクリプト名を使用できるという事実を活用してください $0
。残念ながら、これは./myprog
役に立たないように見えるかもしれませんので、realpath
フルパス名を取得するには(またはそれに対応する)を使用してください。
あなたの質問が示すように、これは常に機能するはずです。しかし、十分でない場合は、$PWD
代わりに使用してみてください。次のコードは操作を「する」必要があります。
getdir()
{
case "$1" in
(*/daniel/*)
my_dir=$(printf '%s\n' "$1" | sed 's|/daniel/.*|/daniel|'
return 0
(*)
return 1
esac
}
getdir $(realpath "$0") || getdir "$PWD" || { echo "I dunno."; exit 1; }
したがって、スクリプトが現在次のように話している場合
date >> /home/daniel/log
あなたはそれに変わります
date >> "$my_dir"/log
私は偶然見つけました。スクリプト自体からBashスクリプトのソースディレクトリを取得するにはどうすればよいですか?、72の回答があり、そのうちのいくつかは上記の回答のバリエーションです。