如何检查所有Linux用户的PS1?批量修改默认提示符遇执行问题
问题分析与解决方法
核心问题:PS1获取命令的逻辑错误
你写的currentPS1=$(su - ${user} -c "$(set | grep ^PS1)")完全错误:
$(set | grep ^PS1)是在当前执行脚本的shell中执行的,不是切换到目标用户后执行的。这部分会先展开成当前用户的PS1(如果存在),再传给su -c,相当于让目标用户执行当前用户的PS1字符串,自然不会返回有效内容,结果必然为空。
正确获取目标用户PS1的方法
要在目标用户的shell环境内执行set | grep ^PS1,需将命令作为字符串传给su -c,且用单引号包裹避免当前shell提前解析变量。推荐两种写法:
# 方法1:直接打印PS1变量 currentPS1=$(su - "${user}" -c 'echo "$PS1"') # 方法2:处理非交互式shell无PS1的情况(强制启动交互式shell) currentPS1=$(su - "${user}" -c 'bash -i -c "echo \"\$PS1\"" 2>/dev/null | tail -n1')
注:bash -i启动交互式shell,有些系统的非交互式bash会跳过PS1设置;2>/dev/null过滤欢迎信息,tail -n1取最后一行有效输出。
额外优化建议
默认PS1判断准确性
你的DefaultPs1数组包含带变量的字符串(如${debian_chroot}),实际环境中该变量可能已展开,导致匹配失败。建议匹配PS1的核心特征,比如:is_default=0 for default in "${DefaultPs1[@]}"; do if [[ "$currentPS1" == *"${default%\$}"* ]]; then is_default=1 break fi done写入.bashrc的规范
- 写入前检查是否已有PS1设置,避免重复添加或覆盖错误:
if ! grep -q "^PS1=" "${home}/.bashrc"; then printf "PS1='%s'\n" "$newPS1" >> "${home}/.bashrc" else sed -i "s/^PS1=.*/PS1='$newPS1'/" "${home}/.bashrc" fi
- 写入前检查是否已有PS1设置,避免重复添加或覆盖错误:
修正后的关键代码片段
for userAndHome in $(listUserWithBashShell) do user=$(echo "$userAndHome" | awk -F "," '{print $1}') home=$(echo "$userAndHome" | awk -F "," '{print $2}') log i "user: ${user} has home ${home}" # 正确获取目标用户PS1 currentPS1=$(su - "${user}" -c 'bash -i -c "echo \"\$PS1\"" 2>/dev/null | tail -n1') currentPS1=$(echo "$currentPS1" | xargs) # 去除多余空格和换行 log i "$user current prompt PS1 = \"${currentPS1}\"" userID=$(su - "${user}" -c "/usr/bin/id -u") log i "$user ID is: ${userID}" # 判断是否为默认PS1 local is_default=0 for default in "${DefaultPs1[@]}"; do if [[ "$currentPS1" == *"${default%\$}"* ]]; then is_default=1 break fi done if [[ $is_default -eq 1 ]] then log i "INFO - Prompt currently default for user ${user}" log i "PS1=${currentPS1}" if [[ "${userID}" -eq 0 ]] then newPS1=$(setPrompt root) log i "Set root Prompt ${newPS1}" # 写入或替换root的PS1设置 if ! grep -q "^PS1=" "${home}/.bashrc"; then printf 'PS1=%s\n' "$newPS1" >> "${home}/.bashrc" else sed -i "s/^PS1=.*/PS1=$newPS1/" "${home}/.bashrc" fi else newPS1=$(setPrompt user) log i "Set user Prompt to ${newPS1}" # 写入或替换普通用户的PS1设置 if ! grep -q "^PS1=" "${home}/.bashrc"; then printf "PS1='%s'\n" "$newPS1" >> "${home}/.bashrc" else sed -i "s/^PS1=.*/PS1='$newPS1'/" "${home}/.bashrc" fi fi fi done
内容的提问来源于stack exchange,提问作者Angel115
相关产品推荐
相关产品推荐

