【BASH】回顾与知识点梳理(十三)

【BASH】回顾与知识点梳理 十三

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

十三. 文件内容查阅

如果我们要查阅一个文件的内容时,该如何是好呢?这里有相当多有趣的指令可以来分享一下: 最常使用的显示文件内容的指令可以说是 cat 与 more 及 less 了!此外,如果我们要查看一个很大型的文件 (好几百 MB 时),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用 tail 呀,此外, tac 这个指令也可以达到这个目的喔!好了,说说各个指令的用途吧!

  • cat 由第一行开始显示文件内容
  • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
  • nl 显示的时候,顺道输出行号!
  • more 一页一页的显示文件内容
  • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
  • head 只看头几行
  • tail 只看尾巴几行
  • od 以二进制的方式读取文件内容!

13.1 直接检视文件内容:cat, tac, nl

直接查阅一个文件的内容可以使用 cat/tac/nl 这几个指令啊!

cat (concatenate)

bash 复制代码
[root@study ~]# cat [-AbEnTv]
选项与参数:
-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符
bash 复制代码
# 范例一:检阅 /etc/issue 这个文件的内容
[root@study ~]# cat /etc/issue
\S
Kernel \r on an \m

#范例二:承上题,如果还要加印行号呢?
[root@study ~]# cat -n /etc/issue
 1 \S
 2 Kernel \r on an \m
 3
# 所以这个文件有三行!看到了吧!可以印出行号呢!这对于大文件要找某个特定的行时,有点用处!
# 如果不想要编排空白行的行号,可以使用『cat -b /etc/issue』,自己测试看看:

#范例三:将 /etc/man_db.conf 的内容完整的显示出来(包含特殊字符)
[root@study ~]# cat -A /etc/man_db.conf
# $
....(中间省略)....
MANPATH_MAP^I/bin^I^I^I/usr/share/man$
MANPATH_MAP^I/usr/bin^I^I/usr/share/man$
MANPATH_MAP^I/sbin^I^I^I/usr/share/man$
MANPATH_MAP^I/usr/sbin^I^I/usr/share/man$
.....(底下省略).....
# 上面的结果限于篇幅,鸟哥删除掉很多数据了。另外,输出的结果并不会有特殊字体,
# 鸟哥上面的特殊字体是要让您发现差异点在哪里就是了。基本上,在一般的环境中,
# 使用 [tab] 与空格键的效果差不多,都是一堆空白啊!我们无法知道两者的差别。
# 此时使用 cat -A 就能够发现那些空白的地方是啥鬼东西了![tab]会以 ^I 表示,
# 断行字符则是以 $ 表示,所以你可以发现每一行后面都是 $ 啊!不过断行字符
# 在 Windows/Linux 则不太相同,Windows 的断行字符是 ^M$ 啰。

嘿嘿!Linux 里面有『猫』指令?喔!不是的, cat 是 Concatenate (连续) 的简写, 主要的功能是将一个文件的内容连续的印出在屏幕上面!例如上面的例子中,我们将 /etc/issue 印出来!如果加上-n 或 -b 的话,则每一行前面还会加上行号呦!

鸟哥个人是比较少用 cat 啦!毕竟当你的文件内容的行数超过 40 行以上,嘿嘿!根本来不及在屏幕上看到结果! 所以,配合等一下要介绍的 more 或者是 less 来执行比较好!此外,如果是一般的DOS 文件时,就需要特别留意一些奇奇怪怪的符号了, 例如断行与 tab 等,要显示出来,就得加入 -A 之类的选项了!

tac (反向列示)

bash 复制代码
[root@study ~]# tac /etc/issue

Kernel \r on an \m
\S
# 嘿嘿!与刚刚上面的范例一比较,是由最后一行先显示喔!

tac 这个好玩了!怎么说呢?详细的看一下, cat 与 tac ,有没有发现呀!对啦! tac 刚好是将 cat 反写过来,所以他的功能就跟 cat 相反啦, cat 是由『第一行到最后一行连续显示在屏幕上』,而 tac 则是『 由最后一行到第一行反向在屏幕上显示出来 』,很好玩吧!

