Если я наберу
::
в оболочку bash, я получаю:
-bash: ::: command not found
Но только один :
результат не приводит к выводу. Почему это?
command-line
bash
NerdOfLinux
источник
источник
Ответы:
:
Оболочка встроенная против несуществующего::
Существует
:
встроенная команда оболочки (обратите внимание на разницу между внешней и встроенной командами ), которая ничего не делает; он просто возвращает успех, какtrue
команда.:
Встроенный стандартный и определяется стандартом POSIX , где он также известен как «нулевой полезности». Он часто используется для тестирования или для запуска бесконечных циклов, как вwhile : ; do ...;done
Тем не менее,
::
- два символа двоеточия вместе - интерпретируются как одно «слово» для оболочки, и предполагается, что это команда, введенная пользователем. Оболочка будет проходить процесс проверки встроенных модулей, а затем любого каталога вPATH
переменной на наличие этой команды. Но нет ни встроенной,::
ни внешней команды::
. Следовательно, это приводит к ошибке.Ну, что является типичным форматом для ошибки?
Таким образом, вы видите не 3 двоеточия, а то, что вы ввели, вставлены в стандартный формат ошибок.
Также обратите внимание, что он
:
может принимать аргументы командной строки, то есть это допустимо:В этом случае оболочка будет рассматривать это как два «слова», одно из которых является командой, а другое позиционным параметром. Это также не приведет к ошибке! (См. Также историческую заметку (далее в этом ответе) об использовании of
:
с позиционными параметрами.)В снарядах, кроме Баш
Обратите внимание, что форматирование также может отличаться для разных оболочек. Ибо
bash
,ksh
иmksh
поведение является последовательным. Например,/bin/sh
оболочка по умолчанию Ubuntu (которая на самом деле/bin/dash
):где 1 - номер команды (эквивалентный номеру строки в скрипте).
csh
напротив, вообще не выдает сообщения об ошибке:Фактически, если вы запустите
strace -o csh.trace csh -c ::
, вывод трассировки вcsh.trace
файле показывает, чтоcsh
выходы завершаются со статусом выхода 0 (без ошибок). Ноtcsh
выводит ли ошибку ( но не выводит ее имя):Сообщения об ошибках
Как правило, первый элемент в сообщении об ошибке должен быть исполняющим процессом или функцией (ваша оболочка пытается выполнить
::
, следовательно, сообщение об ошибке приходит из оболочки). Например, здесь выполняющийся процессstat
:Фактически, POSIX определяет функцию perror () , которая в соответствии с документацией принимает строковый аргумент, затем выводит сообщение об ошибке после двоеточия, а затем перевод строки. Quote:
И в качестве аргумента строки
perror()
технически может быть что угодно, но, конечно, для ясности обычно это имя функции илиargv[0]
.В отличие от этого, GNU имеет свой собственный набор функций и переменных для обработки ошибок , которые программист может использовать
fprintf()
дляstderr
потоковой передачи. Как показывает один из примеров на связанной странице, можно сделать что-то вроде этого:Историческая справка
В старых Unix и Thompson оболочка
:
использовалась сgoto
оператором (который, по словам пользователя Perderabo в этом потоке, не был встроенным в оболочку). Цитата из руководства:Таким образом, вы можете сделать что-то вроде этого, чтобы создать скрипт с бесконечным циклом:
источник
command.com
и Windowscmd.exe
имеют похожую, но противоположную ситуацию::
это явно метка goto (не команда) и часто используется как символ комментария (например:: This is a comment
).Последнее двоеточие является частью стандартного сообщения «not found»:
Причина , по которой единственное двоеточию ничего не производит, что
:
является допустимой командой - хотя она ничего не делает (кроме возвратаTRUE
). ИзSHELL BUILTIN COMMANDS
разделаman bash
:Вы иногда будете видеть это в конструкциях, таких как
Посмотрите, например, для чего служит встроенное двоеточие?
источник
Попробуйте любую другую несуществующую команду, и вы увидите, что она
:
выполняет свое обычное назначение на английском языке:источник
Добавленное двоеточие является частью самого сообщения об ошибке. Если один из
cd ow
них приводит к результатуbash: cd: ow: No such file or directory
, это показывает, что ошибка помещается в лишний: No such file or directory
источник
3-й это проставка от форматирования
в bash
:
- пустая строкаисточник
вы получаете 3 двоеточия, потому что формат ошибки содержит двоеточие:
источник