Jak stworzyć „alias” na długą ścieżkę?


96

Próbowałem utworzyć „alias” dla ścieżki, której często używam podczas wykonywania skryptów powłoki. Próbowałem czegoś, ale się nie udało:

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

bash: cd: myFold: No such file or directory

Jak to działa?
Jednak cd ~/Files/Scripts/Maindziała.

Odpowiedzi:


121

Ponieważ jest to zmienna środowiskowa (alias ma inną definicję w bash), musisz ją ocenić za pomocą czegoś takiego:

cd "${myFold}"

lub:

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

Ale w rzeczywistości jest to łatwiejsze, jeśli chcesz po prostu łatwo przejść do tego katalogu, utworzyć prawdziwy alias (w jednym z bashplików startowych, takich jak .bashrc), więc mogę zapisać naciśnięcia klawiszy:

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

Następnie możesz po prostu użyć (bez cd):

myfold

Aby pozbyć się definicji, użyj unalias. Poniższy zapis pokazuje wszystkie te działania w akcji:

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

Dzięki. To działa. Próbowałem tylko alias myfold = '~ / some / path' i cd myfold. Pojawia się błąd - nie ma takiego katalogu. Czemu ? Czy można także „cofnąć przypisanie” zmiennej aliasu?
bashboy

myfold = '~ / some / path' cd "$ myfold" Niepowodzenie. Czemu ?
bashboy

1
@bashboy, prawdopodobnie dlatego, że nie masz katalogu o tej nazwie. ~ / jakaś / ścieżka była przykładem, powinieneś zastąpić rzeczywistą ścieżkę, której chcesz użyć. Zmienię go, aby używał twojego przykładowego katalogu, aby był bardziej przejrzysty. Jeśli chodzi o cofanie przypisania aliasu, użyj polecenia unalias. Zaktualizowałem również odpowiedź o transkrypcję, w tym użycie tego polecenia.
paxdiablo

Jak zachować ten alias w różnych sesjach terminala? Kiedy otwieram nową kartę i próbuję użyć tego aliasu, to nie działa.
goldisfine

4
@goldisfine, zobacz mój nawias in one of the bash startup files like .bashrc. Umieszczenie aliasu w odpowiednim pliku startowym zapewni, że będzie on dostępny dla wszystkich sesji.
paxdiablo

78

Istnieje opcja powłoki cdable_vars:

cdable_vars
Jeśli jest ustawiona, przyjmuje się, że argumentem cdpolecenia wbudowanego, który nie jest katalogiem, jest nazwa zmiennej, której wartością jest katalog, do którego należy przejść.

Możesz dodać to do swojego .bashrc:

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

Zauważ, że zastąpiłem tyldę $HOME; cudzysłowy zapobiegają rozwijaniu tyldy, a Bash narzekałby, że nie ma katalogu ~/Files/Scripts/Main.

Teraz możesz tego użyć w następujący sposób:

cd myFold

Nie jest $wymagane. Właściwie o to chodzi - jak pokazano w innych odpowiedziach, cd "$myFold"działa bez opcji powłoki. cd myFolddziała również, jeśli ścieżka w myFoldzawiera spacje, nie jest wymagane cytowanie.

Zwykle działa to nawet z autouzupełnianiem tabulatorów, ponieważ _cdfunkcja bash_completionsprawdza, czy cdable_varsjest ustawiona - ale nie każda implementacja robi to w ten sam sposób, więc być może będziesz musiał bash_completionponownie pobrać źródło w swoim .bashrc(lub edytować, /etc/profileaby ustawić opcję powłoki).


Inne powłoki mają podobne opcje, na przykład Zsh ( cdablevars).


1
Czy istnieje odpowiednik tego dla ZSH?
Ryan Stull

1
@RyanStull setopt cdablevarswygląda na to, że może być, ale w ogóle nie znam zsh.
Benjamin W.,

@JohnMee Wycofam twoją edycję, ponieważ a) opcja nazywa się inaczej w zsh (bez podkreślenia) b) pytanie oznaczone tylko Bash i c) link do podręcznika Bash. Dodam jednak akapit, aby wspomnieć o innych muszlach.
Benjamin W.

1
Taka świetna odpowiedź! Dziękuję bardzo zacdable_vars
Lucas P.

1
@Vladislav Zauważ, że przerywa to uzupełnianie cdzapewniane przez bash- complete , które używa _cdfunkcji ( complete -o nospace -F _cd cd). Dodawanie -vdo tego (aby zakończyć na zmiennych) działa, ale może mieć niepożądane skutki uboczne - dla mnie pokazuje moje pełne środowisko po zakończeniu zakładki.
Benjamin W.

10

Możesz dodać dowolne ścieżki do tablicy hashy twojego basha:

