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

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

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.

  • Использование шаблонов OR в шаблонах оболочки
  • Цитирует имена файлов с пробелами в выводе ls на OSX
  • Разные выходы команд «ls. *» И «ls *.»
  • Что означает @ перед именем каталога?
  • Что на самом деле выводит «ls -dired-l» или «ls -D -l»?
  • Вывести поле ls -l с цифрами, сгруппированными по тысячам?
  • Получился странный результат при выполнении команды bash «cd / usr / share /; ls * z "
  • dircolors: изменить настройки цвета globaly
  • 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

    X (?) Перезапуск каждую минуту при тестировании debian

    Возможно ли монтировать устройство в пространстве имен процессов после unshare ()

    Выбор случайной выборки из дерева каталогов

    наложить изображение

    Как я могу настроить byobu для использования второго сеанса экрана при входе в систему?

    Абортная задача при запуске на Ubuntu 14.04

    Как скопировать / объединить два каталога, и если два файла имеют одинаковое имя, переименуйте более старый, добавив время его модификации

    «Возобновление» Ubuntu после смерти батареи

    Как работают разрешения / атрибуты файлов? Уровень ядра, уровень FS или оба?

    Убирать все PDF-файлы в каталоге, сохраняя структуру каталогов

    Двойное сиденье в Linux с 3D-ускорением и одной видеокартой

    удаление строк между строками в текстовом файле с помощью awk или sed

    Что означает «apt»?

    Программное обеспечение Linux-RAID и загрузчик

    Выполнять параллельные параллельные параллели

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