Skip to main content

Shell

1. 使用shell

shell是最基本的命令行工具,它提供了许多命令,如ls、cd、pwd、mkdir、rm、cp、mv、cat、echo、grep、find、sort、wc、head、tail、less、more、man、history、clear、exit等。它是一种文字接口。

2. 课后练习

原链接:https://missing-semester-cn.github.io/2020/course-shell/

本次练习使用WSL终端完成。

使用 echo $SHELL 命令可以查看您的 shell 是否满足要求

在 /tmp 下新建一个名为 missing 的文件夹。

  1. 不太优雅的做法
# 由于我知道tmp文件夹是在根目录下一级,直接cd进入
cd /tmp
mkdir missing
  1. 优雅一点的做法
# find查询
find / -type d -name "tmp" 2>/dev/null

用 man 查看程序 touch 的使用手册。

man touch

用 touch 在 missing 文件夹中新建一个叫 semester 的文件。

touch /tmp/missing/semester

使用 chmod 命令改变权限,使 ./semester 能够成功执行,不要使用 sh semester 来执行该程序。

sudo chmod 777 /tmp/missing/semester

您的 shell 是如何知晓这个文件需要使用 sh 来解析呢?这涉及到 shell 的解析器。 在semester文件中有#!/bin/sh开头这一行,也就是说文件中存在Shebang(#!),它指示了shell如何解析这个文件。程序加载器会分析Shebang后的内容,将这些内容作为解释器指令,并调用该指令,并将载有Shebang的文件路径作为该解释器的参数。

#!/bin/sh—使用sh,即Bourne shell或其它兼容shell执行脚本。/bin/sh软链接或硬链接到Bash。

使用 | 和 > ,将 semester 文件输出的最后更改日期信息,写入主目录下的 last-modified.txt 的文件中

chengzhu@DESKTOP-TPDC2FU:~$ cd /tmp/missing
chengzhu@DESKTOP-TPDC2FU:/tmp/missing$ stat -c %y semester | tee ~/last-modified.txt
2024-08-16 18:51:41.028832115 +0800
chengzhu@DESKTOP-TPDC2FU:/tmp/missing$ cd
chengzhu@DESKTOP-TPDC2FU:~$ vim last-modified.txt

写一段命令来从 /sys 中获取笔记本的电量信息,或者台式机 CPU 的温度。

cat /sys/class/power_supply/BAT1/capacity

Overview

使用命令行管理 Linux 系统是最基本和最重要的方式。

使用命令行有两种方式,一种是在桌面环境中使用仿真终端,另一种是进入文本模式后登录到控制台

使用仿真终端: Ubuntu 图形界面中使用终端窗口来执行命令行操作。该终端是一个终端仿真应用程序,提供命令行工作模式,可以使用如下几种方法打开终端:

  1. 方法1:鼠标右键一打开终端
  2. 方法2:使用组合键<Ctr|>+<Alt>+<T>可以找到终端
  3. 方法3:在 Dash 中浏览到“终端”程序,或者搜索“gnome-terminal”或“终端”端应用程序

Terminal

仿真终端窗口界面中将显示一串提示符,由4部分组成,格式如下:

当前用户名@主机名:当前目录 命令提示符

  1. 当前用户名,表示当前登录的用户名称1.
  2. 主机名,表示计算机名称
  3. 当前目录,表示终端当前所在目录,“~”表示家目录,其绝对路径为:/home/用户名
  4. 命令提示符,”$”表示普通用户,”#”表示超级管理员 root 用户在命令提示符之后输入命令即可执行相应的操作,执行的结果也显示在该窗口中

Terminal 一个图形界面的仿真终端工具,用户可以通过相应的菜单修改终端的设置,如字符编码、字体颜色、背景颜色等

可根据需要打开多个终端窗口,可以使用图形操作按钮关闭终端窗口,也可在终端命令行中执行命令 exit 关闭该终端窗口

没有安装桌面环境的 Linux系统只能进入文本模式,Ubuntu桌面版启动之后直接进入图形界面,可以根据需要切换到文本模式,此时需要登录到 Linux 系统中的设备和文件层次结构。文件夹中存储系统信息,用户需要的信息也从中调用

