web-dev-qa-db-ja.com

変数のシンボリックリンクを作成するにはどうすればよいですか? (または同様のもの)

現在のユーザーに応じて別の場所を指す 変数シンボリックリンク を作成するにはどうすればよいですか?出来ますか?代わりに他のものを使用する必要がありますか?マウントポイント?どうやって?

別の解決策に遭遇した場合の問題は次のとおりです。

ここで私たちは、SVNを使用してUnixで開発しているチームです。私たちは皆、同じ開発マシンを(リモートで)使用しています。そのため、さまざまな場所にチェックアウトがあります(/ homeではなく、特定のディレクトリが別のディスクにマウントされています。たとえば、/ svn/[userlogin] /)。

スクリプトとツールを使用します。一部の特別なツールには、ソースファイルのパスを含む複雑な構成とプロジェクトファイルがあります。これはエラーが発生しやすく、常に再作成する必要がある不適切な構成または「プロジェクト」のために多くの時間を失います。この複雑な構成とプロジェクトファイルをすべての開発者間で共有したいと思います。

しかし、さまざまなチェックアウトで作業しているときにそのようなファイルを共有するには、次のいずれかを行う必要があります。

  • config/projectに保存されているパスをオンザフライで修正して、現在のユーザーに適合させます
  • シンボリックリンク/マウント/ポイントがユーザーに応じて異なる場所を指す「魔法の」固定パスを作成します(同じプロジェクトファイルですが、異なるソースを指します)

その前は、すべての人に同じパスのビュー(たとえば、/ vob)をマウントするクリアケースを使用し、各開発者は自分のビューを表示していました。便利でした。

どうすれば同様のことができますか?別の解決策を考えられますか?ありがとう。

-編集-

EclipseIDEのことを考えていました。いくつかのワークスペース設定、プロジェクト、および実行/デバッグ構成を共有したいと思います。 Eclipse(+ plugin)設定は50以上の小さなファイルで構成されているため、それらを編集することは問題外です。

クリアケースでは、固定された「/ vob」パスのおかげで簡単でした。このパスは、端末ごとに、選択した「ビュー」を自動的に指していました。

似たようなものが欲しいのですが。 / svn/mysourceが必要です。これは、端末ごとに、ユーザーに依存するパスにあるユーザーの現在のチェックアウトを指します。

6
Offirmo

最近これを見ている人のために、呼び出し元のユーザーのホームディレクトリに相対的なディレクトリに呼び出しを転送する HomeFS という小さなFuseファイルシステムを作成しました。

つまり、ユーザーTylerとユーザーSarahがいて、HomeFSマウントポイントが/usr/share/bigsoft/configで、相対ディレクトリが.config/bigsoftの場合、Tylerがls /usr/share/bigsoftを実行すると、/home/tyler/.config/bigsoftの内容が表示され、Sarahは/home/sarah/.config/bigsoftの内容を表示します。

主に、これは、一部のWindowsソフトウェアがどのように機能するかと同様に、変数ファイルが「インストールディレクトリ」にあることを要求するプロプライエタリソフトウェアを回避するためのものです。

2
Dylan Frese

これは、アプリ構成がコマンドを処理できるか、シェル変数を補間できるかによって異なります。

Bashログインシェルは、ログインシェルに環境変数LOGNAMEを設定します。
アプリケーションが構成内のシェル変数を補間する場合は、構成内で/ svn/$ {LOGNAME} /を使用できます。次に、各ユーザーが自分のパスを参照して、共通の構成を共有できます。

アプリケーションが構成内のシェル変数を補間しない場合は、/ svnパスへの一般的な参照を作成する各ユーザーのシンボリックリンクを作成し、共有構成で一般的な名前を使用できます。

whoは現在のユーザー名を一覧表示します。
各ユーザーがセットアップ時に1回実行してシンボリックリンクを作成するスクリプトを作成する場合。

ln -s /svn/$(who) /svn/anyuser

次に、/ svn/anyuserを参照する共通の構成を共有します(自分に合った一般的な名前を選択してください)

リンクの使用に気付かないnoobユーザーに注意してリンクを削除してください(管理者に昇格したばかりです:)

1
bsd

したがって、各ユーザーにファイルシステム内の異なるものを表示する必要があります。 Unixは実際にはそのように設計されていません(VMSとPlan9はそれを簡単にします)。

私が知っている唯一の方法はchroot()を使用することですが、切り替えた階層にないものはすべてマスクします。シンボリックリンクは階層に残り、難しいものはディレクトリでは役に立ちません。 Fuseファイルシステムを使用して、必要なビューを提供しながら真のルートをミラーリングできるはずです。次に、その位置にchrootします。自分に合った既存のものが見つからない場合は、1つ書くことができます...

1
AProgrammer

AMD(オートマウンターデーモン)はすでに同様のことをしているので、おそらくハックすることができます。

 linux#df/home 
 Filesystem 1K-blocks Used Avail Capacity Mounted on 
 pid174 @ repoman:/ home 0 0 0 100%/ home 
 linux#ps 174 
 PID TT STAT TIME COMMAND 
 174 ?? Ss 0:15.76 AMD -p -a /.AMD_mnt -l syslog/home/etc/AMD。ホーム

オートマウンタを使用すると、/ homeはディレクトリのように見え、stat( "/ home/user")を実行すると、 "user"が他のディレクトリへのシンボリックリンクであることを示す情報が返されます。オートマウンターは、これらの「シンボリックリンク」をその場で作成し、一定期間使用しなくなった後に削除することに関与します。これをベースとして使用し、ソースコードを変更すると、プロセスがユーザーごとに異なるシンボリックリンクを返すようにすることができます。

0
Joe Inwap

Linuxまたは他のほとんどのユニスでは、ユーザーごとにコンテンツが異なるシンボリックリンクを作成することはできません。むしろ、可能ですが、通常とは異なるファイルシステム(おそらく Fuse に基づく)を介してのみ可能であり、セットアップはかなり困難です。

すべての設定がユーザーのホームディレクトリに関連するように調整します。一部のファイルが/svn/$USERではなく/home/$USERの下にあるかどうかは関係ありません。各ユーザーに、シンボリックリンク/home/$USER/svn -> /svn/$USERを作成してもらいます(または作成してもらいます)。

一部のアプリケーションが絶対パスを持つことを要求する場合は、チェックインされたパスをユーザーの正しいパスに置き換えるスクリプトを記述します。

sed -i -e "s:/home/\$USER/:/home/$USER/:g" .Eclipse/*

事前コミットフックで、必ず/home/bobをリテラル文字列/home/$USERに変換し直してください。