社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
本文笔记源自这里——[实验楼]
欢迎大家在下面交流其中有问题的地方喜欢请点收藏,每日更新(全部已亲自实践).
终端本质上是对应着Linux上的/dev/tty设备,linux的多用户登陆就是通过不同的/dev/tty设备完成的,Linux默认提供了6个纯命令行界面的"terminal"(准确的说这里应该是6个virtual consoles)来让用户登录,你可以通过使用[Ctrl]+[Alt]+[F1]~[F6]
进行切换,不过在在线实验环境中可能无法切换,因为特殊功能按键会被你主机系统劫持。当你切换到其中一个终端后想要切换回图形界面,你可以按下[Ctrl]+[Alt]+[F7]
来完成
Shell是指“提供给使用者使用界面”的软件(命令解析器),类似于DOS下的command(命令行)和后来的cmd.exe。之所以被称作shell是因为它隐藏了操作系统底层的细节。就像是个Shell(壳),有壳就有核,这里的核就是指的UNIX/Linux内核。同样的Unix/Linux下的图形用户界面GNOME和KDE,有时也被叫做“虚拟shell”或“图形shell”(这里我查了下 Ubuntu下默认是bash,Deepin下默认是zsh)
按键 | 作用 |
---|---|
Tab |
进行命令补全 |
Ctrl+c |
强行终止当前程序(最常用,你可以放心它并不会使终端退出) |
Ctrl+d |
这个才是强制退出终端的(不用敲exit了) |
Ctrl+s |
暂定当前程序,暂停后按下任意键恢复运行(网络交互有用) |
Ctrl+z |
将当前程序放到后台运行,恢复到前台为命令fg |
Ctrl+u |
删除光标所在的整行 |
Ctrl+q |
删除光标所在的整行(保留当前输入) |
Ctrl+k |
删除从光标所在位置到行末 |
Alt+Backspace |
向前删除一个单词 |
Shift+PgUp |
将终端显示向上滚动 |
Shift+PgDn |
将终端显示向下滚动(知道了以上这些命令几乎可以放弃鼠标了) |
举例:
$ touch love_{1..10}_linux.txt
shell常用通配符:
通配符 | 含义 |
---|---|
* |
匹配 0 或多个字符 |
? |
匹配任意一个字符 |
[list] |
匹配 list 中的任意单一字符 |
[!list] |
匹配 除list 中的任意单一字符以外的字符 |
[c1-c2] |
匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] |
{string1,string2,...} |
匹配 sring1 或 string2 (或更多)其一字符串 |
{c1..c2} |
匹配 c1-c2 中全部字符 如{1..10} |
看好了哈,请打开终端,输入命令:
$ who am i // deepin 中输入who即可
新建一个叫lilei的用户:
$ sudo adduser lilei
现在你创建好一个用户,你可以使用你 创建的用户登录了,使用如下命令切换登录用户( -l 即 login)
$ su -l lilei
使用usermod命令可以为用户添加用户组,同样使用该命令你必需有root权限,你可以直接使用root用户为其它用户添加用户组,或者用其它已经在sudo用户组的用户使用sudo命令获取权限来执行该命令
这里我用shiyanlou用户执行sudo命令将lilei添加到sudo用户组,让它也可以使用sudo命令获得root权限
$ su shiyanlou
$ groups lilei
$ sudo usermod -G sudo lilei
$ groups lilei
然后你再切换回lilei用户,现在就可以使用sudo获取root权限了。
使用较长格式列出文件
$ ls -l
前面提到过,如果你的兄弟姐妹想把你的艾派德据为己有,要是这种事真的发生了,那么我也告诉你如何把他们的爱疯嗯6抢过来
不信的话我们可以来做个小测试,首先打开终端
假设目前是lilei登录,他用他存了半年零花钱买了个爱疯嗯6
$ touch iphone6
瞧你嘚瑟,居然还打上了自己专属标签
好了他出门,忘记带走他的手机了,先去他房间,准备好下手
$ cd /home/lilei
$ ls iphone6
$ sudo chown shiyanlou iphone6
$ cp iphone6 /home/shiyanlou
然后再来看看爱疯恩6是不是就变成你的了
假设你已经抢过来那部爱疯恩了,正所谓辛苦得来的就倍感珍惜,你想好好保护它,也不想让别人玩它,那么你可以去掉它的读权限,如果你还想让它变成一件收藏品不再开机,那么你可以去掉它的执行权限。下面来告诉你怎么做,这里也还有两种方式:
$ chmod go-rw iphone
二进制懂吧,二进制转十进制懂吧,好吧,不懂也没关系
$ echo "echo "hello shiyanlou"" > iphone6
然后修改权限
$ chmod 600 iphone6
这个“600“分别表示各个位置上00表示组用户和访客用户无权限,6表示没有执行权限(4+2 +0)
正好这时候李雷回来了,他发现爱疯恩已经不属于他了,而且你还不允许他使用,他只有独自郁闷了
介绍: linux的目录与windows的目录实现机制来说是完全不同的.
Linux目录结构理解起来也简单,因为它其中大部分目录结构是规定好了(FHS标准)
使用 cd 命令可以切换目录,在linux里面使用 . 表示当前目录, ..表示上一级目录(**注意,还记得我们上一节介绍过的,以 . 开头的文件都是隐藏文件,所以这两个目录必然也是隐藏的,你可以使用ls -a命令查看隐藏文件), -表示上一次所在目录, ~ 通常表示当前用户的"home"目录。使用 pwd 命令可以获取当前所在路径(绝对路径)
进入你的“home”目录
$ cd ~ //不管现在在哪个目录下 运行这个命令就会回到当前用户的home目录
或者cd /home/<你的用户名>
cd - 返回刚才的目录
绝对路径
关于绝对路径,简单地说就是以根"/"目录为起点的完整路径,以你所要到的目录为终点
相对路径
相对路径,也就是相对于你当前的目录的路径,相对路径是以当前目录为起点(即 . ),以你所要到的目录为终点
提示: 在进行目录切换的过程中请多使用Tab键自动补全,可避免输入错误,连续按两次Tab可以显示全部候选结果
touch
mkdir
cp(copy)
命令复制一个文件或目录到指定目录cp命令
复制一个目录的话,会出现错误-r或者-R参数
,表示递归复制(Recursion copy),即“株连九族”的意思rm
(remove files or directories)命令,删除一个文件或目录-f
参数强制删除,忽略有只读权限文件的提示rm
或者rmdir
)-r
或-R
参数mv
移动命令是不需要递归移动的!!!)rm
rename
rename先使用第二个参数的通配符匹配所有后缀为.txt的文件,然后使用第一个参数提供的正则表达式将匹配的这些文件的.txt后缀替换为.c,这一点在我们后面学习了sed命令后,相信你会更好的理解。
$ cat passwd
可以加上-n参数显示行号
$ cat -n passwd
-b : 指定添加行号的方式,主要有两种:
-b a:表示无论是否为空行,同样列出行号("cat -n"就是这种方式)
-b t:只列出非空行的编号并列出(默认为这种方式)
-n : 设置行号的样式,主要有三种:
-n ln:在行号字段最左端显示
-n rn:在行号字段最右边显示,且不加0
-n rz:在行号字段最右边显示,且加0
-w : 行号字段占用的位数(默认为6位)
空格键
下翻一页,按B键
上翻一页,按Q键
退出。less命令与more命令类似,但是用pageup
键和pagedown键
或上下箭头
实现上下翻页。在linux下面文件的类型不是根据文件后缀来判断的,我们通常使用file命令可以查看文件的类型
$ file /bin/ls
在linux下面编辑文件通常我们会直接使用专门的命令行编辑器比如(emacs,vim,nano)
如果想更加快速的入门,你可以直接使用linux内部的vim学习教程,输入如下命令即可开始
$ vimtutor
$whereis who
查找/etc下所有以sh开头的文件
$ locate /etc/sh
注意,它不只是在etc目录下查找并会自动递归子目录进行查找
查找/usr/share/下所有jpg文件
$ locate /usr/share/*.jpg
注意要添加*号前面的反斜杠转义,否则会无法找到
只统计数目可以加上-c参数,-i参数忽略大小写进行查找,whereis的-b,-m,-s同样适用
$ which man
$ find /etc/ -name interfaces
注意find命令的路径是作为第一个参数的, 基本命令格式为 find [path] [option] [action]
tar的解压和压缩都是同一个命令,只需参数不同而已
$ tar -cf shiyanlou.tar ~
$ mkdir tardir
$ tar -xf shiyanlou.tar -C tardir
$ tar -tf shiyanlou.tar
$ tar -cphf etc.tar /etc
$ tar -czf shiyanlou.tar.gz ~ //顺序理解:“创建”一个“gizp”格式的“文件”
$ tar -xzf shiyanlou.tar.gz //理解同上
压缩文件 | 格式参数 |
---|---|
*.tar.gz | -z |
*.tar.xz | -J |
*tar.bz2 | -j |
总结一下常用的两个命令:
$ df
在实际的物理主机上会像这样
我主机上的/dev/sda2是对应着我主机硬盘的分区,后面的数字表示分区号,数字前面的字母a表示第几块硬盘(也可能是你的可移动磁盘),你如果主机上有多块硬盘则可能还会出现/dev/sdb,/dev/sdc,这些磁盘设备都会在/dev目录下以文件的存在形式。
接着你还会看到"1k-blocks"这个陌生的东西,它表示以磁盘块大小的方式显示容量,后面为相应的以块大小表示的已用和可用容量,在你了解linxu的文件系统之前这个就先不管吧,我们以一种你应该看得懂的方式展示
$ df -h
现在你就可以使用命令查看你主机磁盘的使用情况了。至于挂载点如果你还记得前面章节节讲linux目录树结构的内容,那么你就应该能很好的理解挂载的概念,这里就不再赘述。
# 默认同样以blocks的大小展示
$ du
# 加上-h
参数,以更易读的方式展示
$ du -h
-d
参数指定查看目录的深度
# 只查看1级目录的信息
$ du -h -d 0 ~
# 查看2级$ du -h -d 1 ~
du
(estimate file space usage)命令与df
(report file system disk space usage)只一字只差,首先注意不要弄混淆了,从man手册中获取命令的完整描述,记全称就不会搞混了。
通常情况下,这一小节应该直接讲
但如你所见,我们的环境中没东西给你挂,也没东西给你格和分,所以首先我们会先创建一个虚拟磁盘来进行后续的练习操作
你可能会想要是我可以一次性输入完所以命令,让它自己去一次执行各命令就好了,简单的顺序执行你可以使用;
来完成,你可以
$ sudo apt-get update;sudo apt-get install some-tool;some-tool
# ~~~~~它运行它的,你可以去干其它事了~~~~~~~
如果我们在让它自动顺序执行命令时,前面的命令执行不成功,而后面的命令又依赖与上一条命令的结果,那么就会造成花了时间,最终却得到一个错误的结果,而且有时候直观的看你还无法判断结果是否正确。那么我们需要能够有选择性的来执行命令(比如上一条命令执行成功才继续下一条,或者不成功又该做出其它什么处理)
比如我们使用which
来查找是否安装某个命令,如果找到就执行该命令,否则什么也不做
$ which cowsay>/dev/null && cowsay -f head-in ohch~
你如果没有安装cowsay
,你可以先执行一次上述命令,你会发现什么也没发生,你再安装好之后你再执行一次上述命令,你也会发现一些惊喜(出现奇怪生物)
上面的&&
就是用来实现选择性执行的,它表示如果前面的命令执行结果(不是表示终端输出的内容,而是表示命令执行状态的结果)返回0 ,则执行后面的,否则,不执行.
你可以从$?
环境变量获取上一次命令的返回结果
$ which cowsay>/dev/null || echo "cowsay has not been install, please run 'sudo apt-get install cowsay' to install"
除了上述基本的使用之外,我们还可以结合这&&和||来实现一些操作,比如
$ which cowsay>/dev/null && echo "exist" || echo "not exist"
&&
和||
结合起来使用,那么是否以任意顺序都行了,比如上面我们是&&
在前||
在后,反过来可以么,会不会有问题.
$ ls -al /etc | less
通过管道将前一个命令(ls)的输出作为下一个命令(less)的输入,然后你就可以慢慢的悠哉悠哉的一行一行看了。
打印/etc/passwd
文件中以:为分隔符的第1个字段和第6个字段分别表示用户名和其家目录
$ cut /etc/passwd -d ':' -f 1,6
打印/etc/passwd
文件中每一行的前N个字符
# 前五个(包含第五个)
$ cut /etc/passwd -c -5
# 前五个之后的(包含第五个)
$ cut /etc/passwd -c 5-
# 第五个
$ cut /etc/passwd -c 5
# 2到5之间的(包含第五个)
$ cut /etc/passwd -c 2-5
grep
命令是很强大的,也是相当常用的一个命令,它结合正则表达式可以实现很复杂却很高效的匹配和查找,不过在学习正则表达式之前,这里介绍它简单的使用,而关于正则表达式后面将会有单独一小节介绍到时会再继续学习grep
命令和其他一些命令grep
命令的一般形式为:
grep [命令选项]... 用于匹配的表达式 [文件]...
还是先体验一下,我们搜索/home/shiyanlou
目录下所有包含"shiyanlou"的所有文本文件,并显示出现在文本中的行号
$ grep -rnI "shiyanlou" ~
当然你可以在匹配字段中使用正则表达式,简单的演示:
# 查看环境变量中以"yanlou"结尾的字符串
$ export | grep ".*yanlou$ "
wc
命令用于统计并输出一个文件中行、单词和字节的数目比如输出/etc/passwd文件的统计信息
$ wc /etc/passwd
分别只输出行数、单词数、字节数、字符数和输入文本中最长一行的字节数
# 行数
$ wc -l /etc/passwd
# 单词数
$ wc -w /etc/passwd
# 字节数
$ wc -c /etc/passwd
# 字符数
$ wc -m /etc/passwd
# 最长行字节数
$ wc -L /etc/passwd
注意:对于西文字符来说,一个字符就是一个字节,但对于中文字符一个汉子是大于2个字节的,具体数目是由字符编码决定的
$ ls -dl /etc/*/ | wc -l
这个命令前面用过多次了,功能就是将输入按照一定方式排序,然后再输出,它支持的排序有按字典排序,数字排序,按月份排序,随机排序,反转排序,指定特定字段进行排序等等
$ cat /etc/passswd | sort
$ cat /etc/passwd | sort -r
$ cat /etc/passwd | sort -t':' -k 3
上面-t
参数用于指定字段的分隔符,这里是":"为分隔符;-k
字段号用于指定对哪一个字段进行排序。这里/etc/passwd
文件的第三个字段为数字,默认情况下是一字典序排序的,如果要按照数字排序就要加上-n
参数
$ cat /etc/passwd | sort -t':' -k 3 -n
uniq
命令:可以用于过滤或者输出重复行
history
命令查看最近执行过的命令(实际为读取${SHELL}_history文件,如我们环境中的~/.zsh_history文件),不过你可能只想查看使用了那个命令而不需要知道具体干了什么,那么你可能就会要想去掉命令后面的参数然后去掉重复的命令$ history | cut -c 8- | cut -d ' ' -f 1 | uniq
然后经过层层过滤,你会发现确是只输出了执行的命令那一列,不过去重效果好像不明显,仔细看你会发现它趋势去重了,只是不那么明显,之所以不明显是因为uniq
命令只能去连续重复的行,不是全文去重,所以要达到预期效果,我们只能先排个序了
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq
# 或者
$ history | cut -c 8- | cut -d ' ' -f 1 | sort -u
然后就对了,你接着可能会惊叹,哇才这么几个命令啊,可怎么感觉自己干了好多好厉害的事情了呢,哈哈,这就是Linux/Unix哲学吸引人的地方了,大繁至简,一个命令只干一件事却能干到最好(虽然不全是这样,但也差不多)。
# 输出重复过的行(重复的只输出一个)及重复次数
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
# 输出所有重复的行
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D
tr命令可以用来删除一段文本信息中的某些文字。或者将其进行转换
使用方式:
tr [option]...SET1 [SET2]
常用选项:
选项 | 说明 |
---|---|
-d |
删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配 |
-s |
去除set1指定的在输入文本中连续并重复的字符 |
操作举例:
# 删除 "hello shiyanlou" 中所有的'o','l','h'
$ echo 'hello shiyanlou' | tr -d 'olh'
# 将"hello" 中的ll,去重为一个l
$ echo 'hello' | tr -s 'l'
# 将输入文本,全部转换为大写或小写输出
$ cat /etc/passwd | tr '[:lower:]' '[:upper:]'
# 上面的'[:lower:]' '[:upper:]'你也可以简单的写作'[a-z]' '[A-Z]',当然反过来将大写变小写也是可以的
可以使用--help
或者man tr
获得更多tr的使用
还记得我们在讲打包压缩那一节提到windows/dos与linux/unix文本文件一些特殊字符不一致的问题,如断行符windows为CR+LF(rn
),unix/linux为LF(n
),你使用cat -A
文本 你可以看到文本中包含的不可见特殊字符。linux的n
表现出来就是一个$
,而windows/dos的表现为^M$
,你可以直接使用dos2unix
和unix2dos
工具在两种格式之间进行转换,使用file
命令可以查看文件的具体类型。不过现在希望你在不使用上述两个转换工具的情况下,使用前面学过的命令手动完成dos文本格式到unix文本格式的转换。
col命令可以将Tab
换成对等数量的空格建,或反转这个操作.用来格式化代码超爽
使用方式:
col [option]
常用的选项有:
选项 | 说明 |
---|---|
-x |
将Tab转换为空格 |
-h |
将空格转换为Tab(默认选项) |
操作举例:
# 查看/etc/protocols中的不可见字符,可以看到很多^I,这其实就是Tab键转义成可见字符的符号
$ cat -A /etc/protocols
# 使用col -x将/etc/protocols中的Tab转换为空格,然后再使用cat查看,你发现^I不见了
$ cat /etc/protocols | col -x | cat -A
这个命令用于将两个文件中包含相同内容的那一行合并在一起
"Talk is cheep, show me the code":
使用方式:
join [option]... file1 file2
常用的选项有:
选项 | 说明 |
---|---|
-t |
指定分隔符,默认为空格 |
-i |
忽略大小写的差异 |
-1 |
指明第一个文件要用哪个字段来对比,,默认对比第一个字段 |
-2 |
指明第二个文件要用哪个字段来对比,,默认对比第一个字段 |
操作举例:
# 创建两个文件
$ echo '1 hello' > file1
$ echo '1 shiyanlou' > file2
$ join file1 file2
# 将/etc/passwd与/etc/shadow两个文件合并,指定以':'作为分隔符
$ sudo join -t':' /etc/passwd /etc/shadow
# 将/etc/passwd与/etc/group两个文件合并,指定以':'作为分隔符, 分别比对第4和第3个字段
$ sudo join -t':' -1 4 /etc/passwd -2 3 /etc/group
paste
这个命令实际就是上面join
的懒人版,它是在不对比数据的情况下,简单粗暴的将多个文件合并一起,以Tab隔开
使用方式:
paste [option] file...
常用选项:
选项 | 说明 |
---|---|
-d |
指定合并的分隔符,默认为Tab |
-s |
不合并到一行,每个文件为一行 |
操作举例:
$ echo hello > file1
$ echo shiyanlou > file2
$ echo www.shiyanlou.com > file3
$ paste -d ':' file1 file2 file3
$ paste -s file1 file2 file3
这些命令不是所有你都会经常用到,不过你不得不承认的是它们确实很实用,熟练掌握之后,可以为你减轻很多工作量,试想你不停的用鼠标操作在gedit里面复制粘贴赋值粘贴,将两个文件的内容合并为一个文件,这原本只需要一个命名就能完成的事情。
其实重定向,就是将原本输出到标准输出的数据重定向到一个文件中,因为标准输出(/dev/stdout
)本身也是一个文件,我们将命令输出导向另一个文件自然也是没有任何问题的。
简单的回顾前面经常用到的两个重定向操作:
$ echo 'hello shiyanlou' > redirect
$ echo 'www.shiyanlou.com' >> redirect
$ cat redirect
当然前面没有用到的<
和<<
操作也是没有问题的,如你理解的一样,它们的区别在于重定向的方向不一致而已,>
表示是从左到右,<
从右到左
我们需要先知道一些基本的东西,前面我们已经提到过linux默认提供了三个特殊设备,用于终端的显示和输出,分别为stdin
(标准输入,对应于你在终端的输入),stdout
(标准输出,对应于终端的输出),stderr
(标准错误输出,对应于终端的输出)。
文件描述符 | 设备文件 | 说明 |
---|---|---|
0 |
/dev/stdin |
标准输入 |
1 |
/dev/stdout |
标准输出 |
2 |
/dev/stderr |
标准错误 |
文件描述符:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。
另外还有一个符号-
,它可以同时作为前一个命令的
我们可以这样使用这些文件描述符
# 默认使用终端的标准输入作为命令的输入和标准输出作为命令的输出
$ cat
# 将一个文件作为命令的输入,标准输出作为命令的输出
$ cat Documents/test.c~
# 将echo命令通过管道传过来的数据作为cat命令的输入,将标准输出作为命令的输出
$ echo 'hi' | cat
# 将echo命令的输出从默认的标准输出重定向到一个普通文件
$ echo 'hello shiyanlou' > redirect$ cat redirect
重定向标准输出到文件,这是一个很实用的操作,另一个很实用的操作是将标准错误重定向,标准输出和标准错误都被指向伪终端的屏幕显示,所以我们经常看到的一个命令的输出通常是同时包含了标准输出和标准错误的结果的。比如下面的操作:
# 使用cat 命令同时读取两个文件,其中一个存在,另一个不存在
$ cat Documents/test.c~ hello.c
# 你可以看到除了正确输出了前一个文件的内容,还在末尾出现了一条错误信息
# 下面我们将输出重定向到一个文件,根据我们前面的经验,这里将在看不到任何输出了
$ cat Documents/test.c~ hello.c > somefile
# 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
$ cat Documents/test.c~ hello.c >somefile 2>&1
# 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
$ cat Documents/test.c~ hello.c &>somefilehell
注意你应该在输出重定向文件描述符前加上&,否则shell会当做重定向到一个文件名为1的文件中
tee
命令同时重定向到多个文件经常你可能还有这样的需求,除了将需要将输出重定向到文件之外也需要将信息打印在终端,那么你可以使用tee
命令来实现
$ echo 'hello shiyanlou' | tee hello
你应该可以看出我们前面的重定向操作都只是临时性的,即只对当前命令有效,那如何做到“永久”有效呢,比如在一个脚本中,你需要某一部分的命令的输出全部进行重定向,难道要让你在每个命令上面加上临时重定向的操作嘛,当然不需要,我们可以使用exec
命令实现“永久”重定向。exec
命令的作用是使用指定的命令替换当前的shell
,及使用一个进程换当前进程,或者指定新的重定向
# 先开启一个子shell
$ zsh
# 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
$ exec 1>somefile
# 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
$ ls
$ exit
$ cat somefile
默认在shell中可以有9个打开的文件描述符,上面我们使用了也是它默认提供的0
,1
,2
号文件描述符,另外我们还可以使用3-8的文件描述符,只是它们默认没有打开而已,你可以使用下面命令查看当前shell进程中打开的文件描述符
$ cd /dev/fd/;ls -Al
同样使用exec
命令可以创建新的文件描述符
$ zsh
$ exec 3>somefile
# 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
$ cd /dev/fd/;ls -Al;cd -
# 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
$ echo "this is test" >&3
$ cat somefile$ exit
如上面我们打开的3号文件描述符,可以使用如下操作将它关闭
$ exec 3>&-$ cd /dev/fd;ls -Al;cd -
在linux中有一个被成为“黑洞”的设备文件,所以导入它的数据都将被“吞噬”.
在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!