nl (添加行号打印)

bash 复制代码
[root@study ~]# nl [-bnw] 文件
选项与参数:
-b :指定行号指定的方式,主要有两种:
 	-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
 	-b t :如果有空行,空的那一行不要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
 	-n ln :行号在屏幕的最左方显示;
 	-n rn :行号在自己字段的最右方显示,且不加 0 ;
 	-n rz :行号在自己字段的最右方显示,且加 0 ;
-w :行号字段的占用的字符数。
bash 复制代码
# 范例一:用 nl 列出 /etc/issue 的内容
[root@study ~]# nl /etc/issue
 1 \S
 2 Kernel \r on an \m
# 注意看,这个文件其实有三行,第三行为空白(没有任何字符),
# 因为他是空白行,所以 nl 不会加上行号喔!如果确定要加上行号,可以这样做:
[root@study ~]# nl -b a /etc/issue
 1 \S
 2 Kernel \r on an \m
 3
# 呵呵!行号加上来啰~那么如果要让行号前面自动补上 0 呢?可这样
[root@study ~]# nl -b a -n rz /etc/issue
000001 \S
000002 Kernel \r on an \m
000003
# 嘿嘿!自动在自己字段的地方补上 0 了~预设字段是六位数,如果想要改成 3 位数?
[root@study ~]# nl -b a -n rz -w 3 /etc/issue
001 \S
002 Kernel \r on an \m
003
# 变成仅有 3 位数啰~

nl 可以将输出的文件内容自动的加上行号!其预设的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能呢。

13.2 可翻页检视:more, less

前面提到的 nl 与 cat, tac 等等,都是一次性的将数据一口气显示到屏幕上面,那有没有可以进行一页一页翻动的指令啊? 让我们可以一页一页的观察,才不会前面的数据看不到啊~呵呵!有的!那就是 more 与 less 啰~

more (一页一页翻动)

bash 复制代码
[root@study ~]# more /etc/man_db.conf
#
#
# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
# their PATH environment variable. For details see the manpath(5) man page.
#
.....(中间省略).....
--More--(28%) <== 重点在这一行喔!你的光标也会在这里等待你的指令

仔细的给他看到上面的范例,如果 more 后面接的文件内容行数大于屏幕输出的行数时, 就会出现类似上面的图示。重点在最后一行,最后一行会显示出目前显示的百分比, 而且还可以在最后一行输入一些有用的指令喔!在 more 这个程序的运作过程中,你有几个按键可以按的:

  • f 或 空格键 (space):代表向下翻一页;
  • Enter :代表向下翻『一行』;
  • /字符串 :代表在这个显示的内容当中,向下搜寻『字符串』这个关键词;
  • :f :立刻显示出文件名以及目前显示的行数;
  • q :代表立刻离开 more ,不再显示该文件内容。
  • b 或 ctrl-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

less (一页一页翻动)

bash 复制代码
[root@study ~]# less /etc/man_db.conf
#
#
# This file is used by the man-db package to configure the man and cat paths.
# It is also used to provide a manpath for those without one by examining
# their PATH environment variable. For details see the manpath(5) man page.
#
.....(中间省略).....
: <== 这里可以等待你输入指令!

less 的用法比起 more 又更加的有弹性,怎么说呢?在 more 的时候,我们并没有办法向前面翻,只能往后面看,但若使用了 less 时,呵呵!就可以使用 pageup pagedown 等按键的功能来往前往后翻看文件,你瞧,是不是更容易使用来观看一个文件的内容了呢!

除此之外,在 less 里头可以拥有更多的『搜寻』功能喔!不止可以向下搜寻,也可以向上搜寻~ 实在是很不错用~基本上,可以输入的指令有:

  • 空格键 :向下翻动一页;
  • pagedown:向下翻动一页;
  • pageup :向上翻动一页;
  • /字符串 :向下搜寻『字符串』的功能;
  • ?字符串 :向上搜寻『字符串』的功能;
  • n :重复前一个搜寻 (与 / 或 ? 有关!)
  • N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
  • g :前进到这个资料的第一行去;
  • G :前进到这个数据的最后一行去 (注意大小写);
  • q :离开 less 这个程序;

