首先,我不确定我是否正确地提出了问题。所以我有一个bash脚本,可以删除系统中的用户。问题是,它在终端代码之前显示err msg。这里。代码:
echo -e "\nCommencing user $UserName removal"
echo -e "Deactivating $UserName shell account ..." "$(chsh -s /usr/bin/false $UserName)"
echo -e "Listing group(s) user: " "$(groups $UserName)"
echo -e "Removing Crontab ... " "$(crontab -r -u $UserName)"
这是输出:
Commencing user Test2 removal
chsh: unknown user: Test2
Deactivating Test2 shell account ...
groups: Test2: no such user
Listing group(s) user:
scripts/sudo.sh: line 332: /delete_Test2/crontab.bak: No such file or directory
Saving Crontab ...
要删除的用户是Test2,在这种情况下“应该”不存在(不同时间的不同问题)。现在,stderr msg是否不应该显示在命令旁边或命令下方,而不是命令上方?
提前致谢
当shell执行line时echo -e "Deactivating $UserName shell account ..." "$(chsh -s /usr/bin/false $UserName)"
,这是事件的顺序:
chsh -s /usr/bin/false Test2
,其stdout进入捕获缓冲区,以便shell以后可以使用它。chsh
发现“ Test2”不存在,并在其stderr中打印“ chsh:未知用户:Test2”。由于shell对其stderr并没有做任何特殊的事情,因此直接进入shell的stderr,这就是您的终端。chsh
出口chsh
(没有任何内容)获取捕获的输出(注意:stdout,而不是stderr ),并将其替换为echo
命令行,给出echo -e "Deactivating Test2 shell account ..." ""
请注意,错误消息在第2步中被打印出来,但是有关应该发生的事情的消息直到第4步才被打印出来。
有几种解决方法。通常最好的方法是避免整个过程陷入混乱,即捕获命令的输出,然后回显它。这是没有意义的,只会导致这样的混乱(以及其他一些您还没有遇到过的混乱)。只需直接运行命令,然后按正常顺序将其输出(stdout和stderr)都转到其正常位置即可。
顺便说一句,我也建议您避免使用echo -e
或确实使用echo -anything
。在对POSIX标准echo
说“实现不支持任何选项。” 实际上,某些实现确实支持选项。其他人只是将它们视为要打印的字符串的一部分。另外,有些解释\n
了要打印的字符串中的转义序列(如),有些则没有,只有在-e
指定时才执行(违反POSIX标准)。考虑到这些功能的不可预测性,最好只是避免出现这种棘手的情况,而要么printf
改为使用(使用起来更复杂,但更容易预测),或者(如您所愿)echo
对每行使用单独的命令。
另外,您应该几乎总是对变量引用加双引号(例如groups "$UserName"
而不是groups $UserName
),以防它们包含空格,通配符等。
基于以上内容,这是我编写脚本的方式:
echo # print a blank line
echo "Commencing user $UserName removal"
echo "Deactivating $UserName shell account ..."
chsh -s /usr/bin/false "$UserName"
echo "Listing group(s) user: "
groups "$UserName"
echo "Removing Crontab ... "
crontab -r -u "$UserName"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句