千家信息网

怎么理解Linux shell的知识点

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章给大家介绍怎么理解Linux shell的知识点,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。我个人很喜欢使用 Linux 系统,虽然说 Windows 的图形化界面做的
千家信息网最后更新 2026年11月01日怎么理解Linux shell的知识点

这篇文章给大家介绍怎么理解Linux shell的知识点,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

我个人很喜欢使用 Linux 系统,虽然说 Windows 的图形化界面做的确实比 Linux 好,但是对 脚本的支持太差了。一开始有点不习惯 命令行操作,但是熟悉了之后反而发现移动鼠标点点点才是浪费时间的罪魁祸首。那么对于 Linux 命令行,本文不是介绍某些命令的用法,而是说明一些简单却特别容易让人迷惑的细节问题。

一、标准输入和参数的区别

这个问题一定是最容易让人迷惑的,具体来说,就是搞不清什么时候用管道符|和文件重定向>,<,什么时候用变量$。

比如说,我现在有个自动连接宽带的 shell 脚本connect.sh,存在我的家目录:

$ where connect.sh  /home/fdl/bin/connect.sh

如果我想删除这个脚本,而且想少敲几次键盘,应该怎么操作呢?我曾经这样尝试过:

$ where connect.sh | rm

实际上,这样操作是错误的,正确的做法应该是这样的:

$ rm $(where connect.sh)

前者试图将where的结果连接到rm的标准输入,后者试图将结果作为命令行参数传入。

标准输入就是编程语言中诸如scanf或者readline这种命令;而参数是指程序的main函数传入的args字符数组。

管道符和重定向符是将数据作为程序的标准输入,而$(cmd)是读取cmd命令输出的数据作为参数,前文画图解释过:

输入重定向就是说,程序想读取数据的时候就会去 files[0] 读取,所以我们只要把 files[0] 指向一个文件,那么程序就会从这个文件中读取数据,而不是从键盘。

同理,输出重定向就是把files[1]指向一个文件,那么程序的输出就不会写入到显示器,而是写入到这个文件中。

管道符其实也是异曲同工,把一个进程的输出流和另一个进程的输入流接起一条「管道」,数据就在其中传递:

Linux 进程、线程、文件描述符的底层原理

用刚才的例子说,rm命令源代码中肯定不接受标准输入,而是接收命令行参数,删除相应的文件。作为对比,cat命令是既接受标准输入,又接受命令行参数:

$ cat filename  ...file text...  $ cat < filename  ...file text...  $ echo 'hello world' | cat  hello world

如果命令能够让终端阻塞,说明该命令接收标准输入,反之就是不接受,比如你只运行cat命令不加任何参数,终端就会阻塞,等待你输入字符串并回显相同的字符串。

二、后台运行程序

比如说你远程登录到服务器上,运行一个 Django web 程序:

$ python manager.py runserver 0.0.0.0  Listening on 0.0.0.0:8080...

现在你可以通过服务器的 IP 地址测试 Django 服务,但是终端此时就阻塞了,你输入什么都不响应,除非输入 Ctrl-C 或者 Ctrl-/ 终止 python 进程。

可以在命令之后加一个&符号,这样命令行不会阻塞,可以响应你后续输入的命令,但是如果你退出服务器的登录,就不能访问该网页了。

如果你想在退出服务器之后仍然能够访问 web 服务,应该这样把命令包裹成这样(cmd &):

$ (python manager.py runserver 0.0.0.0 &)  Listening on 0.0.0.0:8080...   $ logout

底层原理是这样的:

每一个命令行终端都是一个 shell 进程,你在这个终端里执行的程序实际上都是这个 shell 进程分出来的子进程。正常情况下,shell 进程会阻塞,等待子进程退出才重新接收你输入的新的命令。加上&号,只是让 shell 进程不再阻塞,可以继续响应你的新命令。但是无论如何,你如果关掉了这个 shell 命令行端口,依附于它的所有子进程都会退出。

而(cmd &)这样运行命令,则是将cmd命令挂到一个systemd系统守护进程名下,认systemd做爸爸,这样当你退出当前终端时,对于刚才的cmd命令就完全没有影响了。

类似的,还有一种后台运行常用的做法是这样:

$ nohup some_cmd &

nohup命令也是类似的原理,不过通过我的测试,还是(cmd &)这种形式更加稳定。

三、单引号和双引号的区别

不同的 shell 行为会有细微区别,但有一点是确定的,对于$,(,)这几个符号,单引号包围的字符串不会做任何转义,双引号包围的字符串会转义。

shell 的行为可以测试,使用set -x命令,会开启 shell 的命令回显,你可以通过回显观察 shell 到底在执行什么命令:

可见 echo $(cmd) 和 echo "$(cmd)",结果差不多,但是仍然有区别。注意观察,双引号转义完成的结果会自动增加单引号,而前者不会。

也就是说,如果 $ 读取出的参数字符串包含空格,应该用双引号括起来,否则就会出错。

四、sudo 找不到命令

有时候我们普通用户可以用的命令,用sudo加权限之后却报错 command not found:

$ connect.sh  network-manager: Permission denied  $ sudo connect.sh  sudo: command not found

原因在于,connect.sh这个脚本仅存在于该用户的环境变量中:

$ where connect.sh   /home/fdl/bin/connect.sh

当使用sudo时,系统认为是 root 用户在执行命令,所以会去搜索 root 用户的环境变量,而这个脚本在 root 的环境变量目录中当然是找不到的。

解决方法是使用脚本文件的路径,而不是仅仅通过脚本名称:

$ sudo /home/fdl/bin/connect.sh

关于怎么理解Linux shell的知识点就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

命令 输入 进程 参数 文件 程序 引号 标准 脚本 字符 终端 服务 阻塞 就是 数据 运行 变量 字符串 服务器 用户 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网与科技 什么是科技互联网 亿人帮互联网科技有限公司 互联网和科技技术 深圳互联网络科技有限公司 杭州互联网科技公司 奇酷互联网科技公司 四川狮子座互联网科技 上海电发互联网科技有限公司 互联网对科技的发展 彤创互联网科技有限公司 深圳市优智互联网科技有限公司 互联网科技扶贫时间 燊美集互联网科技有限公司 朱啸虎曾投资哪些互联网科技企业 黑科技 体验场景 互联网大会 电子商务与互联网科技的关系 领航科技大厦互联网公司 世界互联网科技成果奖 兰石爱特工业互联网科技分公司 哈尔滨大商圈互联网科技有限公司 山东特亿宝互联网科技有限公司 新华互联网科技学校 新华互联网科技学院 九亚互联网科技 善班互联网科技有限公司 多迪互联网科技有限公司 唯美互联网科技 陕西彩京云互联网科技有限公司 互联网的黑科技实验室
0