Comment demander à l'écran de se comporter comme un shell bash standard?

37

Je viens d’apprendre la commande d’écran sur linux - c’est un génie. J'aime cela. Cependant, le terminal / l'invite à l'écran ressemble et se comporte différemment de mon invite bash standard. Autrement dit, les couleurs ne sont pas les mêmes, la complétion des onglets ne semble pas fonctionner, etc.

Existe-t-il un moyen de dire à l'écran de se comporter comme une invite normale (du moins, normale, comme d'habitude)?

Information additionnelle

Je me connecte via ssh depuis un Mac (Terminal) à une boîte Linux sans tête (Ubuntu). Après la connexion, je l'ai TERM=xterm-coloret quand je lance l'écran, j'ai TERM=screen.

Je vais essayer les suggestions ci-dessous pour voir si je peux changer la $TERMvaleur en premier.

Thornomad
la source
Juste par curiosité quel OS, et quel type de terminal avez-vous quand l'écran de démarrage? Je suppose que vos problèmes ont plus à voir avec votre terminal en faisant quelque chose de mal ou en identifiant de manière incorrecte à l'écran.
Zoredache
@ Zoredache - J'ai ajouté cette information à l'article ci-dessus. Merci. J'ai dû ajuster les paramètres de mon terminal pour permettre à la touche Retour arrière de fonctionner ...
thornomad
Beurk, je n'aime vraiment pas Terminal.app. Personnellement, je vous suggère d’envisager d’utiliser une alternative voir ( serverfault.com/questions/19240/… )
Zoredache

Réponses:

39

Grâce à ce post , j'ai ajouté une ligne à ~/.screenrc:

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

Ensuite , les choses dans votre ~/.bashrc, /etc/bashrcetc. devraient se lancer.

Seamus Abshere
la source
13

l'écran change le type de terme en screen. Vous pouvez faire l'une des deux choses suivantes:

  1. changer le réglage des termes dans votre .screenrc
  2. modifier vos .bashrcfichiers rechercher TERM=screenainsi queTERM=xterm
staticsan
la source
4
Merci! J'ai créé un $HOME/.screenrcfichier et ajouté cette ligne en haut: term xterm-coloret wa la! L'invite de couleur et les $TERMvaleurs correspondent. Cependant, pas de tabulation complète ...
thornomad
Vous devez creuser dans ce qui active la complétion par tabulation. Les scripts de configuration du shell par défaut ne sont pas tout à fait cohérents sur ce sur quoi ils activent $TERM. certaines choses vont permettre avec xterm ainsi que xterm-color, d’autres ne recherchent que xterm. D'autres choses ont d'autres commutateurs.
staticsan
11

J'aime la façon dont vous avez écrit votre question, je me demandais la même chose et il a fallu un peu de temps pour le comprendre. J'ai eu la chance de connaître un peu plus sur l'invocation de shell, alors j'ai pensé que le problème était là quelque part.

Voici mes conclusions. Tout d'abord, je trouve personnellement intéressant et intéressant de connaître la différence entre un shell de connexion et un shell autre que de connexion. Faites un man $SHELLet recherchez la section sur INVOCATION pour en savoir plus à ce sujet.

Vous pouvez demander à votre instance de shell actuelle s'il s'agit d'un shell de connexion ou d'un shell autre que de connexion en envoyant un shopt login_shellsur votre invite. Notez que ceci est normalement une option en lecture seule.

Sur mes systèmes Debian, il screenest toujours venu défaut avec des shells non-login.

Après une recherche sur le Web et une lecture man $SHELL, j’ai testé plusieurs choses et les deux approches suivantes ont fonctionné pour moi. Dans ~/.screenrcajouter / mettre à jour une ligne comme suit:

shell -$SHELL

Si cela ne fonctionne PAS ET que vous utilisez bash, vous pouvez également essayer, partagé par Seamus :

defshell -bash

