Когда код состояния бесполезен, есть ли способ построить конвейер на основе вывода из stdout?
Я бы предпочел, чтобы ответ был не на сценарии использования, а на вопросе сценариев оболочки. Я пытаюсь найти наиболее конкретный пакет, доступный в репозитории, угадав имя на основе кодов страны и языка.
Возьмите, к примеру, это,
$PACKAGE1=hunspell-en-zz
$PACKAGE2=hunspell-en
Первое предположение более уместно, но оно может не существовать. В этом случае я хочу return hunspell-en
( $PACKAGE2
), потому что первая опция hunspell-en-zz
( $PACKAGE1
) не существует.
конвейеры apt-кеша
Команда apt-cache
возвращает успех (который определяется оболочкой как код выхода ноль) всякий раз, когда команда может быть запущена (из документов apt-cache
)
apt-cache возвращает ноль при нормальной работе, десятичное 100 при ошибке.
Это делает использование команды в конвейере более сложным. Обычно я ожидаю, что эквивалент 404 при поиске пакета приведет к ошибке (как это случилось бы с curl
или wget
). Я хочу выполнить поиск, чтобы увидеть, существует ли пакет, и если нет, использовать другой пакет, если он существует .
Это ничего не возвращает, так как первая команда возвращает успех (поэтому rhs в ||
никогда не выполняется)
apt-cache search hunspell-en-zz || apt-cache search hunspell-en
apt-cache search
с двумя аргументами
Это ничего не возвращает, поскольку apt-cache
ANDs его аргументы,
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 не дает вывод с нулевым символом в конце, вам это не нужно -z
.
hunspell-en
существует? В любом случае, вы можете использоватьapt-cache policy
и grep для^$PACKAGENAME:
.