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
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.
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
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.
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
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.
Tags bash