Кодът за изход или състоянието на изход ни казва за състоянието на последната изпълнена команда. Дали командата е изпълнена успешно или е завършила с грешка. Това се получава след приключване на командата.
Основната идеология е, че програмите връщат изходния код 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
.
pkill lxappearance

Прегледът на съдържанието на файл също ще върне код за изход 0, което предполага само че командата ‘cat’ е изпълнена успешно.
Код за изход 1
Код за изход 1
също е често срещано. Обикновено означава, че командата е прекратена с обща грешка.
Например, използването на мениджъра на пакети без sudo разрешения води до код 1. В Arch Linux, ако опитам това:
pacman -Sy
Ще ми даде съществуващ код като 1, което означава, че последната команда е довела до грешка.

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

Код за изход 2
Този изходен код се дава, когато изпълнената команда има синтактична грешка. Неправилното използване на аргументите на командите също води до тази грешка.
Обикновено предполага, че командата не може да се изпълни поради неправилна употреба.
Например, добавих две тирета към опция, която трябваше да има едно тире. Код 2 беше даден.
grep --z file.txt

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

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

Имайте предвид, че този изходен код се появява само за „екзекуция‘ на скриптове/команди без достатъчни разрешения, което е различно от обща грешка Permission Denied.
Така че, не го бъркайте с предишния пример, който видяхте с изходен код 2. Там командата ls се изпълни и проблемът с разрешението дойде с директорията, която се опитваше да изпълни. Тук проблемите с разрешенията идват от самия скрипт.
Код за изход 127
Това е друг често срещан. Изходен код 127 се отнася до „команда не е намерена“. Обикновено се случва, когато има правописна грешка в изпълнената команда или необходимият изпълним файл не е в променливата $PATH.
Например, често виждам тази грешка, когато се опитам да изпълня скрипт без неговия път.

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

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

Код за изход серия 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 скрипт в първата глава.

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