Pode ',' ser aliado para '..'?

40

Às vezes, quando quero mudar para o diretório pai, por engano, digito cd ,, em vez de cd .. . Existe uma maneira que eu possa fazer bash considerar essas declarações para ser o mesmo? Eu nunca uso vírgulas nos meus comandos. Idealmente, gostaria de alias ,, to .. . Quando tentei isso, não funcionou. Por que isso não funcionou? Como mais posso abordar esse problema?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory
    
por kilojoules 27.04.2017 / 19:25

5 respostas

45

ZSH:

Se você estiver usando zsh alias -g ,,=".." é o que você precisa, mas isso fará com que "," seja expandido em todos os lugares, não apenas quando usado com cd .

De man zshbuiltins :

If the -g flag is present, define a global alias; global aliases are expanded even if they do not occur in command position.

BASH:

Se estiver restrito a bash (como a questão está marcada com bash ), leia o seguinte:

Esta é uma solução de puro pseudônimo, conforme solicitado, no entanto isso fará mais do que o necessário, possivelmente frustrando o usuário (veja o aviso no final do meu post).

Citando man bash :

If the last character of the alias value is a blank, then the next command word following the alias is also checked for alias expansion.

Portanto, basta alias cd com um espaço extra (para permitir a expansão de seu próximo argumento) e, em seguida, alias ,, to .. . Veja que

alias cd='cd '
alias ,,='..'

dá exatamente o que você precisa.

Observe que isso está correto não apenas para bash (e sua alias implementation), mas também para todos os shells de compilações POSIX. Citando um exemplo de man 1p alias (o manual não descreve esse recurso explicitamente, apenas por meio de um exemplo):

  1. Set up nohup so that it can deal with an argument that is itself an alias name:

           alias nohup="nohup "
    

Aviso: Como @PeterCordes escreve em seu comentário, ele automaticamente fará com que outros aliases sejam expandidos quando escritos após cd . Pode ser necessário que você escreva cd \grep se quiser alterar o diretório para um chamado grep , mas seu grep é um alias para grep --color=auto . Sem a barra invertida, cd reportará erro "muitos argumentos" (você não pode cd para dois diretórios de uma só vez)!.

    
por 28.04.2017 / 02:57
57

Os aliases não são destinados a isso, mas você pode criar uma função chamada cd , que é um wrapper para o% realcd. Este aqui funciona para mim! Basta colocá-lo em seu .bash_profile ou em seu arquivo de perfil de preferência.

cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }

Ou, com comentários e formatação bonita:

cd ()
{
  if [ "$1" = ",," ]; then  # if first argument is ",,"...
    builtin cd ..           # call the builtin cd with ".." instead...
  else
    builtin cd "$@"         # else call builtin cd with original arguments 
  fi
}

EDITAR

Obrigado @derobert por apontar que if then else é melhor aqui do que && || . Além disso, acabei de perceber ( * facepalm *) que essa implementação só funcionará se qualquer argumento não caminho (por exemplo, -L -P ) não for o primeiro argumento. Então esteja avisado, se você tem um mau hábito de digitar cd -L ,, , isso não vai ajudá-lo. E isso não é trivial para lidar corretamente, eu acho.

    
por 27.04.2017 / 19:46
29

Os aliases devem ser a primeira palavra de um comando. Além disso, o alias deve ser substituído por uma palavra , portanto sem espaços).

Bash Reference Manual: Aliases

Aliases allow a string to be substituted for a word when it is used as the first word of a simple command.

Você pode alias de .. e ,, a cd .. .

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/
    
por 27.04.2017 / 19:32
3

Outra maneira de fazer o .. alterar o diretório é ativar o % do Bash. código% recurso :

shopt -s autocd 

Isso mudará automaticamente o diretório quando você digitar o nome de um:

~$ /tmp
cd /tmp
/tmp$ 

Você ainda precisa criar um alias para autocd , mas isso pode ser feito com apenas ,,

    
por 29.04.2017 / 16:18
2

Já existe an app um script para isso: link (nenhuma afiliação com Stanley Shuyiko).

commacd exports three commands: , (for jumping forward), ,, (backward) and ,,, (backward+forward):

All three of them try to match by prefix first. Only if no results are found, will they fallback to substring (fuzzy) matching

Para responder à sua pergunta, o script alias as vírgulas a três funções que define:

alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward
    
por 28.04.2017 / 02:52