Zmiana bieżącego katalogu ze skryptu Bash
Czy można zmienić bieżący katalog ze skryptu?
Chcę utworzyć narzędzie do nawigacji po katalogach w Bash. Stworzyłem skrypt testowy, który wygląda następująco:
#!/bin/bash
cd /home/artemb
Kiedy wykonuję skrypt z powłoki Bash bieżący katalog nie zmienia się. Czy jest w ogóle możliwa zmiana bieżącego katalogu powłoki ze skryptu?
13 answers
Musisz przekonwertować skrypt na funkcję powłoki:
#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
# . ~/bin/myprog.sh
#
function myprog() {
A=$1
B=$2
echo "aaa ${A} bbb ${B} ccc"
cd /proc
}
Powodem jest to, że każdy proces ma swój własny bieżący katalog, a po uruchomieniu programu z powłoki jest on uruchamiany w nowym procesie. Standardowe "cd", " pushd "i" popd " są wbudowane w interpreter powłoki tak, że wpływają na proces powłoki.
Czyniąc swój program funkcją powłoki, dodajesz własne polecenie w procesie, a następnie każda zmiana katalogu zostaje odzwierciedlona w procesie powłoki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-17 12:46:45
Po uruchomieniu skryptu tworzony jest nowy proces, który dziedziczy tylko twoje środowisko. Kiedy się skończy, to się skończy. Twoje obecne środowisko pozostaje takie, jakie jest.
Zamiast tego możesz uruchomić skrypt w następujący sposób:
. myscript.sh
.
oceni skrypt w bieżącym środowisku, więc może zostać zmieniony
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-28 08:10:58
W świetle nieczytelności i nadmiaru odpowiedzi, uważam, że to jest to, co powinien zrobić wnioskodawca
- Dodaj ten skrypt do
PATH
- Uruchom skrypt jako
. scriptname
.
(kropka) upewni się, że skrypt nie jest uruchamiany w powłoce potomnej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-06 02:15:11
Składając powyższe razem, możesz utworzyć alias
alias your_cmd=". your_cmd"
Jeśli nie chcesz pisać czołówki"."za każdym razem chcesz pozyskać skrypt do środowiska shell, lub jeśli po prostu nie chcesz pamiętać, że trzeba to zrobić aby skrypt działał poprawnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-16 08:09:32
Jeśli używasz Basha możesz spróbować alias:
Do .plik bashrc dodaj tę linię:
alias p='cd /home/serdar/my_new_folder/path/'
Gdy napiszesz " p " w wierszu poleceń, zmieni to katalog.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-11 12:25:23
Jeśli uruchomisz skrypt bash, będzie on działał na swoim bieżącym środowisku lub na środowisku jego dzieci, nigdy na rodzicu.
Jeśli celem jest uruchomienie komendy : goto.sh / home / test Następnie pracuj interaktywnie w /home / test jednym ze sposobów jest uruchomienie interaktywnej podshell bash wewnątrz skryptu:
#!/bin/bash
cd $1
exec bash
W ten sposób będziesz w /home / test dopóki nie zakończysz (exit lub Ctrl+C ) tej powłoki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-01 19:56:30
Z pushd bieżący katalog jest wypychany na stos katalogów i jest zmieniany na dany katalog, popd pobiera katalog na stos i zmienia się na niego.
pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-17 12:18:26
Po prostu przejdź do
yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor
I dodaj ten kod obok ostatniego wiersza:
alias yourcommand="cd /the_path_you_wish"
Następnie zamknij Edytor.
Następnie wpisz:
source ~/.bashrc or source ~/.bash_profile on MAC.
Teraz możesz użyć: yourcommand W Terminalu
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-28 05:14:13
Zrobiłem skrypt do zmiany katalogu. spójrz: https://github.com/ygpark/dj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-06 05:17:56
Zasadniczo używamy cd..
, aby wrócić z każdego katalogu. Pomyślałem, że ułatwi to, podając liczbę katalogów, z którymi musisz wrócić na raz. Możesz to zaimplementować używając oddzielnego pliku skryptu za pomocą polecenia alias . Na przykład:
Code.sh
#!/bin/sh
_backfunc(){
if [ "$1" -eq 1 ]; then
cd ..
elif [ "$1" -eq 2 ]; then
cd ../..
elif [ "$1" -eq 3 ]; then
cd ../../..
elif [ "$1" -eq 4 ]; then
cd ../../../..
elif ["$1" -eq 10]; then
cd /home/arun/Documents/work
fi
}
alias back='_backfunc'
Po użyciu source code.sh
w bieżącej powłoce możesz użyć :
$back 2
Aby przejść dwa kroki wstecz od bieżącego katalogu. Wyjaśnione szczegółowo w tutaj . Jest to również wyjaśniłem tam jak umieścić kod w~/.bashrc tak, aby każda nowa otwarta powłoka miała automatycznie tę nową komendę alias. Możesz dodać nowe polecenie, aby przejść do określonych katalogów, modyfikując Kod przez dodanie większej liczby if conditions
i różnych argumentów. Możesz również pobrać kod z Gita przez tutaj .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-07 16:36:02
To podejście jest dla mnie łatwiejsze.
Załóżmy, że na osobistym iMacu, gdzie jesteś administratorem, w domyślnym katalogu, gdy zostanie otwarte okno poleceń, /Users /jdoe, będzie to katalog, do którego należy przejść:/Users/jdoe/Desktop/Mongo / db.3.2.1 / bin.
Oto kroki, które mogą wykonać zadanie:
- vi mongobin, w którym wszedłem:
cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin
jako pierwszy wiersz. chmod 755 mongobin
source mongobin
pwd
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-29 19:01:26
Stworzyłem również narzędzie o nazwie goat , którego możesz użyć do łatwiejszej nawigacji.
Możesz wyświetlić kod źródłowy na GitHub .
Od v2. 3. 1 Przegląd użycia wygląda następująco:
# Create a link (h4xdir) to a directory:
goat h4xdir ~/Documents/dev
# Follow a link to change a directory:
cd h4xdir
# Follow a link (and don't stop there!):
cd h4xdir/awesome-project
# Go up the filesystem tree with '...' (same as `cd ../../`):
cd ...
# List all your links:
goat list
# Delete a link (or more):
goat delete h4xdir lojban
# Delete all the links which point to directories with the given prefix:
goat deleteprefix $HOME/Documents
# Delete all saved links:
goat nuke
# Delete broken links:
goat fix
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-11 19:18:15
Lubię robić to samo dla różnych projektów bez odpalania nowej powłoki.
W Twoim przypadku:
cd /home/artemb
Zapisz the_script jako:
echo cd /home/artemb
Następnie odpal go za pomocą:
\`./the_script\`
Następnie dostajesz się do katalogu używając tej samej powłoki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-12 00:32:04