Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php getcwd()和exec(';pwd';)是否始终匹配?_Php_Bash - Fatal编程技术网

Php getcwd()和exec(';pwd';)是否始终匹配?

Php getcwd()和exec(';pwd';)是否始终匹配?,php,bash,Php,Bash,问题 getcwd()和exec('pwd')是否总是返回相同的结果?如果不是,在什么情况下他们不会 我尝试的 我尝试执行exec('cd..'),然后执行echo exec('pwd'),但返回的路径与不执行cd..时的路径相同。这并不让我感到惊讶,因为cd..可能只在执行它的exec()期间有效。如果要将相对路径转换为绝对路径,可以使用realpath(): 作为“工作目录”的符号链接至少是一种情况,其中getcwd()和exec('pwd')可以不同-甚至bash内置pwd和/bin/pw

问题

getcwd()
exec('pwd')
是否总是返回相同的结果?如果不是,在什么情况下他们不会

我尝试的


我尝试执行
exec('cd..')
,然后执行
echo exec('pwd')
,但返回的路径与不执行
cd..
时的路径相同。这并不让我感到惊讶,因为
cd..
可能只在执行它的
exec()
期间有效。

如果要将相对路径转换为绝对路径,可以使用
realpath()

作为“工作目录”的符号链接至少是一种情况,其中
getcwd()
exec('pwd')
可以不同-甚至bash内置
pwd
/bin/pwd
在这里也不同

# ll /res4/Linux/eldk
lrwxrwxrwx 1 armali ARNGO_res4 9 Oct 20  2008 /res4/Linux/eldk -> eldk3.1.1
# cd /res4/Linux/eldk
# php
<?php
echo getcwd(), "\n";
echo exec('pwd'), "\n";
?>
/res4/Linux/eldk3.1.1
/res4/Linux/eldk
# pwd
/res4/Linux/eldk
# /bin/pwd   
/res4/Linux/eldk3.1.1
显然,bash内置的
pwd
默认为-L,而
/bin/pwd
默认为-p


但是对于大多数用例,包括您的用例,这两种表单都可以工作,所以这里的差异并不重要。

它们应该返回相同的内容(后者做更多的工作);您想要完成什么?请记住,
exec('cd..)
将在PHP生成的shell中运行
cd
命令。一旦shell退出,它的本地环境就会丢失。如果您想更改PHP中的工作目录,请改用。@Jack-我想通过命令行运行命令,但该命令需要绝对路径,因此我想解析相对路径,我的程序可以接受绝对路径。我问这个问题的原因是因为我使用的是CLI中的绝对路径,而不是PHP中的绝对路径。如果在PHP和stat中执行stat('.')。在Linux的CLI中产生不同的结果。。。我很想知道。这就是问题所在。@neubert,恐怕我当时不明白这个问题。你能分享一些代码来详细说明吗?
# ll /res4/Linux/eldk
lrwxrwxrwx 1 armali ARNGO_res4 9 Oct 20  2008 /res4/Linux/eldk -> eldk3.1.1
# cd /res4/Linux/eldk
# php
<?php
echo getcwd(), "\n";
echo exec('pwd'), "\n";
?>
/res4/Linux/eldk3.1.1
/res4/Linux/eldk
# pwd
/res4/Linux/eldk
# /bin/pwd   
/res4/Linux/eldk3.1.1
   -L, --logical
          use PWD from environment, even if it contains symlinks

   -P, --physical
          avoid all symlinks