Equivalente di alias per un collegamento simbolico?


18

Mi ritrovo a dover saltare in giro alcune directory nella mia cartella home spesso e mi stanco di scriverle. Vorrei un approccio più rapido, che tradizionalmente sarebbe un collegamento simbolico.

Tuttavia, non voglio ingombrare la mia directory home con dozzine di collegamenti simbolici. Potrei creare un po ' ~/links/di directory e il disordine che con i link simbolici, ma è ancora brutto. Inoltre, potrei voler creare collegamenti simbolici che cambiano ogni giorno (definiti in .bashrc) per passare alla directory dei giorni nostri.

Esiste un modo per aliasare efficacemente un collegamento simbolico, creando qualcosa che verrà riconosciuto come collegamento per una navigazione rapida, ma non verrà effettivamente visualizzato quando eseguo una lsdelle mie directory home e non durerà oltre la sessione corrente?


4
potresti voler esaminare pushd e popd
Rui F Ribeiro il

trovo che l'approccio di Jeroen Janssen sia adattabile ea basso costo per questa esigenza esatta: jeroenjanssens.com/2013/08/16/…
Teofrasto,

2
Che shell stai usando?
Gilles 'SO- smetti di essere malvagio' il

@Theophrastus Heh - questo è fondamentalmente ciò che ho reimplementato non altrettanto elegantemente nella mia risposta.
Mattdm,

3
non esattamente quello che stai cercando, ma potrebbe essere utile quando salti avanti e indietro tra due registi: la cd -volontà cdnell'ultima directory era in precedenza. Quindi, se lo fai due volte tornerai al punto in cui hai iniziato ... molto bello per la situazione "oh ho dimenticato di modificare someFile.txt nella posizione precedente" => Semplicemente cd -:, modifica someFile.txtcd -
dingalapadum

Risposte:


12

È possibile utilizzare il completamento della scheda. Per impostazione predefinita su molte distribuzioni Linux, bash è impostato in modo tale che quando si preme il tasto [TAB], viene visualizzato un elenco di possibili corrispondenze o, se esiste una sola corrispondenza, è tutto compilato. Per cd, questo è normalmente un elenco di sottodirectory della directory di lavoro corrente. Potresti sovrascriverlo, ma suggerisco invece di creare un alias, come jdper "jump directory":

alias jd=cd

e quindi, definendo i "segnalibri" desiderati come completamenti per jd. Guarda la pagina man di bash per molte più opzioni (inclusa la generazione automatica dei risultati al volo da un comando o una funzione), ma il modo più semplice è solo un elenco di parole, con -W:

completo -W "/ srv / www ~ / tmp ~ / work" jd

Ora digita jde premi [TAB] e vedrai i tuoi "segnalibri". Digitare qualsiasi parte ambigua, quindi premere [TAB] per completare. (In precedenza, ~s si espande nella mia home directory, quindi il primo [TAB] mi dà un /, e se wpremo di nuovo e [TAB], /srv/wwwviene compilato.)

Naturalmente, inseriscilo ~/.bash_profileper farlo persistere.

Oppure, possiamo portarlo al livello successivo. Crea una directory ~/.shortcuts- a partire da un punto, sarà nascosta e non confondere la tua bella home directory pulita - e riempila con collegamenti simbolici alle tue directory desiderate. Poi, mettere questo nel vostro ~ / .bash_profile:

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

Questo definisce un completamento leggermente più complicato nella _list_shortcutscreazione di un elenco di nomi e rende jduna funzione piuttosto che un semplice alias, poiché vogliamo che agisca diversamente dal giusto cd. La -Pbandiera per cdrisolvere i collegamenti simbolici, quindi tutto diventa magia trasparente. I nomi delle scorciatoie non devono nemmeno corrispondere agli obiettivi.

Così:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

E, per una dose extra di fantasia, fai una jdlista di tutte le scorciatoie quando eseguite senza alcun parametro:

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

