Posso usare cd ../ .. come nome alias?


11

Sto usando Windows e Ubuntu in parallelo e faccio cose console su entrambi.

Su Windows posso fare un

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

Tuttavia, su Linux questo non funziona, né con barre rovesciate né con barre rovesciate.

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

Da quando commetto spesso quell'errore, ho cercato di definire un alias .bash_aliasesper quella situazione:

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

Quando inizio una nuova festa, ottengo

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

Come impostare gli alias per cd..\..e cd../..correttamente?

La cd..\..sembra avere problemi con il carattere di escape:

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

Non funziona, anche se definisco un altro alias per cd.....


2
Non puoi. Un comando, un alias o un nome file non possono contenere il /carattere. La \ versione, d'altra parte, dovrebbe funzionare bene.
fkraiem,

@fkraiem: sembra che la versione con la barra rovesciata abbia problemi come carattere di escape. Aggiornato la domanda.
Thomas Weller,

Oh davvero. Da man bash: I caratteri /, $, `e = e tutti i metacaratteri della shell o i caratteri di citazione elencati sopra potrebbero non apparire in un nome alias.
fkraiem,

Dannazione. Ci ho provato man aliase non esisteva. Se lo dai come risposta, lo accetterò.
Thomas Weller,

Gli alias sono una cosa, le funzioni della shell sono un'altra. Dai un'altra occhiata.
alexis,

Risposte:


10

/e \sono tra i personaggi che non possono apparire in un nome alias di Bash. Da man bash:

I caratteri /, $, `ed =e qualsiasi metacaratteri shell o caratteri citando sopra enumerate non apparire in un nome alias.

Per ovviare al problema, puoi passare a Zsh, che consente sia:

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

12

Non puoi usare le barre in un nome alias. Bash li consente nei nomi delle funzioni, tuttavia, quindi puoi renderlo una funzione:

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

Non è possibile utilizzare le barre rovesciate in un alias o in un nome di funzione. Il carattere barra rovesciata cita il carattere successivo, quindi cd..\..viene analizzato cd...., ben prima che quella stringa venga cercata come nome di comando. Se si desidera chiamare un comando di nome cd..\.., è necessario digitare cd..\\.., 'cd..\..'o qualcosa di equivalente. Inoltre, un nome di comando che è stato citato in alcun modo non viene considerato per la ricerca di alias, quindi non è mai possibile utilizzare un nome di alias contenente una barra rovesciata. Bash non consente nemmeno barre rovesciate nei nomi delle funzioni. Poiché cd..\..viene analizzato come cd...., è possibile definire una funzione chiamata cd....(come sopra).

Se usi il cdcomando, dovrai digitare lo spazio dopo di esso, proprio come qualsiasi altro comando. Ma puoi salvare la digitazione non digitandola cdaffatto. Impostare l' autocdopzione con la seguente riga in ~/.bashrc:

shopt -s autocd

Quindi è possibile digitare un nome di directory nella riga di comando e "eseguendo" tale directory cambierà in esso.

~/some/sub/directory$ ../..
~/some$ 

Se lo faccio shopt, probabilmente mi mancherà presto quella funzionalità su Windows :-)
Thomas Weller,

Non è vero. Le barre sono accettate nei nomi delle funzioni bash.
alexis,

@alexis Ah, giusto, puoi usare le barre in bash. Risolto, grazie.
Gilles 'SO- smetti di essere malvagio' il

@ThomasW. Certo che lo farai. autocdè stato uno dei motivi per cui sono passato a zsh, quando Bash non ce l'aveva. L'unico modo decente per usare Windows è installare Cygwin comunque, completo di zsh.
Gilles 'SO- smetti di essere malvagio' il

5

"Non puoi usare le barre in un alias o in un nome di funzione "? Questa è una novità per me. Uso la seguente funzione shell da anni su Linux e OS X bash e non ho mai avuto problemi:

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

Naturalmente, cd../..è anche un bel nome di funzione. Una barra può essere utilizzata nel nome di una funzione shell.

Per quanto riguarda la versione di barra rovesciata, non è possibile incorporarla in un alias o in un nome di funzione, ma non è necessario: quando si digita cd..\.., bash interpreta la barra rovesciata come escape e tenta di eseguire il risultato cd..... Quindi definiscilo e puoi fare tutto quello che stavi cercando. Prego.

function cd.... { cd ../..; } 

2

Se vuoi mantenere gli alias, perché non fare semplicemente:

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

Oppure, se avete bisogno di andare così indietro:

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

Non ho idea di quanto bene ti aiuti a rimanere mentalmente sincronizzato con il tuo cervello di Windows, ma questo sembra ancora un modo semplice per andare. (Almeno per quelli di noi abbastanza fortunati da non doversi preoccupare di come vengono fatte le cose su Windows.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.