Come creare un "alias" per un lungo percorso?


95

Ho provato a creare un "alias" per un percorso che uso spesso durante lo scripting della shell. Ho provato qualcosa, ma non è riuscito:

myFold="~/Files/Scripts/Main"
cd myFold

bash: cd: myFold: No such file or directory

Come lo faccio funzionare?
Tuttavia, cd ~/Files/Scripts/Mainfunziona.

Risposte:


120

Poiché è una variabile di ambiente (l'alias ha una definizione diversa in bash), è necessario valutarla con qualcosa del tipo:

cd "${myFold}"

o:

cp "${myFold}/someFile" /somewhere/else

Ma in realtà trovo più semplice, se vuoi solo la facilità di passare a quella directory, creare un vero alias (in uno dei bashfile di avvio come .bashrc), così posso salvare le sequenze di tasti:

alias myfold='cd ~/Files/Scripts/Main'

Quindi puoi semplicemente usare (senza cd):

myfold

Per sbarazzarti della definizione, usi unalias. La seguente trascrizione mostra tutti questi elementi in azione:

pax> cd ; pwd ; ls -ald footy
/home/pax
drwxr-xr-x 2 pax pax 4096 Jul 28 11:00 footy

pax> footydir=/home/pax/footy ; cd "$footydir" ; pwd
/home/pax/footy

pax> cd ; pwd
/home/pax

pax> alias footy='cd /home/pax/footy' ; footy ; pwd
/home/pax/footy

pax> unalias footy ; footy
bash: footy: command not found

Grazie. Che funzioni. Ho provato solo alias myfold = '~ / some / path' e cd myfold. Ottengo un errore - nessuna directory di questo tipo. Perché ? Inoltre, è possibile "annullare l'assegnazione" di una variabile alias?
bashboy

myfold = '~ / some / path' cd "$ myfold" non riesce. Perché ?
bashboy

1
@bashboy, probabilmente perché non hai una directory con quel nome. ~ / some / path era un esempio, dovresti sostituire il percorso effettivo che desideri utilizzare. Lo cambierò per utilizzare la directory di esempio in modo che sia più chiaro. Per quanto riguarda come annullare l'assegnazione di un alias, si utilizza il comando unalias. Ho anche aggiornato la risposta con una trascrizione, incluso l'uso di quel comando.
paxdiablo

Come manterresti questo alias in diverse sessioni di terminale? Quando apro una nuova scheda e provo a utilizzare questo alias, non funziona.
goldisfine

4
@ goldisfine, vedi la mia parentesi in one of the bash startup files like .bashrc. Mettere l'alias in un file di avvio adatto assicurerà che sia disponibile per tutte le sessioni.
paxdiablo

74

C'è un'opzione di shell cdable_vars:

cdable_vars
Se è impostato, cdsi presume che un argomento del comando incorporato che non è una directory sia il nome di una variabile il cui valore è la directory in cui passare.

Puoi aggiungere questo al tuo .bashrc:

shopt -s cdable_vars
export myFold=$HOME/Files/Scripts/Main

Notare che ho sostituito la tilde con $HOME; le virgolette impediscono l'espansione della tilde e Bash si lamenterebbe dell'assenza di directory ~/Files/Scripts/Main.

Ora puoi usarlo come segue:

cd myFold

Non $richiesto. Questo è il punto, in realtà - come mostrato in altre risposte,cd "$myFold" funziona senza l'opzione shell. cd myFoldfunziona anche se il percorso in myFoldcontiene spazi, nessuna citazione richiesta.

Questo di solito funziona anche con il completamento automatico delle schede come il file _cd funzione in bash_completioncontrolla se cdable_varsè impostata, ma non tutte le implementazioni lo fanno nello stesso modo, quindi potresti dover cercare di bash_completionnuovo nel tuo .bashrc(o modificare/etc/profile per impostare l'opzione della shell).


Altre shell hanno opzioni simili, ad esempio Zsh (cdablevars ).


1
C'è un equivalente di questo per ZSH?
Ryan Stull

1
@ RyanStull setopt cdablevarssembra che potrebbe essere, ma non conosco affatto zsh.
Benjamin W.

@ JohnMee Riporterò indietro la tua modifica, poiché a) l'opzione è chiamata diversamente in zsh (senza trattino basso) b) la domanda etichettata solo Bash ec) Mi collego al manuale di Bash. Aggiungerò un paragrafo per menzionare le altre shell, però.
Benjamin W.

1
Un'ottima risposta! Grazie mille per ilcdable_vars
Lucas P.

1
@Vladislav Notare che ciò interrompe il completamento cdfornito da bash-completamento, che utilizza la _cdfunzione ( complete -o nospace -F _cd cd). L'aggiunta -va ciò (per completare sulle variabili) funziona, ma può avere effetti collaterali indesiderati: per me, mostra il mio ambiente completo quando inserisco la scheda Completo.
Benjamin W.

10

Forse è meglio usare i link

Soft Link

Collegamento simbolico o software (file o directory, più flessibile e auto documentato)

#      Source                            Link
ln -s /home/jake/doc/test/2000/something /home/jake/xxx

Collegamento duro

Hard link (solo file, meno flessibile e non auto documentante)

#    Source                            Link
ln /home/jake/doc/test/2000/something /home/jake/xxx

Come creare un collegamento a una directory

Suggerimento : se non hai bisogno di vedere il link a casa tua, puoi avviarlo con un punto. ; quindi sarà nascosto per impostazione predefinita, quindi potrai accedervi come

cd ~/.myHiddelLongDirLink

9

Puoi aggiungere tutti i percorsi che desideri alla tabella hash del tuo bash:

hash -d <CustomName>=<RealPath>

Ora sarai in grado di farlo cd ~<CustomName>. Per renderlo permanente, aggiungilo al tuo script bashrc .

Si noti che questa tabella hash ha lo scopo di fornire una cache affinché bash non abbia bisogno di cercare contenuti ogni volta che viene eseguito un comando, quindi questa tabella verrà cancellata in caso di eventi che invalidano la cache, ad esempio la modifica $PATH.


2
Penso che funzionerà solo dentro zshma non dentro bash.
sergej

Questa è la migliore risposta IMHO, ma è vero che funziona zshsolo, almeno sul mio sistema Ubuntu.
John Stewart

6

Prima di tutto, devi rimuovere le virgolette:

bashboy@host:~$ myFolder=~/Files/Scripts/Main

Le virgolette impediscono alla shell di espandere la tilde nel suo significato speciale di essere tuo $HOME directory.

È quindi possibile utilizzare $myFolderun ambiente una variabile di shell:

bashboy@host:~$ cd $myFolder
bashboy@host:~/Files/Scripts/Main$

Per creare un alias , è necessario definire l'alias:

alias myfolder="cd $myFolder"

Puoi quindi trattare questo tipo di comando come un comando:

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$

In realtà non è una variabile di ambiente a meno che tu non lo exportsia.
Keith Thompson

1
@KeithThompson Va bene, è solo una variabile di shell . Ma non vuoi esportarlo perché non vuoi che possa influire sui processi figli. Lo definisci in questo modo nel tuo .bashrcfile di risorse o in qualsiasi altro file di risorse che usi, e sarà definito nella shell immediata, ma non negli script di shell.
David W.

Preferisco questa soluzione perché funziona con il completamento automatico
Vassilis

5

Innanzitutto, è necessario $per accedere al valore di "myFold" per far funzionare il codice nella domanda:

cd "$myFold"

Per semplificare, crei un alias in ~/.bashrc:

alias cdmain='cd ~/Files/Scripts/Main'

Non dimenticare di generare .bashrcuna volta per rendere l'alias disponibile nella sessione bash corrente:

source ~/.bashrc

Ora puoi passare alla cartella utilizzando:

cdmain

4

Un'altra opzione potrebbe essere quella di utilizzare un collegamento simbolico. cioè:

ln -s ~/Files/Scripts/Main ~/myFold

Dopodiché puoi eseguire operazioni ~/myFoldcome:

cp some_file.txt ~/myFold

che metterà il file in ~/Files/Scripts/Main. Puoi rimuovere il collegamento simbolico in qualsiasi momento con rm ~/myFold, che manterrà la directory originale.


Uno svantaggio: Se si cd myFold, allora pwd, vi mostrerà sei in myFold. Questo è un problema per me perché i comandi relativi con il controllo del codice sorgente p4 dipendono dalla directory corrente.
Utente5910

1
@ User5910 - usapwd -P
dvj

2

ma è anche possibile un vero alias per una directory, prova

 myScripts="~/Files/Scripts/Main"
 alias myScripts="cd $myScripts"

In questo modo hai una convenzione di denominazione comune (per ogni coppia dir / alias), e se hai bisogno di copiare qualcosa dalla directory corrente a myScripts, non devi pensarci.

IHTH


1

Le risposte precedenti che ho provato non consentono l'espansione automatica (autocompletamento) delle sottodirectory della directory con alias.

Tuttavia, se si inserisce nello dirsstack la directory di cui si desidera l'alias ...

$ pushd ~/my/aliased/dir

... puoi quindi digitare dirs -vper vedere la sua posizione numerica nello stack:

 0  ~/my/aliased/dir
 1  ~/Downloads
 2  /media/usbdrive

e fai riferimento ad esso usando quel numero per la maggior parte se non tutti i comandi che prevedono un parametro di directory:

 $ mv foo.txt ~0  

Puoi anche usare Tabper mostrare le sottodirectory immediate della directory "con alias":

 $ cd ~0/<Tab>
 child_dir1    child_dir2

-1

Metti la seguente riga nel tuo myscript

set myFold = '~/Files/Scripts/Main'

Nell'uso terminale

source myscript
cd $myFold
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.