Bash脚本stderr和stdout

用户名

首先,我不确定我是否正确地提出了问题。所以我有一个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)",这是事件的顺序:

  1. shell运行chsh -s /usr/bin/false Test2,其stdout进入捕获缓冲区,以便shell以后可以使用它。
  2. chsh发现“ Test2”不存在,并在其stderr中打印“ chsh:未知用户:Test2”。由于shell对其stderr并没有做任何特殊的事情,因此直接进入shell的stderr,这就是您的终端。
  3. chsh 出口
  4. Shell从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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从bash脚本变量将stderr和stdout回显到文件

来自分类Dev

将stderr和stdout记录到日志文件并处理bash脚本中的错误

来自分类Dev

在bash脚本中,从STDOUT到LOG,从STDERR到LOG和控制台

来自分类Dev

将bash脚本的每个命令的stdout和stderr的输出附加到文件

来自分类Dev

将stdout / stderr重定向到bash脚本

来自分类Dev

如何从bash脚本中将带有时间戳的stdout和stderr复制到文件中?

来自分类Dev

如何从C#中读取PowerShell脚本stdout和stderr

来自分类Dev

脚本中没有输出为stdout和stderr

来自分类Dev

BASH将时间戳添加到stdout和stderr

来自分类Dev

如何在 bash 中抑制 stdout 和 stderr

来自分类Dev

bash中stdout和stderr之间的顺序不匹配

来自分类Dev

Bash脚本-将子脚本stderr重定向到父级的stdout

来自分类Dev

制作bash脚本以将STDOUT&STDERR输出到文件

来自分类Dev

写入 stdout 和 stderr 的命令

来自分类Dev

如何将bst脚本中的stdout和stderr都重定向到文件?

来自分类Dev

如何将Shell脚本stdout / stderr打印到文件和控制台

来自分类Dev

如何在bash中同时重定向stdin和stdout和stderr?

来自分类Dev

在bash中的命令之间使用&符时,重定向stdout和stderr

来自分类Dev

在bash中重定向stdout和stderr的正确方法是什么?

来自分类Dev

当程序被杀死时,Bash保存/重定向stdout和stderr

来自分类Dev

在bash中的命令之间使用&符时重定向stdout和stderr

来自分类Dev

仅Bash打印stderr,而不是stdout

来自分类Dev

代理stdout / stderr保持bash中的顺序

来自分类Dev

在Tcl中跟踪stdout和stderr

来自分类Dev

从Java启动外部进程:stdout和stderr

来自分类Dev

捕获程序stdout和stderr以分离变量

来自分类Dev

分别将stderr和stdout配管

来自分类Dev

Linux:stdout和stderr到套接字

来自分类Dev

在WildFly中控制stderr和stdout输出

Related 相关文章

  1. 1

    从bash脚本变量将stderr和stdout回显到文件

  2. 2

    将stderr和stdout记录到日志文件并处理bash脚本中的错误

  3. 3

    在bash脚本中,从STDOUT到LOG,从STDERR到LOG和控制台

  4. 4

    将bash脚本的每个命令的stdout和stderr的输出附加到文件

  5. 5

    将stdout / stderr重定向到bash脚本

  6. 6

    如何从bash脚本中将带有时间戳的stdout和stderr复制到文件中?

  7. 7

    如何从C#中读取PowerShell脚本stdout和stderr

  8. 8

    脚本中没有输出为stdout和stderr

  9. 9

    BASH将时间戳添加到stdout和stderr

  10. 10

    如何在 bash 中抑制 stdout 和 stderr

  11. 11

    bash中stdout和stderr之间的顺序不匹配

  12. 12

    Bash脚本-将子脚本stderr重定向到父级的stdout

  13. 13

    制作bash脚本以将STDOUT&STDERR输出到文件

  14. 14

    写入 stdout 和 stderr 的命令

  15. 15

    如何将bst脚本中的stdout和stderr都重定向到文件?

  16. 16

    如何将Shell脚本stdout / stderr打印到文件和控制台

  17. 17

    如何在bash中同时重定向stdin和stdout和stderr?

  18. 18

    在bash中的命令之间使用&符时,重定向stdout和stderr

  19. 19

    在bash中重定向stdout和stderr的正确方法是什么?

  20. 20

    当程序被杀死时,Bash保存/重定向stdout和stderr

  21. 21

    在bash中的命令之间使用&符时重定向stdout和stderr

  22. 22

    仅Bash打印stderr,而不是stdout

  23. 23

    代理stdout / stderr保持bash中的顺序

  24. 24

    在Tcl中跟踪stdout和stderr

  25. 25

    从Java启动外部进程:stdout和stderr

  26. 26

    捕获程序stdout和stderr以分离变量

  27. 27

    分别将stderr和stdout配管

  28. 28

    Linux:stdout和stderr到套接字

  29. 29

    在WildFly中控制stderr和stdout输出

热门标签

归档