我所在的目录是符号链接
me@hostname:/home/me$ ls -al
the_link -> actual_a
actual_a
actual_b
actual_c
me@hostname:/home/me$ cd the_link
me@hostname:/home/me/the_link$
现在,当我打开 shell 时,其他一些进程将符号链接从 更改为the_link -> actual_a
,the_link -> actual_b
甚至可能更改了rm -rf actual_a
。如果我在 shell 中运行命令,它会做一些奇怪的事情。有没有办法告诉cd
我“重新cd”到我所在的目录?
显然我能做到
me@hostname:/home/me/the_link$ cd ..
me@hostname:/home/me$ cd the_link
但我可以用一个命令来完成吗?
答案1
cd .
可能适合你。如果没有的话,当然还有
cd ../folder
这将进入一个文件夹并进入指定的文件夹。
答案2
某些 shell 有一个内置版本,pwd
可以通过跟踪cd
.另一方面,该/bin/pwd
命令通过从当前点遍历文件系统到根节点,并生成目录路径来确定您在文件系统中的真实位置。
您可以使用它来获取当前位置的目录路径,然后可以强制更改目录以匹配新的实际情况
cd "$(/bin/pwd)"
例子
mkdir /tmp/x
cd /tmp/x
# In another terminal
mkdir /tmp/y
mv /tmp/x /tmp/y/z
pwd # "/tmp/x" - where the shell thinks you are
/bin/pwd # "/tmp/y/z" - where you actually are
cd "$(/bin/pwd)"
pwd # "/tmp/y/z"
显然,如果某个进程删除了您所在的目录,则这将不起作用,因为不再有到达..
根目录的路径。
答案3
我将采取的方法是cd
获取符号链接的完整路径。这样,您将始终转到链接指向的真实目录。
如果链接指向不存在的目录,请务必捕获错误。就像是:
base_path=/home/me
link_name=the_link
link_path="${base_path}/${link_name}"
cd ${link_path} || {
echo "$0: Could not change directory to ${link_path}: Exiting"
exit 2
}
答案4
做就是了:
cd -- "$PWD"
(短缺cd -L -- "$PWD"
)。
$PWD
在 POSIX shell 中跟踪由 更新的当前工作目录cd
。它将符号链接保留在那里。所以你最终会进入the_link
指向的新目录。
另一方面:
cd -P .
将保留在当前工作目录中,但会进行更新$PWD
,使其包含规范的绝对路径,不含任何符号链接组件。如果当前目录已被删除,那将无济于事,并且行为将随 shell 的不同而变化。