最近所做项目的 Linux 下的安装程序要求把为当前所有用户创建桌面启动器,但Linux下不管是GNOME还是KDE,好像都没找到类似Windows一样的所有用户桌面文件夹。另外,还碰到了一个Linux最新发行版本下才可能出现的问题,Ubuntu 7.10下的用户桌面文件夹可以使用本地化语言或自定义(如中文默认使用"桌面"),而安装程序默认是向$HOME/Desktop文件夹创建桌面启动器的。这样,碰到这种情况,使用本地化语言或自定义名称的用户桌面文件夹的用户,将不能够看到安装程序创建的桌面启动器。
Shell脚本在编写过程中,碰到了一点小麻烦,就是从用户$HOME/.config/user-dirs.dirs文件中读取得到用户自定义的桌面文件夹后,却是一个字符串,并没有当变量处理。如DESKTOPDIR=$HOME/桌面,但“$HOME/桌面”被当做普通字符串处理了。后来求助于ChinaUnix论坛,才搞定这个问题,原来还有eval这个用法!这里同时感谢在此问题上给予我帮助的杨兄,谭兄。脚本本身比较简单,用法及解释见其中注释:
# !/bin/sh
# 桌面启动器路径文件名,必选
LAUNCHER=$1
if [ ! -f $1 ] || [ -z $1 ]
then
echo "Desktop launcher file $1 does not exist!"
echo "Usage: $0 <desktop launcher file>"
exit 1
fi
# 获取用户ID
UIDS=`cat /etc/passwd | cut -f3 -d :`
LINE=0
for UUID in $UIDS
do
LINE=`expr $LINE + 1`
# 用户ID 小于500的为系统内置用户
if [ $UUID -ge 500 ]
then
# echo "UID=$UUID"
# 获取用户主目录
HOMEDIR=`sed -n "${LINE}p" /etc/passwd | cut -f 6 -d :`
# echo "HOME=$HOMEDIR"
# 如果用户主目录存在
if [ -d $HOMEDIR ]
then
# 获取用户本地化语言所用桌面目录
DESKTOPDIR=`grep XDG_DESKTOP_DIR $HOMEDIR/.config/user-dirs.dirs | cut -f 2 -d \"`
DESKTOPDIR=`eval echo $DESKTOPDIR`
echo "XDG_DESKTOP_DIR=$DESKTOPDIR"
# 如果获取不成功(桌面目录不存在),则使用默认桌面目录
if [ ! -d $DESKTOPDIR ]
then
DESKTOPDIR=${HOMEDIR}/Desktop
mkdir -p $DESKTOPDIR
fi
echo "DESKTOP=$DESKTOPDIR"
# 复制桌面启动器文件到用户桌面目录
cp $LAUNCHER $DESKTOPDIR
fi
fi
done