Какой смысл "пустого" оператора в сценарии Bash? Я понимаю, что это используется в качестве заполнителя после if
управляйте, когда Вы не будете иметь ничего для высказывания, но будете нуждаться в команде, чтобы позволить программе работать правильно. Но каково полное использование для него? Когда Вы использовали бы его? Когда имеет смысл использовать его?
Иногда полезно позволить побочным эффектам расширений параметра произойти.
, Например, устанавливая значение по умолчанию
read -p "Enter your name: " name
: ${name:=John Doe} # if the user entered an empty string
echo "$name"
Можно также использовать его для бесконечных циклов:
while : ; do
# ....
done
Можно использовать его для создания файла, не запуская программу::
: > /path/to/file
Это бесконечно мало быстрее, чем touch /path/to/file
(так как это не требует выполнения touch
программа), и может быть незначительно более портативным, чем просто
> /path/to/file
, который, кажется, работает над многими системами. Точно так же это может привыкнуть к проверка, есть ли у Вас доступ для записи к файлу :
if { : >> /path/to/file;} 2> /dev/null
then
echo "writeable"
else
echo "write permission denied"
fi
, хотя это, также, может обычно делаться без :
. Протесты:
(См. связанный вопрос по причинам, почему это более надежно, чем if [ -w /path/to/file ]
.)
Я просто использовал его в сценарии с командами SSH для хранения сценария от erroring.
В этом случае, я хочу видеть, может ли пользователь соединиться с рядом серверов. Если соединение будет в порядке, то удаленный хост отзовется эхом хорошо. Если связь прервется, то SSH ответит ошибкой. Однако я хочу, чтобы мой сценарий вышел с 0 а не значение команды SSH, если это перестало работать. Таким образом, по существу я захватываю ошибку SSH осуществлением операции ИЛИ это ||
с пустой командой :
. Похож на это:
#!/bin/bash
for i in $(cat servers.txt); do
echo -n "$i ";
ssh user@${i} 'echo OK' || :;
done
Тот путь я получаю вывод от SSH, но не кода ошибки:
....
swl06 ok
swl07 ok
swl08 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
swl09 ok
swl10 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
....
Путь назад, в Unix V6 и Thompson Shell, :
на самом деле использовался в качестве части goto
оператор. Согласно руководству, это первоначально появилось в версии 3 Unix:
Весь командный файл ищется строку, начинающуюся a: как первый несимвол пробела, сопровождаемый одним или несколькими пробелами и затем маркировкой. Если такая строка найдена, goto меняет местоположение смещения командного файла к строке после маркировки и выходов. Это заставляет оболочку передавать маркированной строке.
В наше время, в bash
, это не используется в качестве никакого-op оператора, возвращая успех. Действительно при рассмотрении исходного кода Вы будете видеть это оба true
и :
используйте ту же функцию, int colon_builtin()
, внизу. Существует нет :
невстроенная команда, и /bin/true
на самом деле довольно большая команда для того, что она делает.
:
мог использоваться где угодно true
используется, например, в command_that_can_fail || true
, хотя это, вероятно, смутит неспециалистов. Читайте больше об этом здесь.
Можно использовать его на положительном тесте if
управляйте, когда Вы только захотите сделать что-то на отрицательной стороне. Например:
if [[ True == False ]]; then
:
else
echo "true <> flase"
fi
Без :
удар генерировал бы синтаксическую ошибку.
Это - упрощенный пример. Обычно Вы использовали бы такую технику в предварительном кодировании, когда Вы не записали, что для сегмента кода все же и просто нужно что-то, что не генерирует ошибку.