将目录添加到 $PATH 时可以添加所有子目录

Tim*_*Tim 8 environment-variables

通过 PATH=~/my_program/bin:”${PATH}” 向 $PATH 添加目录时

  1. 是不是只有直接在目录下的可执行文件才能通过 $PATH 找到,而其子目录下的其他可执行文件则不会?
  2. 是否可以添加其所有子目录?有时,当有很多子目录时,显式指定所有子目录可能需要大量工作。

感谢致敬!

Pet*_*r.O 5

该脚本使用tree...

  • sudo apt-get install tree

您可以通过更改来更改目录的深度,-L 1
您可以选择是否使用~/...

更新 2
.. 修改脚本以仅替换前导/home/user/(不是“任何”)
.. 并添加了 args..

更新添加了检查:.. 当目录已经在 PATH 中时,不要将目录添加到 PATH .. 此检查认为 '~/' 和 '/home/user/' 是不同的。

关于你的问题 1... 是的,这是真的;每个特定目录必须在 PATH 中单独指定。

关于你的问题 2... 这是一个可以做你想做的脚本..
我已经测试过它,但它会为当前会话创建新的 PATH..
为了使它永久,你可以使用export PATH(但我对细节有点粗略export

#
# name: path-add-dirs
# eg: $ path-add-dirs "$HOME/bin" "tilde" 1

# When directories are $HOME based, choose format.
# Add directories in tidle format: ~/...
#       ...or as fullly-qualified: /home/user/...

# mode values: "tilde", or  anything else for fully-qualified   
mode="$2" # valid mode values: "tilde", or  anything else   
maindir="$1"; dirs= ; echo
# Buld string of subdirectories to a depth/level of 1  
while IFS= read -r dir ; do
  # Don't add directory if it is already in PATH
  if [[ "$mode" == "tilde" ]] ; then
    # replace only a *leading* :/home/user/ 
    homecheck=":$dir"                    
    dircheck="${homecheck/:$HOME\//:~/}"
    dircheck="${dircheck#:}"
  else
    dircheck="${dir}"
  fi;
  pathcheck=":$PATH:"
  if [[ "$pathcheck" != "${pathcheck/:$dircheck:/}" ]] ; then  
    echo "ALREADY IN PATH: $dircheck"
  else
    dirs="$dirs:$dir"  
    echo " added: $dircheck"
  fi
done < <(tree --noreport -L $3 -fi -d "$maindir")
# Choose one of these two options
if [[ "$mode" == "tilde" ]] 
then PATH="$PATH${dirs//:$HOME\//:~/}" # change :$HOME to :~/ 
else PATH="$PATH$dirs" # this method has fully expanded $HOME
fi
echo
echo "$PATH"
echo
Run Code Online (Sandbox Code Playgroud)