Como eu peço que a tela se comporte como um shell bash padrão?

35

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?

Informações adicionais

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.

    
por thornomad 24.03.2010 / 23:24

8 respostas

34

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.

    
por 22.03.2012 / 23:51
13
A tela

muda o tipo de termo para screen . Você pode fazer uma das duas coisas:

  1. altere a configuração do termo no seu .screenrc
  2. modifique seus arquivos .bashrc e procure TERM=screen , bem como TERM=xterm
por 25.03.2010 / 01:01
11

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.

    
por 23.03.2012 / 11:38
9

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.

    
por 25.03.2010 / 00:50
2
A tela

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.

    
por 24.03.2010 / 23:56
2

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.

    
por 21.09.2012 / 17:18
0

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.

    
por 07.03.2015 / 17:57
0

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.

    
por 02.03.2016 / 18:58