Graças a esta postagem , o que fiz foi adicionar uma linha a ~/.screenrc
:
# ~/.screenrc
defshell -bash # dash makes it a login shell
Em seguida, as coisas no seu ~/.bashrc
, /etc/bashrc
etc. devem ser executadas.
Aprendi apenas sobre o comando screen no linux - é genial. Eu amo isso. No entanto, o terminal / prompt real na tela parece e se comporta de maneira diferente do meu prompt bash padrão. Ou seja, as cores não são as mesmas, a conclusão das guias parece não funcionar, etc.
Existe uma maneira que eu posso dizer que a tela se comporte como um normal (pelo menos, normal como no que eu estou acostumado) prompt bash?
Estou conectando via ssh de um Mac (Terminal) a uma caixa headless linux (Ubuntu). Após o login, eu tenho TERM=xterm-color
e quando eu corro tela eu tenho TERM=screen
.
Vou tentar as sugestões abaixo para ver se consigo alterar o valor $TERM
primeiro.
Graças a esta postagem , o que fiz foi adicionar uma linha a ~/.screenrc
:
# ~/.screenrc
defshell -bash # dash makes it a login shell
Em seguida, as coisas no seu ~/.bashrc
, /etc/bashrc
etc. devem ser executadas.
muda o tipo de termo para screen
. Você pode fazer uma das duas coisas:
.screenrc
.bashrc
e procure TERM=screen
, bem como TERM=xterm
Eu gosto do jeito que você escreveu sua pergunta, eu estava me perguntando a mesma coisa e demorou um pouco para descobrir. Tive a sorte de já saber um pouco sobre invocação de shell, então imaginei que o problema estava em algum lugar.
Aqui estão minhas descobertas. Em primeiro lugar, eu pessoalmente acho interessante e vale a pena conhecer a diferença entre um shell de login e um shell de não-login. Faça um man $SHELL
e procure a seção INVOCATION para ler mais sobre isso.
Você pode perguntar à sua instância atual do shell se é um shell de login ou não-login, emitindo um shopt login_shell
no seu prompt. Note que esta é normalmente uma opção somente leitura.
Em meus sistemas Debian, screen
sempre vem padronizado com shells que não são de login.
Depois de pesquisar na web e ler man $SHELL
, testei algumas coisas e as duas abordagens a seguir funcionaram para mim. Em ~/.screenrc
add / update uma linha da seguinte forma:
shell -$SHELL
Se isso não funcionar E você estiver usando bash
, você pode alternativamente tentar, como compartilhado por Seamus :
defshell -bash
Como mencionado, você pode testar se sua instância atual do shell é um shell de login emitindo shopt login_shell
no seu prompt.
Dependendo de como você está acostumado a executar o Bash, você pode estar executando um shell de login. Quando você executa screen
, está executando um shell interativo sem logon.
A diferença está em quais scripts de inicialização são executados.
/etc/bash.bashrc
then ~/.bashrc
são originados quando um shell interativo não-login é iniciado
/etc/profile
, em seguida, os primeiros encontrados de ~/.bash_profile
, ~/.bash_login
e ~/.profile
são originados quando um shell de login interativo é iniciado
Isso pode estar afetando você.
Eu também verificaria se $TERM
é diferente.
não substitui o bash, ele o executa ou qualquer outro shell. talvez esteja executando csh
, zsh
ou bash
, mas com parâmetros diferentes.
a primeira coisa que eu tentaria é verificar com ps
e /proc/<pid>/cmdline
para ter certeza de que está usando o mesmo shell com os mesmos parâmetros que login
faz.
depois disso, verifique /etc/screenrc
e qualquer outro arquivo mencionado na seção man screen
FILES.
Eu tive o mesmo problema, quando eu corri a tela eu perdi o prompt de cor legal do PS1 que eu tinha encontrado astuciosamente: P.
O problema é que eu estava rodando assim em ~ / .bash_profile
PS1="\[3[35m\]\t\[3[m\]-\[3[36m\]\u\[3[m\]@\[3[32m\]\h:\[3[33;1m\]\w\[3[m\]\$ "
Isso significa que quando a tela estava rodando o bash_profile, o PS1 não está sendo transportado.
A correção é fácil: adicione a exportação à instrução PS1 no ~. / bash_profile para ficar assim:
export PS1="\[3[35m\]\t\[3[m\]-\[3[36m\]\u\[3[m\]@\[3[32m\]\h:\[3[33;1m\]\w\[3[m\]\$ "
Assim a variável não é perdida na execução aninhada.
Só quero acrescentar algo sobre "defshell -bash" (que acabei de descobrir, depois de meses de arranhar a cabeça). Quando você faz isso, o shell filho executado pela tela tem $ SHELL definido como "bash", em vez de "/ bin / bash" como normalmente seria. Se você, então, executar "script" dentro da sua sessão de tela, você verá:
$ script
Script started, file is typescript
script: failed to execute bash: No such file or directory
Ou pelo menos é o que acontece na minha caixa Ubuntu 14.04. A solução alternativa que estou usando é executar $ SHELL=/bin/bash script
. Eu imagino que ter $ SHELL definido errado vai quebrar outras coisas, mas o script é o que eu notei.
Estou usando este trecho no meu .profile
antes de iniciar qualquer inicialização do shell:
which screen > /dev/null 2>&1 && {
screen -q -ls
if [ $? -gt 10 ]; then
read -p "$(tput setaf 2)Found a running SCREEN sesion, attach?$(tput sgr0)[Y/n] " y >&2
if [ "${y:-y}" = "y" -o "$y" = "Y" ]; then
screen -aDR && logout
fi
else
echo "$(tput setaf 3)No running SCREEN sessions found.$(tput sgr0)" >&2
fi
}
Então, se não houver nenhuma sessão de tela em execução, eu ... bem, eu não estou no prompt padrão do shell. Há mais um prompt para sudo
pasword (já que 99% do tempo que eu me conecto para administrar o servidor), e se eu planejo executar uma tarefa demorada, eu cancelo o sudo login, lanço a tela manualmente na sessão do meu usuário e sudo in lá.
O ponto chave aqui é "antes de qualquer inicialização do shell", de modo que quando você já tem uma sessão de tela em execução, ele já foi inicializado com o código de idioma e outras coisas e você não precisa refazê-lo novamente.