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

How to hide error notifications in linux bash aliases?

我写了一个别名来显示 10 个最大的文件和 10 个最大的目录,所以我试图隐藏 "du cannot access" 和 "no such file or directory" 错误,但没有成功。

下面我写的别名:

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"

感谢帮助

尝试将 du 命令的标准错误流通过管道传输到 /dev/null

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

第一:改用函数。这种应用程序 完全是 别名的错误用例。一个函数可以让你在多行中编写你的逻辑;在执行时可以有条件逻辑(例如,你可以查看你的函数是否有参数,如果有参数则表现不同);并且可以使用相同的语法调用(在任何一种情况下都只是 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-specified,并且具有与 find ... -print0 | xargs -0 相同的效率增益(就生成不超过必要的子进程实例而言),实际上略微 高效,因为它避免了对外部 xargs 进程的需要。
  • 在 "Big Directories" 段中使用 */ 告诉 glob 仅扩展到目录名称。使用 -- 之前的参数告诉 du 将超过该点的所有参数解释为文件或目录名称,即使您的名称以 -.
  • 开头
  • 对于尝试在 MacOS 上测试此答案的人,请注意它取决于 GNU 排序。我个人通过 macports (port install coreutils) 安装了 gsort,所以在测试时使用 sort() { gsort "$@"; } 来包装排序命令。