直接在Linux计算机上的登录称为从控制台登录,使用telnet、ssH等工具通过网络登录到 Linux 主机称为远程登录。Visual

Linux 是多用户操作系统,可以同时接受多个用户登录而且允许一个用户进行多次登录。

使用普通用户登录时,账号密码不变;使用root用户登陆时,第一次登录需要设置root 账户密码,在仿真终端中输入:

sudo passwd root

在文本模式下从控制台登录的界面又称 TTY。

Linux 系统允许用户同时打开 6个控制台(tty1~tty6)进行操作,每个控制台可以让不同用户身份登录,运行不同的应用程序。

在 Ubuntu 图形界面中可按组合键<Ctrl>+<Alt>+F(n)(其中F(n)为F1-F6,分别代表 1~6号控制台)切换到文本控制台界面,在文本控制台界面中按组合键<Ctrl>+<Alt>+<F1>返回到图形界面

shell

Linux中,Shell是用户和系统交互的接口,是一个命令解释器。

用户在命令提示符下输入的命令都由 shell 先接收并进行分析,然后传给 Linux 内核执行,结果返回给 shell,由它显示在屏幕上

不管命令执行结果成功与否,Shell总是再次给出命令提示符,等待用户输入下 一个命令

Shell 同时又是一种程序设计语言,允许用户编写由Shell命令组成的程序,这种程序称为 Shell 脚本(Shell script)或命令文件。

