it-swarm-eu.dev

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

Je viens d'apprendre la commande screen sur linux - c'est du génie. J'aime cela. Cependant, le terminal/invite réel à 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 tabulations ne semble pas fonctionner, etc.

Existe-t-il un moyen de dire à l'écran de se comporter comme une invite bash normale (au moins, normale comme dans ce à quoi je suis habitué)?

Information additionnelle

Je me connecte via ssh depuis un Mac (Terminal) à une box linux sans tête (Ubuntu). Une fois connecté, j'ai TERM=xterm-color et lorsque je lance l'écran, j'ai TERM=screen.

Je vais essayer les suggestions ci-dessous pour voir si je peux changer le $TERM valeur d'abord.

39
thornomad

Merci à cet article , ce que j'ai fait, c'est d'ajouter une ligne à ~/.screenrc:

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

Ensuite, les choses dans votre ~/.bashrc, /etc/bashrc, etc. devrait s'exécuter.

40
Seamus Abshere

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

  1. changer le paramètre de terme dans votre .screenrc
  2. modifiez votre .bashrc les fichiers recherchent TERM=screen aussi bien que TERM=xterm
13
staticsan

J'aime la façon dont vous avez écrit votre question, je me posais la même chose et il a fallu un peu de temps pour le comprendre. J'ai eu la chance d'en savoir un peu plus sur l'invocation de Shell, alors j'ai pensé que le problème se trouvait quelque part.

Voici mes découvertes. Premièrement, je trouve personnellement intéressant et mérite de connaître la différence entre un shell de connexion et un shell sans connexion. Fait une man $Shell et recherchez la section INVOCATION pour en savoir plus.

Vous pouvez demander à votre instance Shell actuelle s'il s'agit d'un shell de connexion ou d'un shell non connecté en émettant un shopt login_Shell sur votre invite. Notez qu'il s'agit normalement d'une option en lecture seule.

Sur mes systèmes Debian, screen est toujours venu par défaut avec des shells sans connexion.

Après avoir recherché le Web et lu man $Shell, J'ai testé quelques éléments et les deux approches suivantes ont fonctionné pour moi. Dans ~/.screenrc ajouter/mettre à jour une ligne comme suit:

Shell -$Shell

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

defshell -bash

Comme mentionné, vous pouvez tester si votre instance Shell actuelle est un shell de connexion en émettant shopt login_Shell sur votre invite.

11
Kyle

Selon la façon dont vous êtes habitué à 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 l'exécution des scripts de démarrage.

  • /etc/bash.bashrc puis ~/.bashrc proviennent d'un shell interactif sans connexion démarré

  • /etc/profile puis le premier trouvé de ~/.bash_profile, ~/.bash_login, et ~/.profile proviennent d'un shell de connexion interactif démarré

Cela peut vous affecter.

Je vérifierais également si $TERM est différent.

screen ne remplace pas bash, il l'exécute ou tout autre Shell. il fonctionne peut-être csh, zsh ou bash mais avec des paramètres différents.

la première chose que j'essaierais est de vérifier avec ps et /proc/<pid>/cmdline pour être sûr qu'il utilise le même shell avec les mêmes paramètres que login.

après cela, vérifiez /etc/screenrc et tout autre fichier mentionné à man screen Section FICHIERS.

2
Javier

J'ai eu le même problème, lorsque j'ai exécuté l'écran, j'ai perdu l'invite de couleurs PS1 cool que j'avais astucieusement trouvée: P.

Le problème est que je l'exécutais comme ceci 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 l'écran exécutait le profil bash_profile, la PS1 n'est pas transférée.

Le correctif est simple: ajoutez l'exportation à l'instruction PS1 dans le ~./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\]\$ "

De cette façon, la variable n'est pas perdue dans l'exécution imbriquée.

2
davidsaliba

Je veux juste ajouter quelque chose sur "defshell -bash" (que je viens de comprendre, après des mois de gratte-tête). Lorsque vous faites cela, le shell enfant exécuté par l'écran 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 écran, 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'utilise consiste à exécuter $ Shell=/bin/bash script. J'imagine que le fait que $ Shell soit mal réglé cassera d'autres choses, mais le script est ce que j'ai remarqué.

1
Roy Smith

J'utilise cet extrait de code dans mon .profile Avant de démarrer l'initialisation du 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, s'il n'y a pas de session d'écran en cours, je… eh bien, je ne tombe pas dans l'invite de shell standard. Il y a une autre invite pour Sudo mot de passe (depuis 99% du temps je me connecte pour administrer le serveur), et si je prévois d'effectuer une tâche longue, j'annule la connexion Sudo, lance l'écran manuellement dans la session de mon utilisateur et Sudo là-dedans.

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

0
AnrDaemon