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


8

通过PATH =〜/ my_program / bin将一些目录添加到$ PATH时:“ $ {PATH}”

  1. 是否确实可以通过$ PATH找到直接在目录下的可执行文件,但不能找到其子目录下的其他可执行文件?
  2. 是否可以添加其所有子目录?有时,在有许多子目录时,明确指定所有子目录可能会很繁重。

谢谢并恭祝安康!

Answers:


5

该脚本使用tree...

  • sudo apt-get install tree

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

更新2
..修改了脚本以仅替换开头的 / home / user /(而不是“ any”)
..并添加了参数。

更新已添加检查:..当目录已经在PATH中时,请勿将目录添加到PATH。此检查将“〜/”和“ / home / user /”视为不同。

关于您的问题1 ...是的,这是真的。每个特定目录都必须在PATH中单独添加。

回复你的问题2 ...这里是一个脚本,它会做你想要什么..
我测试过它,但因为它代表它将使新的路径当前会话..
要使其永久,您可以使用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

3

这是不可能的,因为基于UNIX的系统并非旨在那样工作。通常,所有可执行文件都位于少数目录之一中。例如,我出于个人目的编写的所有内容都放在〜/ bin中。

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

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


3

这应该做的工作

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

请考虑到

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

两个错误:未添加绝对路径->无法正常工作。此外,它还添加了两个双冒号。删除:在$ PATH之后。
Olli

1

不,不可能以简单的方式。是否可以将所有可执行文件的软链接添加到“〜/ my_program / bin”?


1

尝试这种方式:

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

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

说明:

  • du 将在每行显示所有子目录信息
  • cut -f2 将提取第二列,即子目录的名称
  • tr '\n' ':'将改变每个链接到冒号。这会将所有行合并为一行,并且子目录由冒号分隔
  • sed 's/:*$//' 将删除最后一个冒号
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.