상상하다:
상위 폴더에는 실행 파일이나 소스 프로그램이 포함된 많은 하위 폴더(예: 수백 개)가 포함되어 있습니다. 예를 들어 상위 폴더에는 , , ..., 등 /opt/app1/bin/
많은 하위 폴더가 포함되어 있습니다 . 변수 에 모두 추가하면 줄당 글자 수 제한을 초과하거나 매우 다루기 힘들 수 있습니다!mod1
mod2
modn
PATH
dogbane 사용자의 답변을 보면 알 수 있습니다.디렉토리의 모든 디렉토리를 선택하는 와일드카드란 무엇입니까?저것:
- 와일드카드를
*/
사용하여 디렉터리를 일치시킬 수 있습니다. - 와일드카드 문자를
**/*/
사용하여 디렉터리 및 하위 디렉터리를 일치시킬 수 있습니다.
변수 /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
대신 사용됩니다 .failglob
PATH
$1
답변2
예, 추가하세요확장PATH 변수 에 추가하면 /opt/app1/bin/**/*/
(셸에서 확장을 유발하는 적절한 옵션을 설정했다고 가정 **
) 해당 디렉터리에서 실행 파일을 검색하게 됩니다.
여기의 후행은 */
관련이 없습니다. 확장명을 사용하면 /opt/app1/bin/**/
아래의 모든 하위 디렉터리 목록을 얻을 수 있습니다 /opt/app1/bin
.
길이 제한이 보이지 않습니다.$PATH에 대한 POSIX 사양, 기본 정의 - 환경 변수 - 기타 환경 변수에 나와 있습니다.
내가 상상할 수 있는 합병증은 다음과 같습니다.
동일한 명령 차단 - 두 개의 동일한 실행 파일 이름이 주어지고 하나는 발견되고 PATH에 삽입됩니다.첫 번째기본적으로 호출되는 이름이 됩니다.
잘못된 명령이 발견되지 않으면 추가 지연이 발생합니다(쉘이 명령에 대해 해당 디렉토리를 모두 검색하기 때문입니다).