Prawie za każdym razem, gdy „cd” do innego katalogu na moim komputerze (w tym przypadku z systemem Mac OS X 10.6.7) za pomocą wiersza polecenia (którym jest bash), natychmiast wpisuję „ls”, aby uzyskać listę zawartości w tym katalogu. Próbuję wymyślić sposób na zastąpienie „cd”, aby zmienił się na żądany katalog, a następnie dał mi listę w jednym ujęciu.
Udało mi się uzyskać podstawową funkcjonalność, której szukam, dodając następujący wiersz do mojego ~ / .bash_profile
function cl() { cd "$@"; ls -l; }
Działa to zgodnie z oczekiwaniami. Przejście do żądanego katalogu, a następnie wyświetlenie mi zawartości. W miejscu, w którym mam problem, próbuję zastąpić samą „cd” zamiast tworzyć nowe polecenie „cl”.
Następujące rzeczy nie działają
##### Attempt 1 #####
# Hangs the command line
function cd() { cd "$@"; ls -l; }
##### Attempt 2 #####
# Hangs the command line
function cd() { 'cd' "$@"; ls -l; }
##### Attempt 3 #####
# Does not change directory.
# Does list contents, but of the directory where you started.
function cd() { /usr/bin/cd "$@"; ls -l; }
#### Other attempts that fail in various ways #####
alias cd=cd "$@"; ls -la;
alias cd="cd '$@'; ls -la;"
alias cd='cd "$@"'; ls -la;
alias cd=/usr/bin/cd "$@"; ls -la;
Próbowałem także kilku innych iteracji, których nie ma na liście, a także utworzyłem alias wskazujący działającą funkcję „cl”. Żaden z nich nie działał.
To, co przeczytałem w dokumentacji, mówi o tym, że „cd” nie może być uruchamiane jako polecenie zewnętrzne (co rozumiem jako sposób, w jaki funkcja musiałaby go użyć).
Tak więc mogę obecnie użyć polecenia „cl” i uzyskać to, czego chcę, ale pytanie brzmi / pozostaje:
Czy istnieje sposób na przesłonięcie zachowania „cd”, aby zmienić go na żądany katalog, a następnie zrobić coś innego?
źródło
cd ""
(do tego, co ta odpowiedź powinna ocenić, różni się odcd "$@"
pustego$@
. Przepraszam za zamieszanie.Myślę, że wpadasz w pętlę. Twoja
cd
funkcja dzwonicd
, co jest ... funkcją.Musisz wiedzieć,
builtin
które słowo kluczowe powoduje, że wyszukiwanie poleceń korzysta z wbudowanych poleceń Bash, takich jak cd, a nie z funkcjiRównież wywoływanie
/usr/bin/cd
nigdy nie zadziała, nawet jeśli takie polecenie istnieje.Co by się stało:
/bash/dir
./usr/bin/cd /dir/for/cd
./usr/bin/cd
idzie do reż/dir/for/cd
./usr/bin/cd
wychodzi./bash/dir
, ponieważ proces potomny/usr/bin/cd
nie może wpływać na element nadrzędny.Aliasy to także proste podstawienia tekstu. Nigdy nie mogą mieć parametrów.
źródło
builtin cd $@ && ls
; ponieważcd
wezwanie powinno się powieść, aby wszystko inne miało sens. Pamiętaj również o szczególnych przypadkach, takich jakcd
(bez argumentów).Sugeruję, aby nie zastępować płyty cd, ponieważ istnieją inne skrypty przechwytujące funkcję „cd”, na przykład rvm. Lepiej byłoby wybrać inną nazwę, na przykład „d”, i nie określać typu „wbudowanego” w swojej funkcji; w przeciwnym razie porywacz nie działałby. Korzystam z poniższego kodu:
źródło