date: 2015/09/20


sh模块


sh官方文档


基本使用


直接使用命令对应的函数


如:print(sh.ls("/"))


  1. 命令参数分别以函数参数的形式给出
    如:tar("cvf", "/tmp/test.tar", "/my/home/directory/")
    即执行linux命令tar -cvf /tmp/test.tar /my/home/directory/
  2. 命令名中如果出现横线-则其对应的函数名应改为下划线_
    如:linux命令google-chrome对应函数google_chrome


自定义命令函数


如:


    lscmd = sh.Command("/bin/ls -l")  
    lscmd("/")


即将带参数linux命令/bin/ls -l“封装”成lscmd()


提供参数的两种形式


以linux命令curl http://duckduckgo.com/ -o page.html --silent为例


  1. 以关键词参数的形式给出
    sh.curl("http://duckduckgo.com/", o="page.html", silent=True)
  2. 以分割的字符串的形式给出
    sh.curl("http://duckduckgo.com/", "-o", "page.html", "--silent")


后台运行


命令默认前台运行(阻塞式,block),如果将命令转至后台(非阻塞式,doesn't block),添加关键词参数_bg=True即可

如:sh.sleep(3, _bg=True)


管道


使用linux中的管道命令,直接用函数的嵌套调用即可

如:sh.wc( sh.ls("/etc", "-l"), "-l" )

即linux命令ls /etc -l | wc -l


默认情况下,被传递的命令完成后才会传递给管道命令

如上例中ls完成后才会传递并执行wc命令


给被传递的命令函数加入参数_piped=True后,可以使两个命令同时执行,被传递的命令不断得将新产生的返回信息传递给管道命令

如上例中不等ls完成即会传递并执行wc命令,ls不断产生新的信息并不断传递给wc命令


数据流重定向


使用参数_out={filename}_err={filename}分别将标准输出和错误输出重定向到指定文件中

如果文件已存在,默认将清空文件内容后重新写入

如:sh.ls(_out="files.list")


标准输入stdin


可以给一个命令函数提供标准输入

只需要提供参数_in={stdin}即可

如:print( sh.cat(_in="hello") )

“stdin”不仅可以是字符串,还可以是文件、队列和任何可迭代对象(列表、集合、字典等)


子命令的两种形式


以linux命令sudo ls /root为例


  1. 使用命令函数下的对应子函数
    sh.sudo.ls("/root")
  2. 将子命令作为参数给出
    sh.sudo( "ls", "/root" )


注意:对于sudo命令,用户必须设置NOPASSWD选项使该用户在命令执行时无需再输入密码才能正常执行


命令回传值的接收与处理


命令函数的返回内容除了其应有的输出,还包含exit_code属性记录命令的回传值(一般正常执行的回传值为0)

如:

print(sh.ls("/root"))打印ls命令的输出

print(sh.ls("/root").exit_code)打印ls命令的回传值



通配符的使用


将使用通配符的字符串用sh.glob()函数处理(注意不是glob.glob()函数

如:

sh.ls( sh.glob("*.py") )

即linux命令ls *.py


进阶使用


暂略……