神兵利刃:shell 初入门

“这是我参与更文挑战的第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 是如何知道去哪里寻找 dateecho 的呢?

其实,类似于 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 -habc --help

通常,在执行程序时使用 -h 或 –help 标记可以打印帮助信息,以便了解有哪些可用的标记或选项。

但注意,并不是所有的命令都支持这种用法(Mac 上 cd 命令就不支持 -h)。

以下命令将会展示mv的用法:

shellLearn:~$ mv -h
...
复制代码

导航操作(路径切换)

我们在工作的过程中,经常需要更换当前的工作路径。如何进行路径切换呢。

路径分隔符

shell 中的路径是一组被分割的目录,在 LinuxmacOS 上使用 / 分割,而在 Windows 上是 \。类似如下:

  • macOS : /Users/xxxx/shellLearn
  • Windows: C:\Users\shellLearn

根目录

路径 / 代表的是系统的根目录,所有的文件夹都包括在这个路径之下,在Windows上每个盘都有一个根目录(例如: C:\)。

绝对路径、相对路径

*nux系统中,如果某个路径以 / 开头,那么它是一个绝对路径,其他的都是相对路径 。相对路径是指相对于当前工作目录的路径。在相对路径中,. 表示的是当前目录,而 .. 表示上级目录。

路径跳转:pwdcd 命令

  • 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》的学习笔记,同步的学习过程中,收获很多,感谢并致敬。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享