管道

管道命令操作符是:”|”,它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandarderror 信息没有直接处理能力。然后,传递给下一个命令,作为标准的输入 standard input.

图 1

如图,command1正确输出,作为command2的输入 然后comand2的输出作为,comand3的输入 ,comand3输出就会直接显示在屏幕上面了。通过管道之后:comand1,comand2的正确输出不显示在屏幕上面。

注意:

1、管道命令只处理前一个命令正确输出,不处理错误输出。

2、管道命令右边命令,必须能够接收标准输入流命令才行。作用接收标准输入的命令才可以用作管道右边。否则传递过程中数据会抛弃。

常用来作为接收数据管道命令(文本处理命令)有:

sed,awk,cut,head,top,less,more,wc,join,sort,split 等。
3.  一般如果是命令间传递参数,还是管道的好,如果处理输出结果需要重定向到文件,还是用重定向输出比较好。

[root@s2 ~]# cat /etc/passwd |grep -n "var"
:adm:x:::adm:/var/adm:/sbin/nologin
:lp:x:::lp:/var/spool/lpd:/sbin/nologin
:mail:x:::mail:/var/spool/mail:/sbin/nologin
:ftp:x:::FTP User:/var/ftp:/sbin/nologin
:libstoragemgmt:x:::daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
:avahi:x:::Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
:avahi-autoipd:x:::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
:rpc:x:::Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
:chrony:x::::/var/lib/chrony:/sbin/nologin
:pegasus:x:::tog-pegasus OpenPegasus WBEM/CIM services:/var/lib/Pegasus:/sbin/nologin
:colord:x:::User for colord:/var/lib/colord:/sbin/nologin
:rpcuser:x:::RPC Service User:/var/lib/nfs:/sbin/nologin
:nfsnobody:x:::Anonymous NFS User:/var/lib/nfs:/sbin/nologin
:pulse:x:::PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
:gdm:x::::/var/lib/gdm:/sbin/nologin
:pcp:x:::Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
:sshd:x:::Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
:postfix:x::::/var/spool/postfix:/sbin/nologin
:oprofile:x:::Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin [root@s2 ~]# cat /etc/passwd /etc/abc |grep -n "var" cat: /etc/abc: No such file or directory
#不存在 abc,错误输出也到屏幕 :adm:x:::adm:/var/adm:/sbin/nologin
:lp:x:::lp:/var/spool/lpd:/sbin/nologin
:mail:x:::mail:/var/spool/mail:/sbin/nologin
:ftp:x:::FTP User:/var/ftp:/sbin/nologin
:libstoragemgmt:x:::daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
:avahi:x:::Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
:avahi-autoipd:x:::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
:rpc:x:::Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
:chrony:x::::/var/lib/chrony:/sbin/nologin
:pegasus:x:::tog-pegasus OpenPegasus WBEM/CIM services:/var/lib/Pegasus:/sbin/nologin
:colord:x:::User for colord:/var/lib/colord:/sbin/nologin
:rpcuser:x:::RPC Service User:/var/lib/nfs:/sbin/nologin
:nfsnobody:x:::Anonymous NFS User:/var/lib/nfs:/sbin/nologin
:pulse:x:::PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
:gdm:x::::/var/lib/gdm:/sbin/nologin
:pcp:x:::Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
:sshd:x:::Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
:postfix:x::::/var/spool/postfix:/sbin/nologin
:oprofile:x:::Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin [root@s2 ~]# cat /etc/passwd /etc/abc > err.txt |grep -n "var"
cat: /etc/abc: No such file or directory
cat: : No such file or directory
[root@s2 ~]# cat /etc/passwd /etc/abc > err.txt |grep -n "var"
:adm:x:::adm:/var/adm:/sbin/nologin
:lp:x:::lp:/var/spool/lpd:/sbin/nologin
:mail:x:::mail:/var/spool/mail:/sbin/nologin
:ftp:x:::FTP User:/var/ftp:/sbin/nologin
:libstoragemgmt:x:::daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
:avahi:x:::Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
:avahi-autoipd:x:::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
:rpc:x:::Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
:chrony:x::::/var/lib/chrony:/sbin/nologin
:pegasus:x:::tog-pegasus OpenPegasus WBEM/CIM services:/var/lib/Pegasus:/sbin/nologin
:colord:x:::User for colord:/var/lib/colord:/sbin/nologin
:rpcuser:x:::RPC Service User:/var/lib/nfs:/sbin/nologin
:nfsnobody:x:::Anonymous NFS User:/var/lib/nfs:/sbin/nologin
:pulse:x:::PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
:gdm:x::::/var/lib/gdm:/sbin/nologin
:pcp:x:::Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
:sshd:x:::Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
:postfix:x::::/var/spool/postfix:/sbin/nologin
:oprofile:x:::Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
[root@s2 ~]# cat err.txt
cat: /etc/abc: No such file or directory # ls命令不支持标准输入,所有未例会管道的输出文件名HBaseTestCase.java
[root@s2 ~]# cat /home/zpf/file.txt
HBaseTestCase.java [root@s2 ~]# cat /home/zpf/file.txt |ls
.pcap anaconda-ks.cfg Documents dpi_log err.txt ftp.pcap Music pcap Pictures t1 tcpreplay-3.4. telnet_only.pcap Templates wcp_55_pcap_1452502359.pcap
a Desktop Downloads eclipse ftp_big.pcap initial-setup-ks.cfg nohup.out perl5 Public t60 tcpreplay-3.4..tar.gz telnet.pcap Videos workspace
[root@s2 ~]# grep -n "root" < /etc/passwd
:root:x:::root:/root:/bin/bash
:operator:x:::operator:/root:/sbin/nologin [root@s2 ~]# (sed -n "1,10p" | grep -n "var") < /etc/passwd
:adm:x:::adm:/var/adm:/sbin/nologin
:lp:x:::lp:/var/spool/lpd:/sbin/nologin
:mail:x:::mail:/var/spool/mail:/sbin/nologin
#

