BASH Tips&Tricks #0001: Распахнём "запахнутые" окна! :)

BASH
Надоело восстанавливать сессию screen при каждом заходе по ssh?
Впишите в .bash_profile:

if [[ $PS1 && $(</proc/$PPID/cmdline) =~ ^sshd ]] && { which screen || alias -p screen; } &>/dev/null ; then
  screenSessMaxPID=$(screen -ls | sed -nr 's%^\s+([0-9]+)\..*\((At|De)tached\)$%\1%p' | sort -n | tail -1) && \
   screen -dr $screenSessMaxPID 2>/dev/null
fi

UPD[02/09/2015]
— добавил возможность указания screen'а в виде алиаса
— убрал флуд screen'а при старте

UPD[29/02/2016]
«Интерактивная» версия:

if [[ $PS1 && $(</proc/$PPID/cmdline) =~ ^sshd ]] && { which screen || alias -p screen; } &>/dev/null; then
        declare -a lstScreens=( $(screen -ls | sed -nr 's%^\s+([0-9]+)\..*\((At|De)tached\)$%\1%p' | sort -rn) )
        declare -i nScreens=${#lstScreens[@]}
        if (( nScreens )); then
                if [[ $nScreens>1 && -t 1 ]]; then
                        echo -e 'Warning: there are more than one active screen sessions running simultaneously!\nPlease, choose what session to load' >&2
                        select screenSessID in ${lstScreens[@]}; do [[ $screenSessID ]] && break; done
                else
                        screenSessID=${lstScreens[0]}
                fi
                screen -dr $screenSessID 2>/dev/null
        else
                if [[ -t 1 ]]; then
                        echo 'Info: The are no screens to attach, creating new session' >&2
                        sleep 1
                fi
                screen
        fi
fi

6 комментариев

avatar
Ну нельзя быть таким принципиальным в своих выводах:)
Во-первых, и таки да, пользовательская утилита sed (заметьте, к ОС она имеет довольно посредственное отношение имеет) поддерживает ключ "-r":
-R, -r, --recursive
              Read all files under each directory, recursively; this is equiv‐
              alent to the -d recurse option.

Во-вторых — надо хоть как-то приучать себя пользоваться документацией :)
avatar
Извиняюсь, это из man grep. man sed говорит следующее:
-r      Same as -E for compatibility with GNU sed.
avatar
Ну значит к 2010-му году научилась, раньше была только -E, а поскольку всю жизнь пользуюсь явно более функциональным sed'ом из проекта GNU, то я даже не смотрел в сторону этой опции :)
А sed во FreeBSD наконец научился редактировать i-place, не создавая дополнительных файлов?
avatar
Боюсь про такие тонкости штатного sed не смогу ответить. Но если он Вам так действительно неприятен — то всегда можно доставить гнутый sed :)
Port:   gsed-4.2.1_2
Path:   /usr/ports/textproc/gsed
Info:   The GNU stream editor
Maint:  gabor@FreeBSD.org
B-deps: gettext-0.18.1.1 gmake-3.81_4 libiconv-1.13.1_1
R-deps: gettext-0.18.1.1 libiconv-1.13.1_1
WWW:    http://www.gnu.org/software/sed/sed.html
avatar
Вы бы лучше обратили внимание на то, что сама идея поста неправильная :)
Подумайте, что будет, если поступить именно так, как я написал. Я уже огрёб грабли на этом :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.