Posso usar cd ../ .. como um nome alternativo?

11

Estou usando o Windows e o Ubuntu em paralelo e faço coisas de console nos dois.

No Windows eu posso fazer uma

C:\Users\Thomas>cd..\..
C:\>

No entanto, no Linux, isso não funciona, nem com barras invertidas nem com barras invertidas.

21:17:10 $ cd../..
bash: cd../..: No such file or directory

Como muitas vezes cometi esse erro, tentei definir um alias .bash_aliasespara essa situação:

alias cd../..='cd ../..'
alias cd..\..='cd ../..'

Quando inicio uma nova festança, recebo

21:16:26 $ bash
bash: alias: `cd../..': invalid alias name

Como eu configuraria aliases para cd..\..e cd../..corretamente?

O cd..\..parece ter problemas com o caractere de escape:

21:39:43 $ cd..\..
bash: cd....: command not found

Não funciona, mesmo se eu definir outro alias para cd.....

Thomas Weller
fonte
2
Você não pode. Um comando, alias ou nome de arquivo não pode conter o /caractere. A \ versão, por outro lado, deve funcionar bem.
fkraiem 27/09/14
@krakraiem: Parece que a versão da barra invertida tem problemas como caractere de escape. Atualizado a pergunta.
Thomas Weller
Ah, de fato. De man bash: os caracteres /, $, `e = e qualquer um dos metacaracteres do shell ou caracteres de citação listados acima podem não aparecer em um nome alternativo.
fkraiem 27/09/14
Droga. Eu tentei man aliase não existia. Se você der isso como resposta, eu aceito.
Thomas Weller
Aliases são uma coisa, funções shell são outra. Dê outra olhada.
alexis

Respostas:

10

/e \estão entre os caracteres que não podem aparecer no nome alternativo do Bash. De man bash:

Os caracteres /, $`e =e qualquer um dos metacaracteres do shell ou caracteres de citação listados acima podem não aparecer em um nome alternativo.

Como solução alternativa, você pode alternar para o Zsh, que permite:

% grep 'alias.*cd' .zshrc 
alias cd../..='cd ../..'
alias cd..\\..='cd ../..'
% pwd
/Users/firas
% cd../..
% pwd
/ 
% cd
% pwd
/Users/firas
% cd..\..
% pwd
/
Fkraiem
fonte
12

Você não pode usar barras em um nome alternativo. No entanto, o Bash os permite nomes de funções, para que você possa transformar isso em uma função:

cd../.. () { cd ../..; }

Você não pode usar barras invertidas em um alias ou nome de função. O caractere de barra invertida cita o próximo caractere, portanto, cd..\..é analisado cd....também, muito antes da cadeia de caracteres ser procurada como um nome de comando. Se você quiser chamar um comando chamado cd..\.., você precisa digitar cd..\\.., 'cd..\..'ou algo equivalente. Além disso, um nome de comando que foi citado de qualquer forma não é considerado para pesquisa de alias, portanto, você nunca pode usar um nome de alias que contenha uma barra invertida. O Bash também não permite barras invertidas nos nomes das funções. Como cd..\..é analisado como cd...., você pode definir uma função chamada cd....(como acima).

Se você usar o cdcomando, precisará digitar o espaço após ele, como qualquer outro comando. Mas você pode salvar a digitação não digitando cdnada. Defina a autocdopção com a seguinte linha em ~/.bashrc:

shopt -s autocd

Em seguida, você pode digitar um nome de diretório na linha de comando e "executar" esse diretório será alterado para ele.

~/some/sub/directory$ ../..
~/some$ 
Gilles 'SO- parar de ser mau'
fonte
Se eu fizer a shoptcoisa, eu provavelmente vou perder essa funcionalidade no Windows breve :-)
Thomas Weller
Hum, isso não é verdade. As barras são aceitas nos nomes das funções do bash.
alexis
@ alexis Ah, certo, você pode usar barras no bash. Corrigido, obrigado.
Gilles 'SO- stop be evil'
@ThomasW. Claro que você vai. autocdfoi uma das razões pelas quais mudei para o zsh, quando o bash não o possuía. A única maneira decente de usar o Windows é instalar o Cygwin de qualquer maneira, completo com o zsh.
Gilles 'SO- stop be evil'
5

"Você não pode usar barras em um apelido ou nome de função "? Isso é novidade para mim. Uso a seguinte função shell há anos no Linux e OS X bash e nunca tive nenhum problema:

function ../.. { cd ../..; echo "$PWD"; }

Naturalmente, também cd../..é um bom nome de função. Uma barra pode ser usada em um nome de função de shell.

Quanto à versão da barra invertida, você não pode incorporá-la em um apelido ou nome da função, mas não precisa: Quando você digita cd..\.., o bash interpreta a barra invertida como uma fuga e tenta executar o resultado cd..... Então defina isso e você pode fazer tudo o que procurava. Você é bem vindo.

function cd.... { cd ../..; } 
alexis
fonte
2

Se você deseja manter os aliases, por que não fazer:

alias   ..='cd ..'
alias  ...='cd ../../' 
alias ....='cd ../../../'

Ou, se você precisa ir caminho de volta:

alias   .3='cd ../../../' 
alias   .4='cd ../../../../'
alias   .5='cd ../../../../../'
# how far back do you need to go on a normal basis..?

Não faço ideia de como isso ajuda você a se manter mentalmente sincronizado com o cérebro do Windows, mas ainda parece um caminho simples. (Pelo menos para aqueles de nós que têm a sorte de não precisar se preocupar com a maneira como as coisas são feitas no Windows.)

Jon
fonte