在OSX下,它们是否等同于Linux下的xargs -r?如果没有数据的话,我想找一种方法来插入管道。
例如,假设您做了以下操作:
touch test
cat test | xargs -r echo "content: "这不会产生任何结果,因为xargs中断了管道。
在OSX下是否有隐藏的xargs选项或其他东西来实现相同的结果?
发布于 2012-01-10 14:03:27
您可以使用test或[
if [ -s test ] ; then cat test | xargs echo content: ; fi发布于 2012-01-10 16:18:06
xargs的POSIX标准要求命令执行一次,即使没有参数。这是一个麻烦,这就是为什么GNU xargs有-r选项。不幸的是,BSD (MacOS X)和其他主流Unix版本(AIX、HP、Solaris)都不支持它。
如果这对您非常重要,那么获取并安装GNU xargs,以便您的环境能够找到它,而不会影响系统(所以,除非您比我更勇敢,否则不要替换/usr/bin/xargs --但是/usr/local/bin/xargs可能会好,或者$HOME/bin/xargs,或者…)。
发布于 2013-12-02 18:49:03
没有确定您正在运行的xargs是否为GNU的标准方法。我将$gnuargs设置为"true“或"false”,然后使用一个函数替换xargs并执行正确的操作。
在Linux、FreeBSD和MacOS上,这个脚本适合我。xargs的POSIX标准要求命令执行一次,即使没有参数。FreeBSD和MacOS X违反了这个规则,因此不需要"-r“。GNU觉得它很烦人,并添加了-r。这个脚本做了正确的事情,如果您找到了Unix的一个版本,它可以以其他方式进行增强。
#!/bin/bash
gnuxargs=$(xargs --version 2>&1 |grep -s GNU >/dev/null && echo true || echo false)
function portable_xargs_r() {
if $gnuxargs ; then
cat - | xargs -r "$@"
else
cat - | xargs "$@"
fi
}
echo 'this' > foo
echo '=== Expect one line'
portable_xargs_r <foo echo "content: "
echo '=== DONE.'
cat </dev/null > foo
echo '=== Expect zero lines'
portable_xargs_r <foo echo "content: "
echo '=== DONE.'https://stackoverflow.com/questions/8803987
复制相似问题