Chcę uruchomić skrypt, aby po prostu zmienić bieżący katalog roboczy:
#!/bin/bash
cd web/www/project
Ale po uruchomieniu bieżący pwd pozostaje niezmieniony! Jak mogę to zrobić?
Chcę uruchomić skrypt, aby po prostu zmienić bieżący katalog roboczy:
#!/bin/bash
cd web/www/project
Ale po uruchomieniu bieżący pwd pozostaje niezmieniony! Jak mogę to zrobić?
Odpowiedzi:
Jest to oczekiwane zachowanie, które zostało już kilkakrotnie omówione.
Skrypt jest uruchamiany w podpowłoce i nie może zmienić katalogu roboczego powłoki nadrzędnej. Jego efekty są tracone po zakończeniu.
Aby trwale zmienić katalog, powinieneś pobrać skrypt, jak w
. ./script
source ./script
taki sam?
.
i source
są równi w bash. 2. nie musimy używać ./
przed nazwą pliku, jeśli znajduje się w tym samym katalogu. Można uruchomić tylko to:. script
W przypadku małych zadań, takich jak to, zamiast tworzyć skrypt, utwórz taki alias,
$ alias cdproj='cd /dir/web/www/proj'
Powinieneś dodać to do swojego .bashrc
pliku, jeśli chcesz ustawić dla każdej interaktywnej powłoki.
Teraz możesz uruchomić to jako $ cdproj
.
eval `./script`
lub eval $(./script)
wykonać te polecenia. Jest to powszechne podejście do poleceń, które muszą zaktualizować środowisko powłoki wywołującej.
eval
podejście.
exec bash
na końcuSkrypt bash działa w bieżącym środowisku lub w środowisku potomnym, ale nigdy w środowisku macierzystym.
Jednak to pytanie jest często zadawane, ponieważ chce się pozostać w wierszu polecenia bash w określonym katalogu po wykonaniu skryptu bash z innego katalogu.
W takim przypadku po prostu uruchom podrzędną instancję bash na końcu skryptu:
#!/usr/bin/env bash
cd desired/directory
exec bash
To tworzy nową podpowłokę. Wpisz, exit
aby powrócić do pierwszej powłoki, w której skrypt został początkowo uruchomiony.
exec
jest zwykle uważane za ostateczność łajdaka .. :)
exit
(lub Ctrl + D), musisz to zrobić 11 do 21 razy. (2) Kolejną wadą używania skryptu wykonywalnego jest to, że jeśli ustawisz jakieś opcje powłoki (np. dotglob
Lub globstar
) w interaktywnej sesji powłoki, stracisz je, ponieważ zaczynasz nową powłokę.
Chociaż istnieją odpowiedzi, które wykonują dokładnie taką akcję, jaką chcesz, bardziej standardową metodą do tego celu jest utworzenie dowiązania symbolicznego:
ln -s ~/web/www/project proj #use full path to dir!
Następnie możesz cd
przejść do katalogu, używając nazwy proj
:
cd proj
Ta metoda jest bardziej elastyczna, ponieważ można uzyskać dostęp do plików przy użyciu krótkiej nazwy bez cd
:
ls proj/ #note the endslash!
vim proj/file.x
W zależności od tego, co zamierzasz zrobić, innym rozwiązaniem może być utworzenie funkcji zamiast skryptu.
Przykład:
Utwórz funkcję w pliku, powiedzmy /home/aidin/my-cd-script
:
function my-cd() {
cd /to/my/path
}
Następnie dołącz go do swojego bashrc
lub zshrc
pliku:
# Somewhere in rc file
source /home/aidin/my-cd-script
Teraz możesz używać go jak polecenia:
$ my-cd
Dlaczego nie użyć „exec”, to robi dokładnie to, co chcę.
#!/bin/bash
cd someplace
exec bash
~/someplace
exit
(lub Ctrl + D), musisz to zrobić 11 do 21 razy.
dotglob
Lub globstar
), stracisz je, ponieważ zaczynasz nową powłokę. … (Ciąg dalszy)
Możesz to zrobić za pomocą funkcji lub za pomocą && Przykłady poniżej instalują Zabbix i tworzą plik z linią w nim zawartą.
Dawny:
#!/bin/bash
# Create Function:
installZabbix(){
cd /usr/src/zabbix-4.2.4;
./configure --enable-agent;
make install;
cd /usr/src/;
>file;
echo "Hi, this is a file." >>file;
}
# Call the function:
installZabbix
lub:
#!/bin/bash
cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
return
aby uciec od skryptu pochodzącego w ten sposób, a nieexit
- są one jak funkcje powłoki iexit
opuszczą powłokę, z której pochodzi skrypt.