grep.需要将前面用"()"

运算符括起来。在单括号内的命令,可以把它们看作一个象一个命令样。#如果不加括号test.sh就是grep 的输入了,如下
[root@s2 ~]# sed -n "1,10p" | grep -n "var" < /etc/passwd
:adm:x:::adm:/var/adm:/sbin/nologin
:lp:x:::lp:/var/spool/lpd:/sbin/nologin
:mail:x:::mail:/var/spool/mail:/sbin/nologin
:ftp:x:::FTP User:/var/ftp:/sbin/nologin
:libstoragemgmt:x:::daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
:avahi:x:::Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
:avahi-autoipd:x:::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
:rpc:x:::Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
:chrony:x::::/var/lib/chrony:/sbin/nologin
:pegasus:x:::tog-pegasus OpenPegasus WBEM/CIM services:/var/lib/Pegasus:/sbin/nologin
:colord:x:::User for colord:/var/lib/colord:/sbin/nologin
:rpcuser:x:::RPC Service User:/var/lib/nfs:/sbin/nologin
:nfsnobody:x:::Anonymous NFS User:/var/lib/nfs:/sbin/nologin
:pulse:x:::PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
:gdm:x::::/var/lib/gdm:/sbin/nologin
:pcp:x:::Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
:sshd:x:::Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
:postfix:x::::/var/spool/postfix:/sbin/nologin
:oprofile:x:::Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin [root@s2 ~]# sed -n "1,10p" </etc/passwd | grep -n "var" < /etc/passwd
:adm:x:::adm:/var/adm:/sbin/nologin
:lp:x:::lp:/var/spool/lpd:/sbin/nologin
:mail:x:::mail:/var/spool/mail:/sbin/nologin
:ftp:x:::FTP User:/var/ftp:/sbin/nologin
:libstoragemgmt:x:::daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
:avahi:x:::Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
:avahi-autoipd:x:::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
:rpc:x:::Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
:chrony:x::::/var/lib/chrony:/sbin/nologin
:pegasus:x:::tog-pegasus OpenPegasus WBEM/CIM services:/var/lib/Pegasus:/sbin/nologin
:colord:x:::User for colord:/var/lib/colord:/sbin/nologin
:rpcuser:x:::RPC Service User:/var/lib/nfs:/sbin/nologin
:nfsnobody:x:::Anonymous NFS User:/var/lib/nfs:/sbin/nologin
:pulse:x:::PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
:gdm:x::::/var/lib/gdm:/sbin/nologin
:pcp:x:::Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
:sshd:x:::Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
:postfix:x::::/var/spool/postfix:/sbin/nologin
:oprofile:x:::Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin ##重定向运算符,在shell命令解析前,首先检查的(一个命令,执行前一定检查好它的输入,输出,也就是0,

