You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:53:23