if command; then ...
оценивает статус выхода команды
. 0 - успех (оценивает условие как true).
Прежде всего: [
(почти) идентичен test
, поэтому он ожидает, что строка command
будет соответствовать его синтаксису.
if [ $(command) ]; then ...
оценивает строку, содержащую вывод command
. В большинстве случаев это не сработает - см. пример ниже.
[ command ] && ..
grep -l "mail" "file"
будет интерпретирован следующим образом:
grep
- строка-l
- унарный оператор, возвращающий длину следующей строки"mail"
- строка, будет передана в качестве аргумента оператору -l
"file"
- строкаВ зависимости от реализации вы получите немного разные ошибки, потому что выше приведена просьба [
оценить последовательность, состоящую из строки, числа и другой строки, без каких-либо операторов. По умолчанию [
(как и test
) является встроенной оболочкой, вы можете сравнить сообщения об ошибках с отдельным бинарником (обычно /bin/[
или /usr/bin/[
).
Это потенциально может быть сделано с помощью ужасных вещей с помощью accept-line
:
function _accept-line() {
if [[ $BUFFER == "." ]]; then
BUFFER="source ~/.zshrc"
fi
zle .accept-line
}
zle -N accept-line _accept-line
Напишите функцию
для
которая вызывает .
встроенную функцию по мере необходимости. Кроме того, ==
некорректен для числовых сравнений в shell (test
странный такой, и требует -eq
или -ne
).
function . {
if [[ $# -eq 0 ]]; then
builtin . ~/.zshrc
else
builtin . "$@"
fi
}