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 ./scripttaki sam?
.i sourcesą 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 .bashrcpliku, 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.
evalpodejście.
exec bashna 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, exitaby powrócić do pierwszej powłoki, w której skrypt został początkowo uruchomiony.
execjest 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. dotglobLub 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 cdprzejść 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 bashrclub zshrcpliku:
# 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.
dotglobLub 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
returnaby uciec od skryptu pochodzącego w ten sposób, a nieexit- są one jak funkcje powłoki iexitopuszczą powłokę, z której pochodzi skrypt.