Nota: lo uso compgen -W $( cmd )invece compgen -C 'cmd'perché quest'ultimo non funziona mai per me e non capisco perché. Potrebbe essere una mia nuova domanda. :)


molto interessante. Un trucco però, richiede ancora di digitare il link completo, o almeno abbastanza del link per diventare non ambiguo, prima che io possa completare con jd. Un modo per aggiungere alias ai comandi jd per accorciarli? o renderli relativi a una directory in cui posso memorizzare collegamenti simbolici suppongo.
dsollen,

@dsollen Vedi aggiornamento :)
mattdm il

questo ha funzionato perfettamente. In tutta onestà non mi aspettavo una buona risposta a questa domanda, ma questo è praticamente esattamente quello che volevo. Prevedo un po 'di uso di questo e mi sento abbastanza pulito da aggiungere all'elenco delle cose che modifico ogni volta che ottengo una nuova macchina virtuale (ho anche un modo automatizzato per clonare le mie modifiche ambientali standard in una nuova VM lol). Molte grazie. A un certo punto, quando avrò più tempo libero, capirò come funziona la sintassi di COMPREPLY;)
dsollen,

18

Gli alias di shell hanno la funzione su cui è possibile eseguire (alcuni) il completamento del nome (di solito associato tab). In alternativa, è possibile utilizzare la CDPATHfunzione, che "recentemente" (negli ultimi 5-6 anni) è stata migliorata per supportare il completamento del nome. Se questo funziona per te, ha il vantaggio che ciò che digiti è il nome effettivo della directory piuttosto che un mnemonico.

Secondo il manuale di bash

CDPATH
Un elenco separato da due punti di directory utilizzato come percorso di ricerca per il cdcomando incorporato.

Ulteriori letture:


Non sapevo della CDPATHvariabile d'ambiente, grazie. Potrei aggiungere la mia git_reposdirectory a quella variabile ....
Wildcard il

16

Per le directory che frequenti spesso, ma non cambi quotidianamente, un'altra opzione è solo avere diversi aliascomandi nel tuo .bashrcfile:

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

Un amico ne ha circa 50; Ne ho una manciata; facile e veloce. Appena

cdo

per cambiare la directory in / u01 / app / oracle


Infatti. Ho usato questo meccanismo sin dai primi anni '90.
Wallyk,

7

Raccomando pushde popd.

Personalmente li trovo utili quando si svolgono lavori di sviluppo / lettura del codice sorgente, quando sono coinvolte più directory.

Implementano efficacemente una struttura di stack / LIFO, in cui si preme una directory ( pushd) e il successivo comando di directory POP ( popd) lo recupera.

Quindi, all'interno di una directory, faresti:

pushd .

E quando devi recuperarlo, lo fai

popd

È possibile eseguire multipli pushd(s), e fare i corrispondenti in popdseguito, per tornare alle directory.

Lascerò qui un link.

http://www.eriwen.com/bash/pushd-and-popd/


1
Questa è la soluzione che uso anche, con l'eccezione che non uso popdmolto. Riempo la mia dirslista (che è popolata da pushdcomandi) con tutte le directory che voglio visitare / lavorare per quel pezzo di tempo, quindi corro pushd +1. Quindi, posso scorrere le directory con un semplice !puche è molto veloce. (Si noti che sia su Ubuntu che su CentOS, pushdè l' unico comando disponibile su un'installazione pulita che inizia con pu.)
Wildcard il

3

Potresti semplicemente metterli come variabili nel tuo ~/.bashrc, e poi sono solo a $distanza.

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj

3

La risposta ovvia sono le variabili , quelle cose simboliche nella shell che rappresentano altre cose, analogamente ai collegamenti simbolici nel filesystem.

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

In qualsiasi shell decente, ottieni il Tabcompletamento su nomi di variabili che aiutano ulteriormente.

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.