To nebude možné.
Váš skript běží v dílčím shellu vytvořeném nadřazeným shellem, kde byl příkaz vydán.
Jakékoli cd
ing provedený v sub-shell nemá vliv na nadřazený shell.
Jiní poukázali na to, že nemůžete změnit pracovní adresář rodiče z potomka.
Existuje však způsob, jak dosáhnout svého cíle – pokud cd z funkce shellu, může změnit pracovní dir. Přidejte toto do svého ~/.bashrc:
go() {
cd "$(python /path/to/cd.py "$1")"
}
Váš skript by měl vytisknout cestu k adresáři, který chcete změnit. Může to být například vaše cd.py:
#!/usr/bin/python
import sys, os.path
if sys.argv[1] == 'tdi': print(os.path.expanduser('~/long/tedious/path/to/tdi'))
elif sys.argv[1] == 'xyz': print(os.path.expanduser('~/long/tedious/path/to/xyz'))
Pak můžete udělat:
[email protected]:/home/$> go tdi [email protected]:/home/tdi$> go tdi
cd
je výhradně(?) implementován jako interní příkaz shellu, protože žádný externí program nemůže změnit CWD nadřazeného shellu.
Jak píše codaddict, to, co se děje ve vašem sub-shellu, nemá vliv na nadřazený shell. Pokud je však vaším cílem poskytnout uživateli shell v jiném adresáři, můžete vždy nechat Python použít os.chdir
změnit pracovní adresář sub-shell a poté spustit nový shell z Pythonu. Toto nezmění pracovní adresář původního shellu, ale ponechá uživateli jeden v jiném adresáři.