$ sudo su - user1 -c 'echo $DOMAIN_HOME'
/app/user1/DOMAINHOME
这看起来不错,对吧?然而,让我们更深入地挖掘一下:
$ sudo su - user1 -c 'echo $DOMAIN_HOME' | tee test.out
$less test.out
ESC]P0000000ESC]P8A9A9A9ESC]P1DC143CESC]P9FF0000ESC]P2008000ESC]PA00FF00ESC]P3aa9943ESC]PBFFD700ESC]P41E90FFESC]PC87CEFAESC]P5706c9aESC]PD826ab1ESC]P6FFA500ESC]PEF0F8FFESC]P7FFFFFFESC]PFFFFFFFESC[HESC[2JESC[HESC[2J/app/user1/DOMAINHOME
这导致我的脚本失败。
它们是来自 .bashrc 的颜色代码,.bashrc 为 xterm 提供颜色。经过一些研究后,最后一部分[HESC[2JESC[HESC[2J]是在输出路径之前清除终端的内容。
我一直在绞尽脑汁试图找出这些现象出现的原因。有任何想法吗?
注意:当以 user1 身份登录时,它会很好地回显该变量。
答案1
由于您使用的是“su -”,正在执行的 shell 假装是一个登录 shell(执行系统的/etc/profile
、用户的配置文件,例如.profile
或.bash_profile
等)。这些脚本之一是生成转义序列(字符串Esc]P
)并将结果打印到标准输出。它不应该这样做。
它应该做的是检查 shell 是否是交互式的,并且然后——只有那时! -- 它应该生成转义序列。
检查交互式 shell 的最佳方法是检查“$-”的值并查看它是否包含该字母i
- 如果包含,则 shell 是交互式的,如果不包含,则 shell 不是。我通常使用这样的东西:
case "$-" in
*i*) # Here if the shell is interactive
;;
*) # Here otherwise
;;
esac
您需要确定是什么生成了该转义序列。常见的罪魁祸首是echo
、tput
和 以及其他应该修改终端设置的命令。我做了一些谷歌搜索,但找不到那个特定的转义序列,所以我无法提供任何关于在哪里/寻找什么的线索。
当然,你为什么要使用su -
?只需使用sudo -u user1
并消除额外的步骤(user1
尽管您的要求可能包括执行 .profile ;我不知道,您也没有说)。