Почему «false; echo $?» возвращает 1, если источник Solaris для ложных выходов с 255?

#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 , чтобы спросить bash false , откуда поступает команда, чтобы определить, определена ли она внешним исполняемым файлом, встроенной оболочкой, псевдонимом, функцией и т. Д.

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 , указав, что он должен возвращать «ненулевое» значение).