待办事项管理脚本兼谈dash里面诡异的local及其他

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
millenniumdark
论坛版主
帖子: 4159
注册时间: 2005-07-02 14:41
系统: Ubuntu 14.04 (Kylin)
送出感谢: 42 次
接收感谢: 9 次
联系:

待办事项管理脚本兼谈dash里面诡异的local及其他

#1

帖子 millenniumdark » 2011-02-15 19:27

基本的想法就是每件todo对应一个文件,事项就是文件名,备注就是文件内容。做完的记录在.done目录里面。

代码:https://gist.github.com/827296

我在dash和mksh下试过,没发现什么大问题。应该还是比较通用的。

======================
用法举例
======================

初始化

ftm init

(默认文件都存在~/.config/ftm下,可以 ftm init /path/your/dir 来制定其他目录)

新增

ftm -a 明天去买牙膏

写备注(调用默认编辑器编辑)

ftm -e 明天去买牙膏

也可以偷懒,尾部省略(要求唯一匹配)

ftm -e 明天

看备注:

ftm -c 明天去买牙膏
要买白人牌的

列出所有todo

ftm -l

列出带“买”字的todo

ftm -l 买

做完了:

ftm -d 明天去买牙膏

支持尾部省略(要求唯一匹配)

ftm -d 明天

或者,ftm -d 标记ftm -l列出的第一项

ftm -n也是显示ftm -l列出的第一项

ftm -s ERE正则表达式

搜索所有todo的备注

其他用法

ftm -h

或者直接看原文件的注释,最详细。

===================
关于这个脚本
===================

没经验,写得乱七八糟的。

语法真是诡异,fi和esac之类的倒觉得还好,我感到奇怪的是函数定义里面 { 和 } 居然是关键词。最要命的是quote和escape,大部分时间都浪费在这上面。

都用了全局变量。其实函数里面应该用local的。但是dash里面的local很诡异,比如下面的例子:

代码: 全选

f() {
  local x=1
  readonly x
  echo $x
}

g() {
  local x=2
  readonly x
  echo $x
}

f
g
f
mksh和bash都输出

代码: 全选

1
2
1
dash就报错。所以为了兼容这个dash,我就全用了全局变量。

顺带一提,ftm init dir可以指定保存的目录,这个数据要记录下来。但我又不想为了这个搞一个配置文件。不知道有什么好办法?

我现在的做法是用sed修改源代码中的变量,类似:

代码: 全选

config_bang() {
    readonly var_pattern="^(readonly $1=).*"
    readonly new_var_pattern=$2
    sed -i -r -e "s:$var_pattern:\1$new_var_pattern:" $0
}
可以工作,但总觉得这样搞不靠谱。
头像
astolia
论坛版主
帖子: 3185
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 537 次

Re: 待办事项管理脚本兼谈dash里面诡异的local及其他

#2

帖子 astolia » 2011-02-15 20:45

local那个应该是dash的bug,而且很可能是readonly的bug。先定一个全局的x,后面再执行fg就不会报错了
另外这样定义也不会报错:local readonly x=1

另外呢,按照这个规范 http://standards.freedesktop.org/basedi ... atest.html
配置文件该放$XDG_CONFIG_HOME/ftm,XDG_CONFIG_HOME没设置才用$HOME/.config/ftm
而所有的todo文件是数据,该放在$XDG_DATA_HOME/ftm或$HOME/.local/share/ftm里

还有就是help()的输出,按照惯例来说,[]里面的参数是可选的,你那个不该加[]
头像
millenniumdark
论坛版主
帖子: 4159
注册时间: 2005-07-02 14:41
系统: Ubuntu 14.04 (Kylin)
送出感谢: 42 次
接收感谢: 9 次
联系:

Re: 待办事项管理脚本兼谈dash里面诡异的local及其他

#3

帖子 millenniumdark » 2011-02-16 19:30

astolia 写了:local那个应该是dash的bug,而且很可能是readonly的bug。先定一个全局的x,后面再执行fg就不会报错了
反正dash的local和readonly碰一起就很诡异。比如下面的例子,定义全局变量也没用:

代码: 全选

x='global'

g() {
  local x
  readonly x=$1
  echo $x
}

f() {
  local x
  readonly x='f'
  g $x
}

f
dash还是报错:

代码: 全选

readonly: 13: x: is read only
另外这样定义也不会报错:local readonly x=1
这样就不readonly了。貌似是定义了两个local变量,一个叫readonly,一个叫x。

代码: 全选

f() {
  local  readonly x='x'
  x='y'
  echo $x
}
f
dash/bash/mksh输出都是y。
所有的todo文件是数据,该放在$XDG_DATA_HOME/ftm或$HOME/.local/share/ftm里
发现我以前没认真看XDG。-_-! 以为放~/.config就可以了。现在看了下,正当做法是先找$XDG_DATA_HOME,没设定的话,默认取~/.local/share。然后建立ftm目录(还要判断ftm是否存在,不存在的话权限设为0700,存在的话不作变动)。好复杂。我还是不赶时髦,用老式的~/.ftm吧。
还有就是help()的输出,按照惯例来说,[]里面的参数是可选的,你那个不该加[]
谢谢指出。其实edit/done什么的都有默认项,但是add确实没有。
回复

回到 “Shell脚本”