, 设备是否准备好),所以优先级会最高。如下示例,"<"

运算符会优先,管道还没有发送数据前,grep绑定了testsh.sh输入,这样sed命令输出就被抛弃了。这里一定要小心使用

[root@s2 ~]# sed -n "1,10p" </etc/passwd  | grep -n "var" < /etc/passwd
:adm:x:::adm:/var/adm:/sbin/nologin
:lp:x:::lp:/var/spool/lpd:/sbin/nologin
:mail:x:::mail:/var/spool/mail:/sbin/nologin
:ftp:x:::FTP User:/var/ftp:/sbin/nologin
:libstoragemgmt:x:::daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
:avahi:x:::Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
:avahi-autoipd:x:::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
:rpc:x:::Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
:chrony:x::::/var/lib/chrony:/sbin/nologin
:pegasus:x:::tog-pegasus OpenPegasus WBEM/CIM services:/var/lib/Pegasus:/sbin/nologin
:colord:x:::User for colord:/var/lib/colord:/sbin/nologin
:rpcuser:x:::RPC Service User:/var/lib/nfs:/sbin/nologin
:nfsnobody:x:::Anonymous NFS User:/var/lib/nfs:/sbin/nologin
:pulse:x:::PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
:gdm:x::::/var/lib/gdm:/sbin/nologin
:pcp:x:::Performance Co-Pilot:/var/lib/pcp:/sbin/nologin
:sshd:x:::Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
:postfix:x::::/var/spool/postfix:/sbin/nologin
:oprofile:x:::Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin

管道和重定向的区别

1、左边的命令应该有标准输出 | 右边的命令应该接受标准输入
   左边的命令应该有标准输出 > 右边只能是文件

左边的命令应该需要标准输入 < 右边只能是文件

2、管道触发两个子进程执行"|"两边的程序;而定向是在一个进程内执行。

重定向

重定向和文件描述符有关。

      linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。 用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值。linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error output 2。以后打开文件后。新增文件绑定描述符 可以依次增加。 一条shell命令执行,都会继承父进程的文件描述符。因此,所有运行的shell命令,都会有默认3个文件描述符。

文件输入输出由追踪为一个给定的进程所有打开文件的整数句柄来完成。这些数字值就是文件描述符。最为人们所知的文件米描述符是 stdin, stdoutstderr,文件描述符的数字分别是0,1和2。这些数字和各自的设备是保留的。一个命令执行前,先会准备好所有输入输出,默认分别绑定(stdin,stdout,stderr),如果这个时候出现错误,命令将终止,不会执行。命令解析过程。

如下图:一个命令执行了:先有一个输入:输入可以从键盘,也可以从文件得到命令执行完成:成功了,会把成功结果输出到屏幕:standard output默认是屏幕。命令执行有错误:会把错误也输出到屏幕上面:standard error默认也是指的屏幕。

根据应用的场景,改变1,2的默认输出,这就是重定向

linux上的标准输入、输出、错误,如下:,&表示全部

[root@s2 ~]# ll /dev/std*
lrwxrwxrwx root root May : /dev/stderr -> /proc/self/fd/
lrwxrwxrwx root root May : /dev/stdin -> /proc/self/fd/
lrwxrwxrwx root root May : /dev/stdout -> /proc/self/fd/

输出重定向

注意:

1、shell遇到”>”操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件。不存在直接创建。 无论左边命令执行是否成功。右边文件都会变为空。

2、“>>”操作符,判断右边文件,如果不存在,先创建。以添加方式打开文件,会分配一个文件描述符[不特别指定,默认为1,2]然后,与左边的标准输出(1)或错误输出(2) 绑定。

3、当命令:执行完,绑定文件的描述符也自动失效。0,1,2又会空闲。

4、一条命令启动,命令的输入,正确输出,错误输出,默认分别绑定0,1,2文件描述符。

5、一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行

几个示例如下:

