Linux|这篇 Linux 总结得很棒啊!

1. Linux安装因为图太多了 , 转载一篇从虚拟机 vmware 配置到 centos7 详细安装教程2.linux常用命令2.1 常见目录

/bin存放二进制可执行文件(ls,cat,mkdir等) , 常用命令一般都在这里 。
/etc存放系统管理和配置文件
/home存放所有用户文件的根目录 , 是用户主目录的基点 , 比如用户user的主目录就是/home/user , 可以用~user表示
/usr用于存放系统应用程序 , 比较重要的目录/usr/local 本地系统管理员软件安装目录(安装系统级的应用) 。 这是最庞大的目录 , 要用到的应用程序和文件几乎都在这个目录 。/usr/x11r6 存放x window的目录/usr/bin 众多的应用程序
/usr/sbin 超级用户的一些管理程序
/usr/doc linux文档
/usr/include linux下开发和编译应用程序所需要的头文件
/usr/lib 常用的动态链接库和软件包的配置文件
/usr/man 帮助文档
/usr/src 源代码 , linux内核的源代码就放在/usr/src/linux里
/usr/local/bin 本地增加的命令
/usr/local/lib 本地增加的库
/opt额外安装的可选应用程序包所放置的位置 。 一般情况下 , 我们可以把tomcat等都安装到这里 。
/proc虚拟文件系统目录 , 是系统内存的映射 。 可直接访问这个目录来获取系统信息 。
/root超级用户(系统管理员)的主目录(特权阶级^o^)
/sbin存放二进制可执行文件 , 只有root才能访问 。 这里存放的是系统管理员使用的系统级别的管理命令和程序 。 如ifconfig等 。
/dev用于存放设备文件 。
/mnt系统管理员安装临时文件系统的安装点 , 系统提供这个目录是让用户临时挂载其他的文件系统 。
/boot存放用于系统引导时使用的各种文件
/lib存放跟文件系统中的程序运行所需要的共享库及内核模块 。 共享库又叫动态链接共享库 , 作用类似windows里的.dll文件 , 存放了根文件系统程序运行所需的共享文件 。
/tmp用于存放各种临时文件 , 是公用的临时文件存储点 。
/var用于存放运行时需要改变数据的文件 , 也是某些大文件的溢出区 , 比方说各种服务的日志文件(系统启动日志等 。 )等 。
/lost+found这个目录平时是空的 , 系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里
2.2 命令基本格式2.2.1 命令提示符[root@xiaoming ~] #
  • root 当前登录用户
  • localhost 主机名
  • ~ 当前工作目录,默认是当前用户的家目录 , root就是/root,普通用户是 /home/用户名
  • 提示符 超级用户是 #,普通用户是$
2.2.2 命令格式
  • 命令 [选项] [参数]
  • 当有多个选项时 , 可以写在一起
  • 一般参数有简化和完整写法两种 -a 与 --all 等效
2.2.3 ls
  • 查询目录中的内容
  • ls [选项] [文件或者目录]
  • 选项
    • -a 显示所有文件 , 包括隐藏文件
    • -l 显示详细信息
    • -d 查看目录本身的属性而非子文件 ls /etc/
    • -h 人性化的方式显示文件大小
    • -i 显示inode,也就是i节点 , 每个节点都有ID号
  • 默认当前目录下的文件列表
-l显示详细信息
drwxr-xr-x . 1 root root 800 Sep 16 00:19 logs
drwxr-xr-x.1rootroot800Sep 16 00:19logs
文件类型和权限ACL权限硬链接引用计数所有者所属组文件大小最后修改时间文件名
文件类型和权限 -rw-r--r--
  • 文件类型 - 文件、d 目录、l 软链接文件
  • u(所有者)、g(所属组)、o(其他人)
  • r(read) 读取、w(write) 写入、x(execute) 执行
2.3 文件处理命令2.3.1 mkdir
  • 建立目录 make directory
  • mkdir -p [目录名]
    • -p 递归创建
2.3.2 cd
  • 切换所在目录 change directory
  • cd [目录]
    • 上次目录
    • ~ 家目录
    • 家目录
    • . 当前目录
    • .. 上级目录
  • 相对路径是参照当前所在目录
  • 绝对路径是从根目录开始
  • 按TAB键可以补全命令和目录
