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

37

Acabei de aprender sobre o comando screen no linux - é genial. Eu amo isso. No entanto, o terminal / prompt na tela parece e se comporta de maneira diferente do meu prompt do bash padrão. Ou seja, as cores não são as mesmas, a conclusão da guia não parece funcionar etc.

Existe uma maneira de dizer para a tela se comportar como um prompt do bash normal (pelo menos, normal como no que estou acostumado)?

informação adicional

Estou conectando via ssh de um Mac (Terminal) a uma caixa Linux sem cabeça (Ubuntu). Após o login, eu tenho TERM=xterm-colore quando executo a tela, eu o tenho TERM=screen.

Vou tentar as sugestões abaixo para ver se posso alterar o $TERMvalor primeiro.

thornomad
fonte
Por curiosidade, qual sistema operacional e que tipo de terminal você tem quando a tela inicial? Eu acho que seus problemas têm mais a ver com o Terminal fazendo algo errado ou identificando-se incorretamente na tela.
Zoredache
@ Zoredache - eu adicionei essa informação ao post acima. Obrigado. Eu tive que ajustar as configurações do meu terminal para permitir a tecla de retrocesso para o trabalho ...
thornomad
Eca, eu realmente não gosto do Terminal.app. Pessoalmente, eu sugiro que você considere usar um ver alternativo ( serverfault.com/questions/19240/... )
Zoredache

Respostas:

39

Graças a este post , o que fiz foi adicionar uma linha a ~/.screenrc:

# ~/.screenrc
defshell -bash      # dash makes it a login shell

Então as coisas no seu ~/.bashrc, /etc/bashrc, etc, devem se executar.

Seamus Abshere
fonte
13

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

  1. altere a configuração do termo no seu .screenrc
  2. modificar seus .bashrcarquivos procurar TERM=screen, bem comoTERM=xterm
staticsan
fonte
4
Obrigado! Eu criei um $HOME/.screenrcarquivo e adicionei esta linha ao topo: term xterm-colore wa la! O prompt de cores e os $TERMvalores correspondem. No entanto, não há preenchimento de tabulação ...
thornomad 26/03
Você precisa descobrir o que ativa a conclusão da guia. Os scripts de configuração padrão do shell não são totalmente consistentes sobre o que eles habilitam com base $TERM; algumas coisas serão ativadas com o xterm e com o xterm-color, outras apenas o xterm. Outras coisas têm outras opções.
staticsan
11

Eu gosto do jeito que você escreveu sua pergunta, eu estava me perguntando a mesma coisa e demorou um pouco para descobrir. Eu tive a sorte de já saber um pouco sobre invocação de shell, então achei que o problema estava lá 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 não-login. Faça um man $SHELLe 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-logon, emitindo um shopt login_shellem seu prompt. Observe que normalmente é uma opção somente leitura.

Nos meus sistemas Debian, screensempre vem com shells sem login.

Depois de pesquisar na web e ler man $SHELL, testei algumas coisas e as duas abordagens a seguir funcionaram para mim. Em ~/.screenrcAdicionar / atualizar uma linha da seguinte forma:

shell -$SHELL

Se isso não der certo E você estiver usando bash, você pode tentar alternativamente, conforme compartilhado pelo Seamus :

defshell -bash

Como mencionado, você pode testar se sua instância atual do shell é um shell de logon emitindo shopt login_shellem seu prompt.

Kyle
fonte
É a maneira de iniciar o shell no diretório atual? Um exemplo do que desejo é o seguinte cd ~/Projects ; screen ; pwd #=> ~/Projects. No entanto, o que eu recebo depois de adicionar shell -$SHELLaos meus ~/.screenrcsejacd ~/Projects ; screen ; pwd #=> ~/
rudolph9
9

Dependendo de como você está acostumado a executar o Bash, você pode estar executando um shell de login. Ao executar screen, você está executando um shell interativo sem login.

A diferença está em quais scripts de inicialização são executados.

  • /etc/bash.bashrcem seguida, ~/.bashrcsão originados quando um não-login shell interativo é iniciado

  • /etc/profiledepois, o primeiro encontrado de ~/.bash_profile, ~/.bash_logine ~/.profileé originado quando um shell de logon interativo é iniciado

Isso pode estar afetando você.

Eu também verificaria se $TERMé diferente.

Pausado até novo aviso.
fonte
2

A tela não substitui o bash, executa-o ou qualquer outro shell. talvez ele está correndo csh, zshou bash, mas com diferentes paramters.

a primeira coisa que eu tentaria é verificar pse /proc/<pid>/cmdlineter certeza de que ele está usando o mesmo shell com os mesmos parâmetros que loginele.

depois disso, verifique /etc/screenrce qualquer outro arquivo mencionado na man screenseção FILES.

Javier
fonte
Eu executei um pscomando e ele mostra que bashestá sendo executado (este é um comando ps dentro da tela) ... Eu consegui a cor funcionando (acima), só preciso completar a guia.
thornomad
2

Eu tive o mesmo problema, quando corri a tela, perdi o prompt de cores legais do PS1 que encontrei com astúcia: P.

Problema é que eu estava executando assim em ~ / .bash_profile

PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

Isso significa que, quando a tela estava executando o bash_profile, o PS1 não está sendo carregado.

A correção é fácil: adicione exportação à instrução PS1 em ~. / Bash_profile para ter a seguinte aparência:

export PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

Assim, a variável não é perdida na execução aninhada.

davidsaliba
fonte
1

Só quero adicionar algo sobre "defshell -bash" (que eu acabei de descobrir, depois de meses coçando 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ê executar o "script" dentro da sessão da tela, você obtém:

$ 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 do Ubuntu 14.04. A solução alternativa que eu estou usando é executar $ SHELL=/bin/bash script. Eu imaginaria que $ SHELL configurado errado quebraria outras coisas, mas o script é o que eu notei.

Roy Smith
fonte
0

Estou usando esse trecho .profileantes de 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 uma sessão de tela em execução, eu ... bem, não caio no prompt de shell padrão. Há mais uma solicitação de sudosenha (desde 99% do tempo em que faço login para administrar o servidor) e, se pretendo executar uma tarefa longa, cancelo o login do sudo, inicio a tela manualmente na sessão do usuário e o sudo lá.

O ponto principal aqui é "antes de qualquer inicialização do shell", para que, quando você já tenha uma sessão de tela em execução, ela já seja inicializada com código de idioma e outras coisas e não precise refazê-la novamente.

AnrDaemon
fonte