GNU Screen с запущенным скриптом bash init

Я уверен, что есть ответ на этот вопрос в руководстве к экрану, но я не могу его найти! Я хочу, чтобы оболочка bash, порожденная экраном GNU, использовалась в качестве файла в дополнение к.bashrc, который она уже запускает.

Я не могу вызвать файл в.bashrc, потому что на нашем сайте.bashrc файлы автоматически восстанавливаются при входе в систему.

Есть идеи?

РЕДАКТИРОВАТЬ:

Я создал этот маленький скрипт (screen_bash.sh):

bash --rcfile ~/.screen_bashrc

Потом добавил

shell $HOME/screen_bash.sh

На мой.screenrc

Файл ~/.screen_bashrc был

<my_setup_stuff>
export SHELL=bash

SHELL=bash необходим для того, чтобы такие программы, как vim, могли правильно запускать вложенные оболочки.

3 ответа

Решение

Вы хотите, чтобы этот файл получался каждый раз, когда открывается новое окно экрана? Если это так, команда оболочки позволяет перезаписать то, что запускается, когда вы создаете новое окно экрана (по умолчанию это просто $SHELL). Вы можете установить этот сценарий на ваш выбор, который в конце запускает вашу оболочку.

screen bash --rcfile yourfile.rc

yourfile.rc должен источник .bashrc,

РЕДАКТИРОВАТЬ: Это на самом деле не делает то, что вы хотите, я просто понял, что вы, вероятно, хотите применить его ко всем оболочкам, запущенным на экране.

Я делал это раньше, но теперь я понял, что лучше работать как служба системного инициализации. Вы можете найти мой скрипт, прикрепленный к этому сообщению об ошибке. Надеюсь, он будет доступен как часть экранной сборки в Gentoo. Я буду держать это в курсе на github.

start() {

for SCREENRC in /etc/screen.d/* ; do 

    SESSION="$(basename $SCREENRC)"

    ## I don't think there may be a security issue,
    ## provided that users will not be have write
    ## permission in /etc/screen.d/ and if anyone
    ## gained access to mod the session file, they
    ## are in already anyhow!
    BELONGS="$(stat $SCREENRC --printf=%U)"

    MYSHELL="$(getent passwd $BELONGS | cut -d: -f7)"


    COMMAND="/usr/bin/screen -- -U -D -m -c ${SCREENRC} -S ${SESSION} -t ${SESSION}"

    ## Why on earth would one write this ???
    #HOMEDIR="$(getent passwd $BELONGS | cut -d: -f6)"

    ebegin "Starting screen session ${SESSION} for ${BELONGS}"

    PIDFILE="/var/run/screen.${BELONGS}.${SESSION}.pid"

    start-stop-daemon \
        --env TERM="rxvt" \
        --env HOME="~${BELONGS}" \
        --env SCREEN_SESSION=${SESSION} \
        --user $BELONGS \
        --chdir "~${BELONGS}" \
        --make-pidfile \
        --background \
        --pidfile=${PIDFILE} \
        --exec ${COMMAND}
    eend $?
done

}




stop() {

## Perhaps we should determin this by pidfiles ...
## but this way is not bad either!
for SCREENRC in /etc/screen.d/* ; do 

    SESSION="$(basename $SCREENRC)"
    BELONGS="$(stat $SCREENRC --printf=%U)"

    PIDFILE="/var/run/screen.${BELONGS}.${SESSION}.pid"
    PROCESS="$(cat ${PIDFILE})"

    if [ -e /proc/${PROCESS}/status ]; then

    grep -i "Name:" /proc/${PROCESS}/status | grep -iq "screen" || continue

    ebegin "Stopping screen session ${SESSION} for ${BELONGS} (PID: ${PROCESS})"

    ## There other things we can try here ...
    ## perhaps add /etc/screen.d/$SESSION.stop

    ## It will CERTAINly kill the righ screen!
    CERTAIN="${PROCESS}.${SESSION}"
    env TERM="urxvt" \
        start-stop-daemon \
            --user ${BELONGS} \
            --exec /usr/bin/screen -- -S $CERTAIN -X quit
    eend $?

    fi

    rm -f $PIDFILE

done
}
Другие вопросы по тегам