Как я могу сократить, если затем еще использовать формат

Я хочу сократить это до одного лайнера:

if ls --version 2>/dev/null | grep -q 'coreutils'; then alias ls='ls --color=always' else alias ls='ls -G' fi 

Я часто использую [] для условных [ -z(or -n) condition] , например, условие [ -z(or -n) condition] но еще не пришлось делать какую-либо часть в этом формате.

В рубине я бы сделал condition ? true : false condition ? true : false Есть ли эквивалент в bash?

Я пытался

 [ -z ls --version 2>/dev/null | grep -q 'coreutils'] ? alias ls='ls --color=always' : alias ls='ls -G' 

но, очевидно, это неправильный способ сделать это.

Я хочу один лайнер, потому что я хочу, чтобы весь мой .bashrc в маленьком окне (<50 строк), так что, как и в случае с другими многострочными слоями, я могу скомпоновать их в один лайнер, когда это возможно. Мне удобнее жертвовать читабельностью размера для этого примера.

Я также пробовал:

 [ -z ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G' 

а также

 [ -n ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G' 

а также

 [ ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G' 

но я всегда получаю псевдоним «else», а не псевдоним «then»

Я мог бы просто отменить его, но я подозреваю, что, поскольку он не работает правильно, это не поможет. Единственный способ убедиться, хотя это попробовать его на OSX, и я сейчас на ubuntu.

  • Почему вы не можете перечислить файл / каталог относительно .. из каталога символической ссылки (Нет такого файла или каталога)?
  • Вывести поле ls -l с цифрами, сгруппированными по тысячам?
  • Что означает список @ после каталога?
  • Почему «du -b» показывает другой размер, чем «правый щелчок» ⇨ «свойства» внутри файловых браузеров?
  • Символические ссылки с ls, mv: принуждение функций к использованию «логических» адресов (запоминание исходного пути)
  • передача переменной ls в grep при выполнении поиска файла работает только внутри каталога
  • Как найти последние n новых файлов для каждой из нескольких каталогов
  • используя ls в bash
  • 2 Solutions collect form web for “Как я могу сократить, если затем еще использовать формат”

    ТЛ; др;

    использование

     ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'` 

    Детали….
    [...] нужны только для оценки условных выражений (статистика файлов, сравнение строк, числовые сравнения, см. CONDITIONAL EXPRESSIONS в bash(1) ). Они также понадобятся для этого в if ... ; then ...; else if ... ; then ...; else if ... ; then ...; else построить.

    Для относительно простых конструкций

     if CONDITION; then EXPR1 else EXPR2 fi 

    можно заменить на

     CONDITION && EXPR1 || EXPR2 

    Если вам не нужно [...] в первом случае, вам это не нужно для второго.

    В вашем случае CONDITIONls --version 2>/dev/null | grep -q 'coreutils' ls --version 2>/dev/null | grep -q 'coreutils' , то есть код возврата grep . Так что вы можете просто написать

     ls --version 2>/dev/null | grep -q 'coreutils' && alias ls='ls --color=always' || alias ls='ls -G' 

    BTW: Было бы проще проверить, поддерживает ли ls --color напрямую:

     ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G' 

    С помощью zsh его можно сжать до:

     if {ls --version|&grep -q coreutils} {alias ls='ls --color=always' } else {alias ls='ls -G'} 

    cmd1 && cmd2 || cmd3 cmd1 && cmd2 || cmd3 в качестве замены для if / then / else, как правило, следует избегать, поскольку это совсем не то же самое.

    В

     cmd1 && cmd2 || cmd3` 

    cmd2 выполняется, если cmd1 возвращает true . И cmd3 выполняется, если какой-либо из cmd1 или cmd2 возвращает false.

    В вашем случае cmd2 ( alias ) вряд ли вернет false, но в общем случае легко забыть о проблеме, поэтому лучше избегать этой конструкции в первую очередь.

    Единственная реальная причина, по которой это может быть полезно, – это когда вы хотите написать код, который работает как в Bourne-подобных, так и в csh-подобных оболочках (или rc подобных, где это работает), где конструкция if/then/else имеет разные синтаксис.

    Interesting Posts

    Утилита командной строки для изучения бит-скручивающих хаков

    Почему остановка не выключает машину?

    отображать переменную unix с помощью dbms_output.put_line

    Как решить, почему Apache пытается «execmem»?

    Как контролировать создание txt-файла без использования incron?

    Невозможно скопировать / переместить между файловыми системами с помощью SFTP

    какие инструменты я могу использовать, чтобы быстро показать / скрыть некоторые напоминания о себе?

    Извлеките первые две части каждой линии, используя awk

    Postfix trivial-rewrite неправильно расшифровывает получателя после завершения виртуального наложения

    Раздел LVM + LUKS. Является ли эта архитектура зависимой или независимой?

    Как я могу подключиться к выходу одного терминала с другого терминала?

    файл списка файлов для пакета 'gucharmap' отсутствует окончательная новая строка

    Как убедиться, что определенные устройства всегда используют один и тот же файл устройства?

    Emacs получил синий фон после обновления до 3.20

    CentOS – Yum – Несколько URL-адресов

    Linux и Unix - лучшая ОС в мире.