更多精彩请到 http://www.139ya.com
Winxp下 gvim 编程环境搭建 : http://blog.csdn.net/minico/archive/2007/12/15/1938050.aspx
Wednesday, May 27, 2009
Winxp下 gvim 编程环境搭建
更多精彩请到 http://www.139ya.com
1.官方网站下载最新的gvim7.1 win32,然后选择完全安装;我是安装在d:\vim目录下面,安装后的目录结构如下:
D:\VIM
├─vim71
│ ├─autoload
│ ├─colors
│ ├─compiler
│ ├─doc
│ ├─ftplugin
│ ├─indent
│ ├─keymap
│ ├─lang
│ ├─macros
│ ├─plugin
│ ├─spell
│ ├─syntax
│ ├─tools
│ └─tutor
└─vimfiles
├─after
├─autoload
├─colors
├─compiler
├─doc
├─ftdetect
├─ftplugin
├─indent
├─keymap
├─plugin
└─syntax
2.安装常用插件:
vimdoc http://vcd.gro.clinux.org (中文)
安装 直接安装即可,安装时会自动搜索到vim的安装位置,然后安装到相应的目录
使用 :h
说明 中文帮助文档
taglist http://www.vim.org/scripts/script.php?script_id=273
安装 解压到vim71目录下面
使用 :Tlist
说明 需要Ctags产生的tags文件配合
WinManager http://www.vim.org/scripts/script.php?script_id=95
安装 解压到vim71目录下面
使用 wm,这个命令是通过在_vimrc中配置后才能有,具体配置见后面的_vimrc文件
说明 此插件的作用是将TagList窗口和netrw窗口整合起来
Ctags http://ctags.sourceforge.net
安装 解压到vim71目录下面
使用 ctags -R --c++-kinds=+p --fields=+iaS --extra=+q src
在对C++文件进行补全时,OmniCppComplete插件需要在标签文件中包含C++的额外信息,因此上面的ctags命令不同于以前我们所使用的,它专门为C++语言生成一些额外的信息.
说明 其实只是一个ctags.exe文件,用来产生tags文件供其它插件使用
MiniBufExplorer http://www.vim.org/scripts/script.php?script_id=159
安装 将minibufexpl.vim放 到vim71/plugin 文件夹中即可;
使用 打开多个文件后,自动在顶端出现文件标签,双击鼠标或者Ctrl+tab键可以切换文件;
说明
grep http://www.vim.org/scripts/script.php?script_id=311
安装 将grep.vim放 到vim71/plugin 文件夹中即可;
使用 安装后会在菜单=》工具中增加search子菜单,也可以用命令:grep或者按照后面给出的_vimrc文件映射快捷键F3
说明 需要windows版本的grep.exe程序配合;
到http://unxutils.sourceforge.net/下载unxutils工具包里面包含grep.exe,把grep.exe放到系统c:\windows\system32下面即可。
omnicppcomplete http://www.vim.org/scripts/script.php?script_id=1520
安装 解压到vimfiles目录下面;
使用 配合后面的supertab插件,使用Tab键进行自动完成;
说明 如果要对c++文件进行自动完成,需要生成tag文件时用特殊的选项,见后面的_vimrc配置文件
a http://www.vim.org/scripts/script.php?script_id=31
安装 将a.vim放 到vim71/plugin 文件夹中即可;
使用 :A
说明 在源文件和头文件之间进行切换
Supertab http://www.vim.org/scripts/script.php?script_id=1643
安装 将supertab.vim放 到vim71/plugin 文件夹中即可;
使用 配合前面的omnicppcomplete插件,使用Tab键进行自动完成;
说明
NERD_commenter http://www.vim.org/scripts/script.php?script_id=1218
安装 解压到vim71目录下面
使用 http://xiaobo.spaces.live.com/blog/cns!5ec21dee9b73c1a8!814.entry
说明
lookupfile http://www.vim.org/scripts/script.php?script_id=1581
安装 解压到vimfiles目录下面;
使用 根据后面的_vimrc配置文件,使用F5键打开搜索窗口;Tab键进行选择
说明 依赖于插件genutils
genutils http://www.vim.org/scripts/script.php?script_id=197
安装 解压到vimfiles目录下面;
使用 这个插件提供了一些通用的函数,可供其它的脚本使用
说明 供lookupfile插件使用
clearcase http://p.blog.csdn.net/images/p_blog_csdn_net/minico/EntryImages/20081123/gvim.JPG
安装 解压到vimfiles目录下面;
使用 这个插件提供一些常用的clearcase命令
说明 无
3._vimrc配置文件
set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin
set diffexpr=MyDiff()
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let eq = ''
if $VIMRUNTIME =~ ' '
if &sh =~ '\ let cmd = '""' . $VIMRUNTIME . '\diff"'
let eq = '"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
" Add by minico---begin
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
"设置帮助语言
set helplang=cn,en
"把gui的工具栏去掉(要去掉,把等号前面的加号变成一个减号即可)
set guioptions+=T
"把gui的右边的滑动条去掉
set guioptions+=r
"把gui的左边的滑动条去掉
set guioptions-=L
"把gui的菜单去掉
set guioptions+=m
filetype on
let Tlist_Show_Menu = 1
" 这项必须设定,否则出错,配置taglist的ctags路径
"let Tlist_Ctags_Cmd = 'D:\Vim\vim71\ctags.exe'
"设置Taglist
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
" 使用F8打开Taglist
nnoremap :TlistToggle
"设置窗口大小和位置
set lines=80
set columns=200
winpos 0 0
"设置tags文件路径
set tags=G:\lwip\tags
"设置文件浏览器窗口显示方式
"通过WinManager插件来将TagList窗口和netrw窗口整合起来
let g:winManagerWindowLayout='FileExplorer|TagList'
nmap wm :WMToggle
"设置SuperTab,用tab键打开cppcomplet的自动补全功能。
let g:SuperTabRetainCompletionType=2
let g:SuperTabDefaultCompletionType=""
"显示行号
set number
"打开语法高亮显示功能
syntax enable
syntax on
"设置主题颜色
colorscheme desert
"则可以用切换到上下左右的窗口中去
let g:miniBufExplMapWindowNavVim = 1
"按F12时在一个新的buffer中打开c\h文件
nnoremap :A
"用F3调用grep查找当前光标所在处的字符串
nnoremap :Grep
"为了使用智能补全,打开文件类型检测,关闭VI兼容模式
filetype plugin indent on
set nocp
"关掉智能补全时的预览窗口,这样可以防止闪屏现象
set completeopt=longest,menu
"====================Lookupfile 相关设置========================================
let g:LookupFile_MinPatLength = 2 "最少输入2个字符才开始查找
let g:LookupFile_PreserveLastPattern = 0 "不保存上次查找的字符串
let g:LookupFile_PreservePatternHistory = 1 "保存查找历史
let g:LookupFile_AlwaysAcceptFirst = 1 "回车打开第一个匹配项目
let g:LookupFile_AllowNewFiles = 0 "不允许创建不存在的文件
if filereadable("./filenametags") "设置tag文件的名字
let g:LookupFile_TagExpr = '"./filenametags"'
endif
"nmap lk LookupFile "映射LookupFile为,lk
"nmap ll :LUBufs "映射LUBufs为,ll
"nmap lw :LUWalk "映射LUWalk为,lw
"有了上面的定义,当我输入”,lk”时,就会在tag文件中查找指定的文件名;
"当输入”,ll”时,就会在当前已打开的buffer中查找指定名字的buffer;
"当输入”,lw”时,就会在指定目录结构中查找。
"在用lookupfile插件查找文件时,是区分文件名的大小写的,
"如果想进行忽略大小写的匹配,把下面这段代码加入你的vimrc中,
"就可以每次在查找文件时都忽略大小写查找了:
" lookup file with ignore case
function! LookupFile_IgnoreCaseFunc(pattern)
let _tags = &tags
try
let &tags = eval(g:LookupFile_TagExpr)
let newpattern = '\c' . a:pattern
let tags = taglist(newpattern)
catch
echohl ErrorMsg | echo "Exception: " . v:exception | echohl NONE
return ""
finally
let &tags = _tags
endtry
" Show the matches for what is typed so far.
let files = map(tags, 'v:val["filename"]')
return files
endfunction
let g:LookupFile_LookupFunc = 'LookupFile_IgnoreCaseFunc'
"====================Lookupfile 相关设置 end========================================
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
" Add by minico---end
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.官方网站下载最新的gvim7.1 win32,然后选择完全安装;我是安装在d:\vim目录下面,安装后的目录结构如下:
D:\VIM
├─vim71
│ ├─autoload
│ ├─colors
│ ├─compiler
│ ├─doc
│ ├─ftplugin
│ ├─indent
│ ├─keymap
│ ├─lang
│ ├─macros
│ ├─plugin
│ ├─spell
│ ├─syntax
│ ├─tools
│ └─tutor
└─vimfiles
├─after
├─autoload
├─colors
├─compiler
├─doc
├─ftdetect
├─ftplugin
├─indent
├─keymap
├─plugin
└─syntax
2.安装常用插件:
vimdoc http://vcd.gro.clinux.org (中文)
安装 直接安装即可,安装时会自动搜索到vim的安装位置,然后安装到相应的目录
使用 :h
说明 中文帮助文档
taglist http://www.vim.org/scripts/script.php?script_id=273
安装 解压到vim71目录下面
使用 :Tlist
说明 需要Ctags产生的tags文件配合
WinManager http://www.vim.org/scripts/script.php?script_id=95
安装 解压到vim71目录下面
使用 wm,这个命令是通过在_vimrc中配置后才能有,具体配置见后面的_vimrc文件
说明 此插件的作用是将TagList窗口和netrw窗口整合起来
Ctags http://ctags.sourceforge.net
安装 解压到vim71目录下面
使用 ctags -R --c++-kinds=+p --fields=+iaS --extra=+q src
在对C++文件进行补全时,OmniCppComplete插件需要在标签文件中包含C++的额外信息,因此上面的ctags命令不同于以前我们所使用的,它专门为C++语言生成一些额外的信息.
说明 其实只是一个ctags.exe文件,用来产生tags文件供其它插件使用
MiniBufExplorer http://www.vim.org/scripts/script.php?script_id=159
安装 将minibufexpl.vim放 到vim71/plugin 文件夹中即可;
使用 打开多个文件后,自动在顶端出现文件标签,双击鼠标或者Ctrl+tab键可以切换文件;
说明
grep http://www.vim.org/scripts/script.php?script_id=311
安装 将grep.vim放 到vim71/plugin 文件夹中即可;
使用 安装后会在菜单=》工具中增加search子菜单,也可以用命令:grep或者按照后面给出的_vimrc文件映射快捷键F3
说明 需要windows版本的grep.exe程序配合;
到http://unxutils.sourceforge.net/下载unxutils工具包里面包含grep.exe,把grep.exe放到系统c:\windows\system32下面即可。
omnicppcomplete http://www.vim.org/scripts/script.php?script_id=1520
安装 解压到vimfiles目录下面;
使用 配合后面的supertab插件,使用Tab键进行自动完成;
说明 如果要对c++文件进行自动完成,需要生成tag文件时用特殊的选项,见后面的_vimrc配置文件
a http://www.vim.org/scripts/script.php?script_id=31
安装 将a.vim放 到vim71/plugin 文件夹中即可;
使用 :A
说明 在源文件和头文件之间进行切换
Supertab http://www.vim.org/scripts/script.php?script_id=1643
安装 将supertab.vim放 到vim71/plugin 文件夹中即可;
使用 配合前面的omnicppcomplete插件,使用Tab键进行自动完成;
说明
NERD_commenter http://www.vim.org/scripts/script.php?script_id=1218
安装 解压到vim71目录下面
使用 http://xiaobo.spaces.live.com/blog/cns!5ec21dee9b73c1a8!814.entry
说明
lookupfile http://www.vim.org/scripts/script.php?script_id=1581
安装 解压到vimfiles目录下面;
使用 根据后面的_vimrc配置文件,使用F5键打开搜索窗口;Tab键进行选择
说明 依赖于插件genutils
genutils http://www.vim.org/scripts/script.php?script_id=197
安装 解压到vimfiles目录下面;
使用 这个插件提供了一些通用的函数,可供其它的脚本使用
说明 供lookupfile插件使用
clearcase http://p.blog.csdn.net/images/p_blog_csdn_net/minico/EntryImages/20081123/gvim.JPG
安装 解压到vimfiles目录下面;
使用 这个插件提供一些常用的clearcase命令
说明 无
3._vimrc配置文件
set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin
set diffexpr=MyDiff()
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let eq = ''
if $VIMRUNTIME =~ ' '
if &sh =~ '\
let eq = '"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
" Add by minico---begin
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
"设置帮助语言
set helplang=cn,en
"把gui的工具栏去掉(要去掉,把等号前面的加号变成一个减号即可)
set guioptions+=T
"把gui的右边的滑动条去掉
set guioptions+=r
"把gui的左边的滑动条去掉
set guioptions-=L
"把gui的菜单去掉
set guioptions+=m
filetype on
let Tlist_Show_Menu = 1
" 这项必须设定,否则出错,配置taglist的ctags路径
"let Tlist_Ctags_Cmd = 'D:\Vim\vim71\ctags.exe'
"设置Taglist
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
" 使用F8打开Taglist
nnoremap
"设置窗口大小和位置
set lines=80
set columns=200
winpos 0 0
"设置tags文件路径
set tags=G:\lwip\tags
"设置文件浏览器窗口显示方式
"通过WinManager插件来将TagList窗口和netrw窗口整合起来
let g:winManagerWindowLayout='FileExplorer|TagList'
nmap wm :WMToggle
"设置SuperTab,用tab键打开cppcomplet的自动补全功能。
let g:SuperTabRetainCompletionType=2
let g:SuperTabDefaultCompletionType="
"显示行号
set number
"打开语法高亮显示功能
syntax enable
syntax on
"设置主题颜色
colorscheme desert
"则可以用
let g:miniBufExplMapWindowNavVim = 1
"按F12时在一个新的buffer中打开c\h文件
nnoremap
"用F3调用grep查找当前光标所在处的字符串
nnoremap
"为了使用智能补全,打开文件类型检测,关闭VI兼容模式
filetype plugin indent on
set nocp
"关掉智能补全时的预览窗口,这样可以防止闪屏现象
set completeopt=longest,menu
"====================Lookupfile 相关设置========================================
let g:LookupFile_MinPatLength = 2 "最少输入2个字符才开始查找
let g:LookupFile_PreserveLastPattern = 0 "不保存上次查找的字符串
let g:LookupFile_PreservePatternHistory = 1 "保存查找历史
let g:LookupFile_AlwaysAcceptFirst = 1 "回车打开第一个匹配项目
let g:LookupFile_AllowNewFiles = 0 "不允许创建不存在的文件
if filereadable("./filenametags") "设置tag文件的名字
let g:LookupFile_TagExpr = '"./filenametags"'
endif
"nmap
"nmap
"nmap
"有了上面的定义,当我输入”,lk”时,就会在tag文件中查找指定的文件名;
"当输入”,ll”时,就会在当前已打开的buffer中查找指定名字的buffer;
"当输入”,lw”时,就会在指定目录结构中查找。
"在用lookupfile插件查找文件时,是区分文件名的大小写的,
"如果想进行忽略大小写的匹配,把下面这段代码加入你的vimrc中,
"就可以每次在查找文件时都忽略大小写查找了:
" lookup file with ignore case
function! LookupFile_IgnoreCaseFunc(pattern)
let _tags = &tags
try
let &tags = eval(g:LookupFile_TagExpr)
let newpattern = '\c' . a:pattern
let tags = taglist(newpattern)
catch
echohl ErrorMsg | echo "Exception: " . v:exception | echohl NONE
return ""
finally
let &tags = _tags
endtry
" Show the matches for what is typed so far.
let files = map(tags, 'v:val["filename"]')
return files
endfunction
let g:LookupFile_LookupFunc = 'LookupFile_IgnoreCaseFunc'
"====================Lookupfile 相关设置 end========================================
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
" Add by minico---end
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Labels:
vi
在Eclipse中使用Gvim
更多精彩请到 http://www.139ya.com
在Eclipse中使用Gvim : http://ganzhi.blogspot.com/2007/03/vimeclipse.html
Working Directory : ${project_loc}
Arguments : ${resource_loc} 或如下设置
Refresh: The selected resource
命令参数可以这样设置:
-p --remote-tab-silent ${resource_loc}
这是打开一个新的标签页,而不是一个新的vim进程。
在Eclipse中使用Gvim : http://ganzhi.blogspot.com/2007/03/vimeclipse.html
Working Directory : ${project_loc}
Arguments : ${resource_loc} 或如下设置
Refresh: The selected resource
命令参数可以这样设置:
-p --remote-tab-silent ${resource_loc}
这是打开一个新的标签页,而不是一个新的vim进程。
Labels:
eclipse
Tuesday, May 26, 2009
不得不转的ksh 学习
更多精彩请到 http://www.139ya.com
转自 : http://blog.chinaunix.net/u1/56521/showart_1094921.html
Korn Shell
1.语法
特殊的文件
/etc/profile 在登录时首先自动执行。
$HOME/.profile 在登录时第二个自动执行。
$ENV 在创建一个新的KShell时指定要读的一个文件。
文件名元字符
* 匹配有零或零个以上字符的字符串
? 匹配任何单个字符
[abc…] 匹配括号内任何一个字符,也可用连字符指定一个范围(例如,a-z,A-Z,0-9)
[!abc…] 匹配任何不包括在括号内的字符
?(pattern) 匹配模式的零个或一个实例
*(pattern) 匹配指定模式的零个或多个实例
+(pattern) 匹配指定模式的一个或多个实例
@(pattern) 只匹配指定模式的一个实例
!(pattern) 匹配任何不匹配模式的字符串
\n 匹配与(…)中的第n个子模式匹配的文本。
~ 当前用户的主目录
~name 用户name的主目录
这个模式pattern可能是由分隔符“|”或“&”分隔的模式的序列,
例:pr !(*.o|core) | lp
引用
; 命令分隔符
& 后台执行
( ) 命令分组
| 管道
<> & 重定向符号
* ? [ ] ~ + - @ ! 文件名元字符
““ 中间的字符会逐字引用,除了`` 替换命令和$ 替换变量.
‘’ 中间的所有字符都会逐字引用
\ 在其后的字符会按其原来的意义逐字采用.如在””中使用 \”,\`,\$
\a 警告,\b退格,\f 换页,\n 换行,\r 回车,\ 制表符,\v 垂直制表符,
\nnn 八进制值,\xnn 十六进制值,\’ 单引号,\” 双引号,\\ 反斜线,
`` 命令的替换
$ 变量的替换
命令形式
Cmd & 在后台执行
Cmd1;cmd2 命令序列,依次执行
{cmd1;cmd2;} 将命令做为一组来执行
(cmd1;cmd2) 在子shell中,将命令做为一组执行
Cmd1|cmd2 管道;将cmd1的输出作为cmd2的输入
Cmd1 `cmd2` 命令替换;用cmd2的输出作为cmd1的参数
Cmd1$(cmd2) 命令替换,可以嵌套
Cmd$((expression)) 运算替换。用表达式结果作为参数
Cmd1&&cmd2 逻辑与。如果cmd1成功才执行cmd2
Cmd1||cmd2 逻辑或。如果cmd1成功则不会执行cmd2
重定向形式
文件描述符:
0 标准输入 stdin 默认为键盘
1 标准输出 stdout
2 标准错误 stderr
Cmd > file 将cmd的结果输出到file(覆盖)
Cmd >> file 将cmd的结果输出到file(追加)
Cmd < file 从file中获取cmd 的输入
Cmd << text 将shell脚本的内容(直到遇见一个和text一样的标记为止)作为cmd的输入
Cmd <> file 在标准输入上打开文件以便读写
Cmd >&n 将输出发送到文件描述符n。ll >&1
Cmd m>&n 将本来输出的m中的内容转发到n中。Ll 3>&2
Cmd >&- 关闭标准输出
Cmd <&n 获取输入
Cmd m<&n
Cmd <&- 关闭标准输入
在文件描述符和一个重定向符号间不允许有空格。
Cmd 2>file 将标准错误发到file中
Cmd > file 2>&1 将标准错误和标准输出都发到file
Cmd > f1 2>f2 将标准输出发到f1,标准错误发到f2
Cmd | tee files 将输出发送到标准输出和files中
Cmd 2>&1 | tee files 将输出和错误同时发到标准输出和files中
2.变量
变量替换
下列表达式中不允许使用空格。冒号是可选的,如果用冒号那么变量必须是非空的并设置了初始值。
Var=value… 将变量var 设为value
${var} 使用变量var的值;如果变量和其后面的文本是分开的则可以不加大括号。
${var:-value} 如果变量var已设置则使用它,否则使用值value
${var:=value} 如果变量var已设置则使用它,否则使用值value并将value赋给变量var
${var:+value} 如果变量var已设置则使用value,否则什么也不使用
例:echo ${u-$d};echo ${tmp-`date`}如果没设tmp,则执行date;
内置变量
$# 命令行参数的个数
$? 上一条命令执行后返回的值
$$ 当前进程的进程号(PID), 通常用于在shell脚本中创建临时文件的名称
$0 第一个参数即命令名
$n 命令行上的第n个参数
$* 将命令行上所有参数作为一个字符串
$@ 命令行上所有参数,但每个参数都被引号引起来
LINENO 脚本或函数内正在执行的命令的行号
OLDPWD 前一个工作目录(由CD设置)
PPID 当前SHELL的父进程的进程号
PWD 当前工作目录(由CD设置)
RANDOM[=n] 每次引用时产生一个随机数,如果给定n则以整数n开始
SECONDS 这个整型变量的值是指从这个shell会话启动算起所过去的秒数。但它更有用的是用脚本中的计时。
例:start=$SECONDS
read answer
finish=$SECONDS
TMOUT 如果设置了该变量,则在没有输入的情况下经过TMOUT变量所指定的秒数后,shell退出。值为0时无效。
CDPATH
允许用户使用简单文件名作为CD的参数,从而快速改变目录。设置方法与PATH类似,通常在启动文件中设置。如果CD的参数是一个绝对路径,则不会查询CDPATH.
例:CDPATH=:/u1/nr:/u1/progs:
export CDPATH
cd nr
就会进到nr中去。
注意:变量必须大写,定义后必须导出.
数组
Kshell支持一维数组,最多支持1024个元素。第一个元素为0。
Set –A name value0 value1 …
声明数组,指定的值就成为name的元素。
${name[i]} i为0至1023的值,可以是表达式。返回数组元素i
${name} 返回数组元素0
${name[*]},${name[@]} 返回所有元素
下标[*]和[@]都可以提取整个数组的内容。但当它们在引号中使用时其行为是不同的。使用@可生成一个数组,这个数组是原始数组的副本,而使用*,则生成的仅仅是具有单一元素的数组(或者是一个普通变量)。
例:set -A a "${names[*]}"
set -A b "${names[@]}"
set|head -5
a[0]='alex helen jenny scott'
b[0]=alex
b[1]=helen
b[2]=jenny
b[3]=scott
${#name[*]} 返回数组元素个数
运算符
Kshell使用C语言中的运算符。
+ 加;- 减;! 逻辑非;~ 按进制取反;* 乘;/ 除;% 求余;<< 左移;>> 右移;<= 小于等于;>= 大于等于;< 小于;
> 大于;== 相等;!= 不等;&& 逻辑与;|| 逻辑或;
3.内置命令
# 注释后面的一行
Break [n] 从for while select until循环中退出或从n次循环中退出
Case value in
Pattern1) cmds1;;
Pattern2) cmds2;;
…
…
Esac
类似于select case.例:
Case $1 in
No|yea) response=1
break;;
-[tT]) table=TRUE;;
*) echo “unknown option”;exit 1;;
Esac
Continue [n] 在for while select until循环中跳过余下的命令,继续下一次循环(或跳过n次循环)
Eval args args是一行包含shell变量的代码.eval首先进行变量扩展,并且运行由此产生的命令。在shell变量包括了重定向符号,别名或其他变量时是有用的。
例:
For option
Do
Case “$option” in
Save) out=’ > $newfile’;;
Show) out=’ | more’;;
Esac
Done
Eval sort $file $out
Exit [n] 退出脚本,退出状态为n.
Export [name=[value]…]
定义全局变量,让其它shell脚本也可以使用。无参数时输出当前定义的全局变量。
For x [in list]
Do
Commands
Done
使变量x(在可选的值列表中)执行commands,省略时假定为”$@”位置参数
例:
For item in `cat program_list`
Do
Grep –c “$item.[co]” chap*
Done
Function name{commands;} 定义一个函数
If condition1
Then commands1
[elif condition2
Then commands2]
…
…
[else commands3]
Fi
条件执行语句。
Let expressions 执行一个或多个表达式。表达式中的变量前不必有$.如果表达式中包含了空格或其他特殊字符,则必须引起来。
例:let “I = I + 1” 或 let i=i+1
Read [var1[?string]] [var2 …] 从标准输入读入一行给相应的变量,并把剩余的单词给最后一个变量。String为相应的提示信息.无参时只等待一次输入。
Readonly [var1[=value] var2[=value] …] 设置只读变量,无参时显示所有只读变量
Return [n] 用于一个函数里面返回状态
repeat word
do
commands
done
指定一个命令序列执行的次数。
例:
repeat 3
do
echo "bye"
done
Select x [in list]
Do
Commands
Done
显示一列按list中顺序编号的菜单项。让用户键入行号选择或按return重新显示。
例:
Ps3=”select thd item number:”
Select event in format page view exit
Do
Case “event” in
Format) nroff $file | lp;;
Page) pr $file | lp;;
View) more $file;;
Exit) exit 0;;
*) echo “invalid selection”;;
Esac
Done
输出为:
1. format
2. page
3. view
4. exit
select the item number:
set [options arg1 arg2 …] 无参时输出所有已知变量的值。
Shift [n] 交换位置参数(如将$2变为$1).如果给出n,则向左移动n个位置。通常用于在while循环中迭代命令行参数。N可以是一个整数表达式。
Sleep [n] 睡眠n秒钟
Test condition 或[ condition ] 判断条件,为真返回0,否则返回非0.
文件:
-a filename 如果该文件存在而为真
-d filename 如果该文件存在且为一个目录,则为真
-f filename 如果该文件存在且为一个常规文件,则为真
-L filename 如果该文件存在且为一个符号链接,为真
-r filename 如果该文件存在且用户对其有读取权限,真
-s filename 如果该文件存在且包含信息(大于0字节),真
-w filename 如果该文件存在且对其有写入权,真
-x filename 如果该文件存在且对其有执行权,真
File1 -nt file2 如果file1存在且在file2后修改则值为真(指修改时间)
File1 -ot file2 如果file1存在且在file2前修改则值为真(指修改时间)
字符串:
string 如果string不为空字符串则值为真
-n string 如果string字符长度大于0则值为真
-z string 如果string字符长度等于0则值为真
string1=sting2 如果string1等于string2则值为真
string1!=string2 如果string1不等于string2则值为真
string2可以是通配符模式。
整数比较:
-gt 大于;-ge 大于或等于;-eq 等于;-ne 不等于; -le 小于或等于; -lt 小于
组合:
! condition 如果condition为假则为真
condition1 –a condition2 如果两个条件都为真则为真
condition1 –o condition2 如果两个条件有一个为真则为真
trap [[commands] signals] 如果接收到任何的信号signals则执行命令commands.如果完全忽略commands则会重新设置由默认行为处理指定的信号。
例:
Trap “” 2 ;忽略信号2(中断,通常是ctrl+c)
Trap 2 ;恢复中断2
Trap “rm –f $tmp;exit” 0 1 2 15 ;当shell程序退出,用户退出,按ctrl+c或执行kill时删除$tmp.
Typeset [options] [var [var]…]设置变量属性
-u 将变量值中所有字母全部转换成大写
-l 将变量值中所有字母全部转换成小写
-i 将变量值设为整数类型.-ix x为相应的进制,表示时为x#变量值,可用于进制转换。
例:typeset -i2 vv vv=2 echo $vv 2#10
typeset -i 相当于integer
-L width 在width宽度之内左对齐
-R width 在width宽度之内右对齐,前面空位用空格填充
-Z width 在width宽度之内右对齐,变量如果是数字,则前面空位用零填充
如果忽略width,将使用赋给这个变量的第一个值的宽度。
-x 设置一个变量全局。typeset -x 相当于 export
-r 设置一个变量具有只读属性,在设置的同时或之前,要先给这些变量赋值。
例:typeset -r PATH FPATH=/usr/local/funcs
typeset -r 相当于 readonly
不带参数的typeset可以列出变量和变量的属性。查看指定的变量属性可用type|grep day
使用带有某一选项的typeset来看看哪一个变量具有特定的属性:typeset -z
Unset var 删除一个变量,将它置为空
Until condition
Do
Commands
Done
执行命令command直到满足条件condition.
While condition
Do
Commands
Done
如果满足条件condition则执行commands
转自 : http://blog.chinaunix.net/u1/56521/showart_1094921.html
Korn Shell
1.语法
特殊的文件
/etc/profile 在登录时首先自动执行。
$HOME/.profile 在登录时第二个自动执行。
$ENV 在创建一个新的KShell时指定要读的一个文件。
文件名元字符
* 匹配有零或零个以上字符的字符串
? 匹配任何单个字符
[abc…] 匹配括号内任何一个字符,也可用连字符指定一个范围(例如,a-z,A-Z,0-9)
[!abc…] 匹配任何不包括在括号内的字符
?(pattern) 匹配模式的零个或一个实例
*(pattern) 匹配指定模式的零个或多个实例
+(pattern) 匹配指定模式的一个或多个实例
@(pattern) 只匹配指定模式的一个实例
!(pattern) 匹配任何不匹配模式的字符串
\n 匹配与(…)中的第n个子模式匹配的文本。
~ 当前用户的主目录
~name 用户name的主目录
这个模式pattern可能是由分隔符“|”或“&”分隔的模式的序列,
例:pr !(*.o|core) | lp
引用
; 命令分隔符
& 后台执行
( ) 命令分组
| 管道
<> & 重定向符号
* ? [ ] ~ + - @ ! 文件名元字符
““ 中间的字符会逐字引用,除了`` 替换命令和$ 替换变量.
‘’ 中间的所有字符都会逐字引用
\ 在其后的字符会按其原来的意义逐字采用.如在””中使用 \”,\`,\$
\a 警告,\b退格,\f 换页,\n 换行,\r 回车,\ 制表符,\v 垂直制表符,
\nnn 八进制值,\xnn 十六进制值,\’ 单引号,\” 双引号,\\ 反斜线,
`` 命令的替换
$ 变量的替换
命令形式
Cmd & 在后台执行
Cmd1;cmd2 命令序列,依次执行
{cmd1;cmd2;} 将命令做为一组来执行
(cmd1;cmd2) 在子shell中,将命令做为一组执行
Cmd1|cmd2 管道;将cmd1的输出作为cmd2的输入
Cmd1 `cmd2` 命令替换;用cmd2的输出作为cmd1的参数
Cmd1$(cmd2) 命令替换,可以嵌套
Cmd$((expression)) 运算替换。用表达式结果作为参数
Cmd1&&cmd2 逻辑与。如果cmd1成功才执行cmd2
Cmd1||cmd2 逻辑或。如果cmd1成功则不会执行cmd2
重定向形式
文件描述符:
0 标准输入 stdin 默认为键盘
1 标准输出 stdout
2 标准错误 stderr
Cmd > file 将cmd的结果输出到file(覆盖)
Cmd >> file 将cmd的结果输出到file(追加)
Cmd < file 从file中获取cmd 的输入
Cmd << text 将shell脚本的内容(直到遇见一个和text一样的标记为止)作为cmd的输入
Cmd <> file 在标准输入上打开文件以便读写
Cmd >&n 将输出发送到文件描述符n。ll >&1
Cmd m>&n 将本来输出的m中的内容转发到n中。Ll 3>&2
Cmd >&- 关闭标准输出
Cmd <&n 获取输入
Cmd m<&n
Cmd <&- 关闭标准输入
在文件描述符和一个重定向符号间不允许有空格。
Cmd 2>file 将标准错误发到file中
Cmd > file 2>&1 将标准错误和标准输出都发到file
Cmd > f1 2>f2 将标准输出发到f1,标准错误发到f2
Cmd | tee files 将输出发送到标准输出和files中
Cmd 2>&1 | tee files 将输出和错误同时发到标准输出和files中
2.变量
变量替换
下列表达式中不允许使用空格。冒号是可选的,如果用冒号那么变量必须是非空的并设置了初始值。
Var=value… 将变量var 设为value
${var} 使用变量var的值;如果变量和其后面的文本是分开的则可以不加大括号。
${var:-value} 如果变量var已设置则使用它,否则使用值value
${var:=value} 如果变量var已设置则使用它,否则使用值value并将value赋给变量var
${var:+value} 如果变量var已设置则使用value,否则什么也不使用
例:echo ${u-$d};echo ${tmp-`date`}如果没设tmp,则执行date;
内置变量
$# 命令行参数的个数
$? 上一条命令执行后返回的值
$$ 当前进程的进程号(PID), 通常用于在shell脚本中创建临时文件的名称
$0 第一个参数即命令名
$n 命令行上的第n个参数
$* 将命令行上所有参数作为一个字符串
$@ 命令行上所有参数,但每个参数都被引号引起来
LINENO 脚本或函数内正在执行的命令的行号
OLDPWD 前一个工作目录(由CD设置)
PPID 当前SHELL的父进程的进程号
PWD 当前工作目录(由CD设置)
RANDOM[=n] 每次引用时产生一个随机数,如果给定n则以整数n开始
SECONDS 这个整型变量的值是指从这个shell会话启动算起所过去的秒数。但它更有用的是用脚本中的计时。
例:start=$SECONDS
read answer
finish=$SECONDS
TMOUT 如果设置了该变量,则在没有输入的情况下经过TMOUT变量所指定的秒数后,shell退出。值为0时无效。
CDPATH
允许用户使用简单文件名作为CD的参数,从而快速改变目录。设置方法与PATH类似,通常在启动文件中设置。如果CD的参数是一个绝对路径,则不会查询CDPATH.
例:CDPATH=:/u1/nr:/u1/progs:
export CDPATH
cd nr
就会进到nr中去。
注意:变量必须大写,定义后必须导出.
数组
Kshell支持一维数组,最多支持1024个元素。第一个元素为0。
Set –A name value0 value1 …
声明数组,指定的值就成为name的元素。
${name[i]} i为0至1023的值,可以是表达式。返回数组元素i
${name} 返回数组元素0
${name[*]},${name[@]} 返回所有元素
下标[*]和[@]都可以提取整个数组的内容。但当它们在引号中使用时其行为是不同的。使用@可生成一个数组,这个数组是原始数组的副本,而使用*,则生成的仅仅是具有单一元素的数组(或者是一个普通变量)。
例:set -A a "${names[*]}"
set -A b "${names[@]}"
set|head -5
a[0]='alex helen jenny scott'
b[0]=alex
b[1]=helen
b[2]=jenny
b[3]=scott
${#name[*]} 返回数组元素个数
运算符
Kshell使用C语言中的运算符。
+ 加;- 减;! 逻辑非;~ 按进制取反;* 乘;/ 除;% 求余;<< 左移;>> 右移;<= 小于等于;>= 大于等于;< 小于;
> 大于;== 相等;!= 不等;&& 逻辑与;|| 逻辑或;
3.内置命令
# 注释后面的一行
Break [n] 从for while select until循环中退出或从n次循环中退出
Case value in
Pattern1) cmds1;;
Pattern2) cmds2;;
…
…
Esac
类似于select case.例:
Case $1 in
No|yea) response=1
break;;
-[tT]) table=TRUE;;
*) echo “unknown option”;exit 1;;
Esac
Continue [n] 在for while select until循环中跳过余下的命令,继续下一次循环(或跳过n次循环)
Eval args args是一行包含shell变量的代码.eval首先进行变量扩展,并且运行由此产生的命令。在shell变量包括了重定向符号,别名或其他变量时是有用的。
例:
For option
Do
Case “$option” in
Save) out=’ > $newfile’;;
Show) out=’ | more’;;
Esac
Done
Eval sort $file $out
Exit [n] 退出脚本,退出状态为n.
Export [name=[value]…]
定义全局变量,让其它shell脚本也可以使用。无参数时输出当前定义的全局变量。
For x [in list]
Do
Commands
Done
使变量x(在可选的值列表中)执行commands,省略时假定为”$@”位置参数
例:
For item in `cat program_list`
Do
Grep –c “$item.[co]” chap*
Done
Function name{commands;} 定义一个函数
If condition1
Then commands1
[elif condition2
Then commands2]
…
…
[else commands3]
Fi
条件执行语句。
Let expressions 执行一个或多个表达式。表达式中的变量前不必有$.如果表达式中包含了空格或其他特殊字符,则必须引起来。
例:let “I = I + 1” 或 let i=i+1
Read [var1[?string]] [var2 …] 从标准输入读入一行给相应的变量,并把剩余的单词给最后一个变量。String为相应的提示信息.无参时只等待一次输入。
Readonly [var1[=value] var2[=value] …] 设置只读变量,无参时显示所有只读变量
Return [n] 用于一个函数里面返回状态
repeat word
do
commands
done
指定一个命令序列执行的次数。
例:
repeat 3
do
echo "bye"
done
Select x [in list]
Do
Commands
Done
显示一列按list中顺序编号的菜单项。让用户键入行号选择或按return重新显示。
例:
Ps3=”select thd item number:”
Select event in format page view exit
Do
Case “event” in
Format) nroff $file | lp;;
Page) pr $file | lp;;
View) more $file;;
Exit) exit 0;;
*) echo “invalid selection”;;
Esac
Done
输出为:
1. format
2. page
3. view
4. exit
select the item number:
set [options arg1 arg2 …] 无参时输出所有已知变量的值。
Shift [n] 交换位置参数(如将$2变为$1).如果给出n,则向左移动n个位置。通常用于在while循环中迭代命令行参数。N可以是一个整数表达式。
Sleep [n] 睡眠n秒钟
Test condition 或[ condition ] 判断条件,为真返回0,否则返回非0.
文件:
-a filename 如果该文件存在而为真
-d filename 如果该文件存在且为一个目录,则为真
-f filename 如果该文件存在且为一个常规文件,则为真
-L filename 如果该文件存在且为一个符号链接,为真
-r filename 如果该文件存在且用户对其有读取权限,真
-s filename 如果该文件存在且包含信息(大于0字节),真
-w filename 如果该文件存在且对其有写入权,真
-x filename 如果该文件存在且对其有执行权,真
File1 -nt file2 如果file1存在且在file2后修改则值为真(指修改时间)
File1 -ot file2 如果file1存在且在file2前修改则值为真(指修改时间)
字符串:
string 如果string不为空字符串则值为真
-n string 如果string字符长度大于0则值为真
-z string 如果string字符长度等于0则值为真
string1=sting2 如果string1等于string2则值为真
string1!=string2 如果string1不等于string2则值为真
string2可以是通配符模式。
整数比较:
-gt 大于;-ge 大于或等于;-eq 等于;-ne 不等于; -le 小于或等于; -lt 小于
组合:
! condition 如果condition为假则为真
condition1 –a condition2 如果两个条件都为真则为真
condition1 –o condition2 如果两个条件有一个为真则为真
trap [[commands] signals] 如果接收到任何的信号signals则执行命令commands.如果完全忽略commands则会重新设置由默认行为处理指定的信号。
例:
Trap “” 2 ;忽略信号2(中断,通常是ctrl+c)
Trap 2 ;恢复中断2
Trap “rm –f $tmp;exit” 0 1 2 15 ;当shell程序退出,用户退出,按ctrl+c或执行kill时删除$tmp.
Typeset [options] [var [var]…]设置变量属性
-u 将变量值中所有字母全部转换成大写
-l 将变量值中所有字母全部转换成小写
-i 将变量值设为整数类型.-ix x为相应的进制,表示时为x#变量值,可用于进制转换。
例:typeset -i2 vv vv=2 echo $vv 2#10
typeset -i 相当于integer
-L width 在width宽度之内左对齐
-R width 在width宽度之内右对齐,前面空位用空格填充
-Z width 在width宽度之内右对齐,变量如果是数字,则前面空位用零填充
如果忽略width,将使用赋给这个变量的第一个值的宽度。
-x 设置一个变量全局。typeset -x 相当于 export
-r 设置一个变量具有只读属性,在设置的同时或之前,要先给这些变量赋值。
例:typeset -r PATH FPATH=/usr/local/funcs
typeset -r 相当于 readonly
不带参数的typeset可以列出变量和变量的属性。查看指定的变量属性可用type|grep day
使用带有某一选项的typeset来看看哪一个变量具有特定的属性:typeset -z
Unset var 删除一个变量,将它置为空
Until condition
Do
Commands
Done
执行命令command直到满足条件condition.
While condition
Do
Commands
Done
如果满足条件condition则执行commands
Labels:
ksh
grep 用法
更多精彩请到 http://www.139ya.com
grep 的用法
1 双引号引用
在grep命令中输入字符串参数时,最好将其用双引号括起来
2 grep选项
常用的g r e p选项有:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文档时不显示文档名。
-l 查询多文档时只输出包含匹配字符的文档名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的任何行。
3 精确匹配
使用grep抽取精确匹配的一种更有效方式是在抽取字符串后加\>。假定现在精确抽取48,则为"48\>"
三 grep和正则表达式
使用正则表达式时最好用单引号括起来,这样能够防止grep中使用的专有模式和一些shell命令的特别方式相混淆。
1 模式范围
假定要抽取代码为484和483的城市位置,上一章中讲到能够使用[ ]来指定字符串范围,这里用48开始,
以3或4结尾,这样抽出484或483。grep '48[34]' data.f
2 不匹配行首
假如要抽出记录,使其行首不是48,能够在方括号中使用^记号,表明查询在行首开始。
grep '^[^48]' data.f
3 匹配任意字符
假如抽取以L开头,以D结尾的任何代码,可使用下述方法,因为已知代码长度为5个字符:
grep 'L...D' data.f
4 日期查询
一个常用的查询模式是日期查询。先查询任何以5开始以1 9 9 6或1 9 9 8结尾的任何记录。使用模式5..199[6,8].这意味着第一个字符为
5,后跟两个点,接着是199,剩余两个数字是6或8。
grep '5..199[6,8]' data.f
查询包含1998的任何记录的另外一种方法是使用表达式[0-9]\[8],含义是任意数字重复3次,后跟数字8,虽然这个方法不像上一个方
法那么精确,但也有一定作用。
5 使用grep匹配“和”或“或”模式
grep命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为2 1 9或2 1 6,方法如下:
grep -E '219|216' data.f
6 空行
结合使用^和$可查询空行。使用- n参数显示实际行数:
grep '^$' data.f
7 grep 和类名的使用
类等价的正则表达式类等价的正则表达式
[[:upper:]] [A-Z] [[:alnum:]] [0-9a-zA-Z]
[[:lower:]] [a-z] [[:space:]] 空格或t a b键
[[:digit:]] [0-9] [[:alpha:]] [a-zA-Z]
grep 的用法
1 双引号引用
在grep命令中输入字符串参数时,最好将其用双引号括起来
2 grep选项
常用的g r e p选项有:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文档时不显示文档名。
-l 查询多文档时只输出包含匹配字符的文档名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的任何行。
3 精确匹配
使用grep抽取精确匹配的一种更有效方式是在抽取字符串后加\>。假定现在精确抽取48,则为"48\>"
三 grep和正则表达式
使用正则表达式时最好用单引号括起来,这样能够防止grep中使用的专有模式和一些shell命令的特别方式相混淆。
1 模式范围
假定要抽取代码为484和483的城市位置,上一章中讲到能够使用[ ]来指定字符串范围,这里用48开始,
以3或4结尾,这样抽出484或483。grep '48[34]' data.f
2 不匹配行首
假如要抽出记录,使其行首不是48,能够在方括号中使用^记号,表明查询在行首开始。
grep '^[^48]' data.f
3 匹配任意字符
假如抽取以L开头,以D结尾的任何代码,可使用下述方法,因为已知代码长度为5个字符:
grep 'L...D' data.f
4 日期查询
一个常用的查询模式是日期查询。先查询任何以5开始以1 9 9 6或1 9 9 8结尾的任何记录。使用模式5..199[6,8].这意味着第一个字符为
5,后跟两个点,接着是199,剩余两个数字是6或8。
grep '5..199[6,8]' data.f
查询包含1998的任何记录的另外一种方法是使用表达式[0-9]\[8],含义是任意数字重复3次,后跟数字8,虽然这个方法不像上一个方
法那么精确,但也有一定作用。
5 使用grep匹配“和”或“或”模式
grep命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为2 1 9或2 1 6,方法如下:
grep -E '219|216' data.f
6 空行
结合使用^和$可查询空行。使用- n参数显示实际行数:
grep '^$' data.f
7 grep 和类名的使用
类等价的正则表达式类等价的正则表达式
[[:upper:]] [A-Z] [[:alnum:]] [0-9a-zA-Z]
[[:lower:]] [a-z] [[:space:]] 空格或t a b键
[[:digit:]] [0-9] [[:alpha:]] [a-zA-Z]
Labels:
grep
Wednesday, May 20, 2009
New and improved Apps to SD(more stable, more powerful, etc) Tutorial
更多精彩请到 http://www.139ya.com
http://forum.xda-developers.com/showthread.php?t=512743
__________________
Device: T-Mobile G1(black)
ROM: The Dude's version 1.1a(with fixed protected apps)
118 apps with 1400 MB remaining!!!
http://forum.xda-developers.com/showthread.php?t=512743
Well, some of you may have heard my ramblings around here that I've been working with some of the devs here(JF and MartinFick deserve major praise, probably more than me) on getting a better way to do the whole apps to sd thing.
After 3 days of talking/discussing/working on it, I've finally reached the fruits of that investigation and thought I'd share. This new method uses the filesystem unionfs to essentially meld the /data directory with the /system/sd directory, so that they appear to be one. This has the potential to allow users to move specific apps to or from the sd card, is far more stable than the normal symlink method(will still boot, etc even if there's no SD card) and should be easier to set up. Now, onto the tutorial of setting this up.
BIG DISCLAIMER NOTE: This is a major hack of the phone and it is fully possible that it will break your phone(I've seen no permanently bricked phones but that doesn't make it impossible). Use this method, and my app along with it at your own risk.
REQUIREMENTS:
1: This only works on JF(possibly only on 1.5, not sure about the others) and The Dude's v.1.0 or greater. The Dude's 1.0 or greater actually does the steps in this tutorial for you so you can just run appstosd2 and set it all up from there if you're using his ROM.
2: This still requires you to have 2 partitions set up, first FAT32 and second ext2. Although you can use the appstosd2 app attached to this post and available in the market for $0.99 which will partition the card for you.
3: If you want your apps to go to the sd card, you must have a directory "/system/sd/app" If you didn't have apps to sd before on the ext2 partition do the following in terminal emulator or run my appstosd2 app after finishing the tutorial:
If you want the private-apps, or dalvik-cache moved you can replace "app" in that code with ""app-private", or "dalvik-cache" respectively. Do not copy "data" to the sd card. My script will delete it on the next reboot.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Alright, first there's some files you need.
1: init.rc in .zip attached to this thread
2: a2sd.sh in .zip attached to this thread
All the above listed files should be put on your sd card(my tutorial will assume they are in the root directory of the sdcard(the topmost folder)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
If you need to undo the normal apps to SD first do the following in the recovery terminal(it's not strictly necessary but I'd recommend it):
if you moved the dalvik cache, repeat steps 2-3 with "dalvik-cache" instead of app. Ditto with "data" for the data cache.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Then go to terminal editor and type the following:
Then reboot and you're set. By default all future apps are installed to the sd card. In order to move an app to the internal memory do the following in terminal emulator:
I will be incorporating this into my appstosd app soon(probably as a JF and TheDude-only version until the rest of the devs get on board).
I have included a copy of appstosd 2, which will copy all apps from internal memory to the sd card with an option to remove them from the internal memory. This will only work if you have followed this tutorial.
If you don't have partitions set up, appstosd2 will now do that for you with user-set partition sizes.
NOTE: If you're using The Dude's ROM and find yourself with an outdated version of this since he doesn't always update his ROMs at the same time I update this, do the following in terminal emulator to update(after putting a2sd.sh from the attached a2sd.zip on your sdcard):
For JF1.5, do the following to update:
NOTE FOR UPDATERS: If you had your data on the sdcard(/system/sd/data), it WILL GET DELETED with the new version. This is a necessity in order to get both wallpaper and protected apps working. I recommend moving it back to the phone.
After 3 days of talking/discussing/working on it, I've finally reached the fruits of that investigation and thought I'd share. This new method uses the filesystem unionfs to essentially meld the /data directory with the /system/sd directory, so that they appear to be one. This has the potential to allow users to move specific apps to or from the sd card, is far more stable than the normal symlink method(will still boot, etc even if there's no SD card) and should be easier to set up. Now, onto the tutorial of setting this up.
BIG DISCLAIMER NOTE: This is a major hack of the phone and it is fully possible that it will break your phone(I've seen no permanently bricked phones but that doesn't make it impossible). Use this method, and my app along with it at your own risk.
REQUIREMENTS:
1: This only works on JF(possibly only on 1.5, not sure about the others) and The Dude's v.1.0 or greater. The Dude's 1.0 or greater actually does the steps in this tutorial for you so you can just run appstosd2 and set it all up from there if you're using his ROM.
2: This still requires you to have 2 partitions set up, first FAT32 and second ext2. Although you can use the appstosd2 app attached to this post and available in the market for $0.99 which will partition the card for you.
3: If you want your apps to go to the sd card, you must have a directory "/system/sd/app" If you didn't have apps to sd before on the ext2 partition do the following in terminal emulator or run my appstosd2 app after finishing the tutorial:
Code:
su
mkdir /system/sd/app
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Alright, first there's some files you need.
1: init.rc in .zip attached to this thread
2: a2sd.sh in .zip attached to this thread
All the above listed files should be put on your sd card(my tutorial will assume they are in the root directory of the sdcard(the topmost folder)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
If you need to undo the normal apps to SD first do the following in the recovery terminal(it's not strictly necessary but I'd recommend it):
Code:
mount data
rm /data/app
mkdir /data/app
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Then go to terminal editor and type the following:
Code:
su
cp /sdcard/init.rc /data/
cp /sdcard/a2sd.sh /data/
Code:
su
cp /system/sd/app/[the app you want to move] /system/intmem/app/
rm /system/sd/app/[the app you want to move]
I have included a copy of appstosd 2, which will copy all apps from internal memory to the sd card with an option to remove them from the internal memory. This will only work if you have followed this tutorial.
If you don't have partitions set up, appstosd2 will now do that for you with user-set partition sizes.
NOTE: If you're using The Dude's ROM and find yourself with an outdated version of this since he doesn't always update his ROMs at the same time I update this, do the following in terminal emulator to update(after putting a2sd.sh from the attached a2sd.zip on your sdcard):
Code:
su
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
rm /system/bin/a2sd.sh
cp /sdcard/a2sd.sh /system/bin/
reboot
Code:
su
rm /system/intmem/a2sd.sh
rm /system/intmem/init.rc
cp /sdcard/a2sd.sh /system/intmem/
cp /sdcard/init.rc /system/intmem/
reboot
Device: T-Mobile G1(black)
ROM: The Dude's version 1.1a(with fixed protected apps)
118 apps with 1400 MB remaining!!!
Labels:
technique
Email协议基础知识
更多精彩请到 http://www.139ya.com
转自:http://www.chinalinuxpub.com/bbs/showthread.php?t=19694
1. Email系统的基本原理
[1]internet地址
(1)标准的internet地址
所有Internet的地址通用形式为:
userid(用户标识)@domain(域名)
例:qinghua0000@sohu.com
harley@fuzzball.ucsb.edu
(2)域名与子域
用户标识不是唯一的,唯一所具备的条件呢就是用户标识与域名的结合必须是唯一的,在同一个域中的用户标识不能相同。其中的域名包含若干子域。值得注意的 是,一种具有两个子域的地址,通常要么这个机构很小,要么很大(像sohu.com)。sohu是拥有多台计算机的大机构;在这样的机构中,有一台计算机 专用作与外部世界之间电子邮件的收发。该机构的系统管理员为每个人都安排有简单化的邮件地址。以便能够在sohu.com地址上收发邮件。
一般,术语“gateway”(网关)涉及的是两个不同系统之间的连接,假如我们有一个网关(gateway),网关起着内部网络与外部世界之间的连接作用。因网关有用户标识和本地地址表;当一个邮件到达时,网关就可以校查该表,并把该邮件发送给相应的本地计算机。
(3)最高级域
一般有两种形式的最高级域:一般称之为机构域,还有一种称之为地区域。
域 类型
com 商业机构 (全称:commercialorganization)
edu 教育机构 (全称:educationalinstitution)
gov 政府部门 (全称:government)
int 国际性机构 (全称:internationalorganization)
mil 军队 (全称:military)
net 网络机构 (全称:networhimgorganization)
org 非盈利机构 (全称:non-profitorganization)
表一、最高级域机构名属性对照表
域 国家
at 奥地利 (全称:Austria)
au 澳大利亚 (全称:Australia)
ca 加拿大 (全称:Canada)
ch 瑞士 (全称:Switzerland"ConfoederationHlvetia")
cn 中国 (全称:China)
de 德国 (全称:Genmark"Deutschland")
dk 丹麦 (全称:Denmark)
es 西班牙 (全称:Spain"Espana")
fr 法国 (全称:Fance)
gr 希腊 (全称:Greece)
ie 爱尔兰共和国 (全称:Republic of Zreland)
jp 日本 (全称:Japan)
nz 新西兰 (全称:New zealand)
uk 英国 (全称:United Kingdow)
us 美国 (全称:United States)
(4)伪Internet地址
有许多机构希望与Internet相连接,但是没有时间或经费与Internet保持长期的连接。作为一个替代的方法,它们与附近的Internet点商 定,让其作为它们的邮件代理。仅从这个地址,常常无法断定计算机是否真正与Internet相连接。如果要确切知道一台计算机是否与Internet连 接,可使用host命令。
(5)IP地址与 host命令
可以在使用正规地址的任何地方使用IP地址。Internet的地址记录系统叫做域名系统或DNS。DNS是将域名地址与IP数字地址这两个版本来回转换的一种TCP/IP服务。
如果要测试 DNS,可以使用host命令。有以下两种格式:
host standard-address
host IP-address
如果你从一个标准地址入手:
host ucsd.edu
DNS将显示IP地址:
host 128.54.16.1
反之如果你从一个IP地址入手,DNS将显示标准地址。
只有Internet主机才有IP地址(仿真终端是没有的)。因此,可以使用host命令检查计算机是否与Internet直接连接。如使用host能测试出IP地址,说明该计算机是与Internet连接的。
如果指定的地址是未与Internet直接连接的计算机的。将看到:
host not found
host 命令并不适用于所有的计算机。如果你的系统没有host,请试一下nslookup或nstest。
(6)UUCP
所有Unix系统都有一个叫做UUCP的内置联网系统。UUCP是一组程序。名字UUXP来自这些程序中的一个程序,该UUCP程序将文件在Unix系统之间相互拷贝,因此这个名字的意思是“Unix到Unix拷贝”。
UUCP的功能不及TCP/IP强。例如,UUCP不能提供远程登录UUCP邮件程序比Internet慢,并更难用。但是UUCP有一个重要的优点,它 是一个标准的Unix部分(适合于绝大多数系统),它通过拨号或电缆直接连接运行,既便宜又可靠。UUCP的作用是使Unix系统连接到一起,形成一个 链。例如,假定你正在使用一台名为alpha的计算机,你的计算机就与另一台名为beta的计算机连接起来了,beta计算机与gamma计算机连 接,gamma计算机再与delta计算机连接。
它提供了一种经济的方式在计算机之间远距离传送邮件。但是,有一个重要的缺点:由于许多UUCP连接是通过电话线,而且在某些预定的时间内实现的邮件投送 可能需数小时,甚至好几天。将还种方式与Internet比较,在Internet中,连接是永久的,信息件递很迅速,常常在几秒钟内,一般在几分钟内就 可以完成。
(7)UUCP地址和Bang路径
建立一个由名字依次排列组成的地址,名字之间用!符号分开。例如,下面是一个将上面提到的用户标识发送信息的邮件命令。
mailbeta!gamma!delta!murray
在Unix术语中,!符号的专门术语名字之一是bang。因此,一个指定多重名字的UUCP地址有时叫做bang路径(bangpath)。
(8)简化的UUCP地址
为了使得UUCP获取地址方便,采取了一个叫做UUCPmappingproject(UUCP图示方案)的措施。该方案定期出版数据“地图”,发送到许 多关键UUCP计算机,当UUCP邮件到达这些计算机时,计算机可以查看这个图,确定使用的最佳路径。实质上这样可使你使用的UUCP地址与 Internet地址相同,让该系统做这项工作。
因此,有时可能看见一种使用UUCP的最高级域的地址。例如,你可以用以下地址发送邮件:
albert@gendeau.uucp
当使用这样一个地址时,就等于向邮件路由软件发出了一个信号,让它找出UUCP图示数据中的名字和指出最佳使用路径。
[2]INTERNET邮件系统
(1)intrenet电子邮件系统基础
<1> 传送受理程序
邮件系统是可输送各类信息的综合服务系统:像文献、印刷品、计算机程序等。而唯一所需的是用ASCII字码(即可用键盘录入的数据)存贮数据。 在有些情况下,也可传送非文本资料,如图像或录音。
SMTP,表示简易邮件传送协议(SimpleMailTransferProtocol),它是TCP/IP系列协议的一部分。它解释邮件的格式和说明 怎样处理投递的邮件。每一台Internet计算机在运行邮件程序时,可自动地确保邮件以标准格式选址和传送。这个程序称为传送受理程序 (transport agent),它按照SMTP协议工作并将你的邮件联系向外界发送。
在大多数系统中,传送受理程序在“后台”中运行,随时对可能收到的任何要求作出反应。在Unix系统术语中,这个程序称之为“守护神”,即智能程序(daemon)(是的,完全可以这样称呼)。
每一个Unix系统都有各种隐放在“后台”的智能程序无声地为你服务。从理论上讲,不论你的系统使用的是什么传送受理程序,只要它能用SMTP收发邮件文件就行。大多数Unix系统使用一种叫“传送邮件(sendmail)”的智能程序。
<2>电子邮件系统接口(Interface)
a. 用户邮件程序: 做为一个用户,你不会直接与你系统中的传送受理程序发生联系;只是在机器内部通过SMTP运行收发邮件,你使用的这种邮件程序叫作用户邮件程序. 最广泛使用的用户邮件程序是Unix邮件程序。BSD用户邮件程序称为mailx,SystemV用户邮件程序称为Mail。
b.Unix基础邮件程序
通用的有ELM(全屏) 、PINE(菜单驱动)、MH(文件操作者)、MUSH (Zmail)、RMAIL(Emacs是一个建立在功能强大的文本编辑程序上的完整工作环境。在Emacs环境中,你不仅能编辑文本,还能编制扩展程 序,阅读Usenet(用户网)文章,操作Rmail收发邮件)
C.邮件信头编写
标准格式的邮件是由两部分组成:“信头”和“主体”。信头包括在文件开始处的信息行。主体实际上是你所表达的信件内容。
下面是一个样本文件。信头格式在操作系统中也许有变动,但主要内容不变。
Fromrick@tsi.com WedMar3114:47:021993(From+地址+时间)
Received:fromhub.ucsb.edu by engineering.ucsb.edu
id AA15594toharley: Wed, 31Mar9313:19: 25PST
Received:from fuzzball(fuzzball.ucsb.edu)byhub.ucsb.edu ;
id AA11868
Sendmail4.1/UCSB2.0sun
Wed.3lNar9313:23:58SPST for harley@cs.ucsb.edu
Received:by FUZZBALL(5.57/UCSB-V2)
id AA07200:Wed,31Mar9313:17:40PST
Received:fromtsi.combyucsd.edu;id AA03169
Send mail 5.67/UCSD-2.2 sunvia SMTP
Wed.31 Mar 9313:23:520800 for harley@fuzzball.ucsb.edu
Received:bysdcc12.UCSD.EDU(4.l/UCSDGENERIC.3)
id AA25582 to harley@fuzzball.ucsb.edu;
Wed.31 Mar 9313:23:51PST
Date:Wed.31 Mar 9313:23:51PST
From:rick@tsi.com(RickStout)
MessageId:9303311840.AA067ll@tsi
X.Mailer:MailUser's Shell(7.1.27/11/90)
To:harley@fuzball.ucsb.edu
Subject:this is the subject
Cc:ad die@nipper.com kim@nipper.com
Status:Ro
Harley:I have setup an appoint ment for next Thursday afternoon.
PIease let me know if you can attend.
...Rick
来源: rick@tsi.com1993年3月31日星期三14点47分2秒
接收: from hub.ucsb.edu by engineering.ucsb.edu
id AA15594 to harley:93年3月31日星期三13:19:25PST
接收: from fuzzball(fuzzball.ucsb.edu)by hub.ucsb.edu
id AA11868
传送邮件4.1/UCSB-2.Osun
93年3月31日早期三13:23:58PST到harley@cs.ucsb.edu
接收: 由fuzzball(5.57/UCSB-v2)
id AA07200; 93年3月31日星期三,时间13:17:40PST
接收:来自tsi.com by ucsd.edu;idAA03169
传送邮件通过SMTP5.67/UCSD-2.2sun
93年3月31日星期三时间13:25:520800到harley@fuzzball.ucsb.edu
接收:由sdcc12.UCSD.EDU(4.1/UCSDGENERIC.3)
发送id AA25582至harley@fuzzball.ucsb.edu ;
93年3月31日星期三;13:23:51PST
日期:93年3月31日星湖三13:23:51PST
来源: rick@tsi.com(Rick Stout)
文件标识符:93O3311840.AA06711@tsi
X-邮件者: Mail User's Shell(7.1.27/11/90)
至: harley@fuzzball.ucsb.edu
标题:具体题目
副本(Cc): addie@nipper.com kim@nipper.com
状态:RO
Harley:在下星期四下午,我安排了一次会见,请告知我你是否参加。
Rick
以上例子说明,在信头中的第一行总是单词“ From”,该行表明发信人的地址。在我们这个例子中,文件是从rick@tsi.com 发来的。其它行即不必以同样的顺序显示。这取决于收发邮件系统是 怎样构成的,也取决于在你特别的邮件程序设置的是什么选择。在最初的“From”行后有十四行包括五条Received说明的技术信息。这些字行表明该文 件所取的路径、时间、日期和操作过程中每一步应使用什么程序。邮件程序常显示一个“状态”行。可是,几乎没有人知道不同的设计表示什么,这一般查不到。
d.用MIME传送二进制数据(多功能Internet邮件扩展程序)
为了收发二进制数据,你必须具有用来支持MIME的一个用户邮件程序(邮件程序);MIME标准现已成为Internet电子邮件的主流,我们现在最常使 用的电子邮件软件Eudora、Netscap e Mail、Internet Mail就是采用MIME方式。MIME定义两种编码万式:Base64与QP(Quote-Printable)。QP的规则是对于资料中的7位无须重 复编码,仅将8位的数据转成7位。QP编码适用于ASCII码的及字内容,例如我们的中文文件。而Base64 的编码规则是将整个文件重新编码成7位,通常用于传送二进制文件。编码的方式不同会影响编码之后的文件大小。而具有MIME功能的E-mail软件大都能 自动判别你的邮件是采用何种编码,然后自动选择用QP或Base64来解码。
[3]基本的网络协议
(1)SMTP
下图显示了SMTP的基本模型。发送方建立起与接收方SMTP的通信。在传输邮件之前,两个SMTP实体可以交换口令或其他鉴别信号,然后发送方发出一个 特殊命令,称为MAIL,该命令给出了发送方的标识及一些有关邮件交换的其他信息。接收方必须返回一个对MAIL命令的确认。在SMTP中,该确认可写为 250,在另一些文档中,该确认为250 OK。不管是哪一种格式,确认表示所要求的邮件操作完成了。
图一、 SMTP模型
邮件传输过程的下一步是传输RCPT命令以标识报文的目的端,接收方仍必须给出对该命令的一个确认。
第三步是发送DATA命令。发送方SMTP发出该命令提醒接收方一个报文就要到达了。在发送了该命分之后,发送方SMTP便一行接一行地发送数据,直到发送方发出了一个特殊的控制字符序列,表示报文结束了。这时,服务器使用QUIT命令终止该过程。
(1.1)地址段格式
发送方SMTP使用了一个标准的送地址和接收地址格式,它们的形式如下:
local-part@domain-name
因此SMTP名字遵从了域名系统(DNS)的概念,一些系统使用一个服务器,将该名字映射成IP地址。实际应用中,这种格式可能出现为:
Jones@beta.aus.edu
其中本地用户名为Jones,beta.aus.edu是Jones的域标识符。Iocal-part@domain-name还可能采取其他形式以表示如下含义:
² 一个直接的连接(use@host)
² 邮件接收方位于一台非SMTP主机,通过一个邮件网关接收邮件(user%remote-host@gateway-host)
² 多台主机间的应答(@host-b@host-c@hostd)
(2)POP3
首先,P O P 3服务器启动P O P 3服务,并监听110端口。当客户机要仅用P O P 3服务时,它先与 POP3服务器建立一条TCP连接。若连接成功建立,POP3服务器向客户端发送一条欢迎消息,然后客户机与POP3服务器之间就可以进入命令交互和响应 状态,直到连接关闭或异常中断。
每个POP3会话总是处于一系列的状态变化中。一旦客户机与POP3服务器之间的TCP连接建立起来并且POP3服务器的欢迎言息传到客户端。POP3会 话过程就进入认证状态。在该状态下,客户机必须进行身份验证。一旦验证通过,并且POP3服务器获得足够的资源打开用户的邮箱。这时POP3会话过程进入 “命令交互状态”。在“命令交互状态”下,客户端可以向POP3服务器提出各科服务请求,由POP3服务器完成该服务并返回成功或失败的响应信息。当客户 端发出“QUIT’命令后,POP3会话过程进入“更新状态”。在“更新状态”下,POP3服务器释放在“命令交互状态”下获得的资源,更新用户邮箱,然 后关闭TCP连接。
(2.1)POP3的基本命令
² USER
这个命令以用户的帐号名称作为参数。
² PASS
这个命令以用户的口令作为参数,缺省情况下用户的口令将以明文在网络上传输。
² STAT
该命令无参数,仅用于“命令交互状态”。
获取当前用户邮件总数和邮件总大小。POP3服务器返回一个成功的响应,以“+OK”开头,后跟一个空格字符,然后是当前用户邮箱内邮件的总数,之后又是一个空格字符,最后是用户邮件的总大小(BYTES)。
C: STAT
S: +OK 2320
² LIST
该命令可以没有参数也可以有一个参数,该参数代表邮件的序
号,但该序号不能是已删除邮件。
该命令仅用于“命令交互状态”。
C: LIST
S: +OK 2 messages( 320 octets)
S: 1 120
S: 2 200
S: .
......
C: LIST 2
S: +OK 2 200
......
C: LIST 3
S: -ERR no such mesage, only 2 message in maildrop.
² RETR
该命令必须带有一个邮件序号,该邮件序号不能是已删除邮件。
该命令仅用于“命令交互状态”。
若POP3服务器返回一个成功响应,则随后的响应属于多行响应。在首行“+OK”响应之后,POP3服务器把对应于该邮件序号的邮件发送到客户端。
C: RETR 1
S: +OK 120 octets
S: <>
C: RETR 5
S: -ERR no such message.
² DELE
该命令必须带一个邮件序号参数。仅用于“命令交互状态”
POP3服务器把该邮件标志为“已删除”,之后,任何对该邮件的操作都将返回错误。POP3服务器并不实际删除该邮件,除非POP3会话进“更新状态”。
C: DELE 1
S: +OK message 1 deleted
......
C: DELE 1
S: -ERR message 2 already deleted
² NOOP
该命令不待参数,实际上也不做任何事情。仅用于“命令交互状态”。
C: NOOP
S: +OK
² RSET
该命今不带参数。仅用于“命令交互状态”。
POP3服务器将所有已被标志为删除的邮件的删除标志取消,并返回成功响应。
C: RSET
S: +OK maildrop has 2 messages ( 320 octets)
² QUIT
该命令无参数,仅用于“命令交互状态”。
POP3服务器把所有已标志为删除的邮件删除,并释放在“命令交互状态”中获得的资源,然后关闭TCP连接,POP3会话结束。
2.SMTP
1、概述
SMTP被用来在因特网上传递电子邮件。文件RFC821规定了该协议的所有细节。
协议的原理很简单。无非是一个客户端计算机向服务器发送命令,然后服务器向客户端计算机返回一些信息。客户端发送的命令以及服务器的回应都是字符串。
首先要与邮件服务器连接,服务器将返回文本。该文本包含一个三位数的代码及描述,例如:
220-ns.cinfo.ru Sendmail 8.6.12/8.6.9 ready at Wed, 22 Apr 1998 22:54:41 +0300
220 ESMTP spoken here
这些描述可能会因服务器而异。只须要知道代码所代表的意思就行了。代码220表示成功建立连接,服务器等待你的第一个命令。
向服务器传递的第一个命令是HELO. 该命令包含一个参数,即你的邮箱名。
HELO oleg
注意: 在RFC821中,HELO是一个可选择性命令,如果服务器不要求该命令的话,你可以把它忽略掉。
如果命令成功,服务器会返回一个代码为250的回应。
下一步用MAIL FROM命令告诉服务器你想发一封邮件。该命令以发信人的邮件地址为参数。
MAIL FROM: oleg@vbip.com
发完命令后,如果服务器返回一个代码为250回应,你就可以向服务器发送RCPT TO命令了。
RCPT TO命令以收信人地址为参数,是告诉服务器你想将邮件发到收信人地址处。
RCPT TO: somebody@domain.com
如果你想将邮件发给多个收件人的话。你需要多次使用RCPT TO命令,对每个命令,服务器都会返回代码为250的回应。
现在可以向服务器发送邮件正文了。
用DATA命令告诉服务器以下的内容为邮件正文。在你从服务器收到代码为354的回应后,你就可以发送邮件正文了。邮件按行发送,每行邮件以一个无回车的换行符结束,只须按回车键就行了。下面是一个例子:
Subject: My first e-mail message.
First line of a message.
Second line.
注意上面最后一行的最后一个字符是一个小数点。这是正文结束的标志。 服务器收到这个标志后,就会立即返回一个代码为250的回应以及该邮件的唯一ID号。
250 WAA10568 Message accepted for delivery
任务完成了,可以继续发送下封邮件,也可以断开同服务器的连接。如果要断开同服务器的连接就用QUIT命令。在这种情况下,服务器会返回一个代码为221的回应并断开连接。
QUIT
221 ns.cinfo.ru closing connection
2、工作机制
SMTP设计基于以下通信模型:针对用户的邮件请求,发送SMTP建立与接收SMTP之间建立一个双向传送通道。接收SMTP可以是最终接收者也可以是中间传送者。SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。
一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命 令确认邮件是否能接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。 当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答
SMTP提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者不在同一个传送服务 下时,通过中继SMTP服务器传送。为了能够对SMTP服务器提供中继能力,它必须拥有最终目的主机地址和邮箱名称。
MAIL命令参数是回复路径,它指定邮件从何处来;而RCPT命令的参数是转发路径的,它指定邮件向何处去。向前路径是源路径,而回复路径是返回路径 (它用于发生错误时返回邮件)。
3、基本命令(所有的命令都是四个字母组成)
发送邮件操作涉及到不同的数据对象,它们由不同的参数相互连接。回复路径就是MAIL命令的参数,而转发路径则是RCPT命令的参数,邮件日期是DATA 命令的参数。这些参数或者数据对象必须跟在命令后。这种模式也就要求有不同的缓冲区来存储这些对象,也就是说,有一个回复路径缓冲区,一个转发路径缓冲 区,一个邮件内容缓冲区。特定的命令产生自己的缓冲区,或使一个或多个缓冲的内容被清除
(0)HELO(HELLO)
HELO〈SP〉〈domain〉〈CRLF>
通知服务器客户的身份。
此命令用于向接收SMTP确认发送SMTP。参数域包括发送SMTP的主机名。接收SMTP通过连接确认命令来向发送SMTP确认接收SMTP。引命令和OK响应确认发送和接收SMTP进入了初始状态,也就是说,没有操作正在执行,所有状态表和缓冲区已经被子清除。
(1)MAIL
MAIL FROM:
此命令用于开始将邮件发送到一个多个邮箱中。参数域包括回复路径。返回路径中包括了可选的主机和发送者邮箱列表。当有主机列表时,它是一个回复路径源,它 说明此邮箱是由在表中的主机一一传递发送(第一个主机是最后一个接收到此邮件的主机)过来的。此表也有作向发送者返回非传递信号的源路径。因为每个传递主 机地址都被加在此表起始处,它就必须使用发送IPCE而不是接收IPCE(如果它们不是一个IPCE的话)清楚的名称。一些出错信息的回复路径可能就是空 的。
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
(2)RCPT(recipient)
RCPT TO:
此命令用于确定邮件内容的唯一接收者;多个接收者将由多个此命令指定。转发路径中包括一个可选的主机和一个必须的目的邮箱。
此命令给出向前路径标识接收者,如果命令被接收,接收方返回一个250 OK应答,并存储向前路径。如果接收者未知,接收方会返回一个550 Failure应答。此过程可能会重复若干次。
不仅包括邮件,它是主机和目的邮箱的路由表,在其中的第一个主机就是接收命令的主机。
(3)DATA
DATA
如果命令被接收,接收方返回一个354 Intermediate应答,并认定以下的各行都是信件内容。当信件结尾收到并存储后,接收者发送一个250 OK应答。因为邮件是在传送通道上发送,因此必须指明邮件内容结尾,以便应答对话可以重新开始。SMTP通过在最后一行仅发送一个句号来表示邮件内容的结 束,在接收方,一个对用户透明的过程将此符号过滤掉,以不影响正常的数据。
注意:邮件内容包括如下提示:Date, Subject, To, Cc, From。
邮件内容指示符确认邮件操作并告知接收者可以存储和再发送数据了。如果此命令被接收,接收方返回一个250 OK应答。DATA命令仅在邮件操作未完成或源无效的情况下失败。
(4)RSET
RSET
此命令指示当送邮件操作将被放弃。任何保存的发送者,接收者和邮件内容应该被抛弃,所有缓冲区和状态表应该被清除,接收方必须返回OK应答。
(5)SEND
SENDFROM:〈reverse-path>
此命令用于开始一个发送命令,将邮件发送到一个或多个终端上。参数域包括了一个回复路径,此命令如果成功就将邮件发送到终端上了。
回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列表上第一 个主机是最后经手的主机)。此表用于返回非传递信号到发送者。因为每个传递主机地址都被加在此表起始处,它就必须使用发送IPCE而不是接收IPCE(如 果它们不是一个IPCE的话)清楚的名称。一些出错信息的回复路径可能就是空的。
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
(6)SOML(send or mail)
SOMLFROM:〈reverse-path>
此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,或者传送到邮箱中。对于每个接收者,如果接收者终端打开,邮件内容将被传送到接收者的终端上,否则就送到接收者的邮箱中。参数域包括回复路径,如果成功地将信息送到终端或邮箱中此命令成功。
回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列表上第一个主机是最后经手的主机)。
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
(7)SAML(send and mail)
SAMLFROM:〈reverse-path>
此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,并传送到邮箱中。如果接收者终端打开,邮件内容将被传送到接收者的终端上和接收者的邮箱中。参数域包括回复路径,如果成功地将信息送到邮箱中此命令成功。
回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列表上第一个主机是最后经手的主机)。
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
(8)VRFY(verify vt.证实,查证;证明)
VRFY〈string〉
此命令要求接收者确认参数是一个用户。如果这是(已经知道的)用户名,返回用户的全名和指定的邮箱。此命令对回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区没有影响。
(9)EXPN(expand vt.扩大;使膨胀)
EXPN〈string〉
此命令要求接收者确认参数指定了一个邮件发送列表,如果是一个邮件发送列表,就返回表中的成员。如果这是(已经知道的)用户名,返回用户的全名和指定的邮箱。此命令对回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区没有影响。
(10)NOOP
NOOP
此命令不影响任何参数和已经发出的命令。它只是说明没有任何操作而不是说明接收者发送了一个OK应答。此命令对回复路径缓冲区,转发路径缓冲区和邮件 内容缓冲区没有影响。
(11)QUIT
QUIT
此命令指示接收方必须发送OK应答然后关闭传送信道。接收方在接到QUIT命令并做出响应之前不应该关闭通信信道。发送方在发送QUIT命令和接收到 响应之前也不应该关闭信道。即使出错,也不应该关闭信道。如果连接被提前关闭,接收方应该象接收到RSET命令一样,取消所有等待的操作,但不恢复原先已 经做过的操作。而发送方应该象接收到暂时错误(4XX)一样假定命令和操作仍在支持之中。
转自:http://www.chinalinuxpub.com/
1. Email系统的基本原理
[1]internet地址
(1)标准的internet地址
所有Internet的地址通用形式为:
userid(用户标识)@domain(域名)
例:qinghua0000@sohu.com
harley@fuzzball.ucsb.edu
(2)域名与子域
用户标识不是唯一的,
一般,术语“gateway”(网关)
(3)最高级域
一般有两种形式的最高级域:一般称之为机构域,
域 类型
com 商业机构 (全称:commercialorganization)
edu 教育机构 (全称:educationalinstitution)
gov 政府部门 (全称:government)
int 国际性机构 (全称:internationalorganization)
mil 军队 (全称:military)
net 网络机构 (全称:networhimgorganization)
org 非盈利机构 (全称:non-profitorganization)
表一、最高级域机构名属性对照表
域 国家
at 奥地利 (全称:Austria)
au 澳大利亚 (全称:Australia)
ca 加拿大 (全称:Canada)
ch 瑞士 (全称:Switzerland"
cn 中国 (全称:China)
de 德国 (全称:Genmark"Deutschland")
dk 丹麦 (全称:Denmark)
es 西班牙 (全称:Spain"Espana")
fr 法国 (全称:Fance)
gr 希腊 (全称:Greece)
ie 爱尔兰共和国 (全称:Republic of Zreland)
jp 日本 (全称:Japan)
nz 新西兰 (全称:New zealand)
uk 英国 (全称:United Kingdow)
us 美国 (全称:United States)
(4)伪Internet地址
有许多机构希望与Internet相连接,
(5)IP地址与 host命令
可以在使用正规地址的任何地方使用IP地址。
如果要测试 DNS,可以使用host命令。有以下两种格式:
host standard-address
host IP-address
如果你从一个标准地址入手:
host ucsd.edu
DNS将显示IP地址:
host 128.54.16.1
反之如果你从一个IP地址入手,DNS将显示标准地址。
只有Internet主机才有IP地址(仿真终端是没有的)。
如果指定的地址是未与Internet直接连接的计算机的。
host not found
host 命令并不适用于所有的计算机。如果你的系统没有host,
(6)UUCP
所有Unix系统都有一个叫做UUCP的内置联网系统。
UUCP的功能不及TCP/IP强。例如,
它提供了一种经济的方式在计算机之间远距离传送邮件。但是,
(7)UUCP地址和Bang路径
建立一个由名字依次排列组成的地址,名字之间用!符号分开。
mailbeta!gamma!delta!murray
在Unix术语中,!符号的专门术语名字之一是bang。因此,
(8)简化的UUCP地址
为了使得UUCP获取地址方便,
因此,有时可能看见一种使用UUCP的最高级域的地址。例如,
albert@gendeau.uucp
当使用这样一个地址时,就等于向邮件路由软件发出了一个信号,
[2]INTERNET邮件系统
(1)intrenet电子邮件系统基础
<1> 传送受理程序
邮件系统是可输送各类信息的综合服务系统:像文献、印刷品、
SMTP,表示简易邮件传送协议(
在大多数系统中,传送受理程序在“后台”中运行,
每一个Unix系统都有各种隐放在“后台”
<2>电子邮件系统接口(Interface)
a. 用户邮件程序: 做为一个用户,你不会直接与你系统中的传送受理程序发生联系;
b.Unix基础邮件程序
通用的有ELM(全屏) 、PINE(菜单驱动)、MH(文件操作者)、MUSH (Zmail)、RMAIL(
C.邮件信头编写
标准格式的邮件是由两部分组成:“信头”和“主体”。
下面是一个样本文件。信头格式在操作系统中也许有变动,
Fromrick@tsi.com WedMar3114:47:021993(From+地址+
Received:fromhub.ucsb.edu by engineering.ucsb.edu
id AA15594toharley: Wed, 31Mar9313:19: 25PST
Received:from fuzzball(fuzzball.ucsb.edu)byh
id AA11868
Sendmail4.1/UCSB2.0sun
Wed.3lNar9313:23:58SPST for harley@cs.ucsb.edu
Received:by FUZZBALL(5.57/UCSB-V2)
id AA07200:Wed,31Mar9313:17:40PST
Received:fromtsi.combyucsd.edu
Send mail 5.67/UCSD-2.2 sunvia SMTP
Wed.31 Mar 9313:23:520800 for harley@fuzzball.ucsb.edu
Received:bysdcc12.UCSD.EDU(4.
id AA25582 to harley@fuzzball.ucsb.edu;
Wed.31 Mar 9313:23:51PST
Date:Wed.31 Mar 9313:23:51PST
From:rick@tsi.com(RickStout)
MessageId:9303311840.AA067ll@
X.Mailer:MailUser's Shell(7.1.27/11/90)
To:harley@fuzball.ucsb.edu
Subject:this is the subject
Cc:ad die@nipper.com kim@nipper.com
Status:Ro
Harley:I have setup an appoint ment for next Thursday afternoon.
PIease let me know if you can attend.
...Rick
来源: rick@tsi.com1993年3月31日星期三14点47
接收: from hub.ucsb.edu by engineering.ucsb.edu
id AA15594 to harley:93年3月31日星期三13:19:25PST
接收: from fuzzball(fuzzball.ucsb.edu)by hub.ucsb.edu
id AA11868
传送邮件4.1/UCSB-2.Osun
93年3月31日早期三13:23:58PST到harley@
接收: 由fuzzball(5.57/UCSB-v2)
id AA07200; 93年3月31日星期三,时间13:17:40PST
接收:来自tsi.com by ucsd.edu;idAA03169
传送邮件通过SMTP5.67/UCSD-2.2sun
93年3月31日星期三时间13:25:520800到harl
接收:由sdcc12.UCSD.EDU(4.1/
发送id AA25582至harley@fuzzball.ucsb.
93年3月31日星期三;13:23:51PST
日期:93年3月31日星湖三13:23:51PST
来源: rick@tsi.com(Rick Stout)
文件标识符:93O3311840.AA06711@tsi
X-邮件者: Mail User's Shell(7.1.27/11/90)
至: harley@fuzzball.ucsb.edu
标题:具体题目
副本(Cc): addie@nipper.com kim@nipper.com
状态:RO
Harley:在下星期四下午,我安排了一次会见,
Rick
以上例子说明,在信头中的第一行总是单词“ From”,该行表明发信人的地址。在我们这个例子中,文件是从
d.用MIME传送二进制数据(
为了收发二进制数据,
[3]基本的网络协议
(1)SMTP
下图显示了SMTP的基本模型。
图一、 SMTP模型
邮件传输过程的下一步是传输RCPT命令以标识报文的目的端,
第三步是发送DATA命令。
(1.1)地址段格式
发送方SMTP使用了一个标准的送地址和接收地址格式,
local-part@domain-name
因此SMTP名字遵从了域名系统(DNS)的概念,
Jones@beta.aus.edu
其中本地用户名为Jones,beta.aus.edu是Jon
² 一个直接的连接(use@host)
² 邮件接收方位于一台非SMTP主机,通过一个邮件网关接收邮件(
² 多台主机间的应答(@host-b@host-c@hostd)
(2)POP3
首先,P O P 3服务器启动P O P 3服务,并监听110端口。当客户机要仅用P O P 3服务时,它先与 POP3服务器建立一条TCP连接。若连接成功建立,
每个POP3会话总是处于一系列的状态变化中。
(2.1)POP3的基本命令
² USER
这个命令以用户的帐号名称作为参数。
² PASS
这个命令以用户的口令作为参数,
² STAT
该命令无参数,仅用于“命令交互状态”。
获取当前用户邮件总数和邮件总大小。
C: STAT
S: +OK 2320
² LIST
该命令可以没有参数也可以有一个参数,该参数代表邮件的序
号,但该序号不能是已删除邮件。
该命令仅用于“命令交互状态”。
C: LIST
S: +OK 2 messages( 320 octets)
S: 1 120
S: 2 200
S: .
......
C: LIST 2
S: +OK 2 200
......
C: LIST 3
S: -ERR no such mesage, only 2 message in maildrop.
² RETR
该命令必须带有一个邮件序号,该邮件序号不能是已删除邮件。
该命令仅用于“命令交互状态”。
若POP3服务器返回一个成功响应,则随后的响应属于多行响应。
C: RETR 1
S: +OK 120 octets
S: <>
C: RETR 5
S: -ERR no such message.
² DELE
该命令必须带一个邮件序号参数。仅用于“命令交互状态”
POP3服务器把该邮件标志为“已删除”,之后,
C: DELE 1
S: +OK message 1 deleted
......
C: DELE 1
S: -ERR message 2 already deleted
² NOOP
该命令不待参数,实际上也不做任何事情。仅用于“命令交互状态”
C: NOOP
S: +OK
² RSET
该命今不带参数。仅用于“命令交互状态”。
POP3服务器将所有已被标志为删除的邮件的删除标志取消,
C: RSET
S: +OK maildrop has 2 messages ( 320 octets)
² QUIT
该命令无参数,仅用于“命令交互状态”。
POP3服务器把所有已标志为删除的邮件删除,并释放在“
2.SMTP
1、概述
SMTP被用来在因特网上传递电子邮件。
协议的原理很简单。无非是一个客户端计算机向服务器发送命令,
首先要与邮件服务器连接,服务器将返回文本。
220-ns.cinfo.ru Sendmail 8.6.12/8.6.9 ready at Wed, 22 Apr 1998 22:54:41 +0300
220 ESMTP spoken here
这些描述可能会因服务器而异。
向服务器传递的第一个命令是HELO. 该命令包含一个参数,即你的邮箱名。
HELO oleg
注意: 在RFC821中,HELO是一个可选择性命令,
如果命令成功,服务器会返回一个代码为250的回应。
下一步用MAIL FROM命令告诉服务器你想发一封邮件。
MAIL FROM: oleg@vbip.com
发完命令后,如果服务器返回一个代码为250回应,
RCPT TO命令以收信人地址为参数,
RCPT TO: somebody@domain.com
如果你想将邮件发给多个收件人的话。你需要多次使用RCPT TO命令,对每个命令,服务器都会返回代码为250的回应。
现在可以向服务器发送邮件正文了。
用DATA命令告诉服务器以下的内容为邮件正文。
Subject: My first e-mail message.
First line of a message.
Second line.
注意上面最后一行的最后一个字符是一个小数点。
250 WAA10568 Message accepted for delivery
任务完成了,可以继续发送下封邮件,也可以断开同服务器的连接。
QUIT
221 ns.cinfo.ru closing connection
2、工作机制
SMTP设计基于以下通信模型:针对用户的邮件请求,
一旦传送通道建立,
SMTP提供传送邮件的机制,
MAIL命令参数是回复路径,它指定邮件从何处来;
3、基本命令(所有的命令都是四个字母组成)
发送邮件操作涉及到不同的数据对象,它们由不同的参数相互连接。
(0)HELO(HELLO)
HELO〈SP〉〈domain〉〈CRLF>
通知服务器客户的身份。
此命令用于向接收SMTP确认发送SMTP。
(1)MAIL
MAIL FROM:
此命令用于开始将邮件发送到一个多个邮箱中。
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,
(2)RCPT(recipient)
RCPT TO:
此命令用于确定邮件内容的唯一接收者;
此命令给出向前路径标识接收者,如果命令被接收,
不仅包括邮件,它是主机和目的邮箱的路由表,
(3)DATA
DATA
如果命令被接收,接收方返回一个354 Intermediate应答,并认定以下的各行都是信件内容。
注意:邮件内容包括如下提示:Date, Subject, To, Cc, From。
邮件内容指示符确认邮件操作并告知接收者可以存储和再发送数据了
(4)RSET
RSET
此命令指示当送邮件操作将被放弃。任何保存的发送者,
(5)SEND
SENDFROM:〈reverse-path>
此命令用于开始一个发送命令,将邮件发送到一个或多个终端上。
回复路径包括一个可选的主机列表和发送者邮箱。
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,
(6)SOML(send or mail)
SOMLFROM:〈reverse-path>
此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,
回复路径包括一个可选的主机列表和发送者邮箱。
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,
(7)SAML(send and mail)
SAMLFROM:〈reverse-path>
此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,
回复路径包括一个可选的主机列表和发送者邮箱。
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,
(8)VRFY(verify vt.证实,查证;证明)
VRFY〈string〉
此命令要求接收者确认参数是一个用户。如果这是(已经知道的)
(9)EXPN(expand vt.扩大;使膨胀)
EXPN〈string〉
此命令要求接收者确认参数指定了一个邮件发送列表,
(10)NOOP
NOOP
此命令不影响任何参数和已经发出的命令。
(11)QUIT
QUIT
此命令指示接收方必须发送OK应答然后关闭传送信道。