Что является целью: (двоеточие) встроенный Bash GNU?

Какова цель команды, которая ничего не делает, будучи немного больше, чем лидер комментария, но является на самом деле оболочкой, встроенной в и себя?

Это медленнее, чем вставка комментария в Ваши сценарии приблизительно на 40% за вызов, который, вероятно, варьируется значительно в зависимости от размера комментария. Единственные возможные причины I видят для него, они:

# poor man's delay function
for ((x=0;x<100000;++x)) ; do : ; done

# inserting comments into string of commands
command ; command ; : we need a comment in here for some reason ; command

# an alias for `true' (lazy programming)
while : ; do command ; done

Я предполагаю то, что я действительно ищу, то, какое историческое приложение это, возможно, имело.

312
задан amphetamachine 4 September 2015 в 05:20
поделиться

4 ответа

Исторически оболочки Борна не было истина и ложь в качестве встроенных команд. true вместо этого был просто псевдонимом : , а false - чем-то вроде let 0 .

: немного лучше, чем true для переносимости на древние оболочки, полученные из Борна. В качестве простого примера рассмотрим отсутствие ! Оператор конвейера и оператор списка || (как это было в некоторых древних оболочках Борна). Это оставляет предложение else оператора if в качестве единственного средства для перехода на основе статуса выхода:

if command; then :; else ...; fi

Поскольку if требует непустого ], затем предложение и комментарии не считаются непустыми, : не используется.

В настоящее время (то есть: в современном контексте) обычно можно использовать либо : , либо true . Оба они определены POSIX, и некоторые считают, что true легче читать. Однако есть одно интересное отличие: : - это так называемый специальный встроенный POSIX , тогда как true - это обычный встроенный ].

  • В оболочку должны быть встроены специальные встроенные модули; Обычные встроенные модули встраиваются только «обычно», но это не строго гарантируется. Обычно не должно быть обычной программы с именем : с функцией true в PATH большинства систем.

  • Вероятно, наиболее важным отличием является то, что со специальными встроенными модулями любая переменная, установленная встроенными средствами - даже в среде во время простой оценки команды - сохраняется после завершения команды, как показано здесь с использованием ksh93:

     $ сбросить x; (x = hi:; echo "$ x")
    Привет
    $ (x = привет правда; эхо "$ x")
    
    $
    

    Обратите внимание, что Zsh игнорирует это требование, как и GNU Bash, за исключением случаев, когда он работает в режиме совместимости с POSIX, но все другие основные оболочки, производные от POSIX sh, соблюдают это требование, включая dash, ksh93 и mksh.

  • Еще одно отличие состоит в том, что обычные встроенные модули должны быть совместимы с exec - продемонстрировано здесь с использованием Bash:

     $ (exec:)
    -bash: exec: :: not found
    $ (exec истина)
    $
    
  • POSIX также явно отмечает, что : может быть быстрее, чем true , хотя это, конечно, специфическая деталь реализации.

390
ответ дан 23 November 2019 в 01:10
поделиться

Я использую его, чтобы легко включать/выключать команды переменных:

#!/bin/bash
if [[ "$VERBOSE" == "" || "$VERBOSE" == "0" ]]; then
    vecho=":"     # no "verbose echo"
else
    vecho=echo    # enable "verbose echo"
fi

$vecho "Verbose echo is ON"

Таким образом

$ ./vecho
$ VERBOSE=1 ./vecho
Verbose echo is ON

Это делает скрипт чистым. Это невозможно сделать с помощью '#'.

Кроме того,

: >afile

это один из самых простых способов гарантировать, что 'afile' существует, но имеет длину 0.

61
ответ дан 23 November 2019 в 01:10
поделиться

Это похоже на pass в Python.

Одним из применений было бы заглушить функцию до тех пор, пока она не будет записана:

future_function () { :; }
29
ответ дан 23 November 2019 в 01:10
поделиться

Вы можете использовать его в сочетании с обратными знаками (``) для выполнения команды без отображения ее вывода, например так:

: `some_command`

Конечно, вы можете просто сделать some_command > /dev/null, но :-версия несколько короче.

Учитывая это, я бы не рекомендовал делать это на самом деле, так как это только запутает людей. Это просто пришло в голову как возможный вариант использования.

21
ответ дан 23 November 2019 в 01:10
поделиться