GNU Screen запускает скрипт инициализации bash - PullRequest
5 голосов
/ 12 июня 2009

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

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

Есть идеи?

EDIT:

Я создал этот маленький скрипт (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 ]

4 голосов
/ 12 июня 2009

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

2 голосов
/ 12 июня 2009
screen bash --rcfile yourfile.rc

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

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

0 голосов
/ 01 сентября 2011

Я делал это раньше, но теперь я понял, что лучше работать как служба системного инициализации. Вы можете найти мой скрипт, прикрепленный к этому сообщению об ошибке . Надеюсь, он будет доступен как часть экранной сборки в 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
}
...