«команда не найдена» не является ошибкой на уровне операционной системы - как вы продемонстрировали в своем коде, поиск осуществляется с помощью perror()
, чтобы найти строку, связанную с текущим errno
.
Вместо этого оболочки типа bash на самом деле жестко кодируют строку command not found
.Чтобы процитировать реализацию (execute_cmd.c
, из снимка bash-20180420):
hookf = find_function (NOTFOUND_HOOK);
if (hookf == 0)
{
/* Make sure filenames are displayed using printable characters */
pathname = printable_filename (pathname, 0);
internal_error (_("%s: command not found"), pathname);
exit (EX_NOTFOUND); /* Posix.2 says the exit status is 127 */
}
Для сравнения с другой оболочкой dash
не излучает foo: command not found
, а просто излучает foo: not found
;он создается с помощью функции errmsg
в src/error.c
, которая вызывается из функции shellexec
в src/exec.c
:
exerror(EXEND, "%s: %s", argv[0], errmsg(e, E_EXEC));
...invoking ...
const char *
errmsg(int e, int action)
{
if (e != ENOENT && e != ENOTDIR)
return strerror(e);
if (action & E_OPEN)
return "No such file";
else if (action & E_CREAT)
return "Directory nonexistent";
else
return "not found";
}
Короче говоря: ни в одной оболочке строка "команда не найдена" возникла где-либо за пределами исходного кода самой оболочки.Если вы хотите, чтобы ваша собственная оболочка написала эту ошибку, вы должны написать код, необходимый для этого.