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

Когда я вставляю, например, 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 .

  • Написать в stderr
  • Перенаправление Stderr не работает
  • Как использовать gpsdecode для вывода результатов gpscat читаемым образом?
  • Как включить &> / dev / null по умолчанию для всех команд sh / bash?
  • Как вывести stderr / stdout моего скрипта как в файл, так и в консоль?
  • в чем разница между `>> / dev / stderr` (с пробелом) и`> & 2`?
  • Вывод команды не в stderr или stdout
  • Должен ли я выводить имя программы при возникновении предупреждения или ошибки?
  • shell stderr to / dev / null
  • Я хочу поймать STDERR и STDOUT сценария с фоновым запуском
  • Попытка понять синтаксисы перенаправления bash и их выходы
  • Interesting Posts

    Как настроить мой DNS при перезаписи resolv.conf?

    При входе в систему Linux я могу найти ip-адреса, которые можно использовать для подключения к машине через ssh?

    SSH сломанная трубка, неверный код аутентификации сообщения

    Fedora 20 KDE: ярлык для режима самолета

    Только выходные результаты grep

    Каковы цели различных типов шрифтов XWindows?

    Удалять удаленные файлы, соответствующие локальным файлам, или удалять файлы по мере их загрузки

    Копировать команду с аргументами командной строки

    Последствия наличия переменной переменной $ PATH?

    Вход SSH на удаленный компьютер с другого удаленного компьютера. Как управлять соединениями?

    Возможно ли совместное использование NFS через многожильный компьютер?

    Как создать резервное копирование исходного состояния внешнего резервного накопителя?

    как обнаружить компакт-диск, физически вставленный в привод

    Компилятор C не может создавать исполняемые файлы при создании backport в Debian

    Точка монтирования для нескольких наборов данных ZFS rootfs (в Arch Linux с sd-zfs)

    Linux и Unix - лучшая ОС в мире.