sudo运行bash脚本时cd命令失效致cmake路径错误的问题
问题原因
每个sudo -su $real_user都会启动一个独立的Shell进程,进程之间的工作目录环境完全隔离。你执行的sudo -su $real_user cd ...只是在临时进程里切换了目录,进程结束后,后续的sudo命令会在新进程中启动,默认回到该用户的家目录/home/$real_user。因此cmake ..实际是在/home/$real_user下执行,向上查找父目录就是/home,自然找不到目标项目的CMakeLists.txt。
解决方案
将需要在同一目录连续执行的命令,合并到同一个sudo -su调用中,通过bash -c参数让这些命令在同一个Shell进程里运行,这样目录切换的效果会持续到后续命令。
修正后的脚本片段
#!/bin/bash if ! [ $(id -u) = 0 ]; then echo "The script needs to be run as root." >&2 exit 1 fi real_user=${SUDO_USER:-$(whoami)} # Install the Micro-XRCE-DDS-Agent # 将所有普通用户权限的命令合并到同一个sudo进程中 sudo -su $real_user bash -c " mkdir -p /home/$real_user/Repos git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git /home/$real_user/Repos/Micro-XRCE-DDS-Agent mkdir -p /home/$real_user/Repos/Micro-XRCE-DDS-Agent/build cd /home/$real_user/Repos/Micro-XRCE-DDS-Agent/build cmake .. make " # 需要root权限的命令直接执行(脚本已以sudo运行) make install ldconfig /usr/local/lib/
额外提示
- 用
mkdir -p可以避免目录已存在时的报错,增强脚本健壮性 real_user=${SUDO_USER:-$(whoami)}是更简洁的变量赋值写法,等价于你原来的if-else判断make install和ldconfig需要root权限,直接在脚本中执行即可(因为脚本已经以sudo启动)
内容的提问来源于stack exchange,提问作者Nighthawx
相关产品推荐
相关产品推荐

