当前位置:  开发笔记 > 编程语言 > 正文

如何在linux bash别名中隐藏错误通知?

如何解决《如何在linuxbash别名中隐藏错误通知?》经验,为你挑选了1个好方法。

我写了一个别名来向我展示10个最大的文件和10个最大的目录,所以我试图隐藏"du无法访问"和"没有这样的文件或目录"错误,但没有成功.

在我写的别名下面:

alias big="echo 'Big Files:';find . -type f -print0 | xargs -0 du -h | sort -hr | head -10 2>/dev/null;echo 'Big Directories:';du -sh * | sort -hr | head -n10 2>/dev/null"

感谢帮助



1> Charles Duff..:

第一:使用函数代替.这种应用程序完全是别名的错误用例.一个函数可以让你在多行上写你的逻辑; 可以在执行时具有条件逻辑(例如,您可以查看您的函数是否被赋予参数,并且如果它们存在则表现不同); 并且可以使用相同的语法big调用(在任何一种情况下都只是调用).

第二:重定向stderr以获取整个事物,而不仅仅是最后一段.

big() {
  { # <-- open a block we can redirect
    echo 'Big Files:'
    find . -type f -exec du -h -- '{}' + |
      sort -hr |
      head -10

    echo 'Big Directories:'
    du -sh -- */ |
      sort -hr |
      head -n10
  } 2>/dev/null # <-- close, and redirect, that block
}

你也可以在继续使用别名的同时做同样的事情(但是,你不应该这样做):

alias big='{ echo "Big Files:";find . -type f -print0 | xargs -0 du -h | sort -hr | head -10;echo "Big Directories:";du -sh * | sort -hr | head -n10; } 2>/dev/null'

在这里,包装整个代码{ }允许我们在整个块上执行单个重定向,而不需要牺牲子shell(如通过包装代码而创建的)( ).


其他说明:

find -exec ... {} +是POSIX指定的,并且具有与产生相同的效率增益find ... -print0 | xargs -0(在产生不再需要的子进程的实例方面),并且实际上稍微有效,因为它避免了对外部xargs进程的需要.

使用*/在"大目录"段告诉水珠只扩大到目录名.使用--参数优先级告诉我du将过去那一点给出的所有参数解释为文件或目录名称,即使您的名称以a开头也是如此-.

对于尝试在MacOS上测试此答案的人,请注意它取决于GNU排序.我个人已gsort通过macports(port install coreutils)安装,因此用于sort() { gsort "$@"; }在测试时包装sort命令.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有