单行bash脚本来检测丢失的PATH

时间:2016-08-23 20:52:15

标签: bash

我发现我的bash终端有点慢,并且发现了一个建议,要检查你的$ PATH以查看是否有错误的条目。有,我修好了。但是,我想写一个快速的单行,以便人们检查他们的$ PATH。

我想出了这个(在OSx上)

echo $PATH | tr : "\n" | xargs -I {} bash -c ' if [ ! -e "{}" ] ; then echo {}; fi; '

基本上有效,除了对于一个特定的目录,它表示它不存在,当它发生时。

我所看到的目录是一个真实的目录,它不是符号链接,我可以cd进入它并运行ls ...

运行上面的命令,它给了我一个目录"/Users/patrickdavey/bin",但我可以运行stat:

stat /Users/patrickdavey/bin
16777220 7650031 drwxr-xr-x 3 patrickdavey staff 0 102 "Aug 23 22:42:29 2016" "May 24 03:03:41 2016" "May 24 03:03:41 2016" "May 24 03:03:32 2016" 4096 0 0 /Users/patrickdavey/bin

所以,它肯定存在。

如果有人能指出我上面的剧本可能出错的地方,我真的很感激! :)

代表@ john1024 -

$ cd ~/
$ pwd
/Users/patrickdavey
$ (IFS=:; find $PATH -maxdepth 0 ! -type d)
find: ~/bin: No such file or directory
$ stat ~/bin
16777220 7650031 drwxr-xr-x 4 patrickdavey staff 0 136 "Aug 24 20:39:24 2016" "Aug 24 16:34:09 2016" "Aug 24 16:34:09 2016" "May 24 02:03:32 2016" 4096 0 0 /Users/patrickdavey/bin

1 个答案:

答案 0 :(得分:1)

注意这不会产生错误:

$ (PATH=/bin:/usr/bin:~/bin; IFS=:; find $PATH -maxdepth 0 ! -type d)

相比之下,这会生成类似于您看到的错误消息:

$ (PATH="/bin:/usr/bin:~/bin"; IFS=:; find $PATH -maxdepth 0 ! -type d)
find: ‘~/bin’: No such file or directory

问题是,在此版本中,~在引号中。 ~/仅表示主目录未加引号

请注意,您仍然可以使用引号来定义PATH。他们只是不能包含~/。例如,以下工作没有错误:

$ (PATH="/bin:/usr/bin":~/"bin"; IFS=:; find $PATH -maxdepth 0 ! -type d)

文档

来自man bash

  

检查每个变量赋值是否为不带引号的波浪号前缀   紧接着:或第一个=在这些情况下,代字号   扩展也在进行中。因此,可以使用文件名   倾斜于PATH,MAILPATH和CDPATH以及shell的赋值   分配扩展值。 [重点补充。]

同样来自man bash

  

Tilde Expansion

     

如果一个单词以不带引号的波浪号(`〜')开头,则第一个未加引号的斜杠前面的所有字符(或全部)   字符,如果没有不带引号的斜杠)被认为是   波浪号前缀。如果tilde-prefix中没有任何字符   引用,代字号后面的波浪号前缀中的字符是   被视为可能的登录名。如果此登录名为null   string,tilde替换为shell参数的值   家。如果未设置HOME,则执行该用户的主目录   用shell代替。否则,替换tilde-prefix   与指定登录名关联的主目录。 [强调补充]