Shell 有多种不同版本,可分为两大类型:

  • 一类是由贝尔实验室开发的,以 Bourne shell(sh)为代表,与之兼容的有 Bourne-Agian Shell (bash)、Korn Shell(ksh)、Z Shell(zsh)

  • 另一类是由加州大学伯克莱分校开发的,以Cshell(csh)为代表,与之兼容的有TENEXCShell(tcsh)

  • 用户进入 Linux 命令行(切换到文本界面,或者在图形界面中打开终端)时,系统自动运行一个默认的 shel程序。用户可看到 shell 的提示符(管理员为#,普通用户为$),用户在提示符后输入指令,shell 对这个指令进行解释。命令语法格式为:命令[选项】[参数(对象)]

  1. 选项:选项是包括一个或多个字母的代码,前面有一个”。”连字符,主要用于改变命令执行动作的类型
  2. 参数(对象):命令的操作对象
  3. 几中的内容表示是可使用的选项,可选一个或多个或不选

Ubuntu 默认使用的 Shell 是 bash

命令

ls 命令是 linux 下最常用的命令,ls 命令是 list 的缩写

ls 用来打印出当前目录的清单。如果ls 指定其他目录,会显示指定目录里的文件及文件夹清单

通过 Is 命令可以查看 linux 文件夹包含的文件,目录和文件的权限等信息

命令格式:

ls[选项][文件 或 目录]

备注:[]中的内容表示是可选选项参数,可选一个或多个或不选中的内容表示只可选其中一个选项参数

颜色说明:

  • 白色:表示普通文件;
  • 蓝色:表示目录;
  • 绿色:表示可执行文件;
  • 红色:表示压缩文件
  • 浅蓝色:链接文件,主要是使用ln命令建立的文件;
  • 红色闪烁:表示链接的文件有问题;
  • 黄色:表示设备文件;
  • 灰色:表示其他文件

例一: 列出/home/文件夹下的所有文件和目录的详细资料,可以使用如下命令

 ls -a -l /home
ls -al /home
# 效果一样,多个参数可以合并使用

常用选项参数:

  • -a:-al 列出目录下的所有文件,包括以·开头的隐藏文件
  • -1:除了文件名之外,还将文件的权限、所有者、文件大小等信息详细列出来
  • -p or -F:在每个文件名后附上一个字符以阐明该文件的类型: “*”表明可执行的一般文件;“/”表明目录;“@”表明符号连接;“”表明FIFOs;“=”表明套接字(sockets)
  • --help:帮助信息

备注:

  1. Ubuntu中,以.开头的文件为隐藏文件
  2. Ubuntu中,“命令--help””man 命令”可获取该命令的帮助信息
  3. FIFO( First In First Out )先进先出队列,一种缓存、或一种管道、设备、接口

cd 命令是 change directory 的缩写,cd 命令切换当前目录至指定的目录

cd [目录名]

备注:cd后不跟参数,进入主目录,即~

常用范例:

  1. 例一:从当前目录进入系统根目录,可以使用如下命令
$ cd /
  1. 例二:从当前目录进入父目录,可以使用如下命令:
$ cd ..

备注:.表示当前目录;.. 表示父目录,即上一级目录

  1. 例三:从当前目录进入当前用户主目录,可以使用如下命令:
$ cd ~
  1. 例四:从当前目录进入上次所在目录,可以使用如下命令:
$ cd -

备注:- 表示上次进入的目录

pwd

pwd 命令是 Print Working Directory 的缩写,Linux 中用 pwd 命令来查看“当前工作目录”的绝对路径。每当在终端进行操作时,都会有一个当前工作目录。在不太确定当前位置时,就可以使用pwd 来判定当前目录在文件系统内的确切位置

命令格式:

pwd[选项]

常用选项参数:

  • -P:显示实际物理路径,而非使用连接(link)路径
  • -L:当目录为连接路径时,显示连接路径

常用范例:

  1. 例一:显示当前目录的物理路径(即绝对路径),可以使用如下命令:
$ pwd
  1. 例二:显示实际物理路径,而非使用链接路径,可以使用如下命令:
$ pwd -P
  1. 例三:显示当前目录的链接路径,可以使用如下命令:
$ pwd -L

echo

echo 命令用来在标准输出中显示输入的字符串,即递给 echo 的对象被打印到标准输出中。echo 通常用于 shel 脚本中,用于显示消息或输出其他命令的结果。

命令格式:

echo[选项]字符串

常用选项参数:

  • -n: 输出字符串不换行
  • -e: 处理转义字符
    • \a: 发出警告声
    • \b: 删除前一个字符
    • \c: 最后不加上换行符号
    • \f: 换行但光标仍旧停留在原来的位置

touch

touch 命令用来新建一个文件,或者修改文件时间戳

命令格式

touch[选项]文件

常用选项参数:

  • -a: 只更改存取时间
  • -d: 使用指定的日期时间,而非现在的时间
  • -t: 使用指定的日期时间,而非现在的时间
  • -m: 只更改变动时间
  • -r: 把指定文档或目录的日期时间,设成和参考文档或目录的日期时间相同

创建log1.log和log2.log文件

sudo touch log1.log log2.log

mkdir

mkdir 命令是 make directory 的缩写,mkdir 命令用来创建指定名称的目录 要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录》

命令格式:

mkdir[选项]目录

常用选项参数

  • -m:设定权限
  • -p:-次可以建立多级目录
  • -v:每次创建新目录都显示信息
  1. 例一:递归创建多个目录,可以使用如下命令:
$ mkdir -p RoS/test
  1. 例二:创建权限为 777 的目录,可以使用如下命令:
$ mkdir -m 777 ROS
  1. 例三:创建目录显示信息,可以使用如下命令:
$ mkdir -vp ROS/test

rm

rm 命令是 remove 的缩写,rm 命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除,对于链接文件,只会删除链接,原文件均保持不变

命令格式:

rm [选项] 文件或目录

常用选项参数:

  • -f:忽略不存在的文件,从不给出提示
  • -i:进行交互式删除
  • -r:指示 rm 将参数中列出的全部目录和子目录均递归地删除
  • -v:详细显示进行的步骤
sudo touch ROS.log
sudo rm ROS.log
# 强行删除文件
rm -f ROS.log
# 按通配符删除文件,删除前逐一询问
rm *.log 或 rm -i *.log

mv

mv 命令是 move 的缩写,mv 命令功能是用来移动文件或更改文件名,经常用来备份文件或者目录,mv 命令根据第二个对象类型(目标是一个文件还是目录),决定执行将文件重命名或将其移至一个新的目录中

  • 当第二个对象类型是文件时,mv 命对文件进行重命名
  • 当第二个对象是已存在的目录时,mv 命令将各对象指定的源文件均移至目标目录中v

命令格式:

mv [选项] 源文件或目录 目标文件或目录

常用选项参数:

  • -b:若需覆盖文件,则覆盖前先行备份
  • -f:如果目标文件已经存在,不会询问而直接覆盖
  • -i:若目标文件已经存在时,会询问是否覆盖
  • -u:若目标文件已经存在,且源文件比较新,才会更新
  • -t:移动多个源文件到一个目录,此时目标目录在前,源文件在后

常用范例:

  1. 例一:将文件 ROS.log 重命名为 ROS1.log,可以使用如下命令:
$ mv ROS.log ROS1.log
  1. 例二:将文件 ROS1.log 移动到 test 目录下(test 目录必须已经存在,否则执行重命 名),可以使用如下命令:
$ mv ROS1.log test
  1. 例三:将文件 ROS1.log 移动到 test 目录下,如果文件存在,覆盖前询问是否覆盖,可 以使用如下命令:
$ mv -i ROS1.log test

cp

cp 命令是 copy 的缩写,cp 命令用来复制文件或者目录。

命令格式:

cp [选项] 源文件 目录

常用选项参数:

  • -i: 覆盖前询问
  • -n:不要覆盖已存在的文件
  • -s:对源文件建立符号链接,而非复制文件
  • -f:强行复制文件或目录,不论目的文件或目录是否已经存在
  • -u:在源文件的修改时间较晚的文件更新时,或是对应的目的文件并不存在,才复制文件

常用范例:

  1. 例一:对文件 ROS.log 建立一个符号链接 r.log,可以使用如下命令:
$ cp -s ROS.log r.log
  1. 例二:将 test 目录下的所有文件复制到 test1 目录下,覆盖前询问,可以使用如下命令:
$ cp -i test/* test1
  1. 例三:将 test1 目录下的最近更新的文件复制到 test目录下,覆盖前询问,可以使用如 下命令:
$ cp -iu test1/* test

cat

cat 命令是 concatenate 的缩写,cat 命令的功能是将文件或标准输入组合输出到标准输出,这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用

命令格式:

cat [选项] 文件

常用选项参数:

  • -A:等价于 -vET
  • -b:对非空输出行编号
  • -e:等价于 -vE
  • -E:在每行结束处显示 $
  • -n:由 1 开始对所有输出的行数编号
  • -s:有连续两行以上的空白行,就代换为一行的空白行
  • -t:与 -vT 等价
  • -T:将跳格字符显示为 ^I
  • -v:使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外

常用范例:

  1. 例一:把 ROS.log 的文件内容加上行号后保存到 ROS1.log 文件中,可以使用如下命令:
$ cat -n ROS.log > ROS1.log

备注:

  • “ cmd > file”中,">" 表示重定向输出。把 cmd 命令的输出重定向到文件 file 中。如果file 已经存在,则清空原有文件
  • “cmd >> file”中,">>" 表示重定向输出。把 cmd 命令的输出重定向到文件 file 中,如果file已经存在,则把信息追加在原文件后面
  • “cmd < file”中,"<" 表示重定向输入。使得 cmd 命令从 file 读入
  • “cmd << text”中,"<<" 表示重定向输入。从命令行读取输入,直到一个与 text 相同的行结束。除非使用引号把输入括起来,此模式将对输入内容进行 shell 变量替换
  1. 例二:把 ROS.log 的文件内容加上行号后追加到 ROS2.log 这个文件里,多行空行换成 一行输出,可以使用如下命令:
$ cat -ns ROS.log >> ROS2.log
  1. 例三:将 ROS.log 的文件内容反向显示,可以使用如下命令:
$ tac ROS.log
warning
  1. 简要说明 Ubuntu 中终端、Shell 和 TTY 的区别与联系
  2. 如何最快的返回到当前账户的主目录?
  3. 如何把 /etc 复制到 /tmp下,并不覆盖已存在的文件?
  4. 如何一次性创建 text/1/2/3/4?
  5. 如何删除 /tmp 下所有A开头的文件?
答案
  1. 终端仿真应用程序,s使用命令行工作模式;Shell是用户和系统交互的接口,是一个命令解释器,也是一种程序设计语言; TTY是在文本模式下从控制台登录的界面,按<Ctrl>+<Alt>+F(n)进入,按<Ctrl>+<Alt>+<F1>返回到图形界面
cd ~
cp /etc /tmp
sudo mkdir -p text/1/2/3/4
rm /tmp/A*