Якщо я набираю
::
в оболонку bash, я отримую:
-bash: ::: command not found
Але лише один :
результат не дає результату. Чому це?
Якщо я набираю
::
в оболонку bash, я отримую:
-bash: ::: command not found
Але лише один :
результат не дає результату. Чому це?
Відповіді:
:
Раковина вбудована проти неіснуючого::
:
Оболонки вбудована команди існує (зверніть увагу на різницю між зовнішнім і вбудованими командами ) , який не робить нічого; він просто повертає успіх, як і true
команда. :
Вбудований стандартний і визначається стандартом POSIX , де він також відомий як «нульовий корисності». Він часто використовується для тестування або для запуску нескінченних циклів, як вwhile : ; do ...;done
bash-4.3$ type :
: is a shell builtin
Однак ::
- два символи двокрапки разом - інтерпретуються як одне "слово" оболонці, і це передбачає, що це команда, яку ввів користувач. Оболонка пройде процес перевірки вбудованих модулів, а потім будь-якого каталогу PATH
змінної для існування цієї команди. Але немає ні вбудованої, ::
ні зовнішньої команди ::
. Тому це призводить до помилки.
Ну, який типовий формат для помилки?
<shell>: <command user typed>: error message
Таким чином, те, що ви бачите, - це не три кольори, а те, що ви ввели, вставили у стандартний формат помилок.
Зауважте також, що :
можуть брати аргументи командного рядка, тобто робити це законно:
: :
У цьому випадку оболонка вважатиме, що це два "слова", одне з яких - команда, а інше - позиційний параметр. Це також не призведе до помилок! (Див. Також історичну записку (пізніше у цій відповіді) про використання параметра :
з позиційними параметрами.)
Зауважте, що форматування також може відрізнятися між різними оболонками. Бо bash
, ksh
і mksh
поведінка послідовна. Наприклад, /bin/sh
оболонка Ubuntu за замовчуванням (яка є насправді /bin/dash
):
$ dash
$ ::
dash: 1: ::: not found
де 1 - номер команди (еквівалентний номеру рядка в скрипті).
csh
навпаки, взагалі не повідомляє про помилку:
$ csh
% ::
%
Насправді, якщо ви запускаєте strace -o csh.trace csh -c ::
, вихід треку у csh.trace
файлі виявляє, що csh
виходить зі статусом виходу 0 (немає помилок). Але tcsh
видає помилку (не вказуючи її назви):
$ tcsh
localhost:~> ::
::: Command not found.
Загалом, першим пунктом повідомлення про помилку має бути процес виконання або функція (ваша оболонка намагається виконати ::
, отже, повідомлення про помилку походить від оболонки). Наприклад, тут виконується процес виконання stat
:
$ stat noexist
stat: cannot stat 'noexist': No such file or directory
Фактично, POSIX визначає функцію perror () , яка згідно з документацією бере строковий аргумент, потім виводить повідомлення про помилку після двокрапки, а потім новий рядок. Цитата:
Функція perror () повинна відображати номер помилки, доступ до якого здійснюється через символ errno, на повідомлення про помилку, залежне від мови, яке записується у стандартний потік помилок таким чином:
По-перше (якщо s не є нульовим покажчиком, а символ, на який вказує s, не є нульовим байтом), рядок, на який вказує s, слідує двокрапкою та <пробілом>.
Потім рядок повідомлення про помилку, а потім <newline>.
І аргументом рядка perror()
технічно може бути що завгодно, але, звичайно, для ясності це, як правило, ім'я функції або argv[0]
.
На відміну від цього, GNU має власний набір функцій та змінних для обробки помилок , якими програміст може користуватися fprintf()
для stderr
передачі потоку. Як показує один із прикладів на пов'язаній сторінці, щось подібне можна зробити:
fprintf (stderr, "%s: Couldn't open file %s; %s\n",
program_invocation_short_name, name, strerror (errno));
У старих оболонках Unix і Томпсона :
використовували goto
оператор (який, за словами користувача Perderabo, на цій темі не був вбудованою оболонкою). Цитата з посібника:
У всьому файлі команд шукається рядок, що починається з символу: як першого непорожнього символу, після якого - один чи більше пробілів, а потім мітка. Якщо такий рядок знайдений, goto репозиціонує зсув командного файлу у рядок після мітки та виходу. Це змушує оболонку переходити до міченої лінії.
Таким чином, ви можете зробити щось подібне, щоб створити нескінченний сценарій циклу:
: repeat
echo "Hello World"
goto repeat
command.com
і Windows " cmd.exe
схожа, але протилежна ситуація: :
явно є готильованою міткою (не командою) і часто переставляється як символ коментаря (наприклад :: This is a comment
).
Остання двокрапка - це лише частина типового повідомлення "не знайдено":
$ x
x: command not found
$ ::
::: command not found
Причина, що одна товста кишка нічого не виробляє, :
- це дійсна команда, хоча вона нічого не робить (крім повернення TRUE
). З SHELL BUILTIN COMMANDS
розділу man bash
:
: [arguments]
No effect; the command does nothing beyond expanding arguments
and performing any specified redirections. A zero exit code is
returned.
Ви іноді побачите це в подібних конструкціях
while :
do
something
done
Дивіться, наприклад, якій цілі служить вбудована кишка?
Додана двокрапка є частиною самого повідомлення про помилку. Якщо вводити один, cd ow
це призводить до того bash: cd: ow: No such file or directory
, що помилка вводить зайву кишку: No such file or directory
$ ::
bash: ::: command not found
$ kkkk
bash: kkkk: command not found
третій - це прокладка від форматування
у bash a :
- пуста рядова інструкція