Como posso alias ...
para ../..
no Bash?
Estou ciente de que outras respostas permitem, alias '...'='cd ../..'
mas gostaria de poder abordar o diretório dois níveis acima com outros comandos, permitindo:
cd ...
ls ...
realpath ...
Eu tentei alias '...'='../..'
, mas ao tentar usar isso, recebo o seguinte:
$ alias '...'='../..'
$ type ...
... is aliased to '../..'
$ cd ...
bash: cd: ...: No such file or directory
Estou ciente de que os aliases devem ser usados com comandos. Existe uma maneira de obter a mesma funcionalidade para um caminho neste caso?
Se mudar para zsh for uma opção, você pode usar aliases globais para isso:
Mas, em qualquer caso, isso só é expandido quando
...
é reconhecido como um token totalmente delimitado por conta própria. Será expandido emecho ...
ouecho ...> file
ou(echo ...)
mas não emecho .../x
ouecho ~/...
ouecho "..."
).Os aliases normais do estilo csh, seja em bash ou zsh, são expandidos apenas quando na posição de comando ou após outra expansão de alias terminando em um caractere em branco. No zsh, porém, se você definir a
autocd
opção, inserir../..
ou outro diretório quando o nome do comando for transformado emcd ../..
, entãoSeria uma maneira de
cd
entrar../..
, mas também seriaalias ...='cd ../..'
ou...() cd ../..
.Uma abordagem melhor que venho usando há muitos anos é vincular a .chave a algo que insere
/..
em vez de.
se o que resta do cursor terminar em..
:Em seguida, entrar
...
é imediata e visualmente transformado em../..
e pressionar .novamente muda para../../..
e assim por diante. Se estiver noemacs
modo,..
seguido por Alt+ 4, .torna-o../../../../..
, por exemplo, (/..
anexado 4 vezes) usando o tratamento usual de prefixo NUMÉRICO .Costumava atrapalhar ao copiar/colar coisas que continham
...
, mas isso não é mais um problema agora que o suporte para colagem entre colchetes foi introduzido. Para inserir um literal...
, você pode pressionar Ctrl+ vantes do terceiro.
ou usar barras invertidas, aspas ou qualquer coisa que faça com que o que resta do cursor ($LBUFFER
acima) não termine<blanks-or-slash>..
em.\..
,..\.
,whatever/'...'
...Uma limitação intencional do acima é que, por exemplo, em
sort -o...
, o...
não é expandido. Usesort -o ...
em vez disso. O mesmo vale paracd '.../***'
->cd ...'/***'
. Você pode alterar o teste acima para[[ $LBUFFER = (|*[^.]).. ]]
ser...
expandido../..
em mais contextos, embora isso aumente a probabilidade de ser expandido em lugares que você não gostaria.Podemos tornar o tratamento de argumentos numéricos um pouco mais útil, permitindo 4 níveis acima (expandir para ), por exemplo, com:
cd Alt+4.
cd
../../../..
Conforme mencionado por @Gilles no comentário, versões recentes do bash adicionaram suporte limitado para editar o buffer de linha em comandos vinculados a chaves, para que você pudesse fazer algo semelhante com:
Você precisa do bash 4.0 ou superior para
$READLINE_LINE
(não$READLINE_LINE_BUFFER
como incorreto em parte da documentação) e$READLINE_POINT
, e 5.2 ou superior para$READLINE_ARGUMENT
, embora, conforme observado acima, ainda não funcione corretamente.Você não pode usar aliases para isso, aliases são sobre coisas que você executa, não coisas que você passa para um comando como argumentos. Você poderia usar uma variável, mas isso significaria digitar algo um pouco diferente. Mas se você usar um nome de variável curto, pode ser apenas dois caracteres:
Se isso funcionar para você, você pode adicionar a definição de variável aos seus arquivos
~/.profile
ou~/.bash_profile
e terá acesso a ela em suas sessões de shell:Existem várias maneiras de alcançar seu objetivo
MÉTODO 1: Modifique o código-fonte do bash
Este método é específico da versão, mas ainda é recomendado, pois é a melhor maneira de fazer as coisas. O que eu fiz foi modificado
builtins/cd.def
de forma que, antes de verificar o caminho absoluto, verifique se o primeiro argumento é,...
se for o caso, define odirname
para../..
(soa apenas como alias)PASSO 1: Baixar bash-5.1.16.tar
PASSO 2: Obtenha e aplique o patch bash_5.16_cd_three_dot.patch
PASSO 3: Compile e execute
MÉTODO 2: Habilitar autocd no shopt
Esses métodos não fazem exatamente o que você deseja, mas acho melhor usar técnicas inteligentes de alias
Agora, se você quiser voltar um diretório, basta usar
..
e para dois../..
MÉTODO 3: Use um alias inteligente
Este método funciona, mas não é recomendado, pois pode ser problemático para vários scripts usados
cd
. você pode adicionar isso ao seu.bashrc
ou criar um arquivo separado e incluir o arquivo em.bashrc
Você não pode usar alias diretamente porque
...
é um argumento paracd
, mas eu vi algumas pessoascd..
serem aliascd ..
, então você poderia fazer o mesmo com todos os comandos:Por outro lado...
E então
Alternativamente,