2.3.3 pwd
  • 显示当前目录 pwd
2.3.4 rmdir
  • 删除目录 remove empty directory
  • rmdir [目录名]
2.3.5 rm
  • 删除文件或者目录 remove
  • rm [文件或者目录]
    • -r 删除目录
    • -f 强制删除
  • rm -rf 文件或者目录] 递归强制删除所有目录
2.3.6 cp
  • copy 复制命令
  • copy [源文件或者目录] [目标文件]
    • -r 复制目录,默认是复制文件
    • -p 连带文件属性复制
    • -d 若源文件是链接文件 , 则复制连接属性
    • -a 相当于 -rpd
2.3.7 mv
  • 移动文件或者改名 move
  • mv [源文件或者目录] [目标文件]
2.3.8 ln
  • 链接命令,生成链接文件 link
2.3.8.1 硬链接特征
  • 拥有相同的i节点和存储block块 , 可以看作是同一个文件
  • 可以通过i节点访问
  • 不能跨分区
  • 不能针对目录使用
  • 一般不使用
2.3.8.2 软链接特征
  • ln -s [源文件] [目标文件]
    • -s 创建软链接
  • 类似Windows快捷方式
  • 软链接拥有自己的i节点和Block块 , 但是数据块中只保存源文件的文件名和i节点号 , 并没有实际的文件数据
  • lrwxrwxrwx l 软链接 软链接的文件权限都是 777
  • 修改任意一个文件 , 另一个都会改变
  • 删除源文件 , 软链接不能使用
  • 软链接源文件必须写绝对路径
2.4 文件搜索命令2.4.1 locate
  • 在后台数据库中按文件名搜索 , 速度比较快
  • 数据保存在 /var/lib/mlocate 后台数据库 , 每天更新一次
  • 可以 updatedb 命令立刻更新数据库
  • 只能搜索文件名
  • /etc/updatedb.conf
    建立索引的配置文件
    • PRUNE_BIND_MOUNTS = "yes" 全部生效 , 开启搜索限制
    • PRUNEFS 不搜索的文件系统
    • PRUNENAMES 忽略的文件类型
    • PRUNEPATHS 忽略的路径 /tmp
2.4.2 whereis
  • 搜索命令所在路径以及帮助文档所在位置
  • whereis 命令名 whereis ls
    • -b 只查找可执行文件
    • -m 只查找帮助文件
2.4.3 which
  • 可以看到别名 which ls
  • 能看到的都是外部安装的命令
  • 无法查看Shell自带的命令 , 如 which cd
2.4.4 环境变量/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
  • 【Linux|这篇 Linux 总结得很棒啊!】定义的是系统搜索命令的路径
  • echo $PATH
2.4.5 find
  • 文件搜索命令
  • find [搜索范围] [搜索条件]
2.4.5.1 按名称搜索
  • 避免大范围的搜索 , 会非常消耗系统资源
  • find / -name aaa.log
2.4.5.2 通配符
  • find是在系统当中搜索符合条件的文件名 , 如果需要匹配 , 使用通配符匹配 , 通配符是完全匹配
  • 通配符
    • * 匹配任意内容
    • ? 匹配任意一个字符
    • [] 匹配任意一个中括号内的字符
find . -name "ab[cdef]" 2.4.5.3 -i
不区分大小写
find / -iname A.log
2.4.5.4 -user
按所有者进行搜索
find /root -user root
find /root -nouser
2.4.5.5 按时间搜索 find /nginx/access.log -mtime +5
参数含义
atime文件访问时间
ctime改变文件属性
mtime修改文件内容
参数含义
-55天内修改的文件
55天前当前修改的文件
+55天前修改的文件
2.4.5.6 按大小搜索
  • k小写,M大写
find . -size 100k
参数含义
-8k小于8K
8k等于8K
+8k大于8K
+8M小于8M
2.4.5.7 按i节点搜索 find . -inum 123456
2.4.5.8 综合应用 find /tmp -size +10k -a -size -20k
  • 查找/etc目录下 , 大于10KB并且小于20KB的文件
  • -a and 逻辑与 , 两个条件都满足
    • -o or 逻辑或 , 两个条件满足一个就可以
