“这是我参与更文挑战的第13天,活动详情查看: 更文挑战”
本文主要介绍一下 shell
的基础使用,包括一些基础概念(如:环境变量、流、路径)的介绍及部分命令( 如:echo
|cd
|ls
)的使用简介。
初识 shell, echo
在终端中,输出当前日期:
shellLearn:~$ date
2021年 6月13日 星期日 09时47分36秒 CST
复制代码
echo
命令接受一个参数,并将输入的内容,在终端中输出 hello
。
shellLearn:~$ echo hello
hello
复制代码
如果碰到输入的内容有特殊字符串或者空格怎么办?
shellLearn:~$ echo 'hello world'
hello world
shellLearn:~$ echo "hello world"
hello world
shellLearn:~$ echo hello\ world
hello world
复制代码
解决方案:
- 使用单引号,双引号将其包裹起来
- 使用转义符号
\
进行处理
环境变量 $PATH
shell
是如何知道去哪里寻找 date
或 echo
的呢?
其实,类似于 Python 或 Node,shell 是一个编程环境,当你在 shell
中执行命令时,实际上是在执行一段 shell
可以解释执行的简短代码。
如果你要求 shell
执行某个指令,但是该指令并不是 shell
所了解的编程关键字,那么它会去咨询**环境变量 $PATH**
,它会列出当 shell
接到某条指令时,进行程序搜索的路径:
shellLearn:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
复制代码
可以看到 $PATH
的输出内容,是由一系列目录和 :
拼接而成的。
- /usr/local/sbin
- /usr/local/bin
- /usr/sbin
- /usr/bin
- /sbin
- /bin
当我们执行 echo
命令时,shell
了解到需要执行 echo
这个程序,随后它便会在 $PATH
中搜索由 :
所分割的一系列目录,基于名字搜索该程序,当找到该程序时便执行。
确定某个程序名代表的是哪个具体的程序,可以使用 which
程序。
找出具体的程序后,可绕过环境变量,通过直接指定需要执行的程序的路径来执行该程序。
shellLearn:~$ which echo
/bin/echo
shellLearn:~$ /bin/echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
复制代码
获取帮助手册
如果是对某个命令(如 xyz)不熟悉,想要寻求帮助怎么办。有两种方式:
- 通过
man xyz
以下操作将获取到 cd
命令的学习手册:
shellLearn:~$ man cd
...
复制代码
中途可以按 q
退出手册阅读。
- 通过
abc -h
或abc --help
通常,在执行程序时使用 -h 或 –help 标记可以打印帮助信息,以便了解有哪些可用的标记或选项。
但注意,并不是所有的命令都支持这种用法(Mac 上 cd
命令就不支持 -h
)。
以下命令将会展示mv
的用法:
shellLearn:~$ mv -h
...
复制代码
导航操作(路径切换)
我们在工作的过程中,经常需要更换当前的工作路径。如何进行路径切换呢。
路径分隔符
shell
中的路径是一组被分割的目录,在 Linux
和 macOS
上使用 /
分割,而在 Windows
上是 \
。类似如下:
- macOS :
/Users/xxxx/shellLearn
- Windows:
C:\Users\shellLearn
根目录
路径 /
代表的是系统的根目录,所有的文件夹都包括在这个路径之下,在Windows上每个盘都有一个根目录(例如: C:\
)。
绝对路径、相对路径
*nux系统中,如果某个路径以 /
开头,那么它是一个绝对路径,其他的都是相对路径 。相对路径是指相对于当前工作目录的路径。在相对路径中,.
表示的是当前目录,而 ..
表示上级目录。
路径跳转:pwd
、cd
命令
- pwd 命令查看当前工作目录。
- cd 命令切换目录。
shellLearn:/home$ pwd
/home
shellLearn:/home$ cd shellLearn
shellLearn:~$ pwd
/home/shellLearn
复制代码
cd -
命令会回到前一次的工作目录
文件目录操作
列举目录下的文件:ls
为了查看指定目录下包含哪些文件,我们使用ls
命令。 如果不指定ls
的目录,它会默认打印当前目录下的文件。
shellLearn:/home$ ls
shellLearn
复制代码
其他几个常见的操作
- mv(用于重命名或移动文件)
- cp(拷贝文件)
- mkdir(新建文件夹)
流操作
在 shell 中,程序有两个主要的“流”:它们的输入流和输出流。
当程序尝试读取信息时,它们会从输入流中进行读取,当程序打印信息时,它们会将信息输出到输出流中。
通常,一个程序的输入输出流都是您的终端。也就是,您的键盘作为输入,显示器作为输出。 但是,我们也可以重定向这些流!
我们主要学习4个操作符号:
- 重定向流
< file
和> file
这两个命令可以将程序的输入输出流分别重定向到文件
shellLearn:~$ echo hello > hello.txt
shellLearn:~$ cat hello.txt
hello
shellLearn:~$ cat < hello.txt
hello
shellLearn:~$ cat < hello.txt > hello2.txt
shellLearn:~$ cat hello2.txt
hello
复制代码
- 追加内容
>> file
可以使用 >>
来向一个文件追加内容
- 管道
|
操作符
使用管道( pipes ),我们能够更好的利用文件重定向。 | 操作符允许我们将一个程序的输出和另外一个程序的输入连接起来:
shellLearn:~$ ls -l / | tail -n1
lrwxr-xr-x@ 1 root admin 11 6 4 2020 var -> private/var
shellLearn:~$ curl --head --silent qq.com | grep --ignore-case content-length
Content-Length: 169
复制代码
备注:tail -nN
, 其中的 ‘N’ 是个数值,指定从上一个流中,倒数开始,一共输出几行。
总结及致谢
本文主要介绍了shell 执行命令的原理,即从环境变量中找到对应的程序并执行,并在此基础上学习了几大类操作,如文件目录操作、导航操作、流操作、帮助操作。
虽然日常工作中,已经使用了好多年的 shell ,但从来没有系统化的学习过,正好借这个契机梳理学习。
本文是网络公开课《The Missing Semester of Your CS Education》的学习笔记,同步的学习过程中,收获很多,感谢并致敬。