Я искал noop в bash (:), но не смог найти никакой хорошей информации. Какова точная цель или вариант использования этого оператора?
Я пробовал следовать, и у меня это работает так:
[mandy@root]$ a=11
[mandy@root]$ b=20
[mandy@root]$ c=30
[mandy@root]$ echo $a; : echo $b ; echo $c
10
30
Сообщите мне обо всех случаях использования этого оператора в режиме реального времени или в любом месте, где его использование обязательно.
:
встроенный существует в оболочке bourne и ksh, а также в bash.:
в tldp.org/LDP/abs/html/special-chars.htmlОтветы:
Это больше по историческим причинам. Встроенное двоеточие
:
в точности эквивалентноtrue
. Традиционно используется,true
когда важно возвращаемое значение, например, в бесконечном цикле:Традиционно используется,
:
когда синтаксис оболочки требует команды, но вам нечего делать.В
:
даты BUILTIN все пути назад к Thompson оболочки , это присутствует в Unix v6 .:
был индикатором ярлыка дляgoto
заявления оболочки Томпсона . Метка может быть любым текстом, поэтому используется:
как индикатор комментария (если его нетgoto comment
, то: comment
это фактически комментарий). Bourne оболочка не была ,goto
но продолжала:
.Обычная идиома , которая использует
:
это: ${var=VALUE}
, который устанавливает ,var
чтобы ,VALUE
если это не установлено , и не делает ничего , еслиvar
уже было установлено. Эта конструкция существует только в форме подстановки переменных, и эта подстановка переменных должна каким-то образом быть частью команды: команда no-op служит хорошо.См. Также Какую цель выполняет встроенная толстая кишка? ,
источник
#
для комментариев (или#!/bin/sh
комментариев);:
команда представила комментарии, и горе наивного программиста , который сделал хорошую коробку звезд в комментариях:: ****
(или, что еще хуже,: * * *
).: * * *
?:
это команда, оболочка все равно должна обработать свои аргументы, прежде чем сможет обнаружить, что:
их игнорирует. Чаще всего вы просто заставляете оболочку выполнять дополнительную работу по расширению*
списка файлов в текущем каталоге; это фактически не повлияет на работу скрипта.set -e
. В любом случае, надеюсь, мы все сможем просто согласиться на использование#
:)while : ; do ... ; done
если мне нужен быстрый и грязный бесконечный цикл. (Обычноsleep
в цикле есть символ, и я нажимаю Ctrl-C, чтобы его убить.)Я использую его для операторов if, когда комментирую весь код. Например, у вас есть тест:
но вы хотите временно закомментировать все содержимое:
Это заставляет bash выдавать синтаксическую ошибку:
В Bash не может быть пустых блоков (WTF). Итак, вы добавляете блокировку:
или вы можете использовать no-op, чтобы закомментировать строки:
источник
Если вы используете
set- e
then|| :
, это отличный способ не выходить из скрипта в случае сбоя (он явно заставляет его пройти).источник
|| :
последующей обработки ошибки самостоятельно с помощью anexit 0
позволит вам отображать все stdout и stderr в окне приложения во время отладки. Подумайте,{ foo ... 2>&1; } || :
что намного проще, чем установка более сложных ловушек и условностей.Вы могли бы использовать
:
команду, которая работает успешно, но ничего не делает. В этом примере команда «многословность» по умолчанию отключена, для нее установлено значение:
. Параметр «v» включает его.источник
$(verbosity $i)
последнее (и условно) ничего не делает.Игнорировать
alias
аргументыИногда вам нужен псевдоним, который не принимает никаких аргументов. Вы можете сделать это, используя
:
:источник
:
, к сожалению, не демонстрирует, как работает. Приведенный вами пример кажется излишним.#
#
заставит игнорировать все, что синтаксически следует после в той же строке. Это действительно другое (рассмотритеmy_alias arg ; other_command
или, наоборотmy_alias arg1 {BACKSLASH}{NEWLINE} arg2
), и, вероятно, это не то, что вы хотите, поскольку это может вызвать синтаксические ошибки (угадайте, чтоwhile my_alias ; do true ; done
илиwhile true ; do my_alias ; done
будет делать).Один из вариантов использования - как многострочные комментарии, или чтобы закомментировать часть вашего кода в целях тестирования, используя его вместе с файлом здесь.
Не забывайте использовать кавычки вокруг
EOF
чтобы любой код внутри не оценивался, например$(foo)
. Она также может быть стоит использовать интуитивное имя терминатора , какNOTES
,SCRATCHPAD
илиTODO
.источник
Два моих.
Встраивать комментарии POD
Довольно забавное приложение
:
для встраивания комментариев POD в сценарии bash. , чтобы можно было быстро создавать страницы . Конечно, со временем можно было бы переписать весь сценарий на Perl ;-)Связывание функций времени выполнения
Это своего рода шаблон кода для привязки функций во время выполнения. Fi, имейте функцию отладки, чтобы что-то делать, только если установлен определенный флаг:
Ты получаешь:
источник
Иногда предложения no-op могут сделать ваш код более читабельным.
Это может быть вопрос мнения, но вот пример. Предположим, вы создали функцию, которая работает по двум путям unix. Он вычисляет «путь изменения», необходимый для перехода от одного пути к другому. Вы накладываете ограничение на свою функцию, что оба пути должны начинаться с '/' ИЛИ оба не должны.
Некоторые разработчики захотят удалить no-op, но это будет означать отрицание условия:
Теперь, на мой взгляд, из предложения if не так ясно, при каких условиях вы хотели бы пропустить выполнение функции. Чтобы исключить бездействие и сделать это четко, вам нужно вынести предложение if из функции:
Это выглядит лучше, но во многих случаях мы не можем этого сделать; мы хотим, чтобы проверка выполнялась внутри функции.
Так как часто это происходит? Не слишком часто. Может, раз или два в год. Это случается достаточно часто, чтобы вы знали об этом. Я не уклоняюсь от его использования, когда считаю, что он улучшает читаемость моего кода (независимо от языка).
источник
:
, вы должны использовать:
, а неtrue
в ответе. Тем не менее, самый простой способ свести на нет условных здесь использовать одну[[ ... ]]
команду и префикс с!
:if ! [[ ( ... && ... ) || ( ... && ... ) ]]; then
.: ${...=...}
, возможно, выглядит менее неудобно, чемtrue ${...=...}
. Некоторые могут предпочесть ,while :; do
чтобыwhile true; do
за краткость , а также.В некоторой степени связанный с этим ответом , я считаю, что этот запрет на выполнение операций довольно удобен для взлома сценариев полиглотов . Например, вот правильный комментарий как для bash, так и для vimscript:
Конечно, мы могли использовать
true
точно так же, но:
знак препинания, а не нерелевантное английское слово, дает понять, что это синтаксический токен.Что касается того, зачем кому-то делать такую сложную вещь, как написание сценария-полиглота (помимо того, что это круто): это оказывается полезным в ситуациях, когда мы обычно пишем несколько файлов сценария на нескольких разных языках, причем файл
X
относится к файлуY
.В такой ситуации объединение обоих скриптов в один файл-полиглот позволяет избежать любой работы
X
по определению пути кY
(это просто"$0"
). Что еще более важно, это делает более удобным перемещать или распространять программу.Типичный пример. Существует хорошо известная, давняя проблема с shebangs: большинство систем (включая Linux и Cygwin) позволяют передавать интерпретатору только один аргумент. Следующий шебанг:
запустит следующую команду:
а не по назначению:
Таким образом, вы в конечном итоге напишете сценарий-оболочку, например:
Вот где на сцену выходит полиглоссия.
Более конкретный пример. Однажды я написал сценарий bash, который, помимо прочего, вызывал Vim. Мне нужно было дать Vim дополнительную настройку, которую можно было бы сделать с опцией
--cmd "arbitrary vimscript command here"
. Однако эта настройка была существенной, поэтому встраивание ее в строку было бы ужасным (если вообще возможно). Следовательно, лучшим решением было записать его полностью в некоторый файл конфигурации, а затем заставить Vim читать этот файл с помощью-S "/path/to/file"
. Таким образом, я получил файл bash / vimscript для полиглотов.источник
Я также использовал в нем сценарии для определения переменных по умолчанию.
источник
предположим, что у вас есть команда, которую вы хотите связать с успехом другой:
но теперь вы хотите выполнить команды условно, и вы хотите показать команды, которые будут выполнены (пробный запуск):
поэтому, если вы установите DEBUG и NOEXEC, вторая команда никогда не появится. это потому, что первая команда никогда не выполняется (потому что NOEXEC не пуст), но оценка этого факта оставляет вам возвращение 1, что означает, что подчиненная команда никогда не выполняется (но вы этого хотите, потому что это пробный запуск). поэтому, чтобы исправить это, вы можете сбросить значение выхода, оставшееся в стеке, с помощью noop:
источник