你是否会觉得 less 使用的画面与环境与 man page 非常的类似呢?没错啦!因为 man 这个指令就是呼叫 less 来显示说明文件的内容的! 现在你是否觉得 less 很重要呢? ^_^

13.3 资料撷取:head, tail

我们可以将输出的资料作一个最简单的撷取,那就是取出文件前面几行 (head) 或取出后面几行 (tail) 文字的功能。 不过,要注意的是, head 与 tail 都是以『行』为单位来进行数据撷取的喔!

head (取出前面几行)

bash 复制代码
[root@study ~]# head [-n number] 文件 
选项与参数:
-n :后面接数字,代表显示几行的意思
bash 复制代码
[root@study ~]# head /etc/man_db.conf
# 默认的情况中,显示前面十行!若要显示前 20 行,就得要这样:
[root@study ~]# head -n 20 /etc/man_db.conf
# 范例:如果后面 100 行的数据都不打印,只打印/etc/man_db.conf 的前面几行,该如何是好?
[root@study ~]# head -n -100 /etc/man_db.conf

head 的英文意思就是『头』啦,那么这个东西的用法自然就是显示出一个文件的前几行啰! 没错!就是这样!若没有加上 -n 这个选项时,默认只显示十行,若只要一行呢?那就加入『 head -n 1 filename 』即可!另外那个 -n 选项后面的参数较有趣,如果接的是负数,例如上面范例的-n -100 时,代表列前的所有行数, 但不包括后面 100 行。举例来说 CentOS 7.1 的 /etc/man_db.conf 共有 131 行,则上述的指令『head -n -100 /etc/man_db.conf』 就会列出前面 31 行,后面 100 行不会打印出来了。这样说,比较容易懂了吧? _

tail (取出后面几行)

bash 复制代码
[root@study ~]# tail [-n number] 文件 
选项与参数:
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c 才会结束 tail 的侦测
bash 复制代码
[root@study ~]# tail /etc/man_db.conf
# 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:
[root@study ~]# tail -n 20 /etc/man_db.conf

# 范例一:如果不知道/etc/man_db.conf 有几行,却只想列出 100 行以后的数据时?
[root@study ~]# tail -n +100 /etc/man_db.conf

# 范例二:持续侦测/var/log/messages 的内容
[root@study ~]# tail -f /var/log/messages
 <==要等到输入[crtl]-c 之后才会离开 tail 这个指令的侦测!

有 head 自然就有 tail ( 尾巴 ) 啰!没错!这个 tail 的用法跟 head 的用法差不多类似,只是显示的是后面几行就是了!默认也是显示十行,若要显示非十行,就加 -n number 的选项即可。

范例一的内容就有趣啦!其实与 head -n -xx 有异曲同工之妙。当下达『tail -n +100 /etc/man_db.conf』代表该文件从 100 行以后都会被列出来,同样的,在 man_db.conf 共有 131 行,因此第 100~131 行就会被列出来啦! 前面的 99 行都不会被显示出来喔!

至于范例二中,由于/var/log/messages 随时会有数据写入,你想要让该文件有数据写入时就立刻显示到屏幕上, 就利用 -f 这个选项,他可以一直侦测/var/log/messages 这个文件,新加入的数据都会被显示到屏幕上。直到你按下[crtl]-c 才会离开 tail 的侦测喔!由于 messages 必须要 root 权限才能看,所以该范例得要使用 root 来查询喔!

假如我想要显示 /etc/man_db.conf 的第 11 到第 20 行呢?

这个应该不算难,想一想,在第 11 到第 20 行,那么我取前 20 行,再取后十行,所以结果就是:『 head -n 20 /etc/man_db.conf | tail -n 10 』,这样就可以得到第 11 到第 20 行之间的内容了!

