Кодове за изход в Linux [Explained]

Сподели

Кодът за изход или състоянието на изход ни казва за състоянието на последната изпълнена команда. Дали командата е изпълнена успешно или е завършила с грешка. Това се получава след приключване на командата.

Основната идеология е, че програмите връщат изходния код 0 за да покаже, че е изпълнено успешно без проблеми. Код 1 или нещо различно от 0 се счита за неуспешно.

Има много повече кодове за изход, различни от 0 и 1, които ще разгледам в тази статия.

Различни изходни кодове в обвивката на Linux

Нека хвърлим един бърз поглед към видните изходни кодове в обвивката на Linux:

Код за изходЗначение на кода
0Командата е изпълнена без грешки
1Код за общи грешки
2Използване на неправилна команда (или аргумент).
126Разрешението е отказано (или) не може да се изпълни
127Командата не е намерена или грешка в PATH
128+nКомандата е прекратена външно чрез предаване на сигнали или е възникнала фатална грешка
130Прекратяване чрез Ctrl+C или SIGINT (код за прекратяване 2 или прекъсване от клавиатурата)
143Прекратяване от SIGTERM (прекратяване по подразбиране)
255/*Кодът за изход надхвърли обхвата 0-255, следователно приключи

📋

Прекратяването сигнализира като 130 (SIGINT или ^C) и 143 (SIGTERM) са видни, които са справедливи 128+n сигнали с n означава код за прекратяване.

Сега, след като сте запознати накратко с кодовете за изход, нека да видим как се използват.

Извличане на изходния код

Изходният код на предишната изпълнена команда се съхранява в специалната променлива $?. Можете да извлечете състоянието на изход, като изпълните:

echo $?

Това ще се използва във всички наши демонстрации за извличане на изходния код.

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

Код за изход 0

Код за изход 0 означава, че командата се изпълнява без грешки. В идеалния случай това е най-добрият случай за изпълнение на команди.

Например, нека изпълним основна команда като тази

neofetch 

echo $?
Код за изход 0 (успешно изпълнение)

Този код за изход 0 означава, че конкретната команда е изпълнена успешно, нищо повече или по-малко. Нека демонстрираме още няколко примера.

Можете да опитате да убиете процес; също ще върне кода 0.

pkill lxappearance
Унищожаването на приложение (същата обвивка) води до код 0

Прегледът на съдържанието на файл също ще върне код за изход 0, което предполага само че командата ‘cat’ е изпълнена успешно.

Код за изход 1

Код за изход 1 също е често срещано. Обикновено означава, че командата е прекратена с обща грешка.

Например, използването на мениджъра на пакети без sudo разрешения води до код 1. В Arch Linux, ако опитам това:

pacman -Sy 

Ще ми даде съществуващ код като 1, което означава, че последната команда е довела до грешка.

код за изход 1 (недопустима операция доведе до този код)
Състояние на изход 1 (неразрешена операция)

📋

Ако опитате това в базирани на Ubuntu дистрибуции (apt update без sudo), получавате 100 като код за грешка за стартиране на „apt“ без разрешения. Това не е стандартизиран код за грешка, а специфичен за apt.

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

Операции като деление на нула също водят до код 1.

Делението на нула води до код 1
Деление на нула

Код за изход 2

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

Обикновено предполага, че командата не може да се изпълни поради неправилна употреба.

Например, добавих две тирета към опция, която трябваше да има едно тире. Код 2 беше даден.

grep --z file.txt
Невалиден аргумент доведе до изходен код 2
Невалиден аргумент води до код 2

Когато разрешението е отказано, като достъп до /root папка, получавате код на грешка 2.

Отказаното разрешение дава код 2
Разрешението е отказано

Код за изход 126

126 е особен изходен код, тъй като се използва, за да покаже, че команда или скрипт не са били изпълнени поради грешка в разрешението.

Тази грешка може да бъде открита, когато се опитате да изпълните shell скрипт без да дадете разрешения за изпълнение.

Код за изход 126 поради недостатъчни разрешения

Имайте предвид, че този изходен код се появява само за „екзекуция‘ на скриптове/команди без достатъчни разрешения, което е различно от обща грешка Permission Denied.

Така че, не го бъркайте с предишния пример, който видяхте с изходен код 2. Там командата ls се изпълни и проблемът с разрешението дойде с директорията, която се опитваше да изпълни. Тук проблемите с разрешенията идват от самия скрипт.

Код за изход 127

Това е друг често срещан. Изходен код 127 се отнася до „команда не е намерена“. Обикновено се случва, когато има правописна грешка в изпълнената команда или необходимият изпълним файл не е в променливата $PATH.

Например, често виждам тази грешка, когато се опитам да изпълня скрипт без неговия път.

Скриптът, изпълнен без пътя, дава „команда не е намерена“ или код 127
Скрипт, изпълнен без пътя, дава “команда не е намерена”

Или когато изпълнимият файл, който се опитвате да стартирате, не е посочен в $PATH променлива. Можете да поправите това, като добавите родителската директория към променливата PATH.

Как да добавите директория към PATH в Linux

Научете всички основни стъпки за добавяне на директория към PATH в Linux и извършване на тези промени за постоянно.

Ще получите този изходен код и когато въвеждате команди, които не съществуват.

Unmount не е команда и Screenfetch не е инсталиран, което доведе до код 127
Демонтиране не е команда и Screenfetch не е инсталиран

Код за изход серия 128+n

Когато приложение или команда бъде прекратено или изпълнението му е неуспешно поради фатална грешка, се произвежда кодът, съседен на 128 (128+n), където n е номерът на сигнала.

Това включва всички видове кодове за прекратяване, като SIGTERM, SIGKILLи т.н., които се отнасят за стойността ‘n’ тук.

Код 130 или SIGINT

SIGINT или Казвамnal за клавиатура Вътрerrupt се предизвиква чрез прекъсване на процеса чрез сигнал за прекратяване 2 или чрез Ctrl+C.

Тъй като сигналът за прекратяване е 2, получаваме код 130 (128+2). Ето видео, демонстриращо прекъсващия сигнал за lxappearance.

Прекратяване на SIGINT(2) или прекъсване на клавиатурата (^C), което дава код 130

Код 137 или SIGKILL

The SIGKILL прекратяване на договора себе синал това убивампроцесът незабавно има сигнал за прекратяване 9. Това е последният метод, който трябва да използвате, докато прекратявате приложение.

Изхвърленият изходен код е 137, тъй като сигналът за прекратяване е 9 (128+9).

SIGKILL(9) прекратяване, което дава код 137

Код 143 или SIGTERM

SIGTERM или Казвамnal към Срокinate е поведението по подразбиране, когато процес е убит без да се посочват аргументи.

Кодът за прекратяване на SIGTERM е 15, следователно този сигнал получава изходен код 143 (128+15).

SIGTERM(15) прекратяване, което дава код 143

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

Как да използвате SIGINT и други сигнали за прекратяване в Linux

Прекратяването на процеса на изпълнение е повече от просто убиване -9. Ето някои от видните сигнали за прекратяване и тяхното използване.

📋

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

В лична бележка сигнал 128 беше невъзможно да се възпроизведе.

Ами ако кодът надвишава 255?

Последните версии на Bash запазват оригиналната стойност на изходния код дори над 255, но като цяло, ако кодът надвишава 255, тогава той се затваря.

Тоест код 256 става ‘0’, 257 става ‘1’, 383 става ‘127’ и т.н., и т.н. За да осигурите по-добра съвместимост, дръжте изходните кодове между 0 и 255.

Обобщавайки

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

Ако използвате тези кодове в шел скрипт, уверете се, че разбирате значението на всеки код, за да улесните отстраняването на проблеми.

В случай, че имате нужда от справка, разгледайте серията Bash тук:

Bash Basics #1: Създайте и стартирайте първия си Bash Shell скрипт

Започнете да изучавате bash скриптове с тази нова серия. Създайте и стартирайте първия си bash shell скрипт в първата глава.

Това е всичко за статията. Чувствайте се свободни да ме уведомите в секцията за коментари, ако съм пропуснал нещо.

Източник: itsfoss.com

Публикациите се превеждат автоматично с google translate

Loading


Сподели