Shell 学习笔记

本文最后更新于:a month ago

SHELL 学习笔记

在任何系统中都会有一个终端,在 windows 系统里它可能叫 CMD 或者 PowerShell ,在 Linux/Unix 系统里它可能叫 bash 或者 zsh ,总之它就是一个让你输入命令,完成一定任务的地方。

说明:本笔记中所有命令都在 Mac OS 下能成功执行,绝大部分命令也能在其他 Linux/Unix 平台中执行,Windows 平台用户可以使用 wsl 来学习 shell。


简单的 shell 命令

我们先学习几个简单的 shell 命令来感受一下 shell 的魅力。

date 打印系统时间

date 命令的作用就是打印当前系统时间,直接在 shell 中输入它并敲击回车键就可以执行它。

1
2
fructose@MacBook-Air ~ % date
2021年 8月 2日 星期一 00时39分16秒 CST

echo 输出内容

echo 命令的作用就是向终端中打印出后面的内容。

1
2
fructose@MacBook-Air ~ % echo hello
hello

我们注意到 echo 和打印的内容之间使用空格区分,如果我们想要打印带空格的内容怎么办呢?

我们可以使用双引号标记内容,或者用 \ 转义空格。

1
2
3
4
fructose@MacBook-Air ~ % echo "Hello world"
Hello world
fructose@MacBook-Air ~ % echo Hello\ world
Hello world

路径 shell 命令

上文中执行的 dateecho 实际上都是一个程序,那么 shell 是怎么找到这些程序的呢?

环境变量 $PATH

shell 会在环境变量中找到这些程序,你通过下列命令来查看系统的环境变量。

1
2
fructose@MacBook-Air ~ % echo $PATH 
/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

输出的这些东西都是不同的路径,以 : 区分,shell 找程序时会按照环境变量的 PATH 次序依次查找,直到找到为止。如果找不到程序,则会抛出错误,下个例子中我的所有 $PATH 路径里都不包括 orz 这个程序。

1
2
fructose@MacBook-Air ~ % orz
zsh: command not found: orz

which 找到程序的路径

使用 which 我们可以找到程序在环境变量中的具体路径。

1
2
3
4
5
6
fructose@MacBook-Air ~ % which echo
echo: shell built-in command
fructose@MacBook-Air ~ % which which
which: shell built-in command
fructose@MacBook-Air ~ % which g++
/usr/bin/g++

可能是因为 Mac OS 比较特殊的原因导致 echo 和 which 没有具体的程序支撑,这个不做更详细的讨论,等以后有机会再研究。

pwd 输出当前路径

使用 pwd 命令我们可以很快知道终端目前所处的位置。

1
2
fructose@MacBook-Air ~ % pwd
/Users/fructose

cd 改变当前路径

使用 cd 命令我们可以很容易改变终端当前所处位置。

绝对路径

绝对路径是指路径的绝对位置,在 Linux\Unix 平台上根目录以 / 开头,用户目录以 ~ 开头;在 Windows 平台上根目录则以 C:\\ 之类的开头。

相对路径

相对路径是指程序相对于当前路径的路径,. 表示当前路径,.. 表示上一级路径。

1
2
3
4
5
6
7
8
fructose@MacBook-Air ~ % pwd
/Users/fructose
fructose@MacBook-Air ~ % cd .. # 返回上一级目录
fructose@MacBook-Air /Users % pwd
/Users
fructose@MacBook-Air /Users % cd /Users/fructose # 进入目标目录
fructose@MacBook-Air ~ % pwd
/Users/fructose

使用 cd - 我们可以很方便返回上次的目录。

1
2
3
4
5
6
7
8
9
10
11
12
13
fructose@MacBook-Air ~ % pwd
/Users/fructose
fructose@MacBook-Air ~ % cd /
fructose@MacBook-Air / % pwd
/
fructose@MacBook-Air / % cd -
~
fructose@MacBook-Air ~ % pwd
/Users/fructose
fructose@MacBook-Air ~ % cd -
/
fructose@MacBook-Air / % pwd
/

文件 shell 命令

ls 列出目录文件

不带参数的 ls 列出当前目录文件,带目录参数的 ls 列出对应目录文件。

1
2
3
4
5
6
7
8
9
fructose@MacBook-Air ~ % ls
CLionProjects Downloads Music PycharmProjects
Desktop Library Pictures source
Documents Movies Public
fructose@MacBook-Air ~ % ls /
Applications Volumes etc sbin
Library bin home tmp
System cores opt usr
Users dev private var

使用 ls -a 可以查看目录中包括隐藏文件的所有文件

在 Linux/Unix 平台隐藏文件一般以 . 开头。

1
2
3
4
5
6
7
8
9
10
11
fructose@MacBook-Air ~ % ls -a
. .ipython Desktop
.. .matplotlib Documents
.CFUserTextEncoding .proxyman Downloads
.DS_Store .proxyman-data Library
.Trash .viminfo Movies
.android .vscode Music
.cache .zsh_history Pictures
.conda .zsh_sessions Public
.config .zshrc PycharmProjects
.gitconfig CLionProjects source

使用 ls -l 可以以列表形式查看目录中的文件,以便获取更多信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
fructose@MacBook-Air ~ % ls -l
total 0
drwxr-xr-x 5 fructose staff 160 7 11 15:49 CLionProjects
drwx------@ 5 fructose staff 160 7 26 15:05 Desktop
drwx------@ 10 fructose staff 320 8 2 03:28 Documents
drwx------+ 10 fructose staff 320 8 2 03:03 Downloads
drwx------@ 78 fructose staff 2496 7 20 00:16 Library
drwx------ 5 fructose staff 160 7 31 00:55 Movies
drwx------+ 7 fructose staff 224 7 8 16:26 Music
drwx------+ 6 fructose staff 192 7 20 00:21 Pictures
drwxr-xr-x+ 5 fructose staff 160 7 8 12:42 Public
drwxr-xr-x 5 fructose staff 160 7 12 00:02 PycharmProjects
drwxr-xr-x@ 9 fructose staff 288 8 1 22:31 source

flag(后面不带参数)或 option(后面带参数)用法可以让程序执行带一个参数,其中 - 后面只会接一个英文字母,如果接多个英文字母会被解析为多个 flag 或 option,-- 后面接一个英文单词,大部分程序都实现了 --help 用法,它会很贴心的告诉你这个程序所有的用法,如果忘了一个程序怎么用可以用它查询。

mv 移动或重命名文件

mv 可以用来重命名文件,给出的两个参数是原文件和名字;mv 还可以用来移动文件,给出的两个参数是原路径和新路径。当然,这两个操作可以一起进行。

1
2
fructose@MacBook-Air ~ % mv old_name new_name
fructose@MacBook-Air ~ % mv old_name ../

cp 复制文件

cp 用来复制文件或目录,给出的两个参数是原文件和新文件或原目录和新目录。

1
fructose@MacBook-Air ~ % cp file file_copy

rm 删除文件

rm 可以用来删除文件,但是它默认不是递归的,你可以给他 -r 让它实现递归删除。

1
2
fructose@MacBook-Air ~ % rm laji
fructose@MacBook-Air ~ % rm -r laji_floder

rmdir 可以用来删除空目录,不能删除整个目录是为了保证重要文件不会被误删除。mkdir 可以用来创建目录。

终端操作命令

man 使用说明

man 是一个非常奥利给的程序,可以用来查询一个程序的用法。

1
fructose@MacBook-Air ~ % man ls

clear 清空终端

当你的终端已经有了很多内容,你可以使用 clear 清除它,除了这个命令,你还可以使用快捷键 control+L 达到相同的效果。

流重定向命令

流一般包括输入流和输出流,这两个流接管所有的输入输出操作,例如 echo 就是把内容传递给了输出流,然后我们就在终端里看到输出的东西了。

> 可以重定向输出流到文件,将输出到终端的内容输出到文件。

cat 命令可以用来查看文件内容

1
2
3
fructose@MacBook-Air ~ % echo hello > hello.txt
fructose@MacBook-Air ~ % cat hello.txt
hello

< 可以重定向输入流,>> 可以将输出流重载为追加而不是覆盖的方式。

两者一起使用也可以完成文件的复制。

1
2
3
fructose@MacBook-Air ~ % cat < hello.txt > hello2.txt
fructose@MacBook-Air ~ % cat hello2.txt
hello

| 分割两个命令,可以把左边命令的输出作为右边命令的输入。

tail 命令可以查看最后十行,如果指定 -n1 则查看最后一行

1
2
fructose@MacBook-Air ~ % ls -l | tail -n1
drwxr-xr-x@ 9 fructose staff 288 8 1 22:31 source

sudo 以root权限执行

sudo 命令可以让我们以root权限执行程序。假设 123.txt 是一个当前用户没有权限写的文件。

1
2
3
4
5
fructose@MacBook-Air ~ % sudo echo 123 > 123.txt
fructose@MacBook-Air ~ % sudo su
sh-3.2# exit
exit
fructose@MacBook-Air ~ %

其中 sudo su 让我们进入 root 用户。

tee 命令写入文件

tee 命令可以用来写入文件,配合 sudo 使用即可实现一行命令写入没有权限的文件。

1
2
3
4
fructose@MacBook-Air ~ % echo 123 | sudo tee 123.txt 
123
fructose@MacBook-Air ~ % cat 123.txt
123

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!