Comme indiqué, vous pouvez vérifier si votre instance de shell actuelle est un shell de connexion en l’envoyant shopt login_shellsur votre invite.

Kyle
la source
Est-il possible de lancer le shell dans le répertoire actuel? Un exemple de ce que je désire est le suivant cd ~/Projects ; screen ; pwd #=> ~/Projects. Cependant, ce que je reçois après avoir ajouté shell -$SHELLà mes ~/.screenrcestcd ~/Projects ; screen ; pwd #=> ~/
rudolph9
9

En fonction de votre habitude d’exécuter Bash, vous pouvez exécuter un shell de connexion. Lorsque vous exécutez screen, vous exécutez un shell interactif sans connexion.

La différence réside dans le lancement des scripts de démarrage.

  • /etc/bash.bashrcpuis ~/.bashrcsont recherchés quand un shell interactif sans connexion est démarré

  • /etc/profilepuis les premiers trouvés de ~/.bash_profile, ~/.bash_loginet ~/.profileproviennent du démarrage d’un shell de connexion interactif

Cela peut vous affecter.

Je voudrais aussi vérifier si $TERMc'est différent.

En pause jusqu'à nouvel ordre.
la source
2

l'écran ne remplace pas bash, il l'exécute, ou tout autre shell. c'est peut-être en cours d'exécution csh, zshou bashmais avec des paramètres différents.

La première chose que je voudrais essayer est de vérifier pset /proc/<pid>/cmdlined’être sûr qu’il utilise le même shell avec les mêmes paramètres login.

Après cela, vérifiez /etc/screenrcet tout autre fichier mentionné dans la man screensection FILES.

Javier
la source
J'ai lancé une pscommande et elle indique que la commande bashest en cours d'exécution (il s'agit d'une commande ps à l'intérieur de l'écran) ... J'ai la couleur qui fonctionne (ci-dessus).
Thornomad
2

J'ai eu le même problème, lorsque j'ai lancé l'écran, j'ai perdu l'invite de couleur PS1 que j'avais trouvée avec talent: P.

Le problème est que je le courais comme ça dans ~ / .bash_profile

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

Cela signifie que lorsque screen exécutait bash_profile, la PS1 n’était pas reportée.

Le correctif est simple: ajoutez export à l'instruction PS1 dans le fichier ~. / Bash_profile pour ressembler à ceci:

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

Ainsi, la variable n'est pas perdue dans l'exécution imbriquée.

davidsaliba
la source
1

Je veux juste ajouter quelque chose à propos de "defshell-bash" (que je viens de comprendre après des mois de casse-tête). Lorsque vous faites cela, le shell enfant exécuté par screen a $ SHELL défini sur "bash", au lieu de "/ bin / bash" comme il le serait normalement. Si vous exécutez ensuite "script" dans votre session screen, vous obtenez:

$ script
Script started, file is typescript
script: failed to execute bash: No such file or directory

Ou du moins c'est ce qui se passe sur ma boîte Ubuntu 14.04. La solution de contournement que j'ai utilisée consiste à exécuter $ SHELL=/bin/bash script. J'imagine qu'avoir mal configuré $ SHELL cassera d'autres trucs, mais le script est ce que j'ai remarqué.

Roy Smith
la source
0

J'utilise cet extrait de code .profileavant toute initialisation de 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 }

Ensuite, si aucune session d’écran n’est en cours, je… eh bien, je ne tombe pas dans l’invite du shell standard. Il existe encore une invite de sudomot de passe (depuis 99% du temps, je me connecte pour administrer le serveur), et si je prévois d'effectuer une longue tâche, j'annule la connexion sudo, lance l'écran manuellement dans la session de l'utilisateur et le sudo dans celui-ci.

Le point clé ici est "avant toute initialisation de shell", de sorte que lorsque vous avez déjà une session d'écran en cours d'exécution, celle-ci est déjà initialisée avec les paramètres régionaux et autres et vous n'avez pas besoin de la refaire.

AnrDaemon
la source