Я хочу сократить это до одной строки:
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
конструкции имеют разный синтаксис.