shell学习
什么是Shell?
Shell是一种用户与计算机进行交互的文字接口,也是一种脚本语言。
Shell有什么用?
允许用户执行程序,查找文件,操作文件,输入并获取某种半结构化的输出
Shell的使用
注意:此教程使用于类Unix shell,例如 Bash 或 ZSH,所以如果你的电脑是Mac或者Linux系统,则可以直接开始学习。
如果您的电脑是Windows系统,请使用Wsl或者Linus虚拟机。
在Shell中导航
shell中的路径时一组被分割的目录,/
代表系统的根目录。
路径分为相对路径与绝对路径。
相对路径指的是相对当前的目录的路径,当前工作目录可以用pwd
命令来获取。
绝对路径都是以/
开头,可以认为是仅凭借绝对路径就能够找到文件的位置(相对路径无法做到这一点)
在相对路径表示中,.
表示当前目录,..
表示上级目录。
切换工作目录用cd
操作来完成,格式为cd 路径
下面举几个例子:
1 |
|
以上操作完成了切入桌面这一目录的操作。
ls命令
作用:查看指定目录下包含哪些文件。
语法:ls 路径
如果没有指定参数,ls打印当前目录下的文件
标记和选项
什么是标记和选项呢?它们以-
开头,可以改变程序的行为。
通常,在执行程序的时候使用-h
或者-help
来打印帮助信息。
下面举一个使用标记和选项的例子:
1 |
|
通过ls -help
中的帮助信息可以知道ls -l
的作用是更加详细地列出目录文件或文件夹下的信息。
当我输入这个指令后,交互界面会打印出例如以下的代码:
1 |
|
前面一串字符串中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 |
|
除此之外,还可以使用>>
来进行文件的最佳操作(即在文件的末尾追加内容)
重定向还可以依赖于管道|
来将一个程序的输出于另一个程序的输入连接起来
举例:
1 |
|
sudo命令
作用:以管理者的身份来执行程序,不会受到权限的限制