最近,我试图向一个朋友解释他电脑上PATH变量是用来做什么的。我在我们所交流的平台‘the Slack group"写了一篇比较长的消息之后,我意识到这个主题可以写成一个很好的博客,所以开始吧!

你大概一直听人说或者在博客上谈论修改你的PATH或者这样那样的。这时候你就会说:“等下,究竟什么是PATH?”。这是一个好问题!

PATH变量说白了就是一个目录列表,你的电脑查找这些目录列表来找到被请求的可执行文件

如果这个定义不能解释明白,请继续看下去,我会深入地解释它是怎么工作的。

简单地介绍文件系统

你的电脑是由文件组成的,这些文件有两种类型:一种是数据文件(只是包含信息的文件),一种是可执行文件(被用来在你电脑上执行各种功能和操作)。

无论什么时候,只要你打开一个电脑应用,从本质上讲就是在运行它的可执行文件。你在终端运行的命令也是一样的,例如,cd和ls只是可执行文件。这些可执行文件通常被存储在某些特定的目录里。你的应用软件的可执行文件,例如,被存储在Applications文件夹里。你所有的CLI程序/命令的可执行文件通常被存储在以下几个地方的其中之一:

  1. /bin -> 使用者的应用程序-包含一些常用的可执行文件,被用来导航到目录和通过命令行来管理文件


  2. /sbin->系统程序和管理员应用程序-包含处理一些像booting\restoring\recovering或者repairingt系统(launchdrebootmount, etc)的可执行文件
  3. /usr/bin
  4. /usr/sbin
  5. /usr/local/bin,  /usr/local/sbin 

    除此之外,还有一些标准目录,一些程序用它们自己的/bin之类的目录来存储可执行文件,例如,Homebrew是一个受欢迎的macOS包管理器,它把可执行文件安装在/usr/local/Cellar中,这些可执行文件然后被软链到/usr/local/bin文件夹。

关于PATH

我们在终端打出文件的绝对路径就能找到并使用这些可执行文件,所以,举个例子,如果你想使用ls来列出当前目录的所有的文件,你可能会在你的终端运行/bin/ls,或者你有一个很赞的程序安装在/usr/local/bin,你可能会运行/usr/local/bin/my-program来使用它。但是你真的想每次打出你的可执行文件的全路径吗?难道你不宁愿能运行ls或者my-program?

这就是PATH存在的意义,这里有一个比喻,来描述PATH是如何工作的:想像你是一个几个大的仓库的管理员,每一个仓库里有很多不同的产品。你也有电子表格或者列出每一个仓库地址的地图和每一个仓库里面都存在什么样的产品。

PATH用了类似的方式工作,它是一个全局变量,包含了用一个冒号( :)来隔开的不同路径的字符串。当你没有用全局路径,只打出了程序的名字,然后你的电脑会使用PATH变量来知道它应该去哪些目录里面去查找你正在请求的那个可执行文件。从列表的第一个目录开始,它将找到一个与你请求匹配的,这意味着PATH中第一个目录比它之后的目录优先查找。

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin


这是macOS默认的PATH,但是假如你想使用其他的工具类似Homebrew,你想把其他的目录加入到你的PATH呢?

编辑你的PATH
既然PATH本质上只是一个变量,我们可以用命令行得到PATH或者用一个脚本$PATH或者${PATH}.  ${PATH}的形式尤其有用,当你想重构像echo ${PATH}foo, 因为运行echo $PATHfoo将尝试去找PATHfoo

例如,我们想添加一个目录优先于其他当前的目录,我们可以在我们的终端运行以下的命令:

export PATH="/my/directory/bin:$PATH"

现在当我们运行echo $PATH ,你会看到PATH里刚加的新目录被列在其他的目录之前:

/my/directory/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

或者你想把这个目录加在PATH最后:

export PATH="$PATH:/my/directory/bin"

那你的PATH将会看起来是这样子:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/my/directory/bin

到这里,你已经知道怎么成功修改你的PATH了。
然而,你刚刚对PATH的修改不会是一直存在的,换句话说,下次你退出mac,PATH将会回到默认的PATH值。我们想永久的改变PATH,有两种方法:

  1. 修改/etc/paths文件
  2. 向我们本地shell文件中添加定制的PATH声明

如果我们编辑/etc/paths文件,PATH的改变将被全局应用到系统上所有的用户。

你只需要在该文件中另起一行来添加你目录路径即可。如果你只要改变当前用户的PATH,那么我推荐你采用第二种方法:

如果你使用的是Bash(大部分UNIX系统默认的shell),你将修改~/.bash_profile或者~/.bashrc;

