Zazwyczaj wykonuje się polecenie w określonym katalogu roboczym
( cd directory && utility )
Nawiasy wokół cd ...
oznaczają, że zawarte w nich polecenia działają w podpowłoce. Zmiana katalogu roboczego w podpowłoce powoduje, że bieżący katalog roboczy powłoki wywołującej nie ulega zmianie, tj. Po wywołaniu tej komendy nadal będziesz znajdować się w tym samym katalogu, w którym zacząłeś.
Przykład:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
Nie można tego zmienić w ogólny alias, ponieważ alias nie może przyjmować żadnych argumentów.
Dla konkretnego katalogu i narzędzia można to zrobić
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
ale w ogólnym przypadku trzeba użyć funkcji powłoki:
cdrun () {
( cd "$1" && shift && command "$@" )
}
lub
cdrun () (
cd "$1" && shift && command "$@"
)
Zastąpienie nawiasów klamrowych nawiasami wokół ciała funkcji powoduje, że funkcja jest wykonywana we własnej podpowłoce.
Byłoby to wykorzystane jako
$ cdrun "$HOME/somedir" ./script.sh
który uruchomiłby skrypt script.sh
znajdujący się w katalogu $HOME/somedir
, z $HOME/somedir
jako katalog roboczy, lub
$ cdrun / ls -l
który zapewniłby ci katalog w „długim formacie” katalogu głównego.
Funkcja powłoki pobiera swój pierwszy argument i próbuje przejść do tego katalogu. Jeśli to zadziała, zmienia nazwę katalogu z parametrów pozycyjnych (lista argumentów wiersza poleceń) i wykonuje polecenie podane przez resztę argumentów. command
to wbudowane polecenie w powłoce, które po prostu wykonuje swoje argumenty jako polecenie.
Wszystko to jest potrzebne, jeśli chcesz wykonać polecenie ze zmienionym katalogiem roboczym . Jeśli chcesz po prostu wykonać polecenie znajdujące się gdzie indziej, możesz oczywiście użyć
alias thing='$HOME/somedir/script.sh'
ale to byłoby script.sh
w mieście $HOME/somedir
z bieżącym katalogu jako katalogu roboczego.
Innym sposobem wykonania skryptu znajdującego się gdzie indziej bez zmiany katalogu roboczego jest dodanie lokalizacji skryptu do PATH
zmiennej środowiskowej, np.
PATH="$PATH:$HOME/somedir"
Teraz script.sh
w $HOME/somedir
będą mogły być uruchamiane z dowolnego miejsca tylko przy użyciu
$ script.sh
Ponownie nie zmienia to katalogu roboczego polecenia.
cdrun () ( cd "$1" && shift && command "$@" )
.{ ... }
dla zachowania spójności z dłuższymi funkcjami.pushd
ipopd
(także> /dev/null
jeśli starasz się unikać komunikatów wyjściowych), jednocześnie utrzymując czysty kontekst!(cd dir && thing)
jest również znacznie bardziej przenośny niż używaniepushd
ipopd
.Tak więc, jeśli chcesz zmienić katalog (cd) na folder,
/var/log/
a następnie wyświetlić listę (ls) jego plików, możesz dołączyć do.bash_profile
pliku:źródło
Korzystam z tej funkcji, aby uruchomić pojedyncze polecenie w innym katalogu:
Ograniczeniem tej funkcji jest to, że symbole wieloznaczne są wypełniane względem oryginalnego katalogu, a nie względem katalogu, w którym uruchamiane jest polecenie. Można zrobić lepiej w Zsh .
Ta funkcja działa jak zwykła,
cd
jeśli jest wywoływana za pomocą jednego argumentu, więc możesz chcieć ją wywołaćcd
. (Ta funkcja nie obsługuje żadnych opcji, ale opcjecd
są rzadko używane).źródło
Oddziel polecenia średnikiem, np .:
źródło
cd
nie powiedzie, otrzymasz listę katalogów niewłaściwego katalogu. Lepiej używać&&
zamiast;
tutaj.