Quando il codice di stato è inutile, c'è comunque modo di costruire una pipeline basata sull'output di stdout?
Preferirei che la risposta non riguardasse il caso d'uso ma la domanda nell'ambito della shell scripting. Quello che sto cercando di fare è trovare il pacchetto più specifico disponibile nel repository indovinando il nome in base ai codici di paese e lingua.
Prendi ad esempio questo,
$PACKAGE1=hunspell-en-zz
$PACKAGE2=hunspell-en
La prima ipotesi è più appropriata ma potrebbe non esistere. In questo caso, voglio return hunspell-en
( $PACKAGE2
) perché la prima opzione hunspell-en-zz
( $PACKAGE1
) non esiste.
pipeline di apt-cache
Il comando apt-cache
restituisce esito positivo (che è definito dalla shell come codice di uscita zero) ogni volta che il comando è in grado di essere eseguito (dai documenti di apt-cache
)
apt-cache restituisce zero durante il normale funzionamento, 100 decimale in caso di errore.
Ciò rende più difficile l'utilizzo del comando in una pipeline. Normalmente, mi aspetto che l'equivalente nella ricerca di pacchetti di un 404 provochi un errore (come accadrebbe con curl
o wget
). Voglio cercare per vedere se esiste un pacchetto, e in caso contrario ricorrere ad un altro pacchetto se esiste .
Questo non restituisce nulla, poiché il primo comando restituisce successo (quindi rhs nel ||
non viene mai eseguito)
apt-cache search hunspell-en-zz || apt-cache search hunspell-en
apt-cache search
con due argomenti
Questo non restituisce nulla, poiché apt-cache
gli argomenti di AND,
apt-cache search hunspell-en-zz hunspell-en
Dai documenti di apt-cache
Argomenti separati possono essere usati per specificare più schemi di ricerca che sono uniti.
Quindi, poiché uno di questi argomenti chiaramente non esiste, questo non restituisce nulla.
La domanda
Qual è il linguaggio della shell per gestire convenzioni come quelle trovate in apt-cache
cui il codice di ritorno è inutile per l'attività? E il successo è determinato solo dalla presenza di output su STDOUT?
Simile a
make find fail quando non è stato trovato nulla
entrambi derivano dallo stesso problema. La risposta scelta menziona
find -z
quale soluzione tristemente non è applicabile qui ed è specifica del caso d'uso. Non vi è alcuna menzione di un linguaggio o costruzione di una pipeline senza utilizzare la terminazione null (non un'opzione attivaapt-cache
)
hunspell-ar
esiste e non ci sono pacchetti di nomi di paesi . Devo trovare il pacchetto più accurato per un determinato paese e lingua.
find
è proprio come apt-cache
sotto questo aspetto: inutile codice di ritorno, il successo si basa sull'output.
-z
che purtroppo non è una soluzione qui, quindi il problema specifico del caso d'uso non è applicabile. E non si fa menzione di un linguaggio o della costruzione di una pipeline senza usare la terminazione nulla (non un'opzione attiva apt-cache
)
find
di essere usato -print0
e così grep -z
. Poiché apt-cache non fornisce output con terminazione null, non è necessario -z
.
hunspell-en
esista? Ad ogni modo, puoi usareapt-cache policy
e grep per^$PACKAGENAME:
.