hash -d <CustomName>=<RealPath>

Teraz będziesz mógł cd ~<CustomName>. Aby był trwały, dodaj go do swojego skryptu bashrc .

Zauważ, że ta tablica hashy ma na celu zapewnienie pamięci podręcznej dla basha, aby nie musiał wyszukiwać treści za każdym razem, gdy wykonywane jest polecenie, dlatego ta tabela zostanie wyczyszczona dla zdarzeń, które unieważniają pamięć podręczną, np $PATH. Modyfikacje .


2
Myślę, że będzie działać tylko w, zshale nie w bash.
sergej

To najlepsza odpowiedź IMHO, ale to prawda, że ​​działa zshtylko w, przynajmniej w moim systemie Ubuntu.
John Stewart

9

Może lepiej użyć linków

Soft Link

Dowiązanie symboliczne lub miękkie (pliki lub katalogi, bardziej elastyczne i samodokumentujące się)

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

Hard Link

Twardy link (tylko pliki, mniej elastyczny i nie dokumentujący się samoczynnie)

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

Jak utworzyć łącze do katalogu

Wskazówka : jeśli nie chcesz widzieć linku w swoim domu, możesz zacząć od kropki. ; wtedy będzie domyślnie ukryty, a następnie możesz uzyskać do niego dostęp jak

cd ~/.myHiddelLongDirLink

6

Po pierwsze, musisz usunąć cytaty:

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

Cudzysłowy uniemożliwiają powłoce rozwinięcie tyldy do jej specjalnego znaczenia, jakim jest bycie twoim $HOMEkatalogiem.

Możesz wtedy użyć $myFolderśrodowiska jako zmiennej powłoki:

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

Aby utworzyć alias , musisz zdefiniować alias:

alias myfolder="cd $myFolder"

Możesz wtedy traktować tego rodzaju polecenie jak polecenie:

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

W rzeczywistości nie jest to zmienna środowiskowa , chyba że ty export.
Keith Thompson,

1
@KeithThompson OK, to tylko zmienna powłoki . Ale nie chcesz go eksportować, ponieważ nie chcesz, aby miał wpływ na procesy potomne. Definiujesz to w ten sposób w swoim .bashrclub jakimkolwiek pliku zasobów, którego używasz, i zostanie zdefiniowany w bezpośredniej powłoce, ale nie w skryptach powłoki.
David W.,

Wolę to rozwiązanie, ponieważ działa z automatycznym uzupełnianiem
Vassilis

5

Po pierwsze, potrzebujesz $dostępu do wartości „myFold”, aby kod w pytaniu działał:

cd "$myFold"

Aby to uprościć, tworzysz alias w ~/.bashrc:

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

Nie zapomnij .bashrcpodać źródła, aby alias stał się dostępny w bieżącej sesji basha:

source ~/.bashrc

Teraz możesz przejść do folderu za pomocą:

cdmain

4

Inną opcją byłoby użycie dowiązania symbolicznego. to znaczy:

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

Następnie możesz wykonywać operacje ~/myFold, takie jak:

cp some_file.txt ~/myFold

który umieści plik ~/Files/Scripts/Main. Możesz usunąć dowiązanie symboliczne w dowolnym momencie za pomocą rm ~/myFold, co zachowa oryginalny katalog.


Jedna wada: jeśli cd myFoldwtedy pwd, pokaże, że jesteś w myFold. Jest to dla mnie przełom, ponieważ polecenia względne z kontrolą źródła p4 zależą od bieżącego katalogu.
Użytkownik5910

1
@ User5910 - usepwd -P
dvj

2

ale rzeczywisty alias do katalogu jest również możliwy, spróbuj

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

W ten sposób masz wspólną konwencję nazewnictwa (dla każdej pary dir / alias) i jeśli chcesz skopiować coś z bieżącego katalogu do myScripts, nie musisz o tym myśleć.

IHTH


2

Powyższe odpowiedzi, których próbowałem, nie pozwalają na automatyczne rozszerzanie (autouzupełnianie) podkatalogów katalogu z aliasami.

Jeśli jednak umieścisz katalog, który chcesz aliasować na dirsstosie ...

$ pushd ~/my/aliased/dir

... możesz następnie wpisać, dirs -vaby zobaczyć jego numeryczną pozycję na stosie:

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

i odwołuj się do niego, używając tego numeru dla większości, jeśli nie wszystkich poleceń, które oczekują parametru katalogu:

 $ mv foo.txt ~0  

Możesz nawet użyć Tabdo pokazania bezpośrednich podkatalogów katalogu „z aliasami”:

 $ cd ~0/<Tab>
 child_dir1    child_dir2

-1

Umieść następujący wiersz w swoim skrypcie

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

W użyciu terminala

source myscript
cd $myFold
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.