Quando o código de status é inútil, existe alguma maneira de construir um pipeline com base na saída do stdout?
Eu preferiria que a resposta não abordasse o caso de uso, mas a pergunta no escopo do script de shell. O que estou tentando fazer é encontrar o pacote mais específico disponível no repositório, adivinhando o nome com base nos códigos de país e idioma.
Tomemos, por exemplo, isso,
$PACKAGE1=hunspell-en-zz
$PACKAGE2=hunspell-en
O primeiro palpite é mais apropriado, mas pode não existir. Nesse caso, desejo return hunspell-en
( $PACKAGE2
) porque a primeira opção hunspell-en-zz
( $PACKAGE1
) não existe.
pipelines do apt-cache
O comando apt-cache
retorna sucesso (que é definido pelo shell como código de saída zero) sempre que o comando é capaz de executar (a partir dos documentos de apt-cache
)
apt-cache retorna zero em operação normal, decimal 100 em erro.
Isso dificulta o uso do comando em um pipeline. Normalmente, espero que o equivalente à pesquisa de pacotes de um 404 resulte em um erro (como aconteceria com curl
ou wget
). Quero pesquisar para ver se existe um pacote e, se não, voltar para outro pacote, se existir .
Isso não retorna nada, pois o primeiro comando retorna com êxito (então o rhs no ||
nunca é executado)
apt-cache search hunspell-en-zz || apt-cache search hunspell-en
apt-cache search
com dois argumentos
Isso não retorna nada, pois apt-cache
ANDs seus argumentos,
apt-cache search hunspell-en-zz hunspell-en
Dos documentos de apt-cache
Argumentos separados podem ser usados para especificar vários padrões de pesquisa que são juntos.
Portanto, como um desses argumentos claramente não existe, isso não retorna nada.
A questão
Qual é o idioma do shell para lidar com convenções como as encontradas em apt-cache
onde o código de retorno é inútil para a tarefa? E o sucesso é determinado apenas pela presença de saída no STDOUT?
Igual a
fazer encontrar falhar quando nada foi encontrado
ambos decorrem do mesmo problema. A resposta escolhida aqui menciona
find -z
que infelizmente não é a solução aplicável aqui e é específica para casos de uso. Não há menção de um idioma ou construção de um pipeline sem o uso de terminação nula (não é uma opção ativadaapt-cache
)
hunspell-ar
existem e não existem pacotes com nomes de países . Preciso encontrar o pacote mais preciso para um determinado país e idioma.
find
é exatamente a apt-cache
esse respeito - código de retorno inútil, o sucesso é baseado na saída.
-z
que, infelizmente, não é uma solução aqui, portanto o problema específico do caso de uso não é aplicável. E não há menção de um idioma ou a construção de um pipeline sem o uso de terminação nula (não opção apt-cache
)
find
que eles sejam usados -print0
e cumprimentados -z
. Como o apt-cache não está fornecendo saída terminada em nulo, você não precisa -z
.
hunspell-en
existe? De qualquer forma, você pode usarapt-cache policy
e grep para^$PACKAGENAME:
.