子外壳中的stderr重定向更改了tput的输出

816-8055

因此,我正在编写脚本,发现了一些奇怪的行为。我敢肯定有一个合理的解释,为什么4的输出和6的命令行比在其他情况不同,但我无法找到它。

1 $ tput cols
128

2 $ tput cols 2>/dev/null
128

3 $ echo $(tput cols)
128

4 $ echo $(tput cols 2>/dev/null)
80

5 $ (tput cols >/tmp/cols.txt); cat /tmp/cols.txt
128

6 $ (tput cols &>/tmp/cols.txt); cat /tmp/cols.txt
80

7 $ echo $(tput cols 2>/dev/null; echo $COLUMNS; tput cols)
80 128 128

为什么stderr重定向会在子shell中更改tput的输出?

最终,我想在脚本中执行以下操作,以使其在无法使用tput / ncurses的系统上运行:

cols=$(tput cols 2>/dev/null || echo $COLUMNS)

上面的示例是使用Bash 4.3.46(1)-release和ncurses 6.0.20150627创建的

用户名

根据strace,发生这种情况是因为tput仅尝试从其stdout和stderr(fd 1&2)读取tty设置。由于您已经显式重定向了stderr,并且$( )还重定向了stdout,因此tput放弃了。

最好的解决办法是打补丁tput以便还检查stdin中是否存在tty。但是,您也可以只删除2>/dev/null重定向,因为tput cols无论如何永远不会输出任何错误消息。(并且如果确实输出了一些错误消息,则最好注意它们。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重定向stderr会更改tput的输出,但仅在将输出捕获到变量时才会更改?

来自分类Dev

htaccess中的重定向301更改了网址编码

来自分类Dev

htaccess中的重定向301更改了网址编码

来自分类Dev

在外壳中重定向输入和输出的代码

来自分类Dev

重定向外壳程序中的输出,权限

来自分类Dev

Ngnix Jsession更改了重定向问题

来自分类Dev

您可以使用tcsh作为外壳重定向GDB中的stderr吗?

来自分类Dev

在Jruby中重定向STDERR

来自分类Dev

在C中重定向stderr

来自分类Dev

输出错误重定向(关于stderr)

来自分类Dev

如何更改重定向输出?

来自分类Dev

动态更改STDOUT和STDERR重定向

来自分类Dev

在子进程中重定向标准输出是否也会对父进程进行重定向?

来自分类Dev

重定向外壳

来自分类Dev

在Google Colab中重定向或查看stderr

来自分类Dev

如何重定向busybox中的stderr?

来自分类Dev

与重定向相关的子外壳优先级?

来自分类Dev

Java中的输出重定向

来自分类Dev

C中的输出重定向

来自分类Dev

在重定向其输出的脚本中重定向命令的输出

来自分类Dev

在重定向其输出的脚本中重定向命令的输出

来自分类Dev

将带有stderr重定向的管道命令的输出分配给脚本中的变量时,csh(tcsh)的输出重定向不明确

来自分类Dev

将带有stderr重定向的管道命令的输出分配给脚本中的变量时,csh(tcsh)的输出重定向不明确

来自分类Dev

如何重定向子进程的输出?

来自分类Dev

JavaScript-如果在表单的文本字段中更改了默认值,则强制重定向

来自分类Dev

将子进程的stdout / stderr重定向到文件

来自分类Dev

在Python的子进程/ Popen中将stdout重定向到stderr

来自分类Dev

如何为子流程模块重定向stderr

来自分类Dev

在Python的子进程/ Popen中将stdout重定向到stderr

Related 相关文章

  1. 1

    重定向stderr会更改tput的输出,但仅在将输出捕获到变量时才会更改?

  2. 2

    htaccess中的重定向301更改了网址编码

  3. 3

    htaccess中的重定向301更改了网址编码

  4. 4

    在外壳中重定向输入和输出的代码

  5. 5

    重定向外壳程序中的输出,权限

  6. 6

    Ngnix Jsession更改了重定向问题

  7. 7

    您可以使用tcsh作为外壳重定向GDB中的stderr吗?

  8. 8

    在Jruby中重定向STDERR

  9. 9

    在C中重定向stderr

  10. 10

    输出错误重定向(关于stderr)

  11. 11

    如何更改重定向输出?

  12. 12

    动态更改STDOUT和STDERR重定向

  13. 13

    在子进程中重定向标准输出是否也会对父进程进行重定向?

  14. 14

    重定向外壳

  15. 15

    在Google Colab中重定向或查看stderr

  16. 16

    如何重定向busybox中的stderr?

  17. 17

    与重定向相关的子外壳优先级?

  18. 18

    Java中的输出重定向

  19. 19

    C中的输出重定向

  20. 20

    在重定向其输出的脚本中重定向命令的输出

  21. 21

    在重定向其输出的脚本中重定向命令的输出

  22. 22

    将带有stderr重定向的管道命令的输出分配给脚本中的变量时,csh(tcsh)的输出重定向不明确

  23. 23

    将带有stderr重定向的管道命令的输出分配给脚本中的变量时,csh(tcsh)的输出重定向不明确

  24. 24

    如何重定向子进程的输出?

  25. 25

    JavaScript-如果在表单的文本字段中更改了默认值,则强制重定向

  26. 26

    将子进程的stdout / stderr重定向到文件

  27. 27

    在Python的子进程/ Popen中将stdout重定向到stderr

  28. 28

    如何为子流程模块重定向stderr

  29. 29

    在Python的子进程/ Popen中将stdout重定向到stderr

热门标签

归档