Pode ',,' ser alias de '..'?

41

Às vezes, quando quero mudar para o diretório pai, digito por engano em cd ,,vez de cd ... Existe uma maneira de fazer com que o bash considere essas instruções iguais? Eu nunca uso vírgulas em meus comandos. Idealmente, gostaria de alias ,,para ... Quando tentei isso, não funcionou. Por que isso não funcionou? De que outra forma posso abordar esse problema?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory
quilojoules
fonte
6
Um alias é um programa para executar, não um argumento para o programa; assim $ ,,iria reclamar, tais como: bash: ..: Is a directory. (Em outras palavras, não é um executável.)
jpaugh
5
@jpaugh: Uma maneira mais clara de dizer isso é: a expansão de alias acontece apenas na primeira "palavra" de um comando. Então, como você diz, ele funciona apenas para nomes de comandos, não args. (E você não poderia mesmo alias 'cd ,,'='cd ..'. Bem, você poderia, mas você tem que executá-lo como cd\ ,,para torná-lo uma palavra só.)
Peter Cordes
5
Considere o zsh. Ele tem aliases globais alias -g ,,=..e cd ,,funciona como você espera.
Muru
1
O pensamento lateral: find / -type d -exec ln -s .. {}/,, \;... ;-)
Toby Speight
2
Imho: não faça isso. Usar aliases para encobrir erros tipográficos é uma prática ruim. Esses erros podem acabar em códigos ou screencasts copiados e colados. Não funcionará em outros hosts ou contas. E essa modificação (dependendo de como é implementada) pode causar outros erros inesperados e difíceis de depurar. Minha sugestão: se você digitar um comando errado, simplesmente digite-o novamente ;-).
Jjmontes

Respostas:

45

ZSH:

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

De man zshbuiltins:

Se o -g sinalizador estiver presente, defina um alias global; aliases globais são expandidos, mesmo que não ocorram na posição de comando.

BATER:

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

Esta é uma solução de alias puro, conforme solicitado, no entanto , isso fará mais do que o necessário, possivelmente frustrando o usuário (consulte o aviso no final da minha postagem).

Citação man bash:

Se o último caractere do valor do alias estiver em branco, a próxima palavra de comando após o alias também será verificada quanto à expansão do alias.

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

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

dá exatamente o que você precisa.

Observe que isso está correto não apenas para bash(e sua aliasimplementação), mas para todos os shells compiladores POSIX. Citando um exemplo de man 1p alias(o manual não descreve esse recurso explicitamente, apenas através de um exemplo):

  1. Configure nohup para que ele possa lidar com um argumento que é ele próprio um nome alternativo:

           alias nohup="nohup "

Aviso: como o @PeterCordes escreve em seu comentário, ele automaticamente fará com que outros aliases se expandam quando escritos depois cd. Pode ser necessário que você escreva cd \grepse deseja alterar o diretório para um nomeado, grepmas seu grepé um alias para grep --color=auto. Sem a barra invertida, cdserá relatado o erro "muitos argumentos" (você não pode acessar cddois diretórios ao mesmo tempo) !.

mosca de isopor
fonte
22
Isso é um truque inteligente, mas desagradável. Eu não gostaria de fazer isso; muito fácil para isso te morder acidentalmente. por exemplo, se você tem um apelido para um comando que normalmente executa, e deseja cdentrar em um diretório com seu código-fonte. Ou outras colisões entre seus aliases e nomes de diretório comuns. Like cd drse expandiria cd disown -rpara mim, com esse apelido. Enfim, é muito melhor substituir o builtin cdpor uma função para coisas como essa, IMO.
Peter Cordes
8
+1 para solução de alias puro (eu aprendi alguma coisa). Ao mesmo tempo, concordo com o comentário de Peter. Algum tipo de aviso explícito deve ser adicionado à sua resposta, eu acho.
Kamil Maciorowski
58

Os aliases não devem fazer isso, mas você pode criar uma função chamada cdque é um wrapper para o real cd. Este funciona para mim! Basta colocá-lo em seu .bash_profilearquivo de perfil ou de sua escolha.

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 algum argumento que não seja o caminho (ie -L -P) não for o primeiro argumento. Portanto, esteja avisado, se você tiver um mau hábito de digitar, cd -L ,,isso não ajudará. E isso não é trivial para lidar corretamente, eu acho.

BenjiWiebe
fonte
16
@ BenjiWiebe Eu acho que a versão "comentários e formatação bonita" seria melhor com um if-then-else.
Zwol 27/04
Uau pessoal, muitas boas idéias. Vejo que você está usando o recurso de edição para cuidar das correções necessárias. Não gastei muito tempo testando. :)
BenjiWiebe
1
Como alternativa, basta substituir $1antes de executar o built-in:cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
Toby Speight 28/17
1
@TobySpeight set .. "${@:2}", ou você perde alguma coisa após o primeiro argumento.
chepner
8
Além disso, tecnicamente ..não precisa ser o primeiro argumento; cdno bashpode tomar uma variedade de opções ( -P, -L, -@, -e).
chepner
29

Aliases deve ser a primeira palavra de um comando. Além disso, o alias deve ser substituído por uma palavra, portanto, não há espaços).

Bash Reference Manual: Aliases

Os aliases permitem que uma sequência seja substituída por uma palavra quando é usada como a primeira palavra de um comando simples.

Você poderia usar o pseudônimo de ambos ..e ,,ser cd ...

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/
Steven
fonte
É exatamente o que eu faço! : D esses dois pontos / vírgulas são muito mais fácil de escrever do quecd ..
rav_kr
10
+1, isso não é uma má ideia. Outra maneira de fazer isso .. no Bash é com o shopt -s autocdque permite alterar para qualquer diretório, basta digitar seu nome. Claro que você ainda os alias para,,
ilkkachu
Eu também :-)
joeytwiddle
3

Outra maneira de ..alterar o diretório é ativar o autocd recurso do Bash :

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, ,,mas isso pode ser feito apenasalias ,,=..

ilkkachu
fonte
2

Já existe um aplicativo para um script: https://github.com/shyiko/commacd (sem afiliação a Stanley Shuyiko).

commacdexporta três comandos: ,(para avançar), ,,(para trás) e ,,,(para trás + para frente):

Todos os três tentam corresponder pelo prefixo primeiro. Somente se nenhum resultado for encontrado, eles retornarão à correspondência de substring (difusa)

Para responder à sua pergunta, o script aliases vírgulas para três funções que ele define:

alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward
Doutor Dao
fonte