无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: chenall
打印 上一主题 下一主题

grub4dos 外部命令 wenv [2010-10-17 ]

  [复制链接]
751#
发表于 2010-11-10 02:32:28 | 只看该作者
还是转义符的问题,上次发现后我改过了check命令,for命令不熟没怎么动过。手机上的,明天再看看吧。

=============================

#664 是同一个问题
原帖由 tuxw 于 2010-11-2 12:05 发表
...
@chenall
字符串最后一个字符是 \ 出错的问题,是Grub4Dos的一个隐藏BUG。函数 skip_to(0, "string echo ok") 当string 最后一个字符是 \ 时,它返回的指针不是echo而是ok,当在echo前面增加一个空格则正常。
我没有研究过这个内部函数,暂时用一段额外的代码实现这个函数的功能,这样代码比较冗余。你帮忙检查一下skip_to,最好从源头上解决。而且很可能其它引用此函数的地方也存在问题只是现在没有被发现

原帖由 chenall 于 2010-11-2 15:07 发表
@tuxw,zhaohj
字符串最后一个字符是 \ 出错的问题,其实这也不能算BUG.
因为skip碰到字符"\"就跳过下一个字符的检测.

解决办法很简单,对于字符串比较,你可以在字符串前后加引号或其它字符(这也是一个保险 ...



我们调用了Grub4Dos提供的 skip_to 来分析命令行
... set b=\ ; check ...

取 b=\ 时,它将后面的空格跳过了,这样集合命令分隔符就少了一个空格, 这个就变成了一条命令
b 值本应该是:\
现在变成了   :\ ; check ...


这个问题不能像check命令里可以通过前后加额外字符可以避免,是必须要解决的问题
让C大改 skip_to 好象不现实,因为影响的地方太多了,只能在wenv里自己实现一个skip_to函数了

[ 本帖最后由 tuxw 于 2010-11-10 09:12 编辑 ]
回复

使用道具 举报

752#
发表于 2010-11-10 16:28:18 | 只看该作者
我目前只能在;前多加一个空格(即两个空格)来解决这个问题。

有时候要让菜单选择键盘上下键不跳到#2这行,这个菜单中命令要非boot命令,如

#0
title aaaaa
goto 2
kernel

#1
title bbbbb
goto 2
kernel

#2
title
clear && configfile (md)4+8

-------------
变态的用法:
echo #0 > (rd)+1
...
echo #2 >> (rd)+1
echo title >> (rd)+1
echo -n clear & >> (rd)+1
echo  & configfile (md)4+8 >> (rd)+1
以实现把&&写入。

[ 本帖最后由 zhaohj 于 2010-11-10 16:49 编辑 ]
回复

使用道具 举报

753#
发表于 2010-11-10 22:14:49 | 只看该作者
已经解决了skip_to的问题,只是这两天动作比较大,还没整理
回复

使用道具 举报

754#
发表于 2010-11-10 22:24:17 | 只看该作者
慢慢来吧,反正现在不急着用。解决了放心。
回复

使用道具 举报

755#
发表于 2010-11-11 12:03:32 | 只看该作者
trunc_cmd开关没起作用

Snap1.jpg (20.57 KB, 下载次数: 40)

Snap1.jpg
回复

使用道具 举报

756#
发表于 2010-11-11 15:09:55 | 只看该作者
又发现check命令错误

Snap1.jpg (22.47 KB, 下载次数: 48)

Snap1.jpg
回复

使用道具 举报

757#
发表于 2010-11-11 15:19:18 | 只看该作者
trunc_cmd的问题用直观语法试下,便于确定问题在哪

check比较带空格的串要用引号括起来,否则到第一个空格就认为串结束了,即使在前半部分找到结果,也会因为子命令识别错误而出错
回复

使用道具 举报

758#
发表于 2010-11-11 15:43:38 | 只看该作者
原帖由 tuxw 于 2010-11-11 15:19 发表
trunc_cmd的问题用直观语法试下,便于确定问题在哪

check比较带空格的串要用引号括起来,否则到第一个空格就认为串结束了,即使在前半部分找到结果,也会因为子命令识别错误而出错


“check比较带空格的串要用引号括起来” --------可以,这个问题解决。

wenv switch trunc_cmd=on    执行后返回成功,但执行下一语句马上恢复默认了。相当于不起作用。

Snap1.jpg (26.09 KB, 下载次数: 44)

Snap1.jpg
回复

使用道具 举报

759#
发表于 2010-11-11 15:53:55 | 只看该作者
另外:语法 wenv check 字符串<-字符串
经测试,<-前后字符串都要引号,否则结果不对
--------------
我知道了,字符串如果包含空格,一定要用引号

[ 本帖最后由 zhaohj 于 2010-11-11 15:58 编辑 ]
回复

使用道具 举报

760#
发表于 2010-11-11 15:56:44 | 只看该作者
我认为字符串比较,<-前后都用引号比较好,目前的处理是可以的。不过程序是否有BUG需要检查一下。
回复

使用道具 举报

761#
发表于 2010-11-11 15:57:41 | 只看该作者
这个开关设计就是一次性的啊,会在下一个WENV命令之后就复位,所以在状态里看不到它为on的。
这样测试
wenv trunc_cmd=on
cat file | wenv set a=
当file超长时,就会截断
回复

使用道具 举报

762#
发表于 2010-11-11 16:12:01 | 只看该作者
正常时
wenv switch ?????1
之后应该看到01串中开关为1,在下一条wenv起作用后复位

[ 本帖最后由 tuxw 于 2010-11-12 01:12 编辑 ]
回复

使用道具 举报

763#
发表于 2010-11-11 16:16:28 | 只看该作者
问题是还没到下一个WENV就已经关闭了

Snap1.jpg (44.77 KB, 下载次数: 48)

Snap1.jpg
回复

使用道具 举报

764#
发表于 2010-11-11 16:19:07 | 只看该作者
check 比较带空格的串必须要引号,简单串可以不要。这样设计是为了比较整数,如果强制带引号,则
wenv set a=0x10
wenv check 16==${a}
这样的比较会出错

现在这样可以按整数比较,也可以加引号按字符比较
回复

使用道具 举报

765#
发表于 2010-11-11 16:24:05 | 只看该作者
check是还有些问题,我已经解决了带引号串的比较问题,待整理后上传,现在出差了在车上
回复

使用道具 举报

766#
发表于 2010-11-11 16:32:44 | 只看该作者
现在解决了64位的除法问题,除法,求余可以计算真正64位的有效结果,之前是64位结果32位有效值得(其它运算符前面几个版本已经解决了64位有效值问题),为了结构清晰,采用了多文件编译方式,将通用的函数整理成独立模块,为以后写其它外部命令做准备,所以动作较大
回复

使用道具 举报

767#
发表于 2010-11-11 16:35:34 | 只看该作者
这个<-(属于)还是比较有用的,可以简化很多操作。
回复

使用道具 举报

768#
发表于 2010-11-12 00:50:33 | 只看该作者
原帖由 zhaohj 于 2010-11-11 16:16 发表
问题是还没到下一个WENV就已经关闭了


回来测试了下,TRUNC_CMD 开关工作是正常的
Error 28 跟 WENV  无关,这个是Grub4Dos的管道限制了传递参数的长度,具体限制是多大要问一下C大
比如 cat /TXTSETUP.OEM | echo 也会报错的

可以这样测试
WENV switch trunc_cmd=on
cat --locate=[ /TXTSETUP.OEM | WENV set a=
cat输出的结果大于512,但管道仍可传递这个参数。

另,TRUNC_CMD这个开关准备取消(一次性的,设置后用空参数的switch不能查看,跟其它开关不协调容易误解),改为更方便的方式
WENV [-t[=L]] sub-command

WENV -t sub-command     #命令行最大512
WENV -t=L sub-command  #命令行最大 L

[ 本帖最后由 tuxw 于 2010-11-12 00:53 编辑 ]
回复

使用道具 举报

769#
发表于 2010-11-12 08:26:42 | 只看该作者
WENV -t sub-command     #命令行最大512
WENV -t=L sub-command  #命令行最大 L
这样设置很好,可以解决wenv for ..do循环超长问题。
-t参数其他地方已经有了,容易误解,改成-L (length或Limits)比较好理解。

管道限制,我测试下长度(应该是512的倍数)。

-------------
测试结果:管道|输出最大不超过3k(3072字节)
turnc_cmd开关确实是起作用的。

[ 本帖最后由 zhaohj 于 2010-11-12 09:07 编辑 ]
回复

使用道具 举报

770#
 楼主| 发表于 2010-11-12 08:29:50 | 只看该作者
管道传递的参数不可以超过3KB。
回复

使用道具 举报

771#
发表于 2010-11-12 12:16:14 | 只看该作者
建议WENV find 输出时在debug 1状态

也建议C大把cat命令不带参数的也改一下,输出时在debug 1状态
如cat FILE

[ 本帖最后由 zhaohj 于 2010-11-12 12:23 编辑 ]

Snap1.jpg (27.76 KB, 下载次数: 48)

Snap1.jpg
回复

使用道具 举报

772#
发表于 2010-11-12 15:52:17 | 只看该作者
已经在debug 1状态了呀,这个我是观察了cat 是在debug 1下输出的,所以find也放在debug 1输出了
set 等命令是在 debug 2 显示的,放在debug 1 时,输出会混乱,比如 find,屏幕上会多一些额外的字符
回复

使用道具 举报

773#
发表于 2010-11-12 16:23:18 | 只看该作者
我认为这样设计不好,如cat FILE不带参数的,我们的目的是查看文件内容,所以不管在什么状态下应该显示。
WENV find也一样,找到了应该输出结果的,而不管什么状态。象上面的图,如果debug 0下,结果不是错误了吗?!

显示不显示,应该不影响结果。

cat FILE这样设计也是不合理的。

[ 本帖最后由 zhaohj 于 2010-11-12 16:29 编辑 ]
回复

使用道具 举报

774#
 楼主| 发表于 2010-11-12 16:33:12 | 只看该作者
@zhaohj
关于这一点有许多不合理的地方,只是用习惯了,呵呵,一直都没有改。嗯,慢慢改吧。
回复

使用道具 举报

775#
发表于 2010-11-12 16:33:49 | 只看该作者
1.解决了64位除法问题,calc命令除法和求余操作能计算完全的64位有效值

2.check -e 参数支持操作符两边的串都可转义

3.check 可比较含引号的字符串,及解决最后一个字符是\的问题
引号的问题比较纠结,它既可能是字符串界定符,也可能是普通字符
现在的规则是只有第一字符是引号时,才作为界定符,并必须找对配对的引号
  所以 check abc"123\ == abc"123\ 这样的串可以直接比较
  
在查找配对引号时,忽略 \",不将它当作界定符
  WENV set a=abc" 123,  这个含有空格,必须用引号括起来
  WENV check "abc\" 123 == "${a!"=\"}" 返回真
  
但这样又将已经解决的最后字符是\的问题给绕回来了
     WENV set a=ab c\,  这个含有空格,必须用引号括起来
  WENV set "ab c\" == "${a}"   这个会出错

对含有引号、含有空格、最后字符还可能是\的串比较时尤其麻烦
  WENV set  a=ab" c\
  WENV set "[ab\" c\]" == "[${a!"\"}]",中间的"换成\"避免早退界定符混淆
  先用 [] 最后字符可能是\的问题,再用引号允许空格

   新的问题是在含引号、空格的串中查找\,不能去找到 " 替换出来的 \"
   WENV set -e "\\" <- "[${a!"\"}]"
   通过 -e 参数再将 \" 换回去

  总之,太纠结了,还有待改善。规则可以慢慢改,主要是测试skip_to的问题,这个函数用的地方太多了,改过后有可能有漏处理的地方。

4.set 命令增加 -e -x -q -tq 参数
-q  参数前切首尾空字符后,同时剪切首尾第一个引号
-tq 将引号当成空字符,再剪切首尾空字符
    这两个参数不是很常用,但特殊情况会有用,最好不要与 -x 同时使用,没做针对性处理,可能会与预期不符
   

-x[=delims[,N]] 将字符串以 delims 为分隔符分割成多段,取第N段(N从0开始)
  delims 默认是空格,N 默认 0

   

5.WENV 添加全局参数 -x (在子命令前)截短命令行(取消 TRUNC_CMD 开关)
WENV [-x[=L]] sub-command
  L 默认512,最大1024(命令行缓存为1024,过长会退出)
  这个只是简单截短命令行,如果命令行是变量,变量展开后超出512仍然失败
  而且 L 还包含子命令所占的字符数

  (不喜欢 -l,不好看,容易跟 1,i 搞混,跟set一样用了 -x,剪刀,从某个地方剪断)

cat --locate=[ /TXTSETUP.TXT | echo | WENV -x set -x a=0x
可以直接到得第一个偏移量0x12,中间用echo中转是为了消除 cat 输出的前导空格

[ 本帖最后由 tuxw 于 2010-11-12 16:54 编辑 ]

wenv-tuxw-2010-11-12.zip

51.92 KB, 下载次数: 20, 下载积分: 无忧币 -2

回复

使用道具 举报

776#
发表于 2010-11-12 17:41:48 | 只看该作者
哇,看起来有点晕晕的,呵呵,记忆会失灵。
晚上测试一下。
回复

使用道具 举报

777#
发表于 2010-11-12 18:06:27 | 只看该作者
check可能还要修改的,主要是比较含空格的串带来的问题,到底有没有必要保留这一特性?
回复

使用道具 举报

778#
发表于 2010-11-12 22:07:59 | 只看该作者
含空格的串一般用引号引起来没问题,不用考虑太复杂的。
我认为不用考虑引号在字符串当中的问题,C大原来这样考虑及你的开关就够了。
"\"的问题比较重要。
字符串比较,一般应用不会太复杂。
回复

使用道具 举报

779#
发表于 2010-11-13 08:20:02 | 只看该作者
如果不考虑引号中含引号,就简单得多了

原帖由 zhaohj 于 2010-11-12 12:16 发表
建议WENV find 输出时在debug 1状态

也建议C大把cat命令不带参数的也改一下,输出时在debug 1状态
如cat FILE


debug 0
wenv find .inf (rd)+1 | wenv set a=

这个用法应该改成
wenv find .inf (rd)+1 && wenv set a=${?_WENV}
这样不受debug状态影响,能够不用管道解决的时候就不要用管道

[ 本帖最后由 tuxw 于 2010-11-13 09:12 编辑 ]
回复

使用道具 举报

780#
发表于 2010-11-13 16:38:02 | 只看该作者
11-12号的版本替换11-9版本后,我发布的SRSF6没法通过。
这次改动与前一版本不兼容,不知原来的参数改动了哪些?

是否能在11-9版本基础上,改良“\"问题。功能增加不要影响原来的参数。
TRUNC_CMD开关我也没有使用,与这个无关。

[ 本帖最后由 zhaohj 于 2010-11-13 16:50 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-1 13:06

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表