バッシュのcd
コマンドは面白いが、少し使用されるオプション、-P
と-L
のカップルを持っています。
cd [-L|[-P [-e]] [[email protected]]] [dir]
... The -P option causes cd to use the physical directory
structure by resolving symbolic links while traversing dir and
before processing instances of .. in dir (see also the -P option
to the set builtin command); the -L option forces symbolic links
to be followed by resolving the link after processing instances
of .. in dir. ...
だから...あなたはあなたの現在の作業ディレクトリのファイルシステム内の物理的な場所を探しているなら、あなたはこのようなものを使用できます:あなたのコメントで
realwd="$(cd -P .; pwd)"
を、あなたがいることを言及しましたディレクトリの親ディレクトリを探しています。にはファイルが含まれています。したがって、パスが/foo/bar/baz/filename
の場合は、/foo/bar
を探しています。
これを得るには、cd -P
とパラメータ拡張の組み合わせをお勧めします。あなたは/
文字がファイル名の一部として存在することはできません、次はあなたのために働く可能性があることを知っているので:
grandparent() {
local realdir="$(cd -P "${1%/*}"; pwd)"
echo "${realdir%/*}"
}
これはにパラメータ展開、その後、ファイルの物理的な場所を「取得」するcd -P
を使用して動作しますパスの最後の項目を削除します。
$ mkdir -p one/two/three
$ touch one/two/three/foo
$ ln -s one/two/three bar
$ ls -l bar
lrwxr-xr-x 1 ghoti wheel 13 Nov 19 23:05 bar -> one/two/three
$ grandparent bar/foo
/usr/home/ghoti/tmp6/one/two
ファイルを含むディレクトリのフルパス名、またはファイルを含むディレクトリの親ディレクトリを探していますか?あなたは、ファイル名に記載されたパスをたどることに興味がありますか?あるいは、ファイルシステム上の正式な場所を取得することに興味がありますか? – ghoti
両方の質問の2番目のケース。 – VasyaNovikov
現在のディレクトリが '/ home/user/bin'で、'ファイル名 'が '..'(親のカレントディレクトリ)であるとします。おそらく、そのエントリを含むディレクトリは '/ home/user/bin'なので、親ディレクトリは'/home/user'か、他の解釈が必要です(ディレクトリ '..'は'/home/user'です。親ディレクトリは '/ home'です)。私は '仮定された'変種が正しいと思っていますし、 '.'と同様ですが、チェックするのも良いでしょう。 –