承上一题,那如果我想要列出正确的行号呢?就是屏幕上仅列出 /etc/man_db.conf 的第 11 到第 20 行,且有行号存在?

我们可以透过 cat -n 来带出行号,然后再透过 head/tail 来撷取数据即可!所以就变成如下的模样了:cat -n /etc/man_db.conf | head -n 20 | tail -n 10(nl /etc/man_db.conf|head -n 20|tail -n 10)

13.4 非纯文本档: od

我们上面提到的,都是在查阅纯文本档的内容。那么万一我们想要查阅非文本文件,举例来说,例如/usr/bin/passwd 这个执行档的内容时, 又该如何去读出信息呢?事实上,由于执行档通常是 binary file ,使用上头提到的指令来读取他的内容时, 确实会产生类似乱码的数据啊!那怎么办?没关系,我们可以利用 od 这个指令来读取喔!

bash 复制代码
[root@study ~]# od [-t TYPE] 文件
选项或参数:
-t :后面可以接各种『类型 (TYPE)』的输出,例如:
	 a :利用默认的字符来输出;
	 c :使用 ASCII 字符来输出
	 d[size] :利用十进制(decimal)来输出数据,每个整数占用 size bytes ;
	 f[size] :利用浮点数(floating)来输出数据,每个数占用 size bytes ;
	 o[size] :利用八进制(octal)来输出数据,每个整数占用 size bytes ;
	 u[size] :SIZE 字节组成一个无符号十进制整数。SIZE 缺省为 sizeof(int);
	 x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size bytes ;
	 size可以为数字,也可以为大写字母。如果 TYPE 是 [doux] 中的一个,那么 SIZE 可以为 
		 C  = sizeof(char),
		 S = sizeof(short),
		 I = sizeof(int),
		 L = sizeof(long)。
	 如果 TYPE 是 f,那么 SIZE 可以为 
		 F = sizeof(float),
		 D = sizeof(double) ,
		 L = sizeof(long double)。
bash 复制代码
# 范例一:请将/usr/bin/passwd 的内容使用 ASCII 方式来展现!
[root@node-135 yurq]# od -t c /usr/bin/passwd |head -5
0000000 177   E   L   F 002 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000020 003  \0   >  \0 001  \0  \0  \0   H   2  \0  \0  \0  \0  \0  \0
0000040   @  \0  \0  \0  \0  \0  \0  \0 220   e  \0  \0  \0  \0  \0  \0
0000060  \0  \0  \0  \0   @  \0   8  \0  \t  \0   @  \0 035  \0 034  \0
0000100 006  \0  \0  \0 005  \0  \0  \0   @  \0  \0  \0  \0  \0  \0  \0
# 最左边第一栏是以 8 进位来表示 bytes 数。以上面范例来说,第二栏 0000020 代表开头是
# 第 16 个 byes (2x8) 的内容之意。

# 范例二:请将/etc/issue 这个文件的内容以 8 进位列出储存值与 ASCII 的对照表
[root@study ~]# od -t oCc /etc/issue
0000000 134 123 012 113 145 162 156 145 154 040 134 162 040 157 156 040
 \ S \n K e r n e l \ r o n
0000020 141 156 040 134 155 012 012
 a n \ m \n \n
0000027
# 如上所示,可以发现每个字符可以对应到的数值为何!要注意的是,该数值是 8 进位喔!
# 例如 S 对应的记录数值为 123 ,转成十进制:1x8^2+2x8+3=83。

利用这个指令,可以将 data file 或者是 binary file 的内容数据给他读出来喔! 虽然读出的来数值预设是使用非文本文件,亦即是 16 进位的数值来显示的, 不过,我们还是可以透过 -t c 的选项与参数来将数据内的字符以 ASCII 类型的字符来显示, 虽然对于一般使用者来说,这个指令的用处可能不大,但是对于工程师来说, 这个指令可以将 binary file 的内容作一个大致的输出,他们可以看得出东西的啦~ ^_^

