Come posso chiedere allo schermo di comportarsi come una shell bash standard?


37

Ho appena appreso il comando dello schermo su Linux: è geniale. Lo adoro. Tuttavia, il terminale / prompt effettivo nella schermata appare e si comporta in modo diverso rispetto al mio prompt bash standard. Cioè, i colori non sono gli stessi, il completamento della scheda non sembra funzionare, ecc.

C'è un modo in cui posso dire allo schermo di comportarsi proprio come un normale prompt bash (almeno, normale come quello a cui sono abituato)?

Informazioni aggiuntive

Mi sto collegando via ssh da un Mac (Terminale) a un box Linux senza testa (Ubuntu). Dopo aver effettuato l'accesso, ho TERM=xterm-colore quando eseguo schermo ho TERM=screen.

Proverò i suggerimenti di seguito per vedere se posso prima cambiare il $TERMvalore.


Solo per curiosità quale sistema operativo e che tipo di terminale hai quando inizi la schermata? Immagino che i tuoi problemi abbiano più a che fare con il tuo Terminale che fa qualcosa di sbagliato o si identifica in modo errato sullo schermo.
Zoredache,

@Zoredache - Ho aggiunto queste informazioni al post, sopra. Grazie. Ho dovuto regolare le impostazioni del mio Terminale per consentire al tasto Backspace di funzionare ...
thornomad,

Yuck, non mi piace molto Terminal.app. Personalmente ti suggerisco di prendere in considerazione l'utilizzo di un'alternativa vedi ( serverfault.com/questions/19240/… )
Zoredache il

Risposte:


39

Grazie a questo post , quello che ho fatto è stato aggiungere una riga a ~/.screenrc:

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

Poi le cose nella vostra ~/.bashrc, /etc/bashrcecc dovrebbero avere eseguito.


13

schermo cambia il tipo di termine in screen. Puoi fare una delle due cose:

  1. cambia l'impostazione del termine nel tuo .screenrc
  2. modificare i .bashrcfile ricercati TERM=screeneTERM=xterm

4
Grazie! Ho creato un $HOME/.screenrcfile e ho aggiunto questa riga all'inizio: term xterm-colore wa la! Richiesta colore e $TERMvalori corrispondenti. Tuttavia, nessun completamento con scheda ...
thornomad,

Devi scavare in ciò che attiva il completamento della scheda. Gli script di configurazione della shell predefiniti non sono del tutto coerenti con ciò che abilitano in base $TERM; alcune cose verranno abilitate con xterm e xterm-color, altre cercano solo xterm. Altre cose hanno altri interruttori.
staticsan

11

Mi piace il modo in cui hai scritto la tua domanda, mi stavo ponendo la stessa cosa e ci è voluto un po 'di tempo per capirlo. Sono stato fortunato a sapere già un po 'dell'invocazione della shell, quindi ho pensato che il problema fosse lì da qualche parte.

Ecco i miei risultati. In primo luogo, trovo personalmente interessante e vale la pena conoscere la differenza tra una shell di login e una shell non di login. Fai una man $SHELLe cerca la sezione su INVOCATION per saperne di più.

È possibile chiedere all'istanza della shell corrente se si tratta di una shell di accesso o di una shell non di accesso emettendo una shopt login_shellrichiesta. Nota che questa è normalmente un'opzione di sola lettura.

Sui miei sistemi Debian, screenè sempre venuto predefinito con shell non di accesso.

Dopo aver cercato sul web e letto man $SHELL, ho testato alcune cose e i seguenti due approcci hanno funzionato per me. In ~/.screenrcaggiungi / aggiorna una riga come segue:

shell -$SHELL

Se ciò non funziona E stai usando bash, puoi in alternativa provare, come condiviso da Seamus :

defshell -bash

Come accennato, è possibile verificare se l'istanza della shell corrente è una shell di accesso emettendo shopt login_shellil prompt.


È il modo di avviare la shell nella directory corrente? Un esempio di ciò che desidero è il seguente cd ~/Projects ; screen ; pwd #=> ~/Projects. Tuttavia, quello che ottengo dopo aver aggiunto shell -$SHELLal mio ~/.screenrcècd ~/Projects ; screen ; pwd #=> ~/
rudolph9

9

A seconda di come sei abituato a eseguire Bash, potresti eseguire una shell di accesso. Quando esegui screen, esegui una shell interattiva senza accesso.

La differenza sta nel modo in cui vengono eseguiti gli script di avvio.

  • /etc/bash.bashrcquindi ~/.bashrcvengono acquistati all'avvio di una shell interattiva senza accesso

  • /etc/profilequindi il primo trovato di ~/.bash_profile, ~/.bash_logine ~/.profileviene fornito all'avvio di una shell di login interattiva

Questo potrebbe interessarti.

Vorrei anche verificare se $TERMè diverso.


2

lo schermo non sostituisce bash, lo esegue o qualsiasi altra shell. forse è in esecuzione csh, zsho bashma con parametri diversi.

la prima cosa che vorrei provare è verificare con psed /proc/<pid>/cmdlineessere sicuro che stia usando la stessa shell con gli stessi parametri login.

successivamente, controlla /etc/screenrce qualsiasi altro file menzionato nella man screensezione FILES.


Ho eseguito un pscomando e mostra che bashè in esecuzione (questo è un comando ps all'interno dello schermo) ... Ho il colore funzionante (sopra) ho solo bisogno del completamento della scheda.
thornomad,

2

Ho avuto lo stesso problema, quando ho eseguito lo schermo ho perso il fantastico prompt dei colori di PS1 che avevo trovato abilmente: P.

Il problema è che lo stavo eseguendo in questo modo in ~ / .bash_profile

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

Ciò significa che quando lo schermo eseguiva il bash_profile, la PS1 non veniva trasferita.

La correzione è semplice: aggiungi l'esportazione all'istruzione PS1 nel file ~. / Bash_profile in questo modo:

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

In questo modo la variabile non viene persa nell'esecuzione nidificata.


1

Voglio solo aggiungere qualcosa su "defshell -bash" (che ho appena capito, dopo mesi di graffi alla testa). Quando lo fai, la shell figlio gestita dallo schermo ha $ SHELL impostato su "bash", invece di "/ bin / bash" come sarebbe normalmente. Se esegui "script" all'interno della sessione dello schermo, otterrai:

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

O almeno è quello che succede sulla mia scatola Ubuntu 14.04. La soluzione alternativa che sto usando è di eseguire $ SHELL=/bin/bash script. Immagino che avere $ SHELL impostato in modo errato rompa altre cose, ma lo script è quello che ho notato.


0

Sto usando questo frammento .profileprima di iniziare qualsiasi inizializzazione della 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 }

Quindi, se non è in esecuzione alcuna sessione dello schermo, io ... beh, non cado nel prompt della shell standard. C'è un altro prompt per sudopasword (dal 99% delle volte che accedo per amministrare il server), e se ho intenzione di eseguire una lunga attività, cancello l'accesso sudo, avvio manualmente lo schermo nella sessione del mio utente e sudo lì.

Il punto chiave qui è "prima di qualsiasi inizializzazione della shell", in modo che quando hai già una sessione dello schermo in esecuzione, sia già inizializzata con impostazioni locali e altre cose e non hai bisogno di rifarla di nuovo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.