Можно добавить все подкаталоги при добавлении каталога в $ PATH

8

При добавлении некоторого каталога в $ PATH с помощью PATH = ~ / my_program / bin: «$ {PATH}»

  1. правда ли, что через $ PATH будут найдены только исполняемые файлы непосредственно в каталоге, а другие исполняемые файлы в его подкаталогах - нет?
  2. Можно ли добавить все его подкаталоги? Иногда указать все подкаталоги явно, может быть много работы, когда их много.

Спасибо и всего наилучшего!

Тим
источник

Ответы:

5

Этот скрипт использует tree...

  • sudo apt-get install tree

Вы можете изменить глубину каталогов путем изменения, -L 1
и вы можете выбрать, следует ли использовать ~/...

ОБНОВЛЕНИЕ 2 :
.. изменен скрипт для замены только ведущего / home / user / (не "any")
.. и добавлены аргументы ..

ОБНОВЛЕНИЕ Добавлена ​​проверка: .. Не добавляйте каталог в 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
Peter.O
источник
3

Это невозможно, потому что системы на основе UNIX не предназначены для такой работы. Как правило, все исполняемые файлы находятся в одном из небольшого количества каталогов. Например, все, что я пишу для собственных целей, находится в ~ / bin.

Если вы не хотите, чтобы ваши фактические двоичные файлы и сценарии находились в каталоге bin, вы можете создать символическую ссылку, например, ~ / bin на фактический двоичный файл.

Наличие всех подкаталогов в $ PATH не особенно желательно, так как оно просто добавляет больше каталогов для поиска, увеличивает риск попадания других исполняемых файлов в вашу PATH, которых не должно быть, и на самом деле не дает большой выгоды.

Скотт Северанс
источник
3

Это должно сделать работу

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

Пожалуйста, примите во внимание, что

  • Будет пройдено все дерево каталогов, что может занять некоторое время, поэтому постарайтесь сохранить небольшую иерархию.
  • Это не будет учитывать каталоги, созданные после установки PATH.
  • Если вы вызовете это несколько раз, в PATH будет много дубликатов. Возможно, вы захотите присвоить исходный PATH некоторой временной переменной (например, OLD_PATH).
Адам Быртек
источник
Две ошибки: он не добавляет абсолютные пути -> не работает должным образом. Кроме того, он добавляет две двойные двоеточия. Удалить: после $ PATH.
Олли
1

Нет, это не просто. Будет ли возможность добавить программные ссылки на все исполняемые файлы в "~ / my_program / bin"?

ddeimeke
источник
1

Попробуйте это так:

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

Это добавит ~/.local/binсебя вместе со всеми своими подкаталогами в $PATH.

Объяснение:

  • du будет отображать всю информацию о подкаталогах в каждой строке
  • cut -f2 будет извлекать второй столбец, то есть имена подкаталогов
  • tr '\n' ':'будет менять каждый разрыв ссылки на двоеточие. Это объединит все строки в одну строку, а подкаталоги будут разделены двоеточием.
  • sed 's/:*$//' удалит последний двоеточие
R0ckyY2
источник