如果对纯文本文件使用这个指令,你甚至可以发现到 ASCII 与字符的对照表!非常有趣! 例如上述的范例二,你可以发现到每个英文字 S对照到的数字都是 123,转成十进制你就能够发现那是 83 啰! 如果你有任何程序语言的书,拿出来对照一下 ASCII 的对照表,就能够发现真是正确啊!呵呵!

我不想找 google,想要立刻找到 password 这几个字的 ASCII 对照,该如何透过 od 来判断?其实可以透过刚刚上一个小节谈到的管线命令来处理!如下所示:

bash 复制代码
echo password | od -t oCc

echo 可以在屏幕上面显示任何信息,而这个信息不由屏幕输出,而是传给 od 去继续处理!就可以得到 ASCII code 对照啰!

13.5 修改文件时间或建置新档: touch

我们在 ls 这个指令的介绍时,有稍微提到每个文件在 linux 底下都会记录许多的时间参数, 其实是有三个主要的变动时间,那么三个时间的意义是什么呢?

  • modification time (mtime ):
    当该文件的『内容数据』变更时,就会更新这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!
  • status time (ctime ):
    当该文件的『状态 (status)』改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间啊。
  • access time (atime ):
    当『该文件的内容被取用』时,就会更新这个读取时间 (access)。举例来说,我们使用 cat 去读取/etc/man_db.conf , 就会更新该文件的 atime 了。

这是个挺有趣的现象,举例来说,我们来看一看你自己的 /etc/man_db.conf 这个文件的时间吧!

bash 复制代码
[root@node-135 yurq]# date;ls -l /etc/man_db.conf ;ls -l --time=atime /etc/man_db.conf ; ls -l --time=ctime /etc/man_db.conf
Tue Aug  8 13:48:04 CST 2023
-rw-r--r--. 1 root root 5171 Oct 31  2018 /etc/man_db.conf
-rw-r--r--. 1 root root 5171 Aug  8 10:36 /etc/man_db.conf
-rw-r--r--. 1 root root 5171 Jul 14 17:29 /etc/man_db.conf

看到了吗?在默认的情况下,ls 显示出来的是该文件的 mtime ,也就是这个文件的内容上次被更动的时间。 至于鸟哥的系统是在 5 月 4 号的时候安装的,因此,这个文件被产生导致状态被更动的时间就回溯到那个时间点了(ctime)! 而还记得刚刚我们使用的范例当中,有使用到 man_db.conf 这个文件啊,所以啊,他的 atime 就会变成刚刚使用的时间了!

文件的时间是很重要的,因为,如果文件的时间误判的话,可能会造成某些程序无法顺利的运作。OK!那么万一我发现了一个文件来自未来,该如何让该文件的时间变成『现在』的时刻呢? 很简单啊!就用『touch』这个指令即可!

嘿嘿!不要怀疑系统时间会『来自未来』喔!很多时候会有这个问题的!举例来说在安装过后系统时间可能会被改变! 因为台湾时区在国际标准时间『格林威治时间, GMT』的右边,所以会比较早看到阳光,也就是说,台湾时间比 GMT 时间快了八小时! 如果安装行为不当,我们的系统可能会有八小时快转,你的文件就有可能来自八小时后了。

至于某些情况下,由于 BIOS 的设定错误,导致系统时间跑到未来时间,并且你又建立了某些文件。 等你将时间改回正确的时间时,该文件不就变成来自未来了?^_^

bash 复制代码
[root@study ~]# touch [-acdmt] 文件
选项与参数:
-a :仅修订 access time;
-c :仅修改文件的时间,若该文件不存在则不建立新文件;
-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
-m :仅修改 mtime ;
-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]
bash 复制代码
# 范例一:新建一个空的文件并观察时间
[dmtsai@study ~]# cd /tmp
[dmtsai@study tmp]# touch testtouch
[dmtsai@study tmp]# ls -l testtouch
-rw-rw-r--. 1 dmtsai dmtsai 0 Jun 16 00:45 testtouch
# 注意到,这个文件的大小是 0 呢!在预设的状态下,如果 touch 后面有接文件,
# 则该文件的三个时间 (atime/ctime/mtime) 都会更新为目前的时间。若该文件不存在,
# 则会主动的建立一个新的空的文件喔!例如上面这个例子!