[root@s2 zpf]# cat file.txt abc.txt  > /dev/null | tee  all.txt |grep java
HBaseTestCase.java
[root@s2 zpf]# cat all.txt
HBaseTestCase.java #通过管道实现将结果存入文件,还需要借助命令tee,它会把管道过来标准输入写入文件test.txt ,然后将标准输入复制到标准输出(stdout),所以重定向到/dev/null 不显示输出
#">"输出重定向,往往在命令最右边,接收左边命令的,输出结果,重定向到指定文件。也可以用到命令中间。 [root@s2 zpf]# cat file.txt abc.txt &> /dev/null | tee all.txt |grep java
[root@s2 zpf]#
#这次打印结果是空,&代表正确与错误输出 都输入给err.txt,通过管道继续往下面传递数据为空,所以没有什么显示的 #同样">"输出重定向符,优先级也是先解析,当一个命令有这个字符,它就会与左边命令标准输出绑定。准备好了这些,就等待命令执行输出数据,它就开始接收
[root@s2 zpf]# ll file.txt abc.txt >ok.txt >err.txt
[root@s2 zpf]# cat ok.txt
-rw-r--r-- root root May : file.txt
[root@s2 zpf]# cat err.txt
ls: cannot access abc.txt: No such file or directory [root@s2 zpf]# ll file.txt abc.txt >>ok.txt >>err.txt
[root@s2 zpf]#
[root@s2 zpf]# cat ok.txt
-rw-r--r-- root root May : file.txt
-rw-r--r-- root root May : file.txt
[root@s2 zpf]# cat err.txt
ls: cannot access abc.txt: No such file or directory
ls: cannot access abc.txt: No such file or directory #如下,标准错误输出到null,正确输出先写到ok.txt ,.然后再标准输出
[root@s2 zpf]# ll file.txt abc.txt >/dev/null |tee ok.txt
-rw-r--r-- root root May : file.txt
[root@s2 zpf]# cat ok.txt
-rw-r--r-- root root May : file.txt #关闭所有输出,效果等同于绑定到null
#&[n] 代表是已经存在的文件描述符,& 代表输出 &2代表错误输出 &-代表关闭与它绑定的描述符 [root@s2 zpf]# ll file.txt abc.txt >&- >&-
[root@s2 zpf]#
[root@s2 zpf]# ll file.txt abc.txt >/dev/null >/dev/null
[root@s2 zpf]#

输入重定向

格式:command-line [n] <file或文件描述符&设备。命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入。执行这个命令,将标准输入0,与文件或设备绑定。将由它进行输入。

[root@s2 zpf]# cat >out.txt
adsfafsd [root@s2 zpf]# cat out.txt
adsfafsd [root@s2 zpf]# cat >out.txt <file.txt
[root@s2 zpf]# cat out.txt
HBaseTestCase.java 如下,#<< 这个连续两个小符号, 他代表的是『结束的输入字符』的意思。这样当空行输入eof字符,输入自动结束,不用ctrl+D [root@s2 zpf]# cat >out.txt <<eof
>
>
>
>
>
> eof
[root@s2 zpf]# cat out.txt

exec绑定重定向

几点说明:

(1)I/O重定向通常与 FD有关,shell的FD通常为10个,即 0~9;常用:0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),默认与keyboard、monitor、monitor有关。

(2)用 >  来改变送出的数据信道(stdout, stderr),使之输出到指定的档案

(3)在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料;

(4)tee 命令是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去。

(5)bash(ksh)执行命令的过程:分析命令-变量求值-命令替代(``和$( ))-重定向-通配符展开-确定路径-执行命令;

(6)( ) 将 command group 置于 sub-shell 去执行,也称 nested sub-shell,它有一点重要的特性是:继承父shell的Standard input, output, and error plus any other open file descriptors。

(7)exec 命令:常用来替当前 shell 并重新启动一个 shell,换句话说,并没有启动子 shell。使用这一命令时任何现有环境都将会被清除。exec 在对文件描述符进行操作的时候,也只有在这时,exec 不会

覆盖你当前的 shell 环境。

(8) n&- 表示将 n 号输出关闭

(9)  2>&1 表示:运行一个命令并把它的标准输出和输出合并。2>&1 也就是 FD2=FD1 ,这里并不是说FD2 的值 等于FD1的值,因为 > 是改变送出的数据信道,也就是说把 FD2 的 “数据输出通道” 改

