代码之家  ›  专栏  ›  技术社区  ›  Greg Reynolds

运行bash init脚本的GNU屏幕

  •  5
  • Greg Reynolds  · 技术社区  · 15 年前

    我确信在屏幕手册中有一个答案,但我找不到! 我希望由GNU屏幕生成的bash shell除了已经运行的.bashrc之外,还可以在文件中提供源代码。

    我不能调用.bashrc中的文件,因为在我们的站点上.bashrc文件在登录时会自动重新生成。

    有什么想法吗?

    编辑:

    我创建了这个小脚本(screen-bash.sh):

    bash --rcfile ~/.screen_bashrc
    

    然后加入

    shell $HOME/screen_bash.sh
    

    给我的屏幕

    ~/.screen\bashrc文件是

    <my_setup_stuff>
    export SHELL=bash
    

    shell=bash是必要的,这样像vim这样的程序就可以正确地启动子shell。

    3 回复  |  直到 13 年前
        1
  •  4
  •   swampsjohn    15 年前

    是否希望每次打开新的屏幕窗口时都源于此文件?如果是这样, shell 命令允许您覆盖创建新屏幕窗口时运行的内容(默认情况下,它只是$shell)。您可以将此脚本设置为最终运行shell的脚本。

        2
  •  2
  •   Michiel Buddingh    15 年前
    screen bash --rcfile yourfile.rc
    

    yourfile.rc 应该来源 .bashrc .

    编辑 :这并不是你想要的,我只是意识到你可能希望它适用于 全部的 炮弹从屏幕开始。

        3
  •  0
  •   errordeveloper    13 年前

    我以前做过,但现在我意识到最好作为SystemInit服务运行。你可以找到我的脚本附加到 this bug report . 希望它能作为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
    }