Skip to content

教程|认识终端和shell

【教程】在macOS上用VSCode写C++代码 4 认识终端和shell

内建程序与内建命令

打开终端,其实相当于打开了shell。shell 可以运行一些程序(例如 sayhello/bin/mkdir )。

shell自身也带着一些程序(二进制可执行文件),这些程序就叫内建程序。

特点:调用shell内建程序的时候只需要敲一个单词就行了。一个单词很短,所以把它们称作内建命令。

重要内建命令:which, echo, history, pwd, cd

Ps. 系统自带的程序如果也能用一个单词就调用那么也可以称它们为系统命令

与路径无关

which

查看shell如何解释后面的命令

1
2
3
4
5
which which
which echo
which history
which pwd
which cd

得到结果:which: shell built-in command

截屏2024-07-07 10.02.55

which /bin/date

得到结果:/bin/date 即一个二进制可执行文件

echo

将后面输入的东西返回。在显示变量的时候会显示变量的值而不是那个字符串

截屏2024-07-07 10.06.25

样例解释:

echo $SHELL

查看正在使用的 shell ,此时就是bin目录下的zsh程序。还有其他 shell,但是 macOS 默认的 shellzsh

history

显示输入命令的历史

可以带参数,表示最近几次

history
history -3

date

输入:

which date
which /bin/date

发现都返回 /bin/date ,说明shell用同种方式解析二者。

所以直接输入 dateshell 就会帮我解析这个单词,然后去调用在文件系统中的 /bin/date 这一个二进制程序,执行这个程序,然后返回当前的时间。

与shell当前工作目录相关

pwd

% 前的 ~ 表示当前所在的目录,用 pwd 可以返回shell当前所在的工作目录,即 ~

截屏2024-07-07 10.31.36

文件的绝对路径和相对路径

绝对路径:从根目录开始

相对路径:. 当前路径;.. 当前路径的上一级路径,即返回上一级文件夹;... 上级的上级;- 刚刚在的目录;~ 家目录

绝对路径和相对路径详解

cd

跳转 shell 的当前工作目录到指定的目录,参数不区分大小写

截屏2024-07-07 10.45.57

想回到上一层目录?用相对路径 cd ..

% 前是当前目录

shell常用命令

参考2020年清华大学电子系科协暑培|Linux

ls

列出当前文件夹下的所有文件,可有参数

1
2
3
ls
ls -a       #显示隐藏文件     
ls -l       #显示文件的详细信息

cat

打开文件,显示文件的内容

cat hello.txt

clear

清空终端中存在的已经执行过的命令( history 仍然可以查看)

mkdir

在当前目录下创建文件夹

touch

在当前目录下创建文件(一般是文本文件)

touch test.md
touch t     #没有后缀名的文本文件,可通过文本编辑打开,就是之前想要的纯文本!

截屏2024-07-07 11.06.07

rm

1
2
3
rm test.md      #移除某个文件(不是移动到废纸篓,而是直接抹掉!!!)
rm -d newFolder     #移除某个文件夹
rm -rf newFolder        #强制删除(使用一定慎重!!!)

Ps. 输入过程中点 tab 可以自动补全带后缀的文件名

mv/cp

移动文件与复制文件

移动文件到原地相当于重命名

mv final.c C_Xcode      #把final.c移动到C_Xcode文件夹中
mv newFolder/final.c newFolder/ffff.c       #重命名

man

查看命令的帮助文档

man date

截屏2024-07-07 11.31.25

Q 退出

open

1
2
3
4
open foo.md
open -a Visual\ Studio\ Code.app foo.md     
open $(pwd)
open .

-a 参数指定打开程序(需要使用程序全名)

$(pwd) 表示当前目录,open $(pwd) 表示用 Finder 打开 shell 当前的工作目录 ( open . 也可)

shell常用的操作

输出流重定向

1
2
3
4
5
echo "hello world" > my.txt
cat < my.txt    #会打开my.txt,接收内容并作为cat的input
echo "hhhh" > my.txt    #发现文件内容只有hhhh,因为 > 表示覆盖
echo "hahaha" >> my.txt    # >> 实现追加
cat < my.txt > your.txt    # my.txt作为cat的input,print到 your.txt中

默认的输出是屏幕显示,现在重定向,不在终端中显示,而是直接写到my.txt文件中去

管道

| :上一个命令(程序)的输出作为下一个命令的输入

history -100 | grep "mkdir"     #最近100条中有哪些是带有mkdir的

grep相当于搜索,从给他的字符串中搜索带有关键词的行

⌃C

输入有误时,停止当前输入,退出

this is wrong

此时点 ⌃C ,可以不执行此行,重开一行

空格

shell通过空格来分辨命令与参数

如果参数中有空格,需要 \ (转义空格)或 "" (给参数加引号)

终端进阶与常用的终端操作

where

where 也是一个 shell 内建命令,和 which 的功能差不多,告诉我们一个命令如何被 shell 解析。

区别:where 能够告诉我们 shell 去解析这个命令的全部可能性,whichwhere 的第一行

vim极简入门

可以编辑文本

vim my.txt

i 进入编辑模式

退出插入模式并保存:⎋ > : > wq

Ps. ⎋是 esc

⌃D

⌃C 差不多,都是退出当前

chmod

修改文件权限

chmod a+x <filepath>    #使一个文件有可执行权限

环境变量

shell 认识给它的命令(单词),所以它就用这个命令(单词)找到需要执行的程序,然后执行这个程序。那 shell 是怎么认识我们给它的单词呢???

查看环境变量:

echo $PATH

返回:

其中冒号是分隔符。当给 shell 扔了一个命令之后,shell 先在自己的内建程序中找有没有这个单词,没找到再到环境变量去找。

其他的工具

shell脚本--组合你的命令

shell脚本:就是把许多命令组合起来,完成一项任务

homebrew--macOS快速安装命令行程序

brew官网

zsh配置文件

想要在终端运行自己写的程序,需要给出路径。如果直接 % sayhello ,会得到 zsh: command not found: sayhello。如何让shell认识我们的单词 sayhello

先退回家目录 ~

1
2
3
4
open ~/.zshrc       #返回The file /Users/chasetsai/.zshrc does not exist.说明没有这个文件
touch ~/.zshrc      #创建一个
echo "alias sayhello=~/desktop/sayhello" > ~/.zshrc     #设置别名
source .zshrc           #使该文件生效

此时我们直接输入 sayhello 就能得到预期输出!!!

查看所有的shell内建命令

man builtins 可以查看shell的所有内建命令

man zshbuiltins 可以查看zsh的所有内建命令