Изменение PS1 на интерактивном ударе подокружает легко

Несколько лет назад уже были сообщения о проблемах в областях как ипотечные программы, делающие вычисления по 30-летним кредитам: 2008 + 30 = 2038.

7
02.02.2011, 18:32
6 ответов

Можно использовать замену процесса для важного создания ~/.bashrc, который только существует для bash -i вызов как так:

 bash --rcfile <(echo "PS1='foo: '") -i
12
27.01.2020, 20:13

Я думаю, что было бы лучше использовать env PS1="foo: " /bin/bash --norc -i вместо того, чтобы использовать --rcfile опция. Среда сохраняется, не перезаписывается точечными файлами, и переменная среды PS1 установлена прежде, чем ввести оболочку.

Вы могли бы также хотеть думать об открытии ограниченной оболочки, если программа вызова дает дополнительный privs. env PS1="foo: " PATH=$RESTRICTED_PATH /bin/rbash --norc -i для любого значения Вы хотите за $RESTRICTED_PATH.

Или имейте уже сборный bashrc файл:

if [ -f /etc/bashrc ]; then
    source /etc/bashrc
fi
if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi
PS1="foo:"
PATH=$RESTRICTED_PATH

И затем звоните с /bin/bash -rcfile ~/.bashrc.appsubshell -i

8
27.01.2020, 20:13
  • 1
    Вариант использования довольно прост..., утилита делает довольно сложное преобразование на коде поставщика repo, импортируя его к локальному подвижному repo. Распечатывает набор деталей состояния (как то, сколько корней/голов/ответвлений получающийся repo имеет), и затем запускает оболочку, чтобы позволить пользователю заняться расследованиями далее. Когда они заканчивают, сценарий спрашивает, должен ли он продолжить "трудный отменить" части процесса. (Таким образом... privs не являются проблемой здесь, но я хочу сделать пользователей максимально довольными их собственными настройками), –  user455 03.02.2011, 03:08
  • 2
    В моем случае я вызывал оболочку удара из задачи Граблей Ruby с sh команда, таким образом, это было лучшим решением безусловно. –  Dave 08.05.2015, 19:13

Согласитесь с SiegeX (кто избил меня к нему :))

Объяснить поведение:

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

Можно использовать -c опция обеспечить команды, но это также устраняет интерактивный режим.

Если Вы действительно хотите сохранить пользовательское дистанционное управление, просто добавьте некоторые операторы теста/источника в строке rcfile к источнику ~/.bashrc и /etc/bashrc если файлы существуют.

1
27.01.2020, 20:13

После того, чтобы читать эту страницу вот то, как я закончил тем, что делал его.

В .bashrc:

# use prompt postfix
if [[ -n "$PROMPT_POSTFIX" ]]; then
    PS1="${PS1}${PROMPT_POSTFIX}"
fi

Затем в сценарии я выполняю интерактивную оболочку от:

env PROMPT_POSTFIX="(whatever) " bash -i

Проблема с использованием --norc это, это не втягивает Ваш .bashrc файл, таким образом, Ваша интерактивная подоболочка не будет иметь вещей, которые Вы привыкли использовать в Bash, как Ваши команды истории, и т.д. Таким образом, можно установить PROMPT_POSTFIX каждый раз, когда Вы называете Bash, и он будет прибавляться к подсказке.

2
27.01.2020, 20:13

Если Вы все еще хотите ~/.bashrc быть считанным и принятие ~/.bashrc не устанавливает $PROMPT_COMMAND, Вы могли использовать этот прием:

PROMPT_COMMAND='PS1="foo: ";unset PROMPT_COMMAND' bash
5
27.01.2020, 20:13
  • 1
    я должен предположить, что PROMPT_COMMAND установлен. –  bukzor 01.01.2015, 04:38
  • 2
    По-моему, это - лучший ответ, так как Вы не портите с подсредой оболочки. –  ivarec 09.03.2016, 20:00

Я запускаю подоболочку из скрипта, поэтому я не могу просто сохранить текущую среду, но я хочу, чтобы пользователь все равно настроил свою среду.

Я не хочу требовать от пользователя bashrc того, что я не могу контролировать.

Так что я сделал источник их bashrc, выбросил PROMPT_COMMAND, если он существует, а затем установил PS1.

bash --rcfile <(echo ". ~/.bashrc; unset PROMPT_COMMAND; PS1='foo shell > '") -i
1
30.03.2020, 16:26

Теги

Похожие вопросы