/ bin / bash -i перезаписывает PS1 - PullRequest
0 голосов
/ 09 апреля 2019

Я использую следующий код python3.6 (g.py) для запуска интерактивной оболочки bash с настраиваемым приглашением:

import subprocess
import os                                                                         


envi = os.environ.copy() # env of the python process
envi["PS1"]="my-prompt"

s = subprocess.Popen(['/bin/bash', '-i'], env=envi, shell=False)
s.communicate()

Когда я запускаю его на Debian Stretch 9, получаю:

initial_prompt> ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
  206 pts/0    00:00:00 ps
initial_prompt> python3 g.py 
user123§ced47a150f0c:ß$ 
user123§ced47a150f0c:ß$ ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
  207 pts/0    00:00:00 python3
  208 pts/0    00:00:00 bash
  209 pts/0    00:00:00 ps

Я получаю user123§ced47a150f0c:ß$ вместо my-prompt.

  • Когда я добавляю --norc к /bin/bash, это работает, но мне нужно прочитать ~/.bashrc.
  • В ~/.bashrc, PS1 не изменяется. У меня нет ~/.bash_profile файла.
  • PROMPT_COMMAND переменная env пуста.
  • В MacOS он работает как шарм.

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

По умолчанию bash не имеет общесистемного файла конфигурации для интерактивных оболочек.Но есть опция компиляции во время компиляции в config-top.h:

/* System-wide .bashrc file for interactive shells. */
/* #define SYS_BASHRC "/etc/bash.bashrc" */

Если это включено (как я полагаю, в Debian), похоже, нет способа отключить этово время выполнения, не отключая также ~/.bashrc.

Debian /etc/bash.bashrc заменяет любое унаследованное значение PS1 своим собственным значением.Конечно, вы можете переопределить это в своем собственном ~/.bashrc, но это означает, что вы не можете форсировать значение PS1 через среду при запуске интерактивной оболочки для кого-то другого.В конце концов, пользователь выбирает, как выглядит его приглашение, а не ваше.

Обходной путь может заключаться в предоставлении собственного rcfile, который будет источником пользователя~/.bashrc файл явно, затем устанавливает подсказку, какой вы хотите, чтобы это было.Я не знаю ни одного простого способа сделать это без временного файла:

with NamedTemporaryFile() as tmprc:
    print(". ~/.bashrc", file=tmprc)
    print('PS1="my-prompt "', file=tmprc)

    s = subprocess.Popen(['/bin/bash', '-i', '--rcfile', tmprc.name])
0 голосов
/ 09 апреля 2019

В Debian Stretch PS1 устанавливается в /etc/bash.bashrc:

# set a fancy prompt (non-color, overwrite the one in /etc/profile)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Также источником является /etc/profile:

if [ "${PS1-}" ]; then
  if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi
...