【问题标题】: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

所以这确实是合法的,但这是什么意思?

【问题讨论】:

    标签: bash android-source


    【解决方案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 的使用只是一种解释
    猜你喜欢
    • 2011-04-21
    • 2015-08-04
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多