当状态代码无效时,是否仍然可以根据stdout的输出构造管道?
我希望答案不是解决用例,而是shell脚本范围内的问题。我要尝试做的是根据国家和语言代码猜测名称,从而找到存储库中最具体的软件包。
以这个为例
$PACKAGE1=hunspell-en-zz
$PACKAGE2=hunspell-en
第一个猜测更合适,但可能不存在。在这种情况下,我想回到hunspell-en
($PACKAGE2
),因为第一个选项hunspell-en-zz
($PACKAGE1
)也不会存在。
apt-cache的管道
apt-cache
只要命令能够运行(从的文档apt-cache
),该命令就会返回成功(由shell定义为退出代码零)
apt-cache在正常运行时返回零,在错误时返回十进制。
这使得在管道中使用该命令更加困难。通常,我期望404的等效程序包搜索会导致错误(如curl
或会发生wget
)。我想搜索以查看是否存在一个软件包,如果不存在,则回退到另一个软件包。
这不会返回任何内容,因为第一个命令将返回成功(因此,||
从不运行rhs )
apt-cache search hunspell-en-zz || apt-cache search hunspell-en
apt-cache search
有两个参数
这不会返回任何内容,因为apt-cache
它的参数是AND,
apt-cache search hunspell-en-zz hunspell-en
来自的文档 apt-cache
可以使用单独的参数来指定多个和在一起的搜索模式。
因此,由于其中一个参数显然不存在,因此不会返回任何内容。
问题
什么是外壳惯用语来处理约定,例如apt-cache
在返回代码对任务无用的情况下?而成功仅取决于STDOUT上是否存在输出?
相似
-
他们都源于同一个问题。那里选择的答案提到
find -z
了可悲的是这里不适用于解决方案,并且是针对用例的。没有提及习惯用法或在不使用空终止的情况下构建管道(不是的选项apt-cache
)
hunspell-ar
确实存在并且没有国家/地区名称打包。我需要为给定的国家和语言找到最准确的软件包。
find
就像apt-cache
在这方面一样-无用的返回码,成功取决于输出。
-z
可悲的不是解决方案,因此用例特定的问题不适用。而且也没有提到不使用空终止(没有一个选项apt-cache
)的惯用法或构造管道
find
它与-print0
和一起使用grep -z
。由于apt-cache不会提供以null结尾的输出,因此您不需要-z
。
hunspell-en
存在吗?无论如何,您可以将apt-cache policy
和grep用于^$PACKAGENAME:
。