If-Koubou

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

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

Ако сте зает човек, то последното, от което се нуждаете, е да се притеснявате с огромно количество "безполезни" уведомления, така че как да успокоите нещата? Днешната публикация "SuperUser Q & A" има някои чудесни отговори, за да помогне на читателя да успокои количеството продукция.

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

Въпроса

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

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

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

Отговорът

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

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

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

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

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

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

Или:

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

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

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

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

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

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

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

Последвано от отговора на Максимилиан Ламейстер:

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

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

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

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

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

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