什么是Shell?

Shell是一种用户与计算机进行交互的文字接口,也是一种脚本语言。


Shell有什么用?

允许用户执行程序,查找文件,操作文件,输入并获取某种半结构化的输出


Shell的使用

注意:此教程使用于类Unix shell,例如 Bash 或 ZSH,所以如果你的电脑是Mac或者Linux系统,则可以直接开始学习。
如果您的电脑是Windows系统,请使用Wsl或者Linus虚拟机。

在Shell中导航

shell中的路径时一组被分割的目录,/代表系统的根目录。

路径分为相对路径与绝对路径。

相对路径指的是相对当前的目录的路径,当前工作目录可以用pwd命令来获取。

绝对路径都是以/开头,可以认为是仅凭借绝对路径就能够找到文件的位置(相对路径无法做到这一点)

在相对路径表示中,.表示当前目录,..表示上级目录。

切换工作目录用cd操作来完成,格式为cd 路径

下面举几个例子:

1
2
3
4
5
6
cd .. # 进入上级目录
pwd # 显示当前目录
/mnt/d/Onedrive # 当前目录
cd ./桌面 # 进入桌面目录
pwd # 查看当前目录
/mnt/d/Onedrive/桌面 # 当前目录

以上操作完成了切入桌面这一目录的操作。


ls命令

作用:查看指定目录下包含哪些文件。

语法:ls 路径

如果没有指定参数,ls打印当前目录下的文件


标记和选项

什么是标记和选项呢?它们以-开头,可以改变程序的行为。

通常,在执行程序的时候使用-h或者-help来打印帮助信息。

下面举一个使用标记和选项的例子:

1
ls -l ./文件夹合集

通过ls -help中的帮助信息可以知道ls -l的作用是更加详细地列出目录文件或文件夹下的信息。

当我输入这个指令后,交互界面会打印出例如以下的代码:

1
2
drwxrwxrwx 1 borwin borwin 4096 Mar 15 01:15  my_python
drwxrwxrwx 1 borwin borwin 4096 Mar 9 22:29 pytorch学习

前面一串字符串中d表示文件夹合集是一个目录,然后接下来的九个字符,每三个字符一组(rwx),它们分别代表了文件所有者、用户组以及其它所有人具有的权限。

r代表可读权限,w代表可写权限,x代表可执行权限(搜索权限),如果不具有该权限,系统会打印出r-x之类的字符串,代表不具有修改权限。


mv命令

作用:为文件或者目录重命名,或者将文件或目录移动到其它位置。

语法:
mv [options] source dest

mv [options] source... directory

对options中的参数说明:

  • -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
  • -i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作。
  • -f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。
  • -n: 不要覆盖任何已存在的文件或目录。
  • -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。

mv参数的设置与运行结果一般有以下几种情况:

参数的设置 运行结果
mv source_file(文件) dest_file(文件) 将源文件名 source_file 改为目标文件名 dest_file
mv source_file(文件) dest_directory(目录) 将文件 source_file 移动到目标目录 dest_directory 中
mv source_directory(目录) dest_directory(目录) 目录名 dest_directory 已存在,将 source_directory 移动到目录名 dest_directory 中;目录名 dest_directory 不存在则 source_directory 改名为目录名 dest_directory

cp命令

作用:复制文件或者目录(包含粘贴操作)

语法:cp [options] source dest

对options中的参数加以说明:

  • -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于 dpR 参数组合。
  • -d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
  • -r 或 --recursive:用于复制目录及其所有的子目录和文件,如果要复制目录,需要使用该选项
  • -i 或 --interactive:在复制前提示确认,如果目标文件已存在,则会询问是否覆盖,回答 y 时目标文件将被覆盖。
  • -u 或 --update:仅复制源文件中更新时间较新的文件。
  • -v 或 --verbose:显示详细的复制过程。
  • -p 或 --preserve:保留源文件的权限、所有者和时间戳信息。
  • -f 或 --force:强制复制,即使目标文件已存在也会覆盖,而且不给出提示。
  • -l:不复制文件,只是生成链接文件。

下面举几个例子:

参数的设置 运行的结果
cp file.txt /path/to/destination/ 将文件 file.txt 复制到目录 /path/to/destination/ 中
cp –r test/ newtest 将当前目录 test/ 下的所有文件复制到新目录 newtest 下
cp -i file.txt /path/to/destination/ 复制文件,并在目标文件已存在时进行确认

mkdir命令

作用:创建目录

语法:mkdir [-p] dirName

参数说明:-p 确保目录名称存在,不存在的就建一个。

参数设置与运行结果:

参数的设置 运行的结果
mkdir runoob 在工作目录下,建立一个名为 runoob 的子目录
mkdir -p runoob2/test 在工作目录下的 runoob2 目录中,建立一个名为 test 的子目录,若 runoob2 目录原本不存在,则建立一个

注意:在上面的第二个例子中若不加 -p 参数,且原本 runoob2 目录不存在,则产生错误。


用户手册

如果想要知道关于程序参数、输入输出的信息,亦或是想要了解它们的工作方式,可以用man程序查看其用户手册。

例如man ls就能查看ls程序的用户手册


在程序之间创建连接

在 shell 中,程序有两个主要的“流”:它们的输入流和输出流。 当程序尝试读取信息时,它们会从输入流中进行读取,当程序打印信息时,它们会将信息输出到输出流中。 通常,一个程序的输入输出流都是您的终端。也就是,您的键盘作为输入,显示器作为输出。 但是,我们也可以重定向这些流!

最简单的两种重定向是< file> file,分别为程序的输入重定向与输出的重定向

举例:

1
2
3
4
5
6
7
8
missing:~$ echo hello > hello.txt
missing:~$ cat hello.txt
hello
missing:~$ cat < hello.txt
hello
missing:~$ cat < hello.txt > hello2.txt
missing:~$ cat hello2.txt
hello

除此之外,还可以使用>>来进行文件的最佳操作(即在文件的末尾追加内容)

重定向还可以依赖于管道|来将一个程序的输出于另一个程序的输入连接起来

举例:

1
2
3
4
missing:~$ ls -l / | tail -n1
drwxr-xr-x 1 root root 4096 Jun 20 2019 var
missing:~$ curl --head --silent google.com | grep --ignore-case content-length | cut --delimiter=' ' -f2
219

sudo命令

作用:以管理者的身份来执行程序,不会受到权限的限制