Который более идиоматичен в сценарии удара: '|| верный' или '||':?

Я знаю решение, но, к сожалению, оно требует полномочия пользователя root. Так или иначе Вы могли бы все еще найти это полезным:

sudo lshw -class disk -class storage

Для каждого устройства это распечатает логическое имя (например, /dev/sda) и информация о шине, которая в случае USB-устройства была бы чем-то как 'usb@1:2'.

Демонстрационный вывод:

[...]
  *-storage
       description: SATA controller
       physical id: d
       bus info: pci@0000:00:0d.0
       configuration: driver=ahci latency=64
[...]
     *-disk:0
          description: ATA Disk
          physical id: 0
          bus info: scsi@2:0.0.0
          logical name: /dev/sda
[...]
  *-scsi
       physical id: 3
       bus info: usb@1:2
       configuration: driver=usb-storage
     *-disk
          description: SCSI Disk
          physical id: 0.0.0
          bus info: scsi@6:0.0.0
          logical name: /dev/sdc
[...]
39
07.06.2013, 02:30
3 ответа

true не был встроен в Оболочку Bourne. : всегда был (это был способ ввести комментарии прежде # был представлен).

Это, и потому что это короче для ввода, является, вероятно, главной причиной, которую предпочитают люди : true.

Отметьте другое различие в оболочках POSIX (для bash, только в режиме POSIX): в то время как true встроенный постоянный клиент (не должно даже быть встроено), : встроенное специальное предложение. Это имеет несколько последствий, большинство которых вряд ли окажет любое влияние в данном случае:

  • Если a : управляйте сбоями, включая из-за неудавшегося перенаправления, которое заставляет оболочку выходить. На практике это, вероятно, не будет иметь значения, если Вы не передадите перенаправления :

    $ sh -c ': > /   ; echo HERE'
    sh: 1: cannot create /: Is a directory
    $ sh -c 'true > /; echo HERE'
    sh: 1: cannot create /: Is a directory
    HERE
    
  • в var=value :, var остается установленным на value после : возвраты, не в случае true:

    $ var=1; var=2 :   ; echo "$var"
    2
    $ var=1; var=2 true; echo "$var"
    1
    

Также отметьте это || true работы в оболочках rc и csh семейства, но нет || : (но не отменять set -e в csh).

|| : не то же как :. Это означает или выполненный : иначе (то есть, если предыдущий конвейер перестал работать).

set -e
false

Заставил бы оболочку выходить из-за set -e и false имеет ненулевое (отказ) статус выхода. set -e эффект отменяется, если команда, которая возвращает ненулевой статус выхода, используется в качестве условия как в:

if false; then ...
while false; do ...
false && : ...
false || : ...

false && : только отмены set -e. false || : отмены set -e и устанавливает статус выхода на 0 так более идиоматично, чтобы сказать, что мы хотим проигнорировать код выхода отказа команды. Большинство обсудило бы это || true является более четким (передает намерение более ясно).

40
27.01.2020, 19:35
  • 1
    && : является блестящим, там какие-либо документы или дополнительные материалы для чтения на этом? Google терпит неудачу в отношении меня пытающийся найти этот вид ключевых слов … –  Ian Bytchek 08.10.2015, 11:11

Обычно в ударе, двоеточии : и true эквивалентно.

||: считавшийся более идиоматичным?

Я думаю, что это основано на контексте.

Если Вы хотите a return value, или a condition всегда верно, необходимо использовать true ключевое слово, это, сделает Ваш код более ясно и позволит средствам просмотра знать, что Вы хотите, подчеркивают верное значение, т.е.:

while true; do something

или

<commnad>
RETURN_VALUE= $? || true

И если Вы хотите ничего не сделать, или NOP в оболочке необходимо использовать двоеточие :

if condition
then
    : # DO NOTHING HERE
else
    do something
fi 

или

while conditon
do
    : # DO NOTHING HERE
done
5
27.01.2020, 19:35

Большинству этих ответов не удается обратиться к наиболее популярному способу использования :.

Во-первых, это обсуждение не связано ни с какой оболочкой, которая не является Оболочкой Bourne (sh) производная. Тем не менее все оболочки производной Bourne видят true и : как то же самое. Программисты раньше поощрялись использовать : вместо true, потому что : всегда встроенное, в то время как раньше были случаи где true было не всегда встроенное.

: имеет два использования. Это не синоним для #, но это имеет другую функцию. При отладке сценария под a set -x, строки, где # используется отбрасываются синтаксическим анализатором и полностью игнорируются, тогда как строки с : проанализированы и оценены. Это действительно полезно в отладке с тех пор под -x те строки показывают и их значение после того, как оценка будет отображена. Это похоже на помещение print операторы в Вашем коде то единственное шоу под -x режим. Будьте осторожны со значениями после : так как они - реальный код, и побочные эффекты могут влиять на Вашу программу.

5
27.01.2020, 19:35

Теги

Похожие вопросы