将文件目录添加到PATH

时间:2014-04-21 18:40:21

标签: bash path

我正在尝试以尽可能简单的方式将一组子目录添加到我的PATH中。

目前的结构是:

main_project/
   subproject/bin/
   subproject2/bin/
   subproject with spaces/bin/

我目前在.bash_profile中使用简单的bash-fu:

PATH="$PATH:$(echo /projects/main_project/*/bin | tr ' ' ':')"

问题是带有空格的路径是:

我的$ PATH

中的

subproject:with:spaces/bin/

3 个答案:

答案 0 :(得分:3)

您应该使用printf代替:

PATH="$PATH$(printf ":%s" /projects/main_project/*/bin)"

答案 1 :(得分:1)

循环会更清晰:

for subproj in /projects/main_project/*/bin; do
    PATH+=":$subproj"
done

答案 2 :(得分:0)

另一种可能性(滥用IFS - 但它也是出于这种目的!):

scratch=( /projects/main_project/*/bin )
IFS=: read -r PATH <<< "$PATH:${scratch[*]}"

下面的内容对你来说可能是矫枉过正,毫无用处!

如果您想要更强大的功能,即使PATH未设置或为空,也能按预期工作:

scratch=( /projects/main_project/*/bin )
IFS=: read -r PATH <<< "${PATH:+$PATH:}${scratch[*]}"

最后你可能(正确!)认为使用globs是不安全的(即没有shell选项nullglobfailglob)设置:

old_nullglob=$(shopt -p nullglob)
shopt -s nullglob
scratch=( /projects/main_project/*/bin )
((${#scratch})) && IFS=: read -r PATH <<< "${PATH:+$PATH:}${scratch[*]}"
$old_nullglob

另一个想法,如果这些已经在你的PATH中怎么办?我会把它留作家庭作业!