当前位置: 首页 > news >正文

[Linux] 关于执行文件路径的变量:$PATH

参考:《鸟哥的Linux私房菜》

一、$PATH 是什么?

        我们知道文件属性的命令ls完整文件名为:/bin/ls(这是绝对路径),那你会不会觉得奇怪:“为什么我可以在任何地方执行 /bin/ls 这个命令?”,为什么我在任何目录下输入ls就一定可以显示出一些信息而不会说找不到该 /bin/ls 命令?这是因为环境变量 PATH 的帮助所导致。

        当我们在执行一个命令的时候,举例来说 ls 好了,系统会依照 PATH 的设置去每个 PATH 定义的目录下查找文件名为 ls 的可执行文件,如果在 PATH定义的目录中含有多个文件名为 ls 的可执行文件,那么先查找到的同名命令先被执行。

         PATH是一个环境变量,用于告诉操作系统在哪里查找可执行文件。当你在命令行中输入一个命令时,如果没有给出完整的路径,系统就会在PATH 中列出的目录里查找该命令对应的可执行文件。需要注意的是 PATH 这个单词必须要大写。

         $PATH 通常包含一系列目录路径,这些路径用冒号 (:) 分隔。每个路径都代表一个目录,其中包含可执行文件。系统会在这些目录中搜索命令。

        通常 $PATH 会包含 /bin 和 /usr/bin 这样的目录,因为这些目录中存放了很多常用的命令。

        要查看当前的 $PATH 设置,可以使用 echo 命令:

echo $PATH

         输出可能是这样的:

/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

  $PATH 中的每一个目录:

  • /usr/local/bin
  • /usr/bin:/bin
  • /bin
  • /usr/local/games
  • /usr/games

         当你输入 ls 命令时,系统会在 $PATH 中的每一个目录依次查找是否存在一个名为 ls 的可执行文件。第一个找到的 ls 命令将会被执行。由于 /bin 通常包含在 $PATH 的最前面,因此系统会在 /bin 目录中找到 ls 并执行它。

二、例题

2.1 问题一

        假设你是root,如果你将 ls 由 /bin/ls 移动成为 /root/ls (可用【mv /bin/ls /root】),然后你自己本身也在 /root 目录下,请问①你能不能直接输入 ls 来执行? ②若不能,你该如何执行 ls 这个命令?③若要直接输入 ls 即可执行,又该如何进行? 

(1)答:不能,当你将 ls 命令从 /bin/ls 移动到 /root/ls 后,/bin/ls 不再存在于 $PATH 中。

默认情况下,/root 目录不在 $PATH 中,因此系统不会在 /root 目录中查找 ls 命令。

(2) 答:方法一:使用完整的路径来执行命令

./ls

方法二: 使用绝对路径执行命令

/root/ls

(3)答:若要直接执行 ls ,需要修改 $PATH,为了能够在任何目录下直接输入 ls 并执行 /root/ls,你需要将 /root 添加到 $PATH 中。

方法一:在 Ubuntu 系统中,你可以编辑 /etc/environment 文件来全局修改 $PATH,或者在用户的 shell 配置文件中(例如 .bashrc 或 .bash_profile)添加以下内容:

export PATH=$PATH:/root

然后执行以下命令来使修改生效:

source ~/.bashrc

 或者重新打开一个终端窗口,这样 $PATH 就会包含 /root 目录。

方法二:在终端中直接设置(这将只在当前会话中有效):

export PATH=$PATH:/root

 重新加载配置文件或打开新的终端会话后,你就可以直接输入 ls 来执行 /root/ls 了。

 2.2 问题二

        为什么${PATH}查找的目录不加入本目录(.)?加入本目录的查找不是也不错?

        在大多数 Unix-like 系统中,默认情况下 $PATH 变量并不包含当前目录(.)。 这是出于安全和系统管理的考虑。

        如果 $PATH 中包含当前目录(.),那么用户在任何目录下都可以通过输入命令名来执行该目录下的可执行文件。这可能导致执行恶意程序的风险增加,特别是如果用户在不受信任的环境中工作。

        如果当前目录中有一个与系统命令同名的可执行文件,那么这个文件可能会被优先执行,而不是系统提供的标准命令。这可能导致意外的行为或安全漏洞。

        用户可能无意中在当前目录放置了一个与系统命令同名的可执行文件,这会导致系统命令被覆盖,从而产生不可预测的结果。例如,如果用户不小心在当前目录下放置了一个名为 ls 的脚本,那么每次输入 ls 时都会执行这个脚本,而不是系统提供的 ls 命令。

三、总结

  1. 不同身份用户默认的 PATH 不同,默认能够随意执行的命令也不同

  2. 使用绝对路径或相对路径直接指定某个命令的文件名来执行,会比查找PATH来的正确

  3. 命令应该放置到正确的目录下,执行才会比较方便

  4. 本目录(.)最好不要放到 PATH 中

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot自定义类加载器
  • linux查看网卡速度和pcie速度
  • 【Python零基础】while循环和用户输入
  • SPI驱动学习一(协议原理)
  • 硬件服务器操作系统的选择:Linux 还是 Windows?
  • 地理科学专业| 中国大学排行榜(2024年)
  • PgSQL HashAgg算法 | 第2期 | 版本12的spill溢出磁盘解秘
  • linux之ELK
  • [Hdp] lc552. 学生出勤记录 II(dp+递推+状态定义+状态转移+向前转移+好题)
  • Clichouse数据导出导入(数据迁移)
  • 重头开始嵌入式第二十三天(进程2)
  • Unity | 性能优化
  • 【分享】格力手机色界G0245D 刷REC、root、 救砖、第三方rom教程和资源
  • 论文辅导 | 基于改进灰色预测模型的港口物流需求预测研究
  • opencv图像基本操作
  • Google 是如何开发 Web 框架的
  • Asm.js的简单介绍
  • ES6--对象的扩展
  • Golang-长连接-状态推送
  • SAP云平台里Global Account和Sub Account的关系
  • 从输入URL到页面加载发生了什么
  • 警报:线上事故之CountDownLatch的威力
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 移动端唤起键盘时取消position:fixed定位
  • 用mpvue开发微信小程序
  • 栈实现走出迷宫(C++)
  • 交换综合实验一
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #ifdef 的技巧用法
  • #Linux(Source Insight安装及工程建立)
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (31)对象的克隆
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Git) gitignore基础使用
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (定时器/计数器)中断系统(详解与使用)
  • (动态规划)5. 最长回文子串 java解决
  • (二)pulsar安装在独立的docker中,python测试
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (接口封装)
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (推荐)叮当——中文语音对话机器人
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转载)从 Java 代码到 Java 堆
  • .apk文件,IIS不支持下载解决
  • .net core 管理用户机密
  • .net2005怎么读string形的xml,不是xml文件。
  • .Net中ListT 泛型转成DataTable、DataSet
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?