2017-01-07 2 views
0

Я хочу, чтобы он получил псевдоним cd, чтобы он взял меня в корень моего текущего проекта git, и если его не найти, он приведет меня в мой обычный домашний каталог.

Я пытаюсь установить HOME либо в корень git, либо, если это не может быть найдено, моя обычная домашняя переменная.

alias cd='HOME="${$(git rev-parse --show-toplevel):-~}" cd' 

Это не работает.

ответ

3

Вы не можете выполнить команду внутри ${}, за исключением предложения fallback, когда значение не задано (в POSIX sh или bash; возможно, это возможно в zsh, что позволяет использовать всевозможные синтаксисы oddball).

Несмотря на это, гораздо меньше искажений необходимы при использовании функции:

# yes, you can call this cd, if you *really* want to. 
cdr() { 
    if (($#)); then 
    command cd "[email protected]" 
    else 
    local home 
    home=$(git rev-parse --show-toplevel 2>/dev/null) || home=$HOME 
    command cd "$home" 
    fi 
} 

Примечания:

  • Использования функции позволяет нам проверить наш список аргументов, используйте разветвление логика, локальные переменные, & с.
  • command cd используется, чтобы позвонить в реальную версию, а не рекурсивно.
+0

'command cd' vs' builtin cd'? Я использовал 'builtin' в каждой функции, которую я написал до сих пор:/ – theonlygusti

+0

Можно ли скрыть .. stderr, я думаю ... из' $ (git rev-parse --show-toplevel) ', потому что это ошибки, если нет git-repos. – theonlygusti

+0

Конечно; поставьте '2>/dev/null' внутри подоболочки. –

2

Конечно, можно выполнять команды внутри разложений параметров.
Ну, только на стороне отказа, то есть:

$ unset var 
$ echo ${var:-"$(echo "hello world!")"} 

Таким образом, вы можете получить команду мерзавец выполняется, если вы используете сторону отказа. Предполагая, что вар пуст:

unset var 
var=${var:-"$(git rev-parse --show-toplevel 2>/dev/null)"}" 

Но это было бы проще с:

var="$(git rev-parse --show-toplevel 2>/dev/null)" 

И, если переменная пуста после этого, использование:

HOME=${var:-~} builtin cd 

что урожайность:

var="$(git rev-parse --show-toplevel 2>/dev/null)"; HOME=${var:-~} builtin cd 

, который может использоваться в псевдониме как:

alias cdr='var="$(git …)"; HOME=${var:-~} builtin cd' 
+0

Это оригинальный ответ, который я искал. – theonlygusti

+0

Умный. Браво!! –

Смежные вопросы