Chcę dostosować funkcjonalność cd
polecenia zgodnie z moimi potrzebami.
Zdefiniowałem następującą funkcję -
function cd () { cd "$@" && pushd "$@"; }
Celem tej funkcji jest automatyczne wypychanie katalogu na stos, dzięki czemu oszczędzam wysiłku, aby za pushd .
każdym razem ręcznie pisać .
Jednak powyższa funkcja jest funkcją nieskończenie rekurencyjną, ponieważ wywołanie cd
to interpretowane jest jako sama funkcja, a nie cd
wbudowana.
Jak odwołać się do cd
wbudowanej funkcji?
Wiem, że za pomocą aliasów można uciec \
. W jaki sposób można uciec od funkcji lub odwoływać się do wbudowanych funkcji w bardziej wyraźny sposób?
Uwaga: nie chcę zmieniać nazwy mojej funkcji na nic innego.
bash
shell-script
shell-builtin
Kshitiz Sharma
źródło
źródło
alias cd=pushd
? Czego oczekujesz, gdy wydarzy się cd do czegoś, co nie jest ścieżką absolutną (np.cd ../
)?pushd
nie obsługuje-P
. Ale masz rację, jak pokazano w pytaniu,function cd
wygląda to nieco źle, ponieważ dwukrotnie zmienił katalog.Odpowiedzi:
Te
command
siły wbudowane nazwę polecenia należy interpretować jako wbudowane lub zewnętrznego polecenia (z pominięciem alias i funkcja wyszukiwania). Jest dostępny we wszystkich powłokach POSIX, w tym bash.(Zauważ, że ten przykład jest zły: nie działa ze ścieżkami względnymi i równie dobrze możesz po prostu wpisać
pushd
na pierwszym miejscu).W bash i zsh (ale nie ksh) można użyć
builtin
do wymuszenia interpretacji nazwy polecenia jako wbudowanej, z wyłączeniem aliasów, funkcji i poleceń zewnętrznych.źródło
Bash ma (wbudowane) polecenie
builtin
, które robi dokładnie to, czego potrzebujesz. Wymianacd
zbuiltin cd
w funkcji ustali rekursji.źródło
Podejrzewam, że kiedy mówisz, że „nie chcesz zmieniać nazwy swojej funkcji na nic innego”, masz na myśli, że chcesz móc wywoływać swoją funkcję o tej samej nazwie, co oryginalne polecenie.
Tak więc innym sposobem na zrobienie tego, co działa również w przypadku rzeczy, które nie są wbudowane, jest nadanie funkcji innej nazwy, a następnie zdefiniowanie aliasu dla zawiniętego polecenia. Działa to, ponieważ alias nie istnieje w kontekście wykonywania funkcji.
Przykład wrapper.sh:
I np. W .bash_aliases:
Ale to dość zuchwałe. Używanie
command
jest zalecane, gdy jest to możliwe.źródło
Aby to działało ze ścieżkami względnymi, potrzebne będą:
Zakłada się, że korzystasz z wystarczająco nowoczesnej dystrybucji Linuksa, która zawiera narzędzie „realpath”. (Na przykład RHEL 6). Jeśli dostępny jest Perl, „realpath” można symulować za pomocą:
źródło