find /tmp -size +10k -a -size -20k - execls -lh {} ;
  • exec 对上个命令的结果进行操作
2.4.5.9 grep
  • 在文件当中匹配符合条件的字符串
  • grep "10" access.log
    • -i 忽略大小写
    • -v 排除指定字符串
  • find命令 , 在系统当中搜索符合条件的文件名 , 如果需要匹配 , 使用通配符匹配 , 通配符是完全匹配
  • grep命令 在文件当中搜索符合条件的字符串 , 如果需要匹配 , 使用正则表达式进行匹配 , 正则表达式时包含匹配
2.5 帮助命令2.5.1 基本用法
  • man 命令 获取指定命令的帮助
    • man ls 查看ls的帮助
man -f ls whatis ls
man 1 ls
man 1p ls2.5.2 关键字搜索- man -k passwd
2.5.3 shell 内部帮助
  • whereis
    找到就是外部 , 找不到就是内部
help cd 2.6 压缩与解压缩命令.zip` `.gz` `.bz2` `.tar.gz` `.tar.bz2
2.6.1 zip格式
  • 压缩文件 zip 压缩文件名 源文件
  • 压缩目录 zip -r 压缩文件名 源目录
  • 解压 unzip 压缩文件名
mkdir book touch book/1.txt
touch book/2.txt
zip -r book.zip book
unzip book.zip
2.6.2 gzip
命令示例含义
gzip 源文件gzip a.txt压缩为.gz格式的压缩文件 , 源文件会消失
gzip -c 源文件 > 压缩文件gzip -c yum.txt > yum.txt.gz压缩为.gz格式的压缩文件 , 源文件不会消失
gzip -r 目录gzip -r xx压缩目录下的所有子文件 , 但是不压缩目录
gzip -d 压缩文件名gzip -d yum.txt.gz解压缩文件,不保留压缩包
gunzip 压缩文件gunzip yum.txt.gz解压缩文件,不保留压缩包
  • 压缩是压缩目录下的文件
2.6.3 .bz2格式压缩
命令示例含义
bzip2 源文件bzip2 1.txt压缩为.bz2格式的文件 , 不保留源文件
bzip2 -k 源文件zip2 -k 1.txt压缩为.bz2格式的文件 , 保留源文件
bzip2 -d 压缩文件名bzip2 -d 1.txt.bz2解压压缩包
bunzip2 压缩文件名bunzip2 1.txt.bz2解压压缩包
  • bzip2 不能压缩目录
2.6.4 tar
  • 打包命令
  • tar -cvf 打包文件名 源文件
    • -c 打包
    • -v 显示过程
    • -f 指定打包后的文件名
tar -cvf book.tar book gzip book.tar
bzip2 book.tar
  • x 解打包
tar -xvf book.tar 2.6.4 压缩格式
压缩
tar –cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg
tar –czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.tar后 , 并且将其用gzip压缩 , 生成一个gzip压缩过的包 , 命名为jpg.tar.gz
tar –cjf jpg.tar.bz2 *.jpg //将目录里所有jpg文件打包成jpg.tar后 , 并且将其用bzip2压缩 , 生成一个bzip2压缩过的包 , 命名为jpg.tar.bz2
tar –cZf jpg.tar.Z *.jpg //将目录里所有jpg文件打包成jpg.tar后 , 并且将其用compress压缩 , 生成一个umcompress压缩过的包 , 命名为jpg.tar.Z
rar a jpg.rar *.jpg //rar格式的压缩 , 需要先下载rar for linux
zip jpg.zip *.jpg //zip格式的压缩 , 需要先下载zip for linux
解压
tar –xvf file.tar //解压 tar包
tar -xzvf file.tar.gz //解压tar.gz
tar -xjvf file.tar.bz2 //解压 tar.bz2
tar –xZvf file.tar.Z //解压tar.Z
unrar e file.rar //解压rar
unzip file.zip //解压zip
2.7 关机和重启命令2.7.1 shutdownshutdown 关机命令
  • -c 取消前一个关机命令
  • -h 关机
  • -r 重启
shutdown -r 06:00 shutdown -c
2.7.2 init
关机
init 0
重启
init 6
系统的运行级别
  • 0 关机
  • 1 但用户
  • 2 不 完全多用户 , 不包含NFS服务
  • 3 完全多用户
  • 4 未分配
  • 5 图形界面
  • 6 重启