# 范例二:将 ~/.bashrc 复制成为 bashrc,假设复制完全的属性,检查其日期
[dmtsai@study tmp]# cp -a ~/.bashrc bashrc
[dmtsai@study tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
Tue Jun 16 00:49:24 CST 2015 <==这是目前的时间
-rw-r--r--. 1 dmtsai dmtsai 231 Mar 6 06:06 bashrc <==这是 mtime
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 15 23:44 bashrc <==这是 atime
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:47 bashrc <==这是 ctime

执行的结果当中,我们可以发现数据的内容与属性是被复制过来的,因此文件内容时间(mtime)与原本文件相同。 但是由于这个文件是刚刚被建立的,因此状态(ctime)就变成现在的时间啦!那如果你想要变更这个文件的时间呢?可以这样做:

bash 复制代码
# 范例三:修改案例二的 bashrc 文件,将日期调整为两天前
[dmtsai@study tmp]# touch -d "2 days ago" bashrc
[dmtsai@study tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
Tue Jun 16 00:51:52 CST 2015
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 14 00:51 bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 14 00:51 bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:51 bashrc
# 跟上个范例比较看看,本来是 16 日变成 14 日了 (atime/mtime)~不过, ctime 并没有跟着改变喔!

# 范例四:将上个范例的 bashrc 日期改为 2014/06/15 2:02
[dmtsai@study tmp]# touch -t 201406150202 bashrc
[dmtsai@study tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
Tue Jun 16 00:54:07 CST 2015
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 15 2014 bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 15 2014 bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:54 bashrc
# 注意看看,日期在 atime 与 mtime 都改变了,但是 ctime 则是记录目前的时间!

透过 touch 这个指令,我们可以轻易的修订文件的日期与时间。并且也可以建立一个空的文件喔!不过,要注意的是,即使我们复制一个文件时,复制所有的属性,但也没有办法复制 ctime 这个属性的。 ctime 可以记录这个文件最近的状态 (status) 被改变的时间。无论如何,还是要告知大家, 我们平时看的文件属性中,比较重要的还是属于那个 mtime 啊!我们关心的常常是这个文件的『内容』是什么时候被更动的说~瞭乎?

无论如何, touch 这个指令最常被使用的情况是:

  • 建立一个空的文件
  • 将某个文件日期修订为目前 (mtime 与 atime)

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

相关推荐
开开心心就好6 分钟前
电脑小说阅读器,支持朗读和自定义皮肤
服务器·开发语言·javascript·算法·pdf·c#·音视频
Smoothcloud润云16 分钟前
GPU远程纳管节点频繁离线?心跳、DNS与时钟排障实战
运维·服务器·开发语言·人工智能·php·gpu算力
class心平气和20 分钟前
ADB 工具函数 Python 使用教程
开发语言·python·adb
滕州市燕猫虎计算机科技工作室个体工商户1 小时前
Java,Java NIO,Java NIO2,Java AIO,AsynchronousServerSocketChannel
java·开发语言·nio·aio·nio2
古城小栈1 小时前
Rust 学习路线,供初学者参考
开发语言·rust
云计算练习生1 小时前
什么是 Bash?Linux 默认 Shell 的核心功能
linux·操作系统·bash·shell·命令解释器
喵了几个咪1 小时前
GoWind CMS 拆解:给 NL2SQL 上四把锁——智能问数的安全边界
开发语言·后端·安全·微服务·golang·gowind
多弗朗皮卡丘1 小时前
C++的类型转换
开发语言·c++
FLJwu1 小时前
运动相机图像传感器选型实战|第二篇:参数看着一模一样,为什么骑行录像疯狂果冻、拖影翻车?
android·c语言·开发语言·数码相机·运动相机·oem 量产
驭渊的小故事1 小时前
从 JVM 底层看泛型:泛型擦除、Signature 属性与 Super Type Token 模式
java·开发语言·jvm