Wie erstelle ich einen „Alias“ für einen langen Weg?

90

Ich habe versucht, einen "Alias" für einen Pfad zu erstellen, den ich beim Shell-Scripting häufig verwende. Ich habe etwas versucht, aber es ist fehlgeschlagen:

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

bash: cd: myFold: No such file or directory

Wie bringe ich es zum Laufen?
Funktioniert jedoch cd ~/Files/Scripts/Main.

Bashboy
quelle

Antworten:

112

Da es sich um eine Umgebungsvariable handelt (Alias ​​hat eine andere Definition in bash), müssen Sie sie wie folgt auswerten:

cd "${myFold}"

oder:

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

Aber ich finde es tatsächlich einfacher, wenn Sie nur einfach in dieses Verzeichnis wechseln möchten, einen echten Alias zu erstellen (in einer der bashStartdateien wie .bashrc), damit ich Tastenanschläge speichern kann:

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

Dann können Sie einfach (ohne cd) verwenden:

myfold

Um die Definition loszuwerden, verwenden Sie unalias. Das folgende Transkript zeigt all dies in Aktion:

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
paxdiablo
quelle
Vielen Dank. Das funktioniert. Ich habe nur alias myfold = '~ / some / path' und cd myfold ausprobiert. Ich bekomme eine Fehlermeldung - kein solches Verzeichnis. Warum ? Ist es auch möglich, die Zuweisung einer Aliasvariablen aufzuheben?
Bashboy
myfold = '~ / some / path' cd "$ myfold" schlägt fehl. Warum ?
Bashboy
1
@bashboy, wahrscheinlich weil du kein Verzeichnis mit diesem Namen hast. ~ / some / path war ein Beispiel. Sie sollten den tatsächlichen Pfad ersetzen, den Sie verwenden möchten. Ich werde es ändern, um Ihr Beispielverzeichnis zu verwenden, damit es klarer ist. Zum Aufheben der Zuweisung eines Alias ​​verwenden Sie den Befehl unalias. Ich habe die Antwort auch mit einem Transkript aktualisiert, einschließlich der Verwendung dieses Befehls.
Paxdiablo
Wie würden Sie diesen Alias ​​in verschiedenen Terminalsitzungen beibehalten? Wenn ich einen neuen Tab öffne und versuche, diesen Alias ​​zu verwenden, funktioniert er nicht.
Goldfine
4
@goldisfine, siehe meine Klammer in one of the bash startup files like .bashrc. Durch das Einfügen des Alias ​​in eine geeignete Startdatei wird sichergestellt, dass er für alle Sitzungen verfügbar ist .
Paxdiablo
67

Es gibt eine Shell-Option cdable_vars:

cdable_vars
Wenn dies festgelegt ist, cdwird angenommen, dass ein Argument für den integrierten Befehl, der kein Verzeichnis ist, der Name einer Variablen ist, deren Wert das Verzeichnis ist, in das geändert werden soll.

Sie können dies zu Ihrem hinzufügen .bashrc:

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

Beachten Sie, dass ich die Tilde durch ersetzt habe $HOME. Anführungszeichen verhindern eine Tilde-Erweiterung und Bash würde sich beschweren, dass es kein Verzeichnis gibt ~/Files/Scripts/Main.

Jetzt können Sie dies wie folgt verwenden:

cd myFold

Nicht $erforderlich. Das ist eigentlich der springende Punkt - wie in anderen Antworten gezeigt, cd "$myFold"funktioniert dies ohne die Shell-Option. cd myFoldfunktioniert auch, wenn der Pfad in myFoldLeerzeichen enthält, kein Anführungszeichen erforderlich.

Dies funktioniert normalerweise sogar mit der automatischen Vervollständigung von Registerkarten, da die _cdFunktion in bash_completionprüft, ob festgelegt cdable_varsist - aber nicht jede Implementierung tut dies auf die gleiche Weise, sodass Sie möglicherweise erneut eine Quelle bash_completionin Ihrem erstellen müssen .bashrc(oder bearbeiten müssen /etc/profile, um die Shell-Option festzulegen).


Andere Shells haben ähnliche Optionen, zum Beispiel Zsh ( cdablevars).

Benjamin W.
quelle
Gibt es ein Äquivalent dazu für ZSH?
Ryan Stull
@ RyanStull setopt cdablevarssieht vielleicht so aus, aber ich kenne zsh überhaupt nicht.
Benjamin W.
@ JohnMee Ich werde Ihre Bearbeitung zurücksetzen, da a) die Option in zsh anders aufgerufen wird (kein Unterstrich) b) die Frage nur mit Bash markiert ist und c) ich auf das Bash-Handbuch verweise. Ich werde jedoch einen Absatz hinzufügen, um die anderen Muscheln zu erwähnen.
Benjamin W.
@ JohnMee Und ich kann die Option für csh oder tcsh nicht finden, wie heißt sie?
Benjamin W.
So eine tolle Antwort! Vielen Dank für diecdable_vars
Lucas P.
10

Vielleicht ist es besser, Links zu verwenden

Soft Link

Symbolischer oder weicher Link (Dateien oder Verzeichnisse, flexibler und selbstdokumentierender)

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

Harte Verbindung

Hardlink (nur Dateien, weniger flexibel und nicht selbstdokumentierend)

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