2.7.3 logout退出登录
logout
2.9 查看登录用户信息2.9.1 w
查看登录用户信息
  • USER 登录的用户名
  • TTY 登录的终端 tty1 本地终端 pts/0远程终端
  • FROM 登录的IP
  • LOGIN 登录时间
  • IDLE 用户闲置时间
  • JCPU 该终端所有进程占用的时间
  • PCPU 当前进程所占用的时间
  • WHAT 正在执行的命令
2.9.2 who查看登录用户信息
  • USER 登录的用户名
  • TTY 登录的终端 tty1 本地终端 pts/0远程终端
  • LOGIN 登录时间(登录的IP)
2.9.3 last查看当前登录和过去登录的用户信息 默认读取 /var/log/wtmp 文件
  • 用户名
  • 登录终端
  • 登录IP
  • 登录时间
  • 退出时间(在线时间)
2.9.4 lastlog查看所有用户的最后一次登录时间
  • 用户名
  • 登录终端
  • 登录IP
  • 最后一次登录时间
3. shell
  • shell是一个命令行解释器 , 它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序
  • 用户可以用Shell来启动、挂起、停止或者编写一些程序
  • Shell还是一个功能相当强大的编程语言 , 易编写 , 易调试 , 灵活性较强 。
  • Shell是解释执行的脚本语言 , 在Shell中可以直接调用Linux系统命令 。
3.1 查看支持的shell
  • /etc/shells
3.2 echo
  • 输出命令
  • --e 支持反斜线控制的字符转换
控制字符作用
\a输出警告音
\b退格键 , 也就是向左删除键
\n换行符
\r回车键
\t制表符 , 也就是Tab键
\v垂直制表符
\onnn按照八进制ASCII码表输出字符 , 其中0为数字零 , nnn是三位八进制数
\xhh按照十六进制ASCII码表输出字符 , 其中hh是两位十六进制数
3.3 编写执行shell#!/bin/bash
echo-e "\e[1;34m hello world \e[0m"
赋予执行权限 , 直接运行
chmod 755 hello.sh
./hello.sh
通过Bash调用执行脚本
bash hello.sh
3.4 别名
  • 命令别名 == 小名
  • 临时生效
  • alias
  • alias rm="rm -i"
  • 写入环境变量配置文件 vi ~/.bashrc
  • source ~/.bashrc
  • unalias 别名 删除别名
3.5 命令的生效顺序
  • 绝对路径或者相对路径
  • 别名
  • bash内部命令
  • 按照$PATH环境变量定义的目录查找顺序找到的第一个命令
3.6 命令快捷键
命令含义
ctrl+c强制终止当前命令
ctrl+l清屏
ctrl+a光标移动到命令行首
ctrl+e光标移动到命令行尾
ctrl+u从光标所在的位置删除到行首
ctrl+z把命令放入后台
ctrl+r在历史命令中搜索
3.7 历史命令
  • history [选项] [历史命令保存文件]
  • 选项
    • -c 清空历史命令
    • -w 把缓存中的历史命令写入历史命令保存文件 ~/.bash_history
  • 默认保存1000条 /etc/profile HISSIZE=10000
3.8 调用
  • 使用上下箭头调用以前的历史命令
  • 使用 !n 重复执行第n条历史命令
  • 使用 !! 重复执行上一条命令
  • 使用 !字符 重复执行最后一条以该字符串开头的命令
3.9 管道符号3.9.1 多命令顺序执行(1) ; 分号 , 没有任何逻辑关系的连接符 。 当多个命令用分号连接时 , 各命令之间的执行成功与否彼此没有任何影响 , 都会一条一条执行下去 。
(2) || 逻辑或 , 当用此连接符连接多个命令时 , 前面的命令执行成功 , 则后面的命令不会执行 。 前面的命令执行失败 , 后面的命令才会执行 。
(3) && 逻辑与 , 当用此连接符连接多个命令时 , 前面的命令执行成功 , 才会执行后面的命令 , 前面的命令执行失败 , 后面的命令不会执行 , 与 || 正好相反 。
(4) | 管道符 , 当用此连接符连接多个命令时 , 前面命令执行的正确输出 , 会交给后面的命令继续处理 。 若前面的命令执行失败 , 则会报错 , 若后面的命令无法处理前面命令的输出 , 也会报错 。
chmod 755 hello.sh
./hello.sh
3.9.2 管道符号
  • 命令1的正确输出会作为命令2的操作对象
  • 命令1|命令2
