命令“PWD=/proc/self/cwd another_executable”是啥意思?
Posted
技术标签:
【中文标题】命令“PWD=/proc/self/cwd another_executable”是啥意思?【英文标题】:What does the command "PWD=/proc/self/cwd another_executable " mean?命令“PWD=/proc/self/cwd another_executable”是什么意思? 【发布时间】:2019-03-26 06:33:58 【问题描述】:使用以下命令构建 AOSP 9.0.0_r30 源代码时:
$ make clean
$ make showcommands -j8 > ~/Buildandroid.txt
在 ~/BuildAndoird.txt 中有这样的命令行:
[ 58% 62374/106553] PWD=/proc/self/cwd prebuilts/clang/host/linux-x86/clang-4691093/bin/clang++ ........
我想这是一个 bash 命令,但是为什么在“prebuilts/clang/host/linux-x86/clang-4691093/”之前有一个空格(不是 ; 或 &&) bin/clang++"?这是什么意思,我认为对bash来说是不合法的,因为空格表示后面的文本是参数而不是命令。
另一个问题是,什么是“/proc/self/cwd”,是标准的proc节点吗?
一些实验:
$ VAR=123
$ VAR=456 echo $VAR
123
$ echo $VAR
123
所以这确实是合法的,但这是什么意思?
【问题讨论】:
【参考方案1】:执行命令
prebuilts/clang/host/linux-x86/clang-4691093/bin/clang++
但是在为该命令设置环境时,它会将环境变量PWD
设置为值/proc/self/cwd
。请注意,这只影响clang++
进程的环境,而不影响shell脚本的环境/变量空间。
【讨论】:
这是正确的,但不能解释为什么有人会更改PWD
。更改PWD
的值不会 更改工作目录。 PWD=/some/dir ls
将打印当前目录的内容,而不是 /some/dir
。知道将 PWD
设置为与当前工作目录不同的内容吗?
@Socowi :是的,但我也不知道为什么有人想这样做。我最好的选择是用户碰巧知道被调用的进程正在(错误地)在某处执行getenv('PWD')
,以查找当前的 WD,并且如果该进程在工作目录中进行了更改,唯一的选择确实是设置密码到 /proc/self/cwd。
是这样吗?不仅 "PWD=*** ls" 打印当前目录的内容,而且 "VAR=123;VAR=456 echo $VAR;echo $VAR" 打印双123 ....
var=456; var=123 echo $var
打印 456
因为 $var
的扩展发生在 之前 echo
被执行。你可以试试var=456; var=123 bash -c 'echo $var'
(注意单引号)或var=456; var=123 declare -p var
。
@jw_ : 你可以通过VAR=4711 printenv VAR
看到效果更好【参考方案2】:
再试一次:
VAR=123
VAR=456 echo $VAR
123
好的,但是:
VAR=456 /bin/sh -c 'echo $VAR'
456
POSIX 变量$PWD
$PWD
将指向当前目录
echo $PWD; ls -l /proc/self/cwd
/home/user
lrwxrwxrwx 1 user user 0 mar 26 09:18 /proc/self/cwd -> /home/user
这样做将确保设置 $PWD
,因为 android 根本不需要它们。
【讨论】:
如果android根本不需要它们,为什么要设置呢? 因为编译器(clang
)不是基于Android,而是POSIX。
我发现还有像 "/bin/bash -c "PWD=/proc/self/cwd prebuilts/clang/host/linux-x86/clang-4691093/bin/clang 这样的行。 ..." ,/bin/bash -c 这里有没有作用?
这只是添加一个进程级别。我对sh -c
的使用只是一种解释以上是关于命令“PWD=/proc/self/cwd another_executable”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
Docker学习重点~docker命令:帮助命令镜像命令容器命令常用其他命令
每天一个 Linux 命令网络相关命令(ifconfigroutepingtraceroutenetstatsstelnetrcpscp)