在bash脚本中发出pushd命令后,readlink命令行为异常

时间:2016-06-14 14:45:36

标签: linux bash shell readlink

我遇到了一个复杂的问题,我试图通过简单的例子来解释它,如下所示

在我的系统中我有

DELIMITER $$
CREATE
TRIGGER `CommentsTrigger` BEFORE INSERT ON Comments
FOR EACH ROW
BEGIN
UPDATE Comments
SET counts = (Select COUNT(*) from Comments)+ 1;
END $$
DELIMITER;

在temp.sh我有

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

现在我以低于标准运行

#!/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命令后显示错误的Arg0和Arg1文件路径。 如果我删除popd命令,那么它打印正常。

那么为什么pushd行为不端?

2 个答案:

答案 0 :(得分:1)

dump()在这里表现正确,这里唯一需要理解的是readlink的行为。 pushd是更改当前目录堆栈的命令。让我们从下面的图片中理解。

enter image description here

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

答案 1 :(得分:1)

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

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

如果readlink ./path/to/file是当前目录(假设没有符号链接),那么/tmp/path/to/file将输出/tmp

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

所以在序列中

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

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

这里没有不端行为。全部按设计。