sudo运行Bash脚本时~路径异常:原因分析与解决方法
问题解答
1. 命令表现差异的原因
直接在终端执行sudo rm -rf ~/testfoldercreatedfordeletion时,~是被当前登录用户的Shell提前解析为你的家目录,再将完整路径传递给sudo执行,所以操作的是你的用户目录。
但把命令写入脚本后用sudo运行时,整个脚本由root的Shell执行,脚本内的所有Shell扩展(包括~)都会以root的身份解析,因此~指向/root,这就是克隆路径出错的原因。
2. ~在sudo运行脚本中的解析结果
是的,~会被解析为root的家目录/root。sudo默认会切换到root的执行环境,脚本内的Shell语法扩展、环境变量读取都基于root的身份,自然~会指向root的家目录。
3. 如何在sudo脚本中可靠指向当前登录用户的家目录
有两种实用且可靠的方法:
- 方法一:通过环境变量获取原用户家目录
sudo运行时,SUDO_USER环境变量会保存发起sudo操作的原用户名,用这个变量结合getent可以精准获取原用户的家目录:# 提前获取原用户家目录 ORIG_USER_HOME=$(getent passwd "$SUDO_USER" | cut -d: -f6) # 使用变量代替~ git clone --depth 1 https://github.com/doomemacs/doomemacs "$ORIG_USER_HOME/.emacs.d" - 方法二:切换回原用户执行非root命令
对于不需要root权限的操作(比如git克隆),用sudo -u "$SUDO_USER"切换回原用户身份执行,此时命令内的~会被原用户的Shell解析为你的家目录:# 需要root权限的pacman操作 pacman -S git emacs --noconfirm # 切换回原用户执行git克隆 sudo -u "$SUDO_USER" git clone --depth 1 https://github.com/doomemacs/doomemacs ~/.emacs.d
内容的提问来源于stack exchange,提问作者TopologicalFieldTheory - TFT
相关产品推荐
相关产品推荐

