envsのすべてのパスを別のパスに置き換える方法は?

envsのすべてのパスを別のパスに置き換える方法は?

私は次のような状況にあります。

私のすべてのソフトウェアはその/home/daniel/*パスにインストールされ、内部的に参照されます。ただし、ネットワークドライブを使用すると参照がに変わり、/home/foo/danielソフトウェアを使用できなくなります。

たとえば、いくつかのプログラムを呼び出すか、いくつかの環境変数を変更してgoパスを変更する方法はありますか?それとも2つのプログラムが必要ですか?

答え1

ソフトウェアがどのように機能するかによって異なります。おすすめ内部パスで。

環境変数を介してのみ実行できる場合は、次のことができます。

eval "$(export -p | sed 's|/home/daniel|/home/foo/daniel|g')"

すべての/home/danielsを対応/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の回答があり、そのうちのいくつかは上記の回答のバリエーションです。

関連情報