温和地走进GNU/Linux 终端
在使用各种AI工具的时候我们会发现AI总是会积极地使用命令行工具,那么这些命令行工具是如何给AI提高效率的,又是如何使用的,接下来跟随豹哥的脚步一探究竟。
ctrl+alt+t
这是打开终端的快捷键,所有的操作都将在此完成。
通常最常用的命令应该是ls,用于查看当前目录下有什么文件/文件夹。
实际上ls是一个可执行程序,ls这个可执行程序的位置可以通过。
1 | which ls |
来查看
1 | li@li-MS-7C94:~$ which ls |
实际上which也是一个可执行程序,也可以用which来查看他的位置。
1 | li@li-MS-7C94:~$ which which |
这些可执行程序都在/usr/bin/目录下,为什么我们的程序能找到这个目录下的程序呢。
因为我们的终端环境变量里写入了/usr/bin这个路径。
我们可以直接输入下面的命令来查看PATH里到底写了什么。
1 | echo $PATH |
你会看到一长串路径,它们之间通常用:分隔,例如:
1 | /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin |
终端在执行命令时,会按照这些路径从左到右依次查找。
也就是说,当我们输入ls时,shell并不是“凭空知道”ls在哪里,而是会去这些目录里找有没有叫做ls的可执行程序。
所以我们也可以把终端理解成一个“帮我们找程序并运行程序”的入口。
我们的环境变量其实是可以修改的,例如我用的是bash shell环境变量就在主目录下的.bashrc文件里面。
使用以下命令你可以知道我们的bashrc文件里有哪些环境变量。
1 | cat ~/.bashrc | grep "PATH" |
1 | li@li-MS-7C94:~$ cat ~/.bashrc | grep "PATH" |
这里的写法很有规律,例如:
1 | export PATH=/home/li/.opencode/bin:$PATH |
它的意思是把/home/li/.opencode/bin加到PATH最前面,同时把原来的PATH也保留下来。
这样一来,终端在查找命令的时候,就会优先去新的路径里找程序,再去后面的路径里继续查找。
当你安装了一些不在/usr/bin里的工具时,通常就需要用这种方式把它们加入环境变量。
如果你修改了.bashrc,可以执行下面这条命令让配置立刻生效:
1 | source ~/.bashrc |
终端命令的一个强大之处,就是它们往往可以组合使用。
例如刚才这条命令:
1 | cat ~/.bashrc | grep "PATH" |
这里的cat负责读取.bashrc文件的内容,grep负责从这些内容里筛选出包含PATH的行,中间的|叫做管道符,它会把前一个命令的输出交给后一个命令继续处理。
也可以用ls来组合使用
例如下面的命令就是在该目录下寻找含D的文件夹或文件
1 | ls | grep D |
1 | li@li-MS-7C94:~$ ls | grep D |
先学会在目录之间移动
在终端里工作时,一个很重要的问题是:我现在到底在哪个目录?
这时候可以使用pwd命令:
1 | pwd |
它会输出你当前所在的路径,例如:
1 | /home/li |
如果你想切换到别的目录,可以使用cd命令,例如:
1 | cd Documents |
如果想回到自己的主目录,可以直接输入:
1 | cd ~ |
学会pwd和cd之后,你就真正具备了在终端里“移动”的能力。
查看文件内容
当我们进入某个目录之后,下一步往往就是看看文件里写了什么。
最直接的命令就是cat:
1 | cat hello.txt |
它会把文件内容直接输出到终端里。
如果文件很短,cat会很好用,但如果文件很长,一下子全部显示出来就不太方便看了。
这时候可以使用less:
1 | less hello.txt |
less会让你分页查看文件内容,可以慢慢往下翻,按q退出。
所以可以简单理解为:cat适合看短文件,less适合看长文件。
搜索文件和内容
当文件和目录越来越多时,光靠ls一个一个看就会比较慢,这时候就要学会搜索。
如果你想在文件内容里搜索某个关键词,可以使用grep:
1 | grep "PATH" ~/.bashrc |
这条命令会在.bashrc文件中查找包含PATH的行。
如果你想在当前目录下查找某个文件,可以使用find:
1 | find . -name "hello.txt" |
这里的.表示当前目录,-name表示按名字查找。
也就是说,grep更像是在“文件内容里找字”,而find更像是在“目录里面找文件”。
重定向
前面我们已经见过管道符|,它可以把一个命令的输出交给另一个命令继续处理。
除了把输出交给别的命令,我们也可以把输出直接写入文件,这就是重定向。
例如下面这条命令:
1 | echo hello > hello.txt |
它会把hello写入hello.txt文件中。
这里的>表示覆盖写入,如果文件原来有内容,那么旧内容会被替换掉。
如果你想在原有内容后面继续追加,可以使用>>:
1 | echo world >> hello.txt |
这样world就会被追加到文件后面,而不会覆盖前面的内容。
写完之后可以再用cat查看结果:
1 | cat hello.txt |
所以可以把它们简单理解为:
|:把输出交给下一个命令>:把输出写入文件,并覆盖原内容>>:把输出追加到文件后面
命令行如何使用
大部分命令行使用-h或者--help参数查看使用手册
1 | li@li-MS-7C94:~$ ls --help |
你也可以通过我部署的网站查询GNU/Linux命令行手册
为什么AI喜欢命令行
现在我们可以回到最开始的问题:为什么AI工具总是喜欢使用命令行?
一个很重要的原因是,命令行足够直接。
查看文件、搜索内容、切换目录、运行程序,这些操作都可以用简短的命令完成,不需要一层一层地点开图形界面。
另一个原因是,命令行非常适合组合使用。
我们前面已经看到,cat、grep、find、ls这些工具都可以互相配合,一个命令负责读取内容,另一个命令负责筛选结果,这样处理问题会很快。
而且命令行操作是可以重复的。
同样一条命令,今天可以用,明天也可以继续用;人可以执行,AI也可以执行。这种可重复、可组合的特点,就是命令行在效率上非常有优势的原因。
所以对于AI来说,命令行并不神秘,它只是一个非常清晰、高效、适合自动化操作的工作入口。
小彩蛋
最后补充一个有意思的小知识:在GNU/Linux系统里,我们前面提到的很多常见命令,比如ls、cat、grep、find,其实都和GNU项目有关。
其中ls、cat这类工具通常来自GNU coreutils,grep来自GNU grep,find来自GNU findutils。
严格一点说,Linux更多指的是内核,而我们平时在终端里频繁使用的许多基础工具来自GNU项目,所以很多人会把整个系统称为GNU/Linux。
这也是为什么我的标题特地写成GNU/Linux,而不是简单写成Linux,也算是向伟大的自由软件致敬。
“自由软件基金会(FSF)是一个非盈利组织。我们的使命是在全球范围内促进计算机用户的自由。我们捍卫所有软件用户的权利。”


