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 "$@" )
.