+ -
当前位置:首页 → 问答吧 → shell script无法执行

shell script无法执行

时间:2011-01-24

来源:互联网

来看论坛也有一段时间了,问了些问题,得到大家的支持,无论能否帮到我,我都感谢大家。
现在我也发些自己探索的成果,同大家分享。水平有限,多多包涵。

以下脚本在ubuntu10.x 64bit gnome下测试通过。因为光盘与U盘在ubuntu10.x中都是自动检测并且自动挂载的,所以就不对其进行处理了。

make_fstab()
{
echo "aa" | sudo -S ls * > /dev/null #因为相关操作要su,所以先拿到到sudo的密码
reset

mounted=$(mount | grep /dev/sd | cut -f 1 -d ' ') #查看当前已经挂载了哪些分区(至少有/对应的分区)

[ -e "/dev/shm/tmp_mnt" ] || mkdir /dev/shm/tmp_mnt #/dev/shm在我的ubuntu中是tmpfs,可以减少读写磁盘。这个目录主要是临时挂载ext用的
for dev_name in $(ls /dev/sd??); #查找分区(但不包括硬盘设备,如/dev/sda,/dev/sdb)
do
dev_type=$(mount --guess-fstype ${dev_name}) #判断文件系统类型
echo -n $dev_name \(${dev_type}\) '' #将分区和文件系统打印出来

if [ -n "$(echo $mounted | grep ${dev_name})" ]; then #如果已挂载的话,打印 already mounted
echo is already mounted
else #否则按其文件系统类型进行挂载,挂载点取其卷标,与Nautilus行为保持一致
case "$dev_type" in
ntfs)
label=$(echo "aa" | sudo -S ntfslabel ${dev_name})
;;
ext?) #因为我无法取得未挂载的ext2/3/4的卷标,所以先将其在一个内存文件夹中只读挂载,拿到卷标后再卸载
echo "aa" | sudo -S mount -t $dev_type -o ro $dev_name /dev/shm/tmp_mnt
label=$(echo "aa" | sudo -S e2label ${dev_name})
echo "aa" | sudo -S umount $dev_name
;;
*) #其它我未试过(resierfs我试过,要安装相关组件才能取其卷标)
echo not support
continue
;;
esac

#正式挂载分区到“/media/卷标”中。这里只是简单批定了一个-o rw参数,以读/写方式挂载。
echo "aa" | sudo -S mkdir -p /media/${label}
echo "aa" | sudo -S mount -t $dev_type -o rw $dev_name /media/${label}
echo is mounted to /media/${label}
fi
done;

[ -e "/dev/shm/tmp_mnt" ] && rmdir /dev/shm/tmp_mnt #删除临时文件夹(不删也可,关机后自动消失的)

echo -n Will quit in 10s
sleep 10
}

make_fstab()

最后我保存成一个.sh文件,对其chmod a+x。开机进入桌面后,双击它运行即可。
我曾试过把代码或.sh文件的调用放在/etc/rc.local中,但不会开机自动执行,也试过把其放在启动程序(Startup App)中,10.04可以开机自动执行,但10.10也不能开机自动执行。

作者: urcllr   发布时间: 2011-01-24

注:
echo "aa" | sudo -S …… 里面的"aa"是sudo时要输入的密码。这句是自动输入密码,不用执行时再手工输入。
如果执行后Nautilus中分区消失,多数是此分区被挂到“/media/”下,用umount取消挂载即可。

作者: urcllr   发布时间: 2011-01-24