繁体   English   中英

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

[英]How to hide error notifications in linux bash aliases?

我写了一个别名来显示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"

感谢帮助

第一:改用函数。 这种应用完全是别名的错误用例。 一个函数可以让您跨多行编写逻辑; 在执行时可以具有条件逻辑(例如,您可以查看函数是否被赋予了参数,如果存在则表现不同); 并可以使用相同的语法来调用(无论哪种情况,调用起来都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'

在这里,将整个代码包装在{ }使我们可以在整个块上执行一次重定向,而无需花费子外壳程序(如将代码包装在( )会创建的那样( )


其他说明:

  • find -exec ... {} +是POSIX指定的,并且具有与find ... -print0 | xargs -0相同的效率提高find ... -print0 | xargs -0 find ... -print0 | xargs -0 (在产卵比必要的子进程没有更多的情况而言),实际上会有效,因为它避免了对外部需求xargs过程。
  • 在“大目录”部分中使用*/告诉全局仅扩展到目录名称。 使用--变量优先级可以使du将该点之后给出的所有自变量解释为文件名或目录名,即使您的名称以-开头。
  • 对于尝试在MacOS上测试此答案的人们,请注意,它取决于GNU排序。 我个人已经通过macports port install coreutils gsortport install coreutils ),所以使用了sort() { gsort "$@"; } sort() { gsort "$@"; }包测试时,sort命令。

尝试将du命令的stderr流传递到/dev/null

du -sh * 2>/dev/null | sort -hr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM