#bash #shell #solaris #opensolaris
#bash #оболочка #solaris #opensolaris
Вопрос:
Мне нужно было найти исходный код для реализации false .
Я нашел исходники на github и нашел false.c, где false завершается с кодом 255.
Итак, почему «false; echo $?» возвращает 1 в оболочке вместо 255? Я думаю, что где-то есть источник, который я пропустил.
код из файла false.c:
#pragma ident "%Z%%M% %I% %E% SMI"
#include <unistd.h>
/*
* Exit with a non-zero value as quickly as possible.
*/
int
main(void)
{
_exit(255);
/*NOTREACHED*/
return (0);
}
Комментарии:
1. Неясно, как Illumos связан с Solaris. Более очевидным источником в стиле Solaris было бы github.com/kofemann/opensolaris/blob/master/usr/src/cmd/false /…
2. Кстати, вы можете использовать
type false
, чтобы спросить bashfalse
, откуда поступает команда, чтобы определить, определена ли она внешним исполняемым файлом, встроенной оболочкой, псевдонимом, функцией и т. Д.3. POSIX просто предписывает, что
false
должен возвращать ненулевой код выхода. pubs.opengroup.org/onlinepubs/9699919799/utilities/false.html
Ответ №1:
Если bash — это ваша оболочка, false
это встроенный — значит, вы смотрите на неправильный исходный код.
Вместо этого смотрите версию, встроенную в сам bash, в файле builtins/colon.def
:
/* Return an unsuccessful result. */
int
false_builtin (ignore)
char *ignore;
{
return (1);
}
Если вы хотите использовать версию вашего поставщика ОС false
вместо встроенной, вы можете сделать это с command false
помощью или /bin/false
.
Комментарии:
1. О, конечно, я ошибся. И у меня есть еще один вопрос. Я попробовал
type false
, как вы сказали в комментарии, и получилfalse is a shell builtin
такжеtype /bin/false
записиfalse is /bin/false
. Есть ли 2 false или это только один?2. Два: есть один, встроенный в оболочку, и есть один, предоставляемый вашей операционной системой как внешний двоичный файл. (Если в вашей системе установлено более одной оболочки, каждая из них может иметь разные встроенные
false
; единственная гарантия, если это оболочка, совместимая с POSIX, заключается в том, что поведение будет соответствовать pubs.opengroup.org/onlinepubs/9699919799/utilities/false.html , указав, что он должен возвращать «ненулевое» значение).