docs:tips_n_tricks:screen.html
Table of Contents
screen
show current directory or command in window name when using zsh
Linux
put this in your .zshrc
- .zshrc
case "$STY" in "") ;; "$PPID".*) # chpwd () { # let "len = 54 - ${#DISPLAY}" # screen -X -S "$STY" title "$DISPLAY - `pwd|sed -e 's:^.*\(.\{'$len'\}\)$:..\1:g'`" # } precmd () { let "len = 54 - ${#DISPLAY}" screen -X -S "$PPID" title "$DISPLAY - `pwd|sed -e 's:^.*\(.\{'$len'\}\)$:..\1:g'` ($_my_last_cmd)" } preexec () { screen -X -S "$PPID" title "$DISPLAY - running: $1" _my_last_cmd="$1" # # Maybe $2 or $3 is a better choice - I didn't get the difference yet. You may # # analyse this with the statement: # printf "1:%s\n2:%s\n3:%s\n" "$1" "$2" "$3" >> "/tmp/preexec.$$.log" } ;; esac
Mac OS X
On Mac OS X (maybe on BSD systems in general), screen launches a login
process which then executes the shell. Therefore, the id of the screen session ($STY
) does not start with the parent processes pid ($PPID
), but with the parent pid of the parent process. Therefor, you have to
use the following lines in your .zshrc
case "`ps -o 'command=' -p $PPID`" in "login"*"zsh") pppid="`ps -o 'ppid=' -p $PPID|sed -e 's/^ *//g'`" ;; *) pppid="XXX" ;; esac case "$STY" in "") ;; "$pppid"*) eval " precmd () { let \"len = 54 - \$#DISPLAY\" screen -X -S "$STY" title \"\$DISPLAY - \`pwd|sed -e 's:^.*\(.\{'\$len'\}\)\$:..\1:g'\`\" } preexec () { screen -X -S \"$STY\" title \"\$DISPLAY - running: \$1\" } " ;; esac
show current directory or command in window name when using bash
This is the beginning of an humble try:
case "$STY" in "") ;; "$PPID".*) precmd () { let "len = 54 - ${#DISPLAY}" screen -X -S "$PPID" title "$DISPLAY - `pwd|sed -e 's:^.*\(.\{'$len'\}\)$:..\1:g'`" } preexec () { screen -X -S "$PPID" title "$DISPLAY - running: $1" # # Maybe $2 or $3 is a better choice - I didn't get the difference yet. You may # # analyse this with the statement: # printf "1:%s\n2:%s\n3:%s\n" "$1" "$2" "$3" >> "/tmp/preexec.$$.log" } if [ "$BASH" ] then PROMPT_COMMAND='precmd' screentitle() { preexec "$BASH_COMMAND"; } # # nice try :-/ # trap screentitle DEBUG on_debug() { case "$BASH_COMMAND" in "$PROMPT_COMMAND") ;; *) preexec "$BASH_COMMAND" >> /dev/tty < /dev/null 2>&1 & disown ;; esac } trap on_debug DEBUG fi # as we show user and cwd in screen title, # clear hardstatus in screen: echo -en "\033]0;\007" ;; esac
This seems to break some Pipe chains. There might be a better approach at at twistedmatrix where the idea to use “trap
… DEBUG
” was stolen from
Actually, I consider this trick dirty and hence both solutions.
Have a separate history for each screen window
Put this in your .profile
, .bashrc
, .zshenv
or whatever shell your're using:
[ -n "$WINDOW" ] && HISTFILE="${HISTFILE:-~/.screen_history}.${WINDOW}"
sample .screenrc file
- .screenrc
#remove some stupid / dangerous key bindings bind ^k bind ^\ bind k # # don't lock screen accidently - use if you don't know the accounts # # password (e.g. when access is managed by ssh keys) # bind x # bind ^x startup_message off vbell on vbell_msg " Klingeling! " bindkey -k kb stuff ^? # Enable cycling backward throug regions in Putty by C-a,Shift+TAB bindkey -t "^A^[[Z" focus prev # Make C-a C-a work smooth again bindkey -t "^A^A" other defscrollback 500 # make $HOME the base for all relative paths chdir caption always # # show window title and optional # # hardware status line text # caption string "%?%F%{.c.}%?%3n %t%? [%h]%?" # # show window title if set, else hardware status line text # windowlist string "%3n %?[%h]%:%t%?" # windowlist title "Num Name|HW Status" # # show window title and hardware status line text if set # windowlist string "%3n %t %?[%h]%?" # windowlist title "Num Name [HW Status]" # # Use approximately original windowlist string appended by hardware statusline if set windowlist string "%3n %t%=%?[%h] %:%?%f " windowlist title "Num Name%=[HW Status] Flags" # # show clock in caption line # caption string "%?%F%{.b.}%H: %?%3n%? [%h]%: %t%?%=| %c:%s " # Higlight active window, show hold and escape-key state caption string "%?%F%{.bw}%?%H: %3n%?%E %{.rw}~a~%{-}%?%?%P %{.wb}~HOLD~%{-}%?%? [%h]%: %t%?%-11=| %c:%s " hardstatus on hardstatus alwayslastline msgminwait 0 logfile .screenlog/screen.%S.%n.%Y-%m-%d.%0c.log zombie xr onerror # If you're using bash (won't hurt otherwise) setenv PROMPT_COMMAND 'screen -p "$WINDOW" -X title "$PWD"'
Logging and reading logs
- .screenrc
: chdir logfile screenlog/screen.%S.%n.%Y-%m-%d.%0c.log :
col < ~/screenlog/screen.pts-0.www.14.2021-09-06.09:28.log | less
References:
Starting root shell in new screen with non-default shell
screen -t root sudo ZDOTDIR=$HOME -i /bin/zsh -
screen -t root sudo su - -c "ZDOTDIR=$HOME exec zsh"
docs/tips_n_tricks/screen.html.txt · Last modified: 27.09.2024 11:42 CEST by peter