0

我遇到了一个复杂的问题,我试图用下面的简单示例来解释它

在我的系统中,我有

ubuntu@ubuntu:~/temp$ pwd
/home/ubuntu/temp
ubuntu@ubuntu:~/temp$ ls
temp1  test.sh
ubuntu@ubuntu:~/temp$ 

在 temp.sh 我有

#!/bin/bash

echo "Arg 0 = $0"
echo "Arg 1 = $1"
echo "Arg 0 Full Path $(readlink -f $0)"
echo "Arg 1 Full Path $(readlink -f $1)"
pushd /var/log
echo "Arg 0 = $0"
echo "Arg 1 = $1"
echo "Arg 0 Full Path $(readlink -f $0)"
echo "Arg 1 Full Path $(readlink -f $1)"

现在我在下面跑

ubuntu@ubuntu:~/temp$ ./test.sh temp1
Arg 0 = ./test.sh
Arg 1 = temp1
Arg 0 Full Path /home/ubuntu/temp/test.sh
Arg 1 Full Path /home/ubuntu/temp/temp1
/var/log ~/temp
Arg 0 = ./test.sh
Arg 1 = temp1
Arg 0 Full Path /var/log/test.sh
Arg 1 Full Path /var/log/temp1

在这里您可以看到readlink在发出pushd命令后显示 Arg0 和 Arg1 文件的错误路径。 如果我删除 popd 命令,那么它打印得很好。

那么为什么这里readlink行为不端呢?

4

2 回答 2

1

给定相对路径,readlink将相对于进程工作目录解释它们,并输出绝对路径(解析中间的符号链接)。

这里的关键点是进程工作目录(又名当前目录)。

因此readlink ./path/to/file将输出/tmp/path/to/fileif/tmp是当前目录(假设没有符号链接)。

您正在使用的另一个命令pushd将更改进程工作目录。

所以在序列中

readlink ./path/to/file
pushd /some/other/place
readlink ./path/to/file

两者readlink都可能解析为两个不同的绝对路径。

这里没有不当行为。都是设计使然。

于 2016-06-17T21:11:38.817 回答
1

readlink在这里行为正确,这里唯一需要了解的是pushd. pushd是更改当前目录堆栈的命令。让我们从下图了解。

在此处输入图像描述

最初test.sh有一些完整路径,在运行pushd另一个目录后,即 ( /var/log) 被插入到目录堆栈中。堆栈的最左侧目录(或最顶部目录)成为当前目录。如果你运行popd,这意味着堆栈从顶部变空。只要你readlink -f test.sh再次运行之后popd,你就会有初始目录。在你的情况下,它将是/home/ubuntu/temp/test.sh

于 2016-06-14T19:49:40.223 回答