',,' può essere aliasato a '..'?


41

A volte, quando voglio passare alla directory principale, scrivo erroneamente cd ,,invece di cd ... C'è un modo in cui posso fare in modo che Bash consideri queste affermazioni come uguali? Non uso mai le virgole nei miei comandi. Idealmente, vorrei alias ,,a ... Quando ho provato questo, non ha funzionato. Perché non ha funzionato? In quale altro modo posso affrontare questo problema?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory

6
Un alias è un programma da eseguire, non un argomento per il programma; così $ ,,si lamentano, come ad esempio: bash: ..: Is a directory. (In altre parole, non è un eseguibile.)
jpaugh

5
@jpaugh: Un modo più chiaro per dire che è: l'espansione alias avviene solo sulla prima "parola" di un comando. Quindi, come dici, funziona solo per i nomi dei comandi, non per args. (E non potresti nemmeno alias 'cd ,,'='cd ..'. Beh, potresti, ma dovresti eseguirlo cd\ ,,per rendere tutto in una sola parola.)
Peter Cordes,

5
Considera zsh. Ha alias globali, quindi alias -g ,,=..e cd ,,funziona come previsto.
muru,

1
Pensiero laterale: find / -type d -exec ln -s .. {}/,, \;... ;-)
Toby Speight,

2
Imho: non farlo. L'uso di alias per nascondere errori tipografici è una cattiva pratica. Questi errori possono finire in codice incollato o screencast. Non funzionerà con altri host o account. E tale modifica (a seconda di come è implementata) potrebbe causare altri errori, inattesi, difficili da eseguire il debug. Il mio consiglio: se si digita male un comando, è sufficiente digitarlo di nuovo ;-).
jjmontes,

Risposte:


45

ZSH:

Se zsh alias -g ,,=".."stai usando è quello che ti serve, ma questo farà sì che ",," sia espanso ovunque, non solo quando utilizzato con cd.

Da man zshbuiltins:

Se la -g bandiera è presente, definire un alias globale; gli alias globali vengono espansi anche se non si verificano nella posizione di comando.

BASH:

Se limitato a bash(poiché la domanda è taggata con ), leggi quanto segue:

Questa è una soluzione alias pura, come richiesto, tuttavia ciò farà più del necessario, eventualmente frustrando l'utente (vedere l'avviso alla fine del mio post).

Citando man bash:

Se l'ultimo carattere del valore di alias è vuoto, anche la parola di comando successiva che segue l'alias viene verificata per l'espansione dell'alias.

Pertanto è sufficiente alias cdcon uno spazio aggiuntivo (per consentire l'espansione del suo argomento successivo) e quindi alias ,,a ... Guarda quello

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

dà esattamente ciò di cui hai bisogno.

Si noti che ciò è corretto non solo per bash(e la sua aliasimplementazione), ma per tutte le shell compilanti POSIX. Citando un esempio da man 1p alias(il manuale non descrive esplicitamente questa funzione, solo attraverso un esempio):

  1. Imposta nohup in modo che possa gestire un argomento che sia esso stesso un nome alias:

           alias nohup="nohup "

Avvertenza: come scrive @PeterCordes nel suo commento, causerà automaticamente l' espansione di altri alias dopo la scrittura cd. Potrebbe essere necessario scrivere cd \grepse si desidera modificare la directory con una denominata grepma il proprio grepè un alias per grep --color=auto. Senza la barra rovesciata, cdverrà segnalato l'errore "troppi argomenti" (non è possibile accedere cda due directory contemporaneamente) !.


22
È un trucco intelligente ma sgradevole. Non vorrei farlo; troppo facile per morderti accidentalmente. ad esempio se si dispone di un alias per un comando che si esegue comunemente e si desidera accedere a cduna directory del suo codice sorgente. O altre collisioni tra i tuoi alias e nomi di directory comuni. Mi cd drpiacerebbe espandermi cd disown -rper me, con questo alias. Ad ogni modo, molto meglio sovrascrivere builtin cdcon una funzione per cose come questa, IMO.
Peter Cordes,

8
+1 per la soluzione alias pura (ho imparato qualcosa). Allo stesso tempo, sono d'accordo con il commento di Peter. Penso che una sorta di avvertimento esplicito debba essere aggiunto alla tua risposta.
Kamil Maciorowski il

58

Gli alias non sono fatti per fare questo, ma puoi creare una funzione chiamata cdche è un wrapper per davvero cd. Questo funziona per me! Inseriscilo nel tuo .bash_profilefile o nel tuo profilo preferito.

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

Oppure, con commenti e formattazione carina:

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
}

MODIFICARE

Grazie @derobert per aver sottolineato che if then elsequi è meglio di && ||. Inoltre, ho appena realizzato ( * facepalm *) che questa implementazione funzionerà solo se qualsiasi argomento non path (ovvero -L -P) non è il primo argomento. Quindi attenzione, se hai la cattiva abitudine di scrivere cd -L ,,questo non ti aiuterà. E questo non è banale da gestire correttamente, penso.


16
@BenjiWiebe Penso che la versione "commenti e formattazione piuttosto" sarebbe migliore con un if-then-else.
zwol,

Caspita gente, tante buone idee. Vedo che stai usando la funzione di modifica per occuparti delle correzioni necessarie. Non ho trascorso molto tempo a testarlo. :)
BenjiWiebe,

1
In alternativa, basta sovrascrivere $1prima di eseguire il built-in:cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
Toby Speight

1
@TobySpeight set .. "${@:2}"o perdi qualcosa dopo il primo argomento.
Chepner,

8
Inoltre, tecnicamente ..non deve essere il primo argomento; cdin bashgrado di assumere una varietà di opzioni ( -P, -L, -@, -e).
Chepner,

29

Gli alias devono essere la prima parola di un comando. Inoltre, l'alias deve essere sostituito con una parola, quindi senza spazi).

Manuale di riferimento di Bash: alias

Gli alias consentono di sostituire una stringa con una parola quando viene utilizzata come prima parola di un semplice comando.

Potresti essere alias sia ..ed ,,essere cd ...

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/

Questo è esattamente quello che faccio! : D questi due punti / virgole sono molto più facili da digitare dicd ..
rav_kr

10
+1, non è affatto una cattiva idea. Un altro modo per farlo .. in Bash è con il shopt -s autocdquale ti permette di passare a qualsiasi directory semplicemente inserendo il suo nome. Ovviamente sei ancora lo pseudonimo di,,
ilkkachu,


3

Un altro modo per ..modificare la directory è abilitare la autocd funzionalità di Bash :

shopt -s autocd 

Questo cambierà automaticamente la directory quando inserisci il nome di uno:

~$ /tmp
cd /tmp
/tmp$ 

Devi ancora creare un alias per ,,ma questo può essere fatto solo conalias ,,=..


2

Esiste già un'app una sceneggiatura per questo: https://github.com/shyiko/commacd (nessuna affiliazione con Stanley Shuyiko).

commacdesporta tre comandi: ,(per saltare in avanti), ,,(indietro) e ,,,(indietro + avanti):

Tutti e tre cercano prima di abbinare per prefisso. Solo se non viene trovato alcun risultato, torneranno alla corrispondenza della sottostringa (fuzzy)

Per rispondere alla tua domanda, gli alias degli script virgole su tre funzioni che definisce:

alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward
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.