Czy mogę używać cd ../ .. jako nazwy aliasu?

11

Korzystam z systemu Windows i Ubuntu równolegle i robię konsole na obu urządzeniach.

W systemie Windows mogę zrobić

C:\Users\Thomas>cd..\..
C:\>

Jednak w systemie Linux nie działa to ani z ukośnikami odwrotnymi, ani z ukośnikami do przodu.

21:17:10 $ cd../..
bash: cd../..: No such file or directory

Ponieważ często popełniam ten błąd, próbowałem zdefiniować alias .bash_aliasesdla tej sytuacji:

alias cd../..='cd ../..'
alias cd..\..='cd ../..'

Kiedy zaczynam nowy bash, dostaję

21:16:26 $ bash
bash: alias: `cd../..': invalid alias name

Jak skonfigurować aliasy cd..\..i cd../..poprawnie?

cd..\..Wydaje się mieć problemy ze znakiem ucieczki:

21:39:43 $ cd..\..
bash: cd....: command not found

To nie działa, nawet jeśli zdefiniuję inny alias cd.....

Thomas Weller
źródło
2
Nie możesz Polecenie, alias lub nazwa pliku nie może zawierać /znaku. Z \ drugiej strony wersja powinna działać dobrze.
fkraiem
@fkraiem: Wygląda na to, że wersja ukośnika ma problemy ze znakiem ucieczki. Zaktualizowałem pytanie.
Thomas Weller
Och, rzeczywiście. Od man bash: Znaki /, $, `i = oraz dowolne z wyżej wymienionych metaznaków powłoki lub znaki cytowania wymienione powyżej mogą nie pojawiać się w nazwie aliasu.
fkraiem
Cholera. Próbowałem man aliasi to nie istniało. Jeśli podasz tę odpowiedź, zaakceptuję ją.
Thomas Weller
Aliasy to jedno, funkcje powłoki to drugie. Spójrz jeszcze raz.
Alexis

Odpowiedzi:

10

/i \należą do znaków, które nie mogą występować w aliasie Bash. Od man bash:

Znaki /, $`, a =, a każdy z metaznaki powłoki lub znaków cytowania wymienionych powyżej może nie pojawić się w alias.

Aby obejść ten problem, możesz przełączyć się na Zsh, co umożliwia zarówno:

% grep 'alias.*cd' .zshrc 
alias cd../..='cd ../..'
alias cd..\\..='cd ../..'
% pwd
/Users/firas
% cd../..
% pwd
/ 
% cd
% pwd
/Users/firas
% cd..\..
% pwd
/
fkraiem
źródło
12

Nie można używać ukośników w nazwie aliasu. Bash dopuszcza je jednak w nazwach funkcji, dzięki czemu można ustawić tę funkcję:

cd../.. () { cd ../..; }

Nie można używać odwrotnych ukośników w aliasie lub nazwie funkcji. Znak odwrotnego ukośnika cytuje następny znak, więc cd..\..jest analizowany jako cd...., zanim ten ciąg zostanie wyszukany jako nazwa polecenia. Jeśli chcesz wywołać polecenie o nazwie cd..\.., należy wpisać cd..\\.., 'cd..\..'albo coś równoważne. Co więcej, nazwa polecenia, która została cytowana w jakikolwiek sposób, nie jest brana pod uwagę przy wyszukiwaniu aliasów, więc nigdy nie można użyć nazwy aliasu zawierającej ukośnik odwrotny. Bash nie dopuszcza również odwrotnych ukośników w nazwach funkcji. Ponieważ cd..\..jest analizowany jako cd...., możesz zdefiniować funkcję o nazwie cd....(jak wyżej).

Jeśli użyjesz cdpolecenia, będziesz musiał wpisać spację po nim, tak jak każde inne polecenie. Ale możesz zaoszczędzić na pisaniu, zupełnie nie pisząc cd. Ustaw autocdopcję za pomocą następującego wiersza w ~/.bashrc:

shopt -s autocd

Następnie możesz wpisać nazwę katalogu w wierszu poleceń, a „wykonanie” tego katalogu zmieni się na niego.

~/some/sub/directory$ ../..
~/some$ 
Gilles „SO- przestań być zły”
źródło
Jeśli to zrobię shopt, prawdopodobnie wkrótce przegapię tę funkcję w systemie Windows :-)
Thomas Weller
To nie prawda. Ukośniki są akceptowane w nazwach funkcji bash.
Alexis
@alexis Ah, racja, możesz używać ukośników w bash. Naprawiono, dziękuję.
Gilles „SO- przestań być zły”
@ThomasW. Oczywiście że będziesz. autocdbył jednym z powodów, dla których przestawiłem się na Zsh, kiedy bash go nie miał. Jedynym przyzwoitym sposobem korzystania z systemu Windows jest zainstalowanie Cygwin, wraz z zsh.
Gilles „SO- przestań być zły”
5

„Nie możesz używać ukośników w aliasie lub nazwie funkcji ”? To dla mnie wiadomość. Od lat używam następującej funkcji powłoki w Linuksie i OS X bash i nigdy nie miałem żadnych problemów:

function ../.. { cd ../..; echo "$PWD"; }

Oczywiście cd../..jest to również dobra nazwa funkcji. W nazwie funkcji powłoki można użyć ukośnika .

Jeśli chodzi o wersję z odwrotnym ukośnikiem, nie możesz osadzić jej w aliasie lub nazwie funkcji, ale nie musisz: Gdy cd..\..piszesz, bash interpretuje odwrotny ukośnik jako ucieczkę i próbuje wykonać wynikowy wynik cd..... Zdefiniuj to i możesz zrobić wszystko, czego szukałeś. Zapraszamy.

function cd.... { cd ../..; } 
Alexis
źródło
2

Jeśli chcesz zachować aliasy, dlaczego po prostu nie:

alias   ..='cd ..'
alias  ...='cd ../../' 
alias ....='cd ../../../'

Lub, jeśli trzeba przejść drogę z powrotem:

alias   .3='cd ../../../' 
alias   .4='cd ../../../../'
alias   .5='cd ../../../../../'
# how far back do you need to go on a normal basis..?

Nie mam pojęcia, jak dobrze pomaga to w synchronizacji mentalnej z mózgiem Windows, ale nadal wydaje się to prostą drogą. (Przynajmniej dla tych z nas, którzy mają szczęście, że nie muszą się martwić, jak to się dzieje w systemie Windows).

jon
źródło