ls /etc/ | more netstat -an | grep ESTABLISHED | wc -l
3.9.3 通配符
匹配文件名和目录名 |通配符|作用| |:----|:----| |?|匹配一个任意字符| |*|匹配0个或任意字符 , 也就是可以匹配任意内容| |[]|匹配中括号中任意一个字符| |[-]|匹配中括号中任意一个字符,-代表范围| |[^]|匹配不是中括号中的一个字符|
3.9.4 其它符号
符号作用
''单引号 。 在单引号中所有的特殊符号 , 如$和`都没有特殊含义
""双引号 , 在双引号里特殊符号都没有特殊含义 , 但是 $ ` \ 例外 , 拥有调用变量值 , 引用命令和转义的含义
``反引号 , 扩起来的是系统命令
$和反引号一样
#在shell脚本中 , #开头的行代表注释
$用于调用变量的值
\转义符号
- a=`ls`
- b=$(ls)
4. vi 编辑器
  • VI visual interface
  • 可视化接口
  • 类似与windows中的记事本
  • vim支持多级撤销
  • 跨平台
  • 语法高亮
  • 支持图形界面
4.1 操作模式
  • :w 保存
  • :q 退出
  • :! 强制保存
  • :ls 列出所有的文件
  • :n 下一个
  • :N 上一个
  • :15 跳转到指定行
  • /xxx 从光标位置开始向后搜索 xxx 字符串
  • ?xxx 从光标位置开始向前搜索
5. 用户和用户组
  • 使用操作系统的人都是用户
  • 用户组是具有相同系统权限的一组用户
5.1 用户组5.1.1 /etc/group
  • /etc/group 存储当前系统中所有用户组信息
  • group:x:123:abc,def
  • 组名称:组密码占位符:组编号:组中用户名列表
  • root 组编号为0
  • 1-499系统预留的编号 预留给安装的软件和服务的
  • 用户手动创建的用户组从500开始
  • 组密码占位符都是x
5.1.2 /etc/gshadow
  • 存放当前系统中用户组的密码信息
  • 和group中的记录一一对应
  • Group: * : :abc
  • 组名称 组密码 组管理者 组中用户名
5.1.3 /etc/passwd
  • 存储当前系统中所有用户的信息
  • user:x:123:456:xxxxx:/home/user:/bin/bash
  • 用户名:密码占位符:用户编号: 用户注释信息:用户主目录:shell类型
5.1.4 /etc/shadow
  • 存放当前系统中所有用户的密码信息
  • user:xxx:::::::
  • 用户名:密码:
6. 用户操作 添加组
groupadd student
修改组名称
groupmod -n stu student
修改组编号
groupmod -g 111 stu
添加分组并指定编号
groupadd -g 222 teacher
删除分组
groupdel 222
添加分组
groupadd teacher
为用户指定所属组
useradd -g teacher zhangsan
为用户指定所属组
useradd -g teacher lisi
为用户指定工作目录
useradd -d /home/zhangsan zhangsan
指定注释
usermod -c iamateacher zhangsan
修改用户名
usermod -l zhangsan zhangsan2
指定文件夹
usermod -d /home/zhangsan2 zhangsan2
修改用户所属组
usermod -g stu zhangsan2
删除用户
userdel zhangsan2
删除所属文件夹
userdel -r lisi
7. 用户命令
显示登录的用户名
whoami
显示指定用户信息 , 包括用户编号 , 用户名 主要组的编号及名称 , 附属组列表
id zhangsan
显示 zhangsan 用户所在的所有组
groups zhangsan
显示用户详细资料
finger zhangsan
8. 附录8.1 系统启动8.1.1 BIOS
  • 计算机通电后 , 第一件事就是读取刷入ROM芯片的开机程序 , 这个程序叫做(Basic Input/Output System)
