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

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

当通过 PATH=~/my_program/bin:”${PATH}” 将某些目录添加到 $PATH 时

  1. 是否确实只有目录下的直接可执行文件才可以通过 $PATH 找到,而其子目录下的其他可执行文件则不会找到?
  2. 是否可以添加其所有子目录?当子目录很多时,有时明确指定所有子目录会很费事。

感谢致敬!

答案1

该脚本使用tree...

  • sudo apt-get install tree

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

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

更新添加检查:.. 当目录已经在 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

答案2

这是不可能的,因为基于 UNIX 的系统不是设计成这样工作的。通常,所有可执行文件都放在少数几个目录中。例如,我为自己编写的所有内容都放在 ~/bin 中。

如果您不希望实际的二进制文件和脚本位于 bin 目录中,则可以在例如 ~/bin 中创建指向实际二进制文件的符号链接。

将所有子目录都放在 $PATH 中并不是特别可取,因为它只会增加需要搜索的目录,增加其他不应该存在的可执行文件进入您的 PATH 的风险,并且实际上并没有带来太多好处。

答案3

这应该可以

PATH="$PATH:$(find ~/bin -type d -printf ":%p")"

请注意

  • 整个目录树将被遍历,这可能需要一些时间,因此请尽量保持层次结构较小。
  • 这不会考虑设置 PATH 后创建的目录。
  • 如果多次调用此命令,PATH 中将出现大量重复项。您可能希望将原始 PATH 分配给某个临时变量(例如 OLD_PATH)。

答案4

尝试以下方法:

export PATH="$PATH:$(du "$HOME/.local/bin/" | cut -f2 | tr '\n' ':' | sed 's/:*$//')"

这会将~/.local/bin其自身及其所有子目录添加到 中$PATH

解释:

  • du将显示每行的所有子目录信息
  • cut -f2将提取第二列,即子目录的名称
  • tr '\n' ':'将把每个链接分隔符更改为冒号。这会将所有行合并为一行,子目录以冒号分隔
  • sed 's/:*$//'将删除最后一个冒号

相关内容