如何在 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 "$@"; }
来包装排序命令。
我写了一个别名来显示 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 "$@"; }
来包装排序命令。