命令“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”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Linux常用命令(网络命令和关机重启命令)

linux命令的排列替换与别名

Docker学习重点~docker命令:帮助命令镜像命令容器命令常用其他命令

每天一个 Linux 命令网络相关命令(ifconfigroutepingtraceroutenetstatsstelnetrcpscp)

Linux基础命令

网络安全—Linux命令