Нерест bash из python и печать сообщения - PullRequest
0 голосов
/ 02 февраля 2020

Хотелось бы узнать, есть ли способ создать оболочку входа в систему и отобразить сообщение для пользователя. Правила:

  • пользователь имеет свой собственный ~ / .bashr c, и мы не хотим его перезаписывать
  • избегайте использования канала в подпроцесс

Что я делаю atm:

def do_bash(tokens, state):
    """
    Drop into system shell or execute shell commands. Examples:

    - bash
    - bash -c "ls ~/.* | grep shell"
    """
    cmd = ["bash", "-l"]
    if len(tokens):
        cmd.extend(tokens)
    subprocess.call(cmd)

Я попытался объединить -l с -c echo "<message>", но это только отображает сообщение в новой оболочке и затем возвращает.

UDPATE : Чтобы упростить это - я хочу выполнить subprocess.call(["bash", "-l", "<magic I am not sure of>"]) и с точки зрения пользователя:

$ python ./mycode.py
I0000 03:16:11 [mycode] Various logging messages until subprocess is called

  You have dropped into a temporary shell but you are still
  within "mycode.py" program. You can use "exit" to continue
  running the script. This shell allows to you to do foo and bar.

bash$

Ответы [ 2 ]

2 голосов
/ 02 февраля 2020

Just bash предоставит вам интерактивную оболочку с загруженной средой из /etc/bashrc + ~/.bashrc.

Если вы хотите использовать оболочку входа в систему, bash -l является правильным.

Для получения показанного предлога (с bash) вам потребуется второй вызов bash, потому что это может быть либо запускается для выполнения заданных команд, либо в качестве интерактивной оболочки. Если вам на самом деле не нужно анализировать предлог с помощью bash, я предлагаю вместо этого вывести предлог с помощью python.

0 голосов
/ 02 февраля 2020

Если вы звоните bash с -l, то ~/.bashrc не выполняется. Вместо этого, поскольку вы запрашиваете оболочку входа в систему, выполняется ~/.bash_profile (если она существует).

Поэтому у меня есть это в моем ~/.bash_profile:

source ~/.bashrc

Что вы, вероятно, хотите это звонить bash без -l.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...