"PATH" 변수에 와일드카드 문자를 추가할 수 있습니까?

"PATH" 변수에 와일드카드 문자를 추가할 수 있습니까?

상상하다:

상위 폴더에는 실행 파일이나 소스 프로그램이 포함된 많은 하위 폴더(예: 수백 개)가 포함되어 있습니다. 예를 들어 상위 폴더에는 , , ..., 등 /opt/app1/bin/많은 하위 폴더가 포함되어 있습니다 . 변수 에 모두 추가하면 줄당 글자 수 제한을 초과하거나 매우 다루기 힘들 수 있습니다!mod1mod2modnPATH

dogbane 사용자의 답변을 보면 알 수 있습니다.디렉토리의 모든 디렉토리를 선택하는 와일드카드란 무엇입니까?저것:

  1. 와일드카드를 */사용하여 디렉터리를 일치시킬 수 있습니다.
  2. 와일드카드 문자를 **/*/사용하여 디렉터리 및 하위 디렉터리를 일치시킬 수 있습니다.

변수 /opt/app1/bin/**/*/에 항목을 추가하면 하위 폴더에서 실행 파일이 검색됩니까? PATH이 작업으로 인해 합병증이 발생합니까?

답변1

셸에는 한 줄에 문자 제한이 없습니다. 여러분이 생각할 수도 있는 것은 명령줄의 길이와 현재 환경 변수 세트 및 그 값이 너무 크면 외부 명령을 실행할 수 없다는 것입니다. 이는 외부 명령을 실행할 때(즉, 셸이 exec()다른 실행 파일을 시작하기 위해 C 라이브러리의 기능 중 하나를 사용해야 하는 경우)에만 적용되는 제한 사항입니다. 변수 값을 설정해도 외부 명령이 실행되지 않습니다.

PATH변수가 사용될 때 쉘은 변수에 대해 파일 이름 확장을 수행하지 않기 때문에 변수 에 파일 이름 글로빙 패턴을 있는 그대로 추가할 수 없습니다 .

당신은 추가할 수 있습니다확장PATH개별 항목이 구분되어 있는지 확인하려면 파일 이름 globbing 패턴을 변수에 추가하세요 :. 값의 디렉터리 경로 구분 기호 PATH는 콜론이므로 이 경로 이름 목록에 포함된 이름에는 콜론이 포함될 수 없습니다.

셸 에서는 bash패턴에 /opt/app1/bin/**/*/다음을 사용할 수 있습니다.

shopt -s globstar failglob

IFS=:$IFS

set -- /opt/app1/bin/**/*/
PATH=$PATH:"$*"

IFS=${IFS#?}

이는 위치 인수 목록을 와일드카드 패턴이 확장되는 확장된 경로 이름 목록으로 설정합니다(원하는 경우 배열을 사용할 수 있지만 더 많은 입력이 필요함). 그러면 목록이 확장되어 "$*"변수 값 끝에 추가됩니다.PATH

"$*"집합의 첫 번째 문자를 IFS콜론으로 확장하면 목록의 요소가 콜론으로 구분됩니다.

IFS그런 다음 원래 값을 복원하십시오.

failglob패턴 일치가 없을 경우 스크립트를 종료하는 데 사용하는 것입니다. PATH패턴과 일치하지 않고 지속 하려면 다음을 사용할 수 있습니다.

shopt -s globstar nullglob

IFS=:$IFS

set -- /opt/app1/bin/**/*/
PATH=$PATH${1+:"$*"}

IFS=${IFS#?}

이는 정의되지 않은 경우 , 즉 패턴이 아무것도 일치하지 않는 경우 수정을 피하기 위해 nullglob대신 사용됩니다 .failglobPATH$1

답변2

예, 추가하세요확장PATH 변수 에 추가하면 /opt/app1/bin/**/*/(셸에서 확장을 유발하는 적절한 옵션을 설정했다고 가정 **) 해당 디렉터리에서 실행 파일을 검색하게 됩니다.

여기의 후행은 */관련이 없습니다. 확장명을 사용하면 /opt/app1/bin/**/아래의 모든 하위 디렉터리 목록을 얻을 수 있습니다 /opt/app1/bin.

길이 제한이 보이지 않습니다.$PATH에 대한 POSIX 사양, 기본 정의 - 환경 변수 - 기타 환경 변수에 나와 있습니다.

내가 상상할 수 있는 합병증은 다음과 같습니다.

  • 동일한 명령 차단 - 두 개의 동일한 실행 파일 이름이 주어지고 하나는 발견되고 PATH에 삽입됩니다.첫 번째기본적으로 호출되는 이름이 됩니다.

  • 잘못된 명령이 발견되지 않으면 추가 지연이 발생합니다(쉘이 명령에 대해 해당 디렉토리를 모두 검색하기 때문입니다).

관련 정보