Начална » как да » Как да стартирате командата на заден план без изход, освен ако няма грешка?

    Как да стартирате командата на заден план без изход, освен ако няма грешка?

    Ако сте зает човек, тогава последното нещо, от което се нуждаете, е да се притеснявате с огромно количество „безполезни“ уведомления, така че как да успокоите нещата? Днешната публикация за въпроси и отговори SuperUser има много добри отговори, за да помогне на читателя да успокои количеството изход.

    Днешната сесия за въпроси и отговори идва при нас с любезното съдействие на SuperUser - подразделение на Stack Exchange, групирано от общността уеб сайтове за въпроси и отговори.

    Въпроса

    Четецът на SuperUser Xster иска да знае как да изпълни команда във фонов режим без изход, освен ако не е налице грешка:

    Как потискате изхода на команда, но го покажете, ако изходните кодове на командата извеждат грешка?

    Как да получите команда да се изпълнява във фонов режим без изход, освен ако няма грешка?

    Отговорът

    Сътрудниците на SuperUser Боб и Максимилиън Лаумайстър имат отговор за нас. Първо, Боб:

    За съжаление, предположението, че STDERR се използва само за извеждане на грешки не винаги е правилно. По-скоро, STDERR често се използва за всеки интерактивен изход и диагностика (т.е. изход, предназначен за четене от потребителя в интерактивен ред).(1) Wget и дд добре известни примери.

    Някои команди ще осигурят флаг (т.е.. -тих или -мълчалив) за потискане на изхода от грешки. Прочетете техните страници, за да видите дали съществува.

    Друга конвенция, която е по-често срещана, е изходен код, програмата връща код за излизане, когато излезе. Обикновено(2), изходен код на 0 показва успех, а всеки друг код за изход показва грешка.

    с удрям, можете да получите кода на изхода на последната команда от $? променлива. в риба, използвай статус на $ променлива. Можете да тръбите STDERR на временен файл и да го отпечатате само ако възникне грешка. Например (риба):

    Можете също да използвате някои преки пътища, ако не сте свързани с команди:

    Или:

    Можете също така да тръбите стандартния изход в същия буфер, като използвате 2> & 1> / tmp / outputbuffer.

    (Забележка: Всъщност не знам риба, така че аз адаптирам концепцията към това, което мога да намеря в нейната документация. Синтаксисът може да е малко погрешен. Също така можете да използвате mktemp за генериране на уникален временен файл. Стартирайте го и запишете името на файла в променлива.)

    Ако трябва да стартирате цялото нещо на фона на черупка, която използвате и интерактивно по едно и също време, тогава е по-добре да напишете скрипт, за да се справите с скриването на изхода и да изпълните този скрипт във фонов режим със стандартните техники. (риба). По дяволите, можете да сложите нещо подобно на следната функция ~ / .Config / риба / config.fish:

    Обадете се с тичам някаква команда & (където е изминал & причинява работата му на заден план)

    Имайте предвид, че това ще погълне оригиналния код за изход и ще изхвърли и двата стандартния изход и STDERR в случай на повреда. Можете да го персонализирате, ако е необходимо.

    (1) Няма гаранция, че извеждането на грешки няма да се появи стандартния изход, някои програми ще изхвърлят цялата продукция там!

    (2) За съжаление, това все още не винаги е така. Изходният код е изцяло контролиран от програмата и някои ще посочат някои условия за успех с ненулеви изходи. Отново проверете ръководството.

    Следван от отговора на Maximillian Laumeister:

    Unix помощните програми изпращат общи съобщения до стандартния изход, и съобщения за грешки STDERR, така че ако искаме само да видим съобщения за грешки, тогава ще е достатъчно да се потисне стандартния изход така че само STDERR получава изход към конзолата.

    Начинът да направите това (и в двете удрям и риба) трябва да добавите > / Сътрудничество / нула към командата. Това тръби стандартния изход в нищото, но STDERR (с вашите съобщения за грешки) все още идва до конзолата.

    Така например:

    Командата echo 1> / dev / null не отпечатва нищо, защото е нормално стандартния изход изходът е потиснат и нищо не е записано STDERR.

    Командата man doesnotexist> / dev / null отпечатва съобщение за грешка, защото мъж пише съобщението си за грешка STDERR.


    Имате ли какво да добавите към обяснението? Звучи в коментарите. Искате ли да прочетете повече отговори от други технологични потребители на Stack Exchange? Вижте пълната тема за дискусия тук.