Alterando o PS1 em um subshell bash interativo facilmente

5

Eu tenho uma situação em que preciso fornecer um subshell para um usuário no meio de um longo processo. Eu gostaria de alterar o prompt para lembrar o usuário de que ele está em um subshell especial e ainda não passou pelo restante do processo. Eu pensei que isso faria o que eu quero ...

echo "PS1='foo:'" | bash -i

Mas quando eu entro nessa linha, esta é a saída que recebo

me@mercury:~$ PS1='foo:'
foo:exit
me@mercury:~$ 

Existe uma maneira simples de contornar isso? Eu poderia escrever o meu próprio bashrc personalizado ... mas eu preferiria preservar a configuração usual do shell bash do usuário.

    
por user455 02.02.2011 / 17:32

5 respostas

11

Você pode usar a substituição de processo para essencialmente criar um ~ / .bashrc que exista apenas para a invocação de bash -i da seguinte forma:

 bash --rcfile <(echo "PS1='foo: '") -i
    
por 02.02.2011 / 17:50
8

Acho que seria melhor usar env PS1="foo: " /bin/bash --norc -i em vez de usar a opção --rcfile . O ambiente é preservado, não sobrescrito pelos arquivos de pontos e a variável de ambiente PS1 é definida antes de entrar no shell.

Você também pode querer pensar em abrir um shell restrito, se o programa de chamada der privs extras. env PS1="foo: " PATH=$RESTRICTED_PATH /bin/rbash --norc -i para qualquer valor que você queira por $ RESTRICTED_PATH.

Ou tenha um arquivo bashrc já pré-fabricado:

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

E depois ligue com /bin/bash -rcfile ~/.bashrc.appsubshell -i

    
por 02.02.2011 / 20:48
2

Depois de ler esta página, eis como acabei fazendo isso.

Em .bashrc :

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

Em seguida, no script, estou executando o shell interativo de:

env PROMPT_POSTFIX="(whatever) " bash -i

O problema com o uso de --norc é que ele não captura seu arquivo .bashrc , então seu subshell interativo não terá coisas que você está acostumado a usar no Bash, como seus comandos de histórico, etc. maneira você pode definir PROMPT_POSTFIX sempre que você chamar Bash e ele será adicionado ao prompt.

    
por 16.06.2013 / 23:45
2

Se você ainda quiser que ~/.bashrc seja lido e supondo que ~/.bashrc não defina $PROMPT_COMMAND , você pode usar este truque:

PROMPT_COMMAND='PS1="foo: ";unset PROMPT_COMMAND' bash
    
por 17.08.2013 / 01:05
1

Concorda com SiegeX (quem me bateu nisso:))

Para explicar o comportamento:

O Bash só iniciará no modo interativo se o std in e out forem terminais normais. Esse não é o caso quando se está inserindo esse comando inicial.

Você pode usar a opção -c para fornecer comandos, mas isso também exclui o modo interativo.

Se você realmente deseja preservar o user rc, simplesmente adicione algumas instruções test / source na string rcfile para obter a origem ~/.bashrc e /etc/bashrc se os arquivos existirem.

    
por 02.02.2011 / 18:12

Tags