Как сократить if then else с помощью формата

Как сократить if then else с помощью формата

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

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

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

В Ruby я бы сделал 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.

решение1

вкратце;

Использовать

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

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

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

if CONDITION; then
    EXPR1
else
    EXPR2
fi

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

CONDITION && EXPR1 || EXPR2

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

В вашем случае CONDITIONэто 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'

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

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

решение2

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

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

Обычно следует избегать использования конструкции 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конструкции имеют разный синтаксис.

Связанный контент