Изменить рабочий каталог в оболочке с помощью python script

Я хочу реализовать команду userland, которая примет один из своих аргументов (путь) и изменит каталог на этот каталог. После завершения программы я хотел бы, чтобы оболочка находилась в этом каталоге. Поэтому я хочу реализовать команду cd, но с внешней программой.

Можно ли это сделать в python script или мне нужно написать bash wrapper?

Пример:

[email protected]:/home/$>python cd.py tdi
[email protected]:/home/tdi$>

Ответ 1

Другие указали, что вы не можете изменить рабочий каталог родителя из дочернего элемента.

Но есть способ, которым вы можете достичь своей цели - если вы cd от функции оболочки, это может изменить рабочий каталог. Добавьте это в свой ~/.bashrc:

function go()
{
    cd $(python /path/to/cd.py "$1")
}

Ваш script должен печатать путь к каталогу, который вы хотите изменить. Например, это может быть ваш cd.py:

#!/usr/bin/python
import sys
if sys.argv[1] == 'tdi': print '~/long/tedious/path/to/tdi'
elif sys.argv[1] == 'xyz':  print '~/long/tedious/path/to/xyz'

Затем вы можете сделать:

[email protected]:/home/$> go tdi
[email protected]:/home/tdi$> go tdi

Ответ 2

Это не будет возможно.

Ваш script работает в подчиненной оболочке, порожденной родительской оболочкой, где была выпущена команда.

Любой cd ing, выполняемый в под-оболочке, не влияет на родительскую оболочку.

Ответ 3

cd реализуется исключительно (?) как внутренняя команда оболочки, потому что любая внешняя программа не может изменить родительскую оболочку CWD.

Ответ 4

Как пишет codaddict, то, что происходит в вашей суб-оболочке, не влияет на родительскую оболочку. Однако, если ваша цель заключается в том, что пользователь имеет оболочку в другом каталоге, вы всегда можете использовать Python os.chdir, чтобы изменить рабочий каталог подчиненной оболочки, а затем запустить новую оболочку из Python. Это не изменит рабочий каталог исходной оболочки, но оставит пользователя с одним в другом каталоге.

Ответ 5

Я попытаюсь показать, как установить рабочий каталог терминала Bash на любой путь, который программа Python хочет в довольно простой форме.

Только Bash может установить свой рабочий каталог, поэтому для Python и Bash необходимы подпрограммы. Программа Python имеет процедуру, определенную как:

fob=open(somefile,"w")
fob.write(dd)
fob.close()

"Somefile" для удобства может быть файлом RAM-диска. Bash "mount" будет показывать tmpfs, смонтированные где-то вроде "/run/user/1000", поэтому somefile может быть "/run/user/1000/pythonwkdir". "dd" - полное имя пути к каталогу.

Файл Bash будет выглядеть так:

#!/bin/bash
#pysync ---Command ". pysync" will set bash dir to what Python recorded
cd `cat /run/user/1000/pythonwkdr`