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?

Author: Mateusz Piotrowski, 2009-05-17

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.

 147
Author: winden,
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

 180
Author: Norbert Hartl,
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

  1. Dodaj ten skrypt do PATH
  2. Uruchom skrypt jako . scriptname

. (kropka) upewni się, że skrypt nie jest uruchamiany w powłoce potomnej.

 49
Author: Steven Penny,
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.

 33
Author: MergerMan,
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.

 28
Author: akarca,
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.

 15
Author: philippe lhardy,
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
 12
Author: seb,
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

 4
Author: ThangTD,
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

 3
Author: Joel,
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 .

 3
Author: Arun Chettoor,
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:

  1. vi mongobin, w którym wszedłem: cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin jako pierwszy wiersz.
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd
Voila!
 0
Author: Daniel C. Deng,
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
 0
Author: Mateusz Piotrowski,
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.

 0
Author: DrGamma,
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