В чем смысл «нулевого» оператора в скрипте BASH? Я понимаю, что он используется в качестве заполнителя после if
команды, когда вам нечего сказать, но вам нужна команда, чтобы программа работала правильно. Но каково общее использование этого? Когда бы вы использовали это? Когда имеет смысл его использовать?
13
Ответы:
Иногда полезно разрешить возникновение побочных эффектов расширения параметров.
Например, установка значения по умолчанию
источник
:
команд и параметров в руководстве по bash.${name:="John Doe"}
будет расширена, что приведет к выполнению присваивания, поскольку оно читается как аргумент для:. Без: оболочка будет пытаться запустить «Джон Доу» в качестве команды или значение,$name
если оно уже установленоВы также можете использовать его для бесконечных циклов:
источник
while true
он более читабелен, потому что (а) он использует меньше знаков препинания и (б) он больше похож на языки, производные от Си.Вы можете использовать его для создания файла без запуска программы:
Это намного быстрее, чем
touch /path/to/file
(так как не требует запускаtouch
программы) и может быть несколько более портативным, чем простокоторый, кажется, работает на многих системах. Точно так же это может использоваться, чтобы проверить, есть ли у вас доступ на запись к файлу :
хотя это также, как правило, можно сделать без
:
. Предостережения:(См. Связанный вопрос по причинам, почему это надежнее, чем
if [ -w /path/to/file ]
.)источник
В Unix V6 и Thompson Shell, на
:
самом деле, они использовались как частьgoto
заявления. Согласно инструкции , она первоначально появилась в 3-й версии Unix:В настоящее время
bash
он используется как оператор без операции, возвращая успех. Действительно, если вы посмотрите на исходный код , вы увидите, что обаtrue
и:
используют одну и ту же функциюint colon_builtin()
внизу. Там нет:
не встроенной команды, и/bin/true
на самом деле это довольно большая команда для того, что она делает.:
может использоваться везде, гдеtrue
используется, например, вcommand_that_can_fail || true
, хотя это может запутать неспециалистов. Подробнее об этом читайте здесь .источник
Вы можете использовать его в положительном тесте
if
команды, когда вы хотите сделать что-то только с отрицательной стороны. Например:Без
:
bash генерируется синтаксическая ошибка.Это упрощенный пример. Обычно вы используете такую технику в предварительном кодировании, когда вы еще не написали этот сегмент кода, и вам просто нужно что-то, что не вызывает ошибку.
источник
if pgrep firefox >/dev/null ; then : ; else echo "Firefox not running"; fi
, ошибка будет отображаться только в том случае, если Firefox не запущен. Другими словами, когда нужно что-то делать только тогда, когда в команде есть ошибка. В некотором смысле это эквивалентноpgrep firefox || echo "Firefox not running"
, хотя и более читабельно и позволяет больше командЯ просто использовал его в сценарии с командами SSH, чтобы избежать ошибок в сценарии.
В этом случае я хочу посмотреть, сможет ли пользователь подключиться к набору серверов. Если соединение в порядке, удаленный хост будет отображать эхо OK. Если соединение не удается, SSH ответит с ошибкой. Тем не менее, я хочу, чтобы мой сценарий завершился с 0, а не со значением команды SSH, если это не удалось. Поэтому, по сути, я перехватываю ошибку SSH, обращаясь к ней
||
с помощью команды null:
. Выглядит так:Таким образом я получаю вывод из SSH, но не код ошибки:
источник