什么是“$PATH”和“~/bin”?我怎样才能拥有个人脚本?

29 environment-variables

什么是$PATH

我如何拥有仅对我可用的命令/程序?
我之前看到过这个路径~/bin,但是它是做什么用的,我该如何使用它?

小智 27

$PATH 是用于查找命令的环境变量。~ 是你的主目录,所以 ~/bin 将是 /home/user/bin;它是一个普通目录。

例如,当您在 shell 中运行“ls”时,您实际上是在运行 /bin/ls 程序;确切位置可能因您的系统配置而异。发生这种情况是因为 /bin 在您的 $PATH 中。

要查看路径并找到任何特定命令所在的位置:

$ echo $PATH
/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:...
$ which ls     # searches $PATH for an executable named "ls"
/bin/ls
$ ls           # runs /bin/ls
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
$ /bin/ls      # can also run directly
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
Run Code Online (Sandbox Code Playgroud)

要拥有自己的私有bin目录,只需将其添加到路径中即可。通过编辑 ~/.profile (隐藏文件)以包含以下行来执行此操作。如果这些行被注释了,你只需要取消注释它们;如果他们已经在那里,你就准备好了!

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ]; then
  PATH="$HOME/bin:$PATH"
fi
Run Code Online (Sandbox Code Playgroud)

现在您需要创建您的 ~/bin 目录,并且因为 .profile 在登录时运行并且只添加 ~/bin 如果当时存在,您需要再次登录以查看更新的 PATH。

让我们测试一下:

$ ln -s $(which ls) ~/bin/my-ls   # symlink
$ which my-ls
/home/user/bin/my-ls
$ my-ls -l ~/bin/my-ls
lrwxrwxrwx 1 user user 7 2010-10-27 18:56 my-ls -> /bin/ls
$ my-ls          # lookup through $PATH
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
$ ~/bin/my-ls    # doesn't use $PATH to lookup
bin  desktop  documents  downloads  examples.desktop  music  pictures  ...
Run Code Online (Sandbox Code Playgroud)

  • 使用 which 时要注意的一件事是它只会找到文件系统中的二进制命令,它不会报告 shell 内置、别名或函数。通常,使用 `type` 来查看 shell 如何解析实际命令更有用;例如:`which echo`和`type echo`会报告不同的东西,`which`返回'/bin/echo'但'type'返回它是一个内置的shell,shell会更喜欢'/bin'中的文件. (3认同)

Dan*_*nga 18

关于~/bin和命令/程序仅对您的用户可用

最近的 Ubuntu 版本~/bin在您的 中包含该目录$PATH,但前提是该~/bin目录存在。

如果不存在:

  1. 确保您~/.profile包含以下节(默认~/.profile已包含):

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建~/bin目录:

    mkdir -p ~/bin
    
    Run Code Online (Sandbox Code Playgroud)
  3. 要么重新启动计算机,要么强制 bash 重新读取~/.profile

    exec -l bash
    
    Run Code Online (Sandbox Code Playgroud)

  • `exec -l` 将 bash 作为登录 shell [http://wiki.bash-hackers.org/commands/builtin/exec] 执行。简而言之,它强制 bash 重新读取 `/etc/profile` 和 `~/.profile`。只运行 `exec bash` 只会重新读取 `~/.bashrc`。 (3认同)