8.1.2 硬件自检
  • BIOS程序首先检查 , 计算机硬件能否满足运行的基本条件 , 这叫做"硬件自检"(Power-On Self-Test)
  • 如果硬件出现问题 , 主板会发出不同含义的蜂鸣 , 启动中止 。 如果没有问题 , 屏幕就会显示出CPU、内存、硬盘等信息 。
8.1.3 启动顺序
  • 硬件自检完成后 , BIOS把控制权转交给下一阶段的启动程序 。
  • 这时 , BIOS需要知道 , "下一阶段的启动程序"具体存放在哪一个设备
  • BIOS需要有一个外部储存设备的排序 , 排在前面的设备就是优先转交控制权的设备 。 这种排序叫做"启动顺序"(Boot Sequence)
  • BIOS按照"启动顺序" , 把控制权转交给排在第一位的储存设备 。
  • 这时 , 计算机读取该设备的第一个扇区 , 也就是读取最前面的512个字节 。 如果这512个字节的最后两个字节是0x55和0xAA , 表明这个设备可以用于启动;如果不是 , 表明设备不能用于启动 , 控制权于是被转交给"启动顺序"中的下一个设备 。
  • 这最前面的512个字节 , 就叫做"主引导记录"(Master boot record , 缩写为MBR)
8.1.4 主引导记录的结构
  • "主引导记录"只有512个字节 , 放不了太多东西 。 它的主要作用是 , 告诉计算机到硬盘的哪一个位置去找操作系统 。
    • (1) 第1-446字节:是用来记录系统的启动信息的,调用操作系统的机器码
    • (2) 第447-510字节(64个字节):分区表(Partition table) , 分区表的作用 , 是将硬盘分成若干个区
    • (3) 第511-512字节:主引导记录签名(0x55和0xAA)
8.1.5 分区表
  • 磁盘分区是使用分区编辑器在磁盘上划分几个逻辑部分
  • 磁盘一旦划分成多个分区 , 不同类的目录与文件可以存储进不同的分区内
  • "主引导记录"因此必须知道将控制权转交给哪个区
  • 分区表的长度只有64个字节 , 里面又分成四项 , 每项16个字节 。 所以 , 一个硬盘最多只能分四个一级分区 , 又叫做"主分区"
    • (1) 第1个字节:如果为0x80 , 就表示该主分区是激活分区 , 控制权要转交给这个分区 。 四个主分区里面只能有一个是激活的 。
    • (2) 第2-4个字节:主分区第一个扇区的物理位置(柱面、磁头、扇区号等等) 。
    • (3) 第5个字节:主分区类型 , 比如FAT32、NTFS等 。
    • (4) 第6-8个字节:主分区最后一个扇区的物理位置 。
    • (5) 第9-12字节:该主分区第一个扇区的逻辑地址 。
    • (6) 第13-16字节:主分区的扇区总数 。
8.1.6 硬盘启动
  • 计算机的控制权就要转交给硬盘的某个分区了
  • 四个主分区里面 , 只有一个是激活的 。 计算机会读取激活分区的第一个扇区 , 叫做"卷引导记录"(Volume boot record , 缩写为VBR)
8.1.7 操作系统
  • 控制权转交给操作系统后 , 操作系统的内核首先被载入内存 。
  • 以Linux系统为例 , 先载入 /boot 目录下面的 kernel。 内核加载成功后 , 第一个运行的程序是 /sbin/init。 它根据配置文件(Debian系统是/etc/initab)产生init进程 。 这是Linux启动后的第一个进程 , pid进程编号为1 , 其他进程都是它的后代
  • 然后 ,init 线程加载系统的各个模块 , 比如窗口程序和网络程序 , 直至执行 /bin/login 程序 , 跳出登录界面 , 等待用户输入用户名和密码 。
作者:孟祥
—版权声明—
来源:Linux爱好者 , 编辑:nhyilin
仅用于学术分享 , 版权属于原作者 。
若有侵权 , 请联系微信号:Eternalhui或nhyilin删除或修改!
—THE END—
? 平凡而又神奇的贝叶斯方法
? 怎样用数学找到一颗丢失的氢弹?
? 【物理方程】物理学中最难的方程之一 , 你知道多少?
? 为什么一定要拼尽全力考上985、211大学?
? 怎样判断漂亮女孩是不是单身的?
? 投资数学天才西蒙斯:尽你所能和最优秀的人合作

    推荐阅读