【发布时间】:2021-12-29 10:30:55
【问题描述】:
当我执行以下命令时:
[root@localhost install_zone]# su nylws -c "cd ~/gamesvr/conf;echo $(pwd);pwd"
输出:
/opt/deploy_scripts/install_zone
/data/nylws/gamesvr/conf
那么为什么这两条路径不同呢?谢谢!
【问题讨论】:
当我执行以下命令时:
[root@localhost install_zone]# su nylws -c "cd ~/gamesvr/conf;echo $(pwd);pwd"
输出:
/opt/deploy_scripts/install_zone
/data/nylws/gamesvr/conf
那么为什么这两条路径不同呢?谢谢!
【问题讨论】:
这是因为 $(...) 是在父 shell 的双引号内计算的,在 su 调用的 shell 甚至启动之前。所以子shell看到:
cd ~/gamesvr/conf;echo /opt/deploy_scripts/install_zone;pwd
解决此问题的最佳方法是使用单引号,这会将字符串按字面意思传递给子shell,而不对其进行任何扩展:
su nylws -c 'cd ~/gamesvr/conf;echo $(pwd);pwd'
【讨论】: