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 | fructose@MacBook-Air ~ % date |
echo 输出内容
echo 命令的作用就是向终端中打印出后面的内容。
1 | fructose@MacBook-Air ~ % echo hello |
我们注意到 echo 和打印的内容之间使用空格区分,如果我们想要打印带空格的内容怎么办呢?
我们可以使用双引号标记内容,或者用 \ 转义空格。
1 | fructose@MacBook-Air ~ % echo "Hello world" |
路径 shell 命令
上文中执行的 date 和 echo 实际上都是一个程序,那么 shell 是怎么找到这些程序的呢?
环境变量 $PATH
shell 会在环境变量中找到这些程序,你通过下列命令来查看系统的环境变量。
1 | fructose@MacBook-Air ~ % echo $PATH |
输出的这些东西都是不同的路径,以 : 区分,shell 找程序时会按照环境变量的 PATH 次序依次查找,直到找到为止。如果找不到程序,则会抛出错误,下个例子中我的所有 $PATH 路径里都不包括 orz 这个程序。
1 | fructose@MacBook-Air ~ % orz |
which 找到程序的路径
使用 which 我们可以找到程序在环境变量中的具体路径。
1 | fructose@MacBook-Air ~ % which echo |
可能是因为 Mac OS 比较特殊的原因导致 echo 和 which 没有具体的程序支撑,这个不做更详细的讨论,等以后有机会再研究。
pwd 输出当前路径
使用 pwd 命令我们可以很快知道终端目前所处的位置。
1 | fructose@MacBook-Air ~ % pwd |
cd 改变当前路径
使用 cd 命令我们可以很容易改变终端当前所处位置。
绝对路径
绝对路径是指路径的绝对位置,在 Linux\Unix 平台上根目录以
/开头,用户目录以~开头;在 Windows 平台上根目录则以C:\\之类的开头。相对路径
相对路径是指程序相对于当前路径的路径,
.表示当前路径,..表示上一级路径。
1 | fructose@MacBook-Air ~ % pwd |
使用 cd - 我们可以很方便返回上次的目录。
1 | fructose@MacBook-Air ~ % pwd |
文件 shell 命令
ls 列出目录文件
不带参数的 ls 列出当前目录文件,带目录参数的 ls 列出对应目录文件。
1 | fructose@MacBook-Air ~ % ls |
使用 ls -a 可以查看目录中包括隐藏文件的所有文件
在 Linux/Unix 平台隐藏文件一般以
.开头。
1 | fructose@MacBook-Air ~ % ls -a |
使用 ls -l 可以以列表形式查看目录中的文件,以便获取更多信息。
1 | fructose@MacBook-Air ~ % ls -l |
flag(后面不带参数)或 option(后面带参数)用法可以让程序执行带一个参数,其中
-后面只会接一个英文字母,如果接多个英文字母会被解析为多个 flag 或 option,--后面接一个英文单词,大部分程序都实现了--help用法,它会很贴心的告诉你这个程序所有的用法,如果忘了一个程序怎么用可以用它查询。
mv 移动或重命名文件
mv 可以用来重命名文件,给出的两个参数是原文件和名字;mv 还可以用来移动文件,给出的两个参数是原路径和新路径。当然,这两个操作可以一起进行。
1 | fructose@MacBook-Air ~ % mv old_name new_name |
cp 复制文件
cp 用来复制文件或目录,给出的两个参数是原文件和新文件或原目录和新目录。
1 | fructose@MacBook-Air ~ % cp file file_copy |
rm 删除文件
rm 可以用来删除文件,但是它默认不是递归的,你可以给他 -r 让它实现递归删除。
1 | fructose@MacBook-Air ~ % rm laji |
rmdir可以用来删除空目录,不能删除整个目录是为了保证重要文件不会被误删除。mkdir可以用来创建目录。
终端操作命令
man 使用说明
man 是一个非常奥利给的程序,可以用来查询一个程序的用法。
1 | fructose@MacBook-Air ~ % man ls |
clear 清空终端
当你的终端已经有了很多内容,你可以使用 clear 清除它,除了这个命令,你还可以使用快捷键 control+L 达到相同的效果。
流重定向命令
流一般包括输入流和输出流,这两个流接管所有的输入输出操作,例如 echo 就是把内容传递给了输出流,然后我们就在终端里看到输出的东西了。
> 可以重定向输出流到文件,将输出到终端的内容输出到文件。
cat命令可以用来查看文件内容
1 | fructose@MacBook-Air ~ % echo hello > hello.txt |
< 可以重定向输入流,>> 可以将输出流重载为追加而不是覆盖的方式。
两者一起使用也可以完成文件的复制。
1 | fructose@MacBook-Air ~ % cat < hello.txt > hello2.txt |
| 分割两个命令,可以把左边命令的输出作为右边命令的输入。
tail命令可以查看最后十行,如果指定-n1则查看最后一行
1 | fructose@MacBook-Air ~ % ls -l | tail -n1 |
sudo 以root权限执行
sudo 命令可以让我们以root权限执行程序。假设 123.txt 是一个当前用户没有权限写的文件。
1 | fructose@MacBook-Air ~ % sudo echo 123 > 123.txt |
其中 sudo su 让我们进入 root 用户。
tee 命令写入文件
tee 命令可以用来写入文件,配合 sudo 使用即可实现一行命令写入没有权限的文件。
1 | fructose@MacBook-Air ~ % echo 123 | sudo tee 123.txt |
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!