$ PATH에 디렉토리를 추가 할 때 모든 하위 디렉토리를 추가 할 수 있습니다


8

PATH = ~ / my_program / bin으로 $ PATH에 디렉토리를 추가 할 때 :“$ {PATH}”

  1. 디렉토리 바로 아래의 실행 파일 만 $ PATH를 통해 찾을 수 있지만 하위 디렉토리 아래의 다른 실행 파일은 찾을 수 없다는 것이 사실입니까?
  2. 모든 하위 디렉토리를 추가 할 수 있습니까? 때때로 모든 서브 디렉토리를 명시 적으로 지정하면 많은 디렉토리가있을 때 많은 작업을 수행 할 수 있습니다.

감사합니다.

답변:


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/:*$//' 마지막 결장을 제거합니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.