我遇到了一个复杂的问题,我试图通过简单的例子来解释它,如下所示
在我的系统中我有
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
行为不端?
答案 0 :(得分:1)
dump()
在这里表现正确,这里唯一需要理解的是readlink
的行为。 pushd
是更改当前目录堆栈的命令。让我们从下面的图片中理解。
最初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
可能会解析为两个不同的绝对路径。
这里没有不端行为。全部按设计。