千家信息网

Linux shell使用注意事项有哪些

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"Linux shell使用注意事项有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成
千家信息网最后更新 2026年11月01日Linux shell使用注意事项有哪些

本篇内容介绍了"Linux shell使用注意事项有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。是在Linux内核与用户之间的解释器程序,现在Linux通常指/bin/bash解释器来负责向内核翻译以及传达用户/程序指令。

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

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

比如说,我现在有个自动连接宽带的 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 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)",结果差不多,但是仍然有区别。注意观察,双引号转义完成的结果会自动增加单引号,而前者不会。

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

四、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安全错误 数据库的锁怎样保障安全 喔噻互联网科技有限公司 期待互联网科技 嘟嘟瓜互联网科技 互联网科技小额贷款 齐家互联网科技有限公司 上海亿帐通互联网科技 互联网金融和金融科技 新华互联网科技校企合作 无锡溥仪互联网科技有限公司 成都玖崟互联网科技有限公司乐商圈怎么样 广州慧亚互联网科技怎么样 阿里巴巴算科技企业还是互联网 互联网科技研发水平 996高科技互联网公司 西安有哪些互联网高科技企业 福仕德教育科技互联网 美国五大互联网科技公司市值多少 北京军民互联网科技公司 互联网高科技绘画 互联网企业和网络科技有限公司 百单网互联网科技有限公司怎么样 涨乐互联网科技 唐信互联网科技 新浪科技互联网 哈尔滨秒房互联网科技有限公司 西藏七维空间互联网科技有限公司 世界互联网科技公司市值排名 链环科技传统企业怎么转型互联网 济南有互联网科技公司吗 启辰互联网科技
0