重新cd到当前目录

重新cd到当前目录

我所在的目录是符号链接

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_athe_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 的不同而变化。

相关内容