So erstellen Sie einen Link zu einem Verzeichnis

Hinweis : Wenn Sie den Link in Ihrem Haus nicht sehen müssen, können Sie ihn mit einem Punkt beginnen. ;; dann wird es standardmäßig ausgeblendet, dann können Sie wie folgt darauf zugreifen

cd ~/.myHiddelLongDirLink
Mahmoud Bahnasy
quelle
9

Sie können der Hashtabelle Ihrer Bash beliebige Pfade hinzufügen:

hash -d <CustomName>=<RealPath>

Jetzt können Sie cd ~<CustomName>. Um es dauerhaft zu machen, fügen Sie es Ihrem bashrc- Skript hinzu.

Beachten Sie, dass diese Hashtabelle einen Cache für Bash bereitstellen soll, damit nicht jedes Mal, wenn ein Befehl ausgeführt wird, nach Inhalten gesucht werden muss. Daher wird diese Tabelle bei Ereignissen gelöscht, die den Cache ungültig machen, z $PATH. B. beim Ändern .

Rodrigo Martins de Oliveira
quelle
2
Ich denke, es wird nur funktionieren, zshaber nicht bash.
Sergej
Dies ist zshmeiner Meinung nach die beste Antwort, aber es stimmt, dass es nur funktioniert , zumindest auf meinem Ubuntu-System.
John Stewart
6

Zunächst müssen Sie die Anführungszeichen entfernen:

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

Die Anführungszeichen verhindern, dass die Shell die Tilde auf ihre besondere Bedeutung als Ihr $HOMEVerzeichnis erweitert.

Sie könnten dann in $myFoldereiner Umgebung eine Shell-Variable verwenden:

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

Um einen Alias ​​zu erstellen , müssen Sie den Alias ​​definieren:

alias myfolder="cd $myFolder"

Sie können diese Art von Befehl dann wie folgt behandeln:

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$
David W.
quelle
Es ist eigentlich keine Umgebungsvariable , es sei denn, Sie exportes.
Keith Thompson
1
@KeithThompson Okay, es ist nur eine Shell-Variable . Sie möchten es jedoch nicht exportieren, da es möglicherweise keine Auswirkungen auf untergeordnete Prozesse hat. Sie definieren es so in Ihrer .bashrcoder einer anderen Ressourcendatei, die Sie verwenden, und es wird in der unmittelbaren Shell definiert, jedoch nicht in Shell-Skripten.
David W.
Ich bevorzuge diese Lösungen, weil es mit automatischer Vervollständigung funktioniert
Vassilis
5

Zunächst müssen Sie auf den $Wert von "myFold" zugreifen, damit der Code in der Frage funktioniert:

cd "$myFold"

Um dies zu vereinfachen, erstellen Sie einen Alias ​​in ~/.bashrc:

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

Vergessen Sie nicht, die .bashrceinmalige Quelle anzugeben, damit der Alias ​​in der aktuellen Bash-Sitzung verfügbar wird:

source ~/.bashrc

Jetzt können Sie mit folgendem Ordner wechseln:

cdmain
hek2mgl
quelle
4

Eine andere Möglichkeit wäre die Verwendung eines symbolischen Links. dh:

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

Danach können Sie Operationen ausführen ~/myFold, z.

cp some_file.txt ~/myFold

Dadurch wird die Datei abgelegt ~/Files/Scripts/Main. Sie können den symbolischen Link jederzeit mit entfernen rm ~/myFold, wodurch das ursprüngliche Verzeichnis erhalten bleibt.

dvj
quelle
Ein Nachteil: Wenn Sie cd myFolddann pwd, wird es zeigen, dass Sie in myFold sind. Dies ist ein Deal Breaker für mich, da relative Befehle mit p4-Quellcodeverwaltung vom aktuellen Verzeichnis abhängen.
User5910
1
@ User5910 - usepwd -P
dvj
2

Es ist aber auch ein tatsächlicher Alias ​​für ein Verzeichnis möglich

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

Auf diese Weise haben Sie eine gemeinsame Namenskonvention (für jedes Verzeichnis / Alias-Paar), und wenn Sie etwas aus dem aktuellen Verzeichnis in myScripts kopieren müssen, müssen Sie nicht darüber nachdenken.

IHTH

Shellter
quelle
1

Die vorhergehenden Antworten, die ich versucht habe, erlauben keine automatische Erweiterung (Autocompletion) von Unterverzeichnissen des Alias-Verzeichnisses.

Wenn Sie jedoch das Verzeichnis, das Sie als Alias ​​verwenden möchten, auf den dirsStapel verschieben ...

$ pushd ~/my/aliased/dir

... können Sie dann eingeben dirs -v, um die numerische Position im Stapel anzuzeigen:

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

und beziehen Sie sich mit dieser Nummer auf die meisten, wenn nicht alle Befehle, die einen Verzeichnisparameter erwarten:

 $ mv foo.txt ~0  

Sie können sogar Tabdie unmittelbaren Unterverzeichnisse des "Alias" -Verzeichnisses anzeigen:

 $ cd ~0/<Tab>
 child_dir1    child_dir2
chb
quelle
-1

Fügen Sie die folgende Zeile in Ihr Myscript ein

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

Im Terminal verwenden

source myscript
cd $myFold
Chayan Pathak
quelle