|
yaya
银牌会员
积分 1009
发帖 353
注册 2003-9-4
状态 离线
|
『楼 主』:
关于&&用法
请教不点:
cat (hd0,0)/grubhere.id || chainloader (hd0,0) +1
cat (hd0,0)/grubhere.id && map (hd0) (hd1)
cat (hd0,0)/grubhere.id && map (hd1) (hd0)
cat (hd0,0)/grubhere.id && chainloader (hd1,0)
语句本意是当u盘识别为a:时,(hd0,0)/grubhere.id 不存在,执行chainloader +1,
当u盘识别为c:时,(hd0,0)/grubhere.id 存在,执行后3条.
可是程序执行时,提示找不到文件.按任意键又返回了启动菜单.
怎样才能实现这一功能?请赐教!谢谢!
|
|
2008-8-1 16:53 |
|
|
不点
银牌会员
不甘寂寞的人
积分 2491
发帖 1115
注册 2003-9-24
状态 离线
|
『第
2 楼』:
谢谢报告此问题。
grub 中的函数在执行完了之后,有一个出错值 errnum,以及一个返回值。
|| 和 && 操作符不使用 errnum 的值,而使用的是函数的返回值。
当 cat 遇到失败时,errnum 可能也同时设置了,如果执行 || 之后的命令之前没能将 errnum 重置为 0,则整个复合命令的执行结果也将被认为是失败的,于是终止后续的菜单命令的执行。
似乎合理的方案应该在执行 || 之后的命令之前清除 errnum,但是,有时候保留这一 errnum 或许是有用的,所以,我现在还不能肯定是否应该清除 errnum 的值。
作为权宜之计,大家可以配合 errorcheck off 来使用 || 和 && 操作符。很抱歉,给大家带来一些不便,不过今后会解决的。
当使用 errorcheck off 之后,一定要在执行 boot 之前有一条 errorcheck on 来结束 errorcheck off 的指定,否则后续的菜单操作会失败。
errorcheck off
cat (hd0,0)/grubhere.id || chainloader (hd0,0) +1
cat (hd0,0)/grubhere.id && map (hd0) (hd1)
cat (hd0,0)/grubhere.id && map (hd1) (hd0)
cat (hd0,0)/grubhere.id && chainloader (hd1,0)
errorcheck on
|
因为我们亲手创建,这个世界更加美丽。 |
|
2008-8-1 22:37 |
|
|
yaya
银牌会员
积分 1009
发帖 353
注册 2003-9-4
状态 离线
|
『第
3 楼』:
使用
errorcheck off
cat (hd0,0)/grubhere.id || chainloader (hd0,0)+1
cat (hd0,0)/grubhere.id && map (hd0) (hd1)
cat (hd0,0)/grubhere.id && map (hd1) (hd0)
cat (hd0,0)/grubhere.id && chainloader (hd1,0)+1
errorcheck on
后,不再提示找不到文件,但必须修改成
errorcheck off
cat (hd0,0)/grubhere.id || chainloader (hd0,0)/ntldr
......
或者
errorcheck off
find --set-root /ntldr
cat (hd0,0)/grubhere.id || chainloader +1
......
才能正确执行.
使用 cat (hd0,0)/grubhere.id || chainloader (hd0,0)+1 后,光标不停闪烁,死机.
使用grub4dos 2008.8.3版问题依旧.
|
|
2008-8-6 09:18 |
|
|
不点
银牌会员
不甘寂寞的人
积分 2491
发帖 1115
注册 2003-9-24
状态 离线
|
『第
4 楼』:
嗯,其实并不能把所有的问题都归结为 grub4dos 的 bug。
比如说,chainloader (hd0,0)+1 之后能否启动,与你在 (hd0,0)+1 上放置的引导代码有关,如果是微软的,则它的启动失败不是很意外的,因为微软的代码并不特别考虑对 USB 的支持。
根据其他人的报告,今天晚上可能还会发布一个版本,解决相关问题。谢谢支持。
|
因为我们亲手创建,这个世界更加美丽。 |
|
2008-8-6 13:29 |
|
|
yaya
银牌会员
积分 1009
发帖 353
注册 2003-9-4
状态 离线
|
『第
5 楼』:
使用grub4dos 2008.8.10版,不用加errorcheck off和errorcheck on就能正常运行.发现菜单可以循环选择了.
用u盘启动,不论识别为A:或者C:,以下命令都可以启动winxp.
title 启动 Windows NT/2K/XP/2K3
cat (hd0,0)/grubhere.id && map (hd0) (hd1)
cat (hd0,0)/grubhere.id && map (hd1) (hd0)
cat (hd0,0)/grubhere.id && map --hook
find --set-root /ntldr
chainloader /ntldr
grubhere.id 是u盘上的1个空文件.
|
|
2008-8-15 09:45 |
|
|
zw2312914
初级用户
积分 39
发帖 16
注册 2007-2-19
状态 离线
|
『第
6 楼』:
看了楼主的菜单,有个执行效率的小疑问。
你的grubhere.id相当于是个判断u盘的标志文件。你是使用cat来判断的,但 cat 命令实际上是找到并显示文件内容的命令,所以,实际执行效率可能和用 ls 命令来判断相仿。
而 find 命令只判断存在与否,不用再显示文件内容,因此效率可能要高一点。比如:
find (hd0,0)/grubhere.id && map (hd0) (hd1)
|
|
2008-8-15 16:03 |
|
|
不点
银牌会员
不甘寂寞的人
积分 2491
发帖 1115
注册 2003-9-24
状态 离线
|
『第
7 楼』:
root 和 rootnoverify 命令后面不加任何参数,则返回当前磁盘是否为硬盘:如果当前磁盘是软盘,则返回 false;如果当前盘是硬盘,则返回 true。
如果能用上这个,可能会简化一些。不过 cat 也是很好的,因为显示空文件其实也很快。
楼上的 find 命令不行,find 似乎并不适合用作这样的目的。ls 也不太好,因为 ls 有 auto completion 的功能,比如 ls /grldr 能够列出 grldr1, grldr2, grldr.mbr, grldr.tmp 等等,凡是以 grldr 打头的都能列出来。
[ Last edited by 不点 on 2008-8-15 at 05:31 PM ]
|
因为我们亲手创建,这个世界更加美丽。 |
|
2008-8-15 17:26 |
|
|
yaya
银牌会员
积分 1009
发帖 353
注册 2003-9-4
状态 离线
|
『第
8 楼』:
可以使用以下语句,更简化一些。
title 启动 Windows NT/2K/XP/2K3
root && map (hd0) (hd1)
root && map (hd1) (hd0)
root && map --hook
find --set-root /ntldr
chainloader /ntldr
|
|
2008-8-18 10:48 |
|
|