PATH=$PATH:/usr/local/mysql/bin

export MONGO_PATH=/usr/local/Cellar/mongodb

export PATH=$PATH:$MONGO_PATH/bin

你用的其他的shell,你可以添加它到你所在用到shell文件。

【翻译】PATH究竟是什么?的更多相关文章

  1. nodejs 5.2.0文档自翻译——Path模块

    模块方法概览 Path path.basename(p[, ext]) path.delimiter path.dirname(p) path.extname(p) path.format(pathO ...

  2. 翻译-DevOps究竟是什么?

    原文地址:http://www.drdobbs.com/architecture-and-design/what-exactly-is-devops/240009147 作者:Neil Garnich ...

  3. Word 有哪些神奇的功能?

    作者:秦阳链接:https://www.zhihu.com/question/27035859/answer/621742048来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  4. Deferred shading rendering path翻译

    Overview 概述 When using deferred shading, there is no limit on the number of lights that can affect a ...

  5. [翻译svg教程]Path元素 svg中最神奇的元素!

    先看一个实例 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999 ...

  6. os.path官方文档(附翻译)

    This module implements some useful functions on pathnames. To read or write files see open(), and fo ...

  7. 快速上手RaphaelJS--Instant RaphaelJS Starter翻译(二)

    (目前发现一些文章被盗用的情况,我们将在每篇文章前面添加原文地址,本文源地址:http://www.cnblogs.com/idealer3d/p/Instant_RaphaelJS_Starter2 ...

  8. 《Programming WPF》翻译 第7章 3.笔刷和钢笔

    原文:<Programming WPF>翻译 第7章 3.笔刷和钢笔 为了在屏幕上绘制一个图形,WPF需要知道你想要为图形填充什么颜色以及如何绘制它的边框.WPF提供了一些Brush类型支 ...

  9. 《Programming WPF》翻译 第7章 1.图形基础

    原文:<Programming WPF>翻译 第7章 1.图形基础 WPF使得在你的应用程序中使用图形很容易,以及更容易开发你的显卡的能力.这有很多图形构架的方面来达到这个目标.其中最重要 ...

随机推荐

  1. 电脑磁盘分区助手:DiskGenius磁盘管理与数据恢复软件

    百度搜索DiskGenius自行下载

  2. ul根据后台添加li,并在点击li时,颜色随之变化

    在我们大多数时候都是通过<ul><li>...</li></ul>来实现同级的加载,但是也用很多时候li里的内容是不固定的.需要根据后台返回数据来生成. ...

  3. 我叫Tomcat:一款web服务器

    我叫Tomcat:一款web服务器 如何将我们的 Java 代码,运行在网络上,初学时,首先接触到的一般都是Servlet以及Jsp(或略过Jsp)而 Tomcat 就是这两者的容器,帮你处理动态网页 ...

  4. 腾讯云+阿里云 搭建hadoop + hbase

    目录 服务器配置 hadoop hbase JAVA测试 历时两天,踩了无数坑最后搭建成功... 准备 两台服务器都安装jdk1.8(最好装在相同路径). hadoop 下载 hbase 下载 这里使 ...

  5. superset的安装(win10)踩踩坑!AWSL

    基本安装参考https://www.jianshu.com/p/8b27ff71429f 按此方案装的时候会遇到各种flask版本不兼容的问题,所以 第一步:装好anaconda 第二部:保证好高于V ...

  6. PHP中类成员的访问控制

    类成员访问控制: 1.public 默认的,任何地方都可以访问,类内,类外,子类中 2.protected 受保护的,对外是封闭的,但是类内部和子类可以访问 3.private  私有的,仅限于本类中 ...

  7. git 显示文件改动,但无具体改动信息

     事件:        同步代码,进行了换行符替换 过程 : 同步代码,在正式服务器的 git 分支基础上创建新的分支,按照同步代码流程,将对方代码换行符转换(对方mac,我方windows) 替换需 ...

  8. QMetaEnum获取枚举元信息

    QMetaEnum 类提供了一个枚举的元数据.我们可以使用该类的静态模板函数,fromType<enumerator>来获得关于某个枚举的QMetaEnum对象,然后就可以调用该类的成员函 ...

  9. springboot 整合 web 项目找不到 jsp 文件

    今天遇到一个问题,就是使用springboot整合web项目的时候,怎么都访问不到 \webapp\WEB-INF\jsp\index.jsp 页面.这个问题搞了半天,试了各种方式.最后是因为在启动的 ...

  10. IDEA整合Jenkins界面化管理项目构建

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/WALK_MAN_wubiao/articl ...