为 FD1 的 “数据输出通道”。如果仅仅这样,这个改变好像没有什么作用,因为 FD2 的默认输出和 FD1的默认输出本来都是 monitor,一样的。

(10) stdin, stdout, stderr 进行了重定向或关闭, 但没有保存原来的 FD(如果要保存, exec 9>&1,将fd1保存在fd9中), 恢复到 default 状态的方式:

如果关闭了stdin,因为会导致退出,那肯定不能恢复。

如关闭 stdout和stderr其中之一,可恢复,因他们默认均往monitor(但不知会否有其他影响)。如恢复重定向或关闭的 stdout: exec 1>&2 ,恢复重定向或关闭的stderr:exec 2>&1。

如果stdout和stderr全部都关闭了,又没有保存原来的FD,可以用:exec 1>/dev/tty 恢复。

(11) cmd >a 2>&1 比 cmd >a 2>a更高效。

cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。使用了两个互相竞争使用文件a的管道。

cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。

(12)  exec 1>outfilename # 打开文件outfilename作为stdout    。exec 2>errfilename # 打开文件 errfilename作为 stderr 。

下面的例子,将stdout(fd1)由屏幕重定向到文件,再恢复到屏幕。

#将fd9和stdout的fd1绑定,也即保存fd1的句柄资源信息到fd9
[root@s2 ~]# exec >& [root@s2 ~]# ll /proc/self/fd
total
lrwx------ root root May : -> /dev/pts/
lrwx------ root root May : -> /dev/pts/
lrwx------ root root May : -> /dev/pts/
lr-x------ root root May : -> /proc//fd
lrwx------ root root May : -> /dev/pts/
[root@s2 ~]# touch /home/stdout
[root@s2 ~]# #将fd1的标准输出重定向到 /home/stdout文件
[root@s2 ~]# exec >/home/stdout # ls的输出在屏幕上没有任何信息,全部在 /home/stdout中
[root@s2 ~]# ls #恢复 fd1句柄资源的原来信息,即恢复默认的stdout输出
[root@s2 ~]# exec >&
#恢复后,可以看到输出到屏幕
[root@s2 ~]# ls
.pcap anaconda-ks.cfg Documents dpi_log err.txt ftp.pcap Music pcap Pictures t1 tcpreplay-3.4. telnet_only.pcap Templates wcp_55_pcap_1452502359.pcap
a Desktop Downloads eclipse ftp_big.pcap initial-setup-ks.cfg nohup.out perl5 Public t60 tcpreplay-3.4..tar.gz telnet.pcap Videos workspace # fd9任务完成,可以删除它啦
[root@s2 ~]# exec >&-

最新文章

  1. 分页插件--根据Bootstrap Paginator改写的js插件
  2. ASP.NET MVC Model元数据(三)
  3. RPM包管理命令rpm
  4. 用shell脚本监控进程是否存在 不存在则启动的实例
  5. java基础算法-快速排序
  6. ASP.NET Entity Framework with MySql服务器发布环境配置
  7. Java troubleshooting guide
  8. 利用Java实现表达式二叉树
  9. 修改linux命令行提示符路径显示
  10. [Android]APK程序卸载二次确认的实现
  11. Chrome不支持本地Ajax请求,解决办法
  12. BZOJ3513[MUTC2013]idiots——FFT+生成函数
  13. Spring cloud Eureka错误锦集(一)
  14. vue中,class与style绑定
  15. Codeforces 987E Petr and Permutations(数组的置换与复原 、结论)
  16. 激光数据匹配(MATLAB Robotics System Toolbox)
  17. LeetCode——Rectangle Area
  18. WCF学习笔记之并发与限流
  19. Centos下 yum方式安装LAMP
  20. 支持触屏的zepto轮播图插件

热门文章

  1. System.getProperty方法中输出路径的方法
  2. FineReport——决策系统组件API
  3. html,图片上传预览,input file获取文件等相关操作
  4. Python 什么是ORM?
  5. LeetCode解题报告—— Combination Sum &amp; Combination Sum II &amp; Multiply Strings
  6. 怎么制作CHM格式电子书
  7. Combination Sum I&amp;&amp;II(经典的回溯算法题)
  8. 【转载】Web Service 的工作原理
  9. Mongo Connector for BI
  10. file &#39;/grub/i386-pc/normal.mod&#39; not found.解决方案