Linux区


站长小衲原创的第一个shell脚本myde发布!

Archlinux因为速度快,所以我一直在用它。但是archlinux要设置显示管理器(gdm、lxdm、mdm、kdm)需要用力折腾一下,而且还消耗系统资源拖慢系统速度,所以我一直没用显示管理器,而坚持用startx手动启动桌面。

但是问题来了,我这人就是喜欢换各种DE玩赏折腾,折腾之后可以为这个网站填料,给大家分享经验。昨天lxde玩腻了,今天可能又会玩gnome,明天又会尝试一下kde桌面。但是每次要换桌面,需手动修改~/.xinitrc文件,稍显繁琐,于是就撸了这么一个脚本,内容如下:

#! /bin/sh

#######################################
# 作者:小衲(撸linux站长)
# 电子邮件:lovinux@163.com
# 网站:http://www.linux.zone
# 本shell脚本遵循GPL协议发布,请尊重作者的署名
# 制作脚本的原因:http://www.linux.zone/archives/598
#######################################

#计算系统中session的数量
a=`ls -l /usr/share/xsessions/*.desktop|wc -l`

#设置两个temp文件
temp=`mktemp -t myde_menu.XXXXXX`
temp2=`mktemp -t myde_selected_id.XXXXXX`

#设置一个listsessions的函数,将/usr/share/xsessions目录下的所有sessions都通过一个dialog列出来
function listsessions {
for i in `seq $a`
do
    echo $i `ls /usr/share/xsessions/*.desktop|sed 's/\/usr\/share\/xsessions\///'|sed 's/\.desktop//'|sed -n "$i"p`>>$temp
done
dialog --menu "Choose a session you like:" 40 30 $a `cat $temp` 2>$temp2
}

listsessions

#设置一个循环,让用户无论如何,都选择一个session
while [ -z `cat $temp2` ] 
do
    dialog --msgbox "You must choose a session." 6 40
    listsessions
done    

if dialog --title "Question" --yesno "Write in ~/.xinitrc to use startx command to start X server next time?" 7 40 
then
    w="1"
    #将原来的不以#开头的exec行用#注释掉,同时把#为开头的行的#和后一个单词中间的空白去掉
    sed -i -e 's/^exec/#exec/' -e 's/^#[[:blank:]]\+/#/' ~/.xinitrc
    #将/usr/share/xsessions中所有sessions中的exec 行提取出来到.xinitrc中
    cat /usr/share/xsessions/*.desktop|grep ^Exec=|sed 's/\/usr\/bin\///'|sed 's/Exec=/#exec\ /'>>~/.xinitrc
    #删除.xinitrc中的重复行
    awk '!a[$0]++' ~/.xinitrc>~/.xinitrc1
    mv ~/.xinitrc1 ~/.xinitrc
    #将刚才选择的菜单ID的具体内容放入到b变量中
    z=`cat $temp2`
    b=`cat /usr/share/xsessions/*.desktop|grep ^Exec=|sed 's/\/usr\/bin\///'|sed 's/Exec=/#exec\ /'|sed -n "$z"p`
    c=`cat /usr/share/xsessions/*.desktop|grep ^Exec=|sed 's/\/usr\/bin\///'|sed 's/Exec=/exec\ /'|sed -n "$z"p`
    #将包含b内容的行的开头的#去掉,^$b$匹配的是整行
    #echo $b>~/.xinitrc
    #echo $c>>~/.xinitrc
    sed -i "s/^$b$/$c/g" ~/.xinitrc
    #提示写入.xinitrc成功
    dialog --msgbox "Write successfully!" 5 30
else
    w="0"
    #如果不保存到~/.xinitrc中的话,就先把~/.xinitrc拷贝为临时备份文件~/.xinitrc_bak
    cp -f ~/.xinitrc ~/.xinitrc_bak
    #然后重复跟上面一样的过程
    sed -i -e 's/^exec/#exec/' -e 's/^#[[:blank:]]\+/#/' ~/.xinitrc
    cat /usr/share/xsessions/*.desktop|grep ^Exec=|sed 's/\/usr\/bin\///'|sed 's/Exec=/#exec\ /'>>~/.xinitrc
    awk '!a[$0]++' ~/.xinitrc>~/.xinitrc1
    mv ~/.xinitrc1 ~/.xinitrc
    z=`cat $temp2`
    b=`cat /usr/share/xsessions/*.desktop|grep ^Exec=|sed 's/\/usr\/bin\///'|sed 's/Exec=/#exec\ /'|sed -n "$z"p`
    c=`cat /usr/share/xsessions/*.desktop|grep ^Exec=|sed 's/\/usr\/bin\///'|sed 's/Exec=/exec\ /'|sed -n "$z"p`
    sed -i "s/^$b$/$c/g" ~/.xinitrc
fi

#提示现在启动X服务器吗?
if dialog --title "Question" --yesno "Start X server now?" 5 25
then
    #恢复到系统默认语言
    #locale=`locale|head -n 1`
    #export LANG=`echo ${locale#*LANG=}`
    #export LANGUAGE=`echo ${locale#*LANG=}`
    #export LC_CTYPE=`echo ${locale#*LANG=}`
    if w="0"
    then
        #如果选择的session不保存到.xinitrc,则先启动startx,然后恢复原始备份好的.xinitrc_bak为.xinitrc
        startx 
        mv -f ~/.xinitrc_bak ~/.xinitrc
    else
        startx
    fi
else
    if w="0"
    then
        #当未保存所选session到.xinitrc之后,就恢复原始备份好的.xinitrc_bak为.xinitrc
        if [ -f ~/.xinitrc_bak ]
        then
            mv -f ~/.xinitrc_bak ~/.xinitrc
        fi
    fi
fi

#删除所有临时文件
rm -f $temp 2> /dev/null
rm -f $temp2 2> /dev/null

大家可以在这里下载脚本,然后放到/usr/bin下并chmod 755 /usr/bin/myde,就可以在tty文本界面里运行它了。

最后来几张myde的截图:

相关博文



以下是网友的5条评论,您赞同吗?

  1. 2016-11-27 23:32

    博主你的文章很不错,很优秀,我很喜欢。如今看到这个文章已经时隔多日了,想问的是:现在还可以用么?
    或者博主考虑,发布新版本哈。谢谢。会持续关注的!

    • 小衲
      2016-11-28 11:13

      应该可以用吧。试试看。不过这个东西就是个玩具,如果不是为了节省一点内存资源,谁还不用DM呢?

      • 221.178.200.*** [ 匿名 ]
        2016-11-28 21:50

        好的,知道了,谢谢

  2. 2015-4-20 13:44

    其实Arch wiki里就有starx的例子啊
    https://wiki.archlinux.org/index.php/Xinitrc#Making_a_DE.2FWM_choice
    后面加上想要启动的环境名称就行

    • 小衲
      2015-4-20 20:30

      你说的这个方法需要手动修改脚本,而且列出的还不是全部可用session,我做这个脚本的目的就是实现自动化。

发表评论

电子邮件地址不会被公开。