Различные сообщения об ошибках при использовании разных строк в терминале

Когда я вставляю, например, unix.stackexchange.com а затем Enter в терминале, я получаю следующую ошибку:

 unix.stackexchange.com: command not found 

Это нормально, и я ожидал. Но когда я вставляю http://unix.stackexchange.com , я получаю еще одно сообщение об ошибке:

 bash: http://unix.stackexchange.com: No such file or directory 

Я не спрашиваю, почему я получаю ошибки. Я хочу знать, почему они различны и, в конце концов, какой процесс / функция обрабатывает их?

2 Solutions collect form web for “Различные сообщения об ошибках при использовании разных строк в терминале”

Как указывал ewhac , сообщения об ошибках различаются, потому что последняя командная строка содержит косые черты ( / ), которые заставляют вашу оболочку интерпретировать ее как путь к файлу.

Обе ошибки исходят из вашей оболочки, которая в этом случае является bash (что видно из второго сообщения об ошибке).

Более конкретно, первая ошибка исходит из функции execute_disk_command() определенной в execute_command.c в исходном коде bash-4.2 . Функция execute_disk_command() вызывает search_for_command() определенную в findcmd.c , которая, если указанное имя pathname не содержит косой черты, ищет $PATH для имени pathname . В случае, когда имя pathname содержит косые черты, search_for_command() не выполняет этот поиск. В случае, если search_for_command() не возвращает команду, команда execute_disk_command() завершится неудачно, если command not found внутреннюю ошибку.

Вторая ошибка исходит из функции shell_execve() , также определенной в execute_command.c . На этом этапе вашего сценария search_for_command() вернется успешно, потому что не было необходимости в поиске, и execute_disk_command() вызвал shell_execve() , который, в свою очередь, выполняет системный вызов execve() . Это не удается, поскольку файл execve() пытается выполнить не существует, и execve() указывает это, установив errno соответствующим образом. Когда execve() терпит неудачу, shell_execve() использует strerror() чтобы сообщить соответствующее сообщение об ошибке файла ( No such file or directory ) и немедленно выйдет из оболочки.

Символ / является разделителем пути. Поэтому оболочка предполагает, что вы указываете относительный путь к команде с именем unix.stackexchange.com в каталоге с именем http: Оболочка не находит каталог или файл и говорит об этом. Вы получите то же сообщение об ошибке, если попытаетесь запустить команду с именем (например): foo/bar/grill/snorklewacker .

С другой стороны, если вы введете имя открытой команды без разделителя пути, тогда оболочка проверяет список каталогов в PATH среды PATH в том порядке, в котором они появляются, чтобы увидеть, содержат ли они программу. Таким образом, если вы хотите ввести unix.stackexchange.com в приглашении моей системы, оболочка проведет поиск, который ищет:

  • /usr/local/bin/unix.stackexchange.com
  • /usr/bin/unix.stackexchange.com
  • /bin/unix.stackexchange.com
  • /usr/local/games/unix.stackexchange.com
  • /usr/games/unix.stackexchange.com

Если все эти поисковые запросы терпят неудачу, вы получаете команду ошибки command not found .

  • Как я могу захватить stdout / stderr в файле, но все еще вижу его в моей консоли?
  • Как создать реальную копию дескриптора файла stdout и stderr без использования unbuffer / script / tee только с встроенными встроенными в bash?
  • Вывод команды не в stderr или stdout
  • Перенаправление STDERR без промежуточного файла
  • перенаправление std-вывода и std-ошибки
  • Может перенаправлять stdout и stderr в те же строки, что и строки?
  • Неудачное решение от «Как перенаправить stdout и stderr в файл и отобразить stderr для консоли»
  • Есть ли процесс, который не отправляет EOF до завершения и как его создать?
  • Как grep stderr?
  • Unix без / dev / stdin, / dev / stdout и / dev / stderr?
  • Запуск сценария, когда процесс выдает сообщение stderr
  • Не удалось перенаправить stdout / stderr в файл журнала
  • Linux и Unix - лучшая ОС в мире.