Я вижу, что вы используете EXIT_FAILURE
в своем коде, поэтому вы включаете stdlib.h
. В этом заголовочном файле EXIT_FAILURE
и EXIT_SUCCESS
определены как:
#define EXIT_FAILURE 1 /* Failing exit status. */
#define EXIT_SUCCESS 0 /* Successful exit status. */
Что соответствует типичному поведению программ UNIX. тип man
также полезен здесь, поскольку тип
является командой POSIX :
EXIT STATUS
The following exit values shall be returned:
0 Successful completion.
>0 An error occurred.
Поэтому да, возвращая 1 в случае сбоя в типе
является правильным и ожидаемым поведением.
Более того, использование EXIT_FAILURE
и EXIT_SUCCESS
в каждом return
вместо довольно запутанных return 1
и return false
будет лучше.
if
оценивает возвращаемое значение переданной ему команды следующим образом: если команда возвращает 0
, она считает его истинным и выполняет then
блок; если команда возвращает что-то отличное от 0
, выполняется блок else
(при условии, что этот блок существует).
Следовательно, ваш тип
(возвращающий 0 в случае успеха и 1 в случае неудачи) должен работать, как ожидалось, в:
if type less > /dev/null
then
echo less exists
else
echo no less we need to use more
fi
Еще одна вещь, в вашем коде меня беспокоит эта часть:
if ((curr_path = malloc(strlen(path) + sizeof(argv[1]))) != NULL) {
if (curr_path == NULL) {
fprintf(stderr, "malloc failed!\n");
}
Это второй , если
никогда не будет правдой. Вы можете попасть внутрь внешнего блока, только если curr_path! = NULL
и вы тестируете curr_path == NULL
. Я считаю, что вместо этого вам нужно следующее:
if ((curr_path = malloc(strlen(path) + sizeof(argv[1]))) != NULL) {
... /* the actual path matching */
}
else {
fprintf(stderr, "malloc failed!\n");
}