설정되지 않은 경우 선행 콜론을 작성하지 않고 PATH 유사 변수에 추가


10

에 디렉토리를 추가해야합니다 PKG_CONFIG_PATH. 일반적으로 표준을 사용합니다

export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:$(pyenv prefix)/lib/pkgconfig

하지만 PKG_CONFIG_PATH이전에 내 시스템에 설정되지 않았습니다. 따라서 변수는 :문자로 시작 하여 현재 디렉토리에서 먼저 보도록 지시합니다. 나는 그것을 원하지 않습니다. 나는 다음에 정착했다.

export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}${PKG_CONFIG_PATH:+:}$(pyenv prefix)/lib/pkgconfig

그러나 그것은 너무 추한 것 같습니다. 더 좋은 방법이 있습니까? 변수가 이미 설정된 경우에만 조건부 콜론을 추가하는 적절한 방법은 무엇입니까?


답변:


13

${:+}확장 연산자를 올바르게 사용하고 있다면 약간 수정하면됩니다.

V=${V:+${V}:}new_V

첫 번째 중괄호로 확장 $V 대장 IFF는 V아무것도 이미 다른 설정 - 정확히 당신이 필요하다 (그리고 아마도 운영자의 존재 이유 중 하나).

따라서 귀하의 경우 :

export "PKG_CONFIG_PATH=${PKG_CONFIG_PATH:+${PKG_CONFIG_PATH}:}$(pyenv prefix)/lib/pkgconfig"

그 양식을 사용했지만, 그것 (약간) 덜 읽을 생각 때문에 나는 그것에 대하여 결정 : ${V}${V:+:}W대를 ${V:+${V}:}W. 어느 쪽이든, 그들은 둘 다 정말 못생긴 느낌입니다. 나는 무언가를 바라고 있었다. .. 더 우아하다라고 생각 하는가?
scottbb

@scottbb-이것은 구문 양식입니다-그것이 수행되는 방식입니다. 조건에 따라 변수 값을 설정하려면 테스트를 수행해야합니다. 여기에 기록 된대로 당신은 인라인 테스트를 할 수있는, 또는 명시 적으로 테스트 할 수 있습니다 test- 당신이 값을 테스트하고 두 번 varname에를 쓰고있어 어느 쪽이든,하지만 당신은 하나의 실행 문에 그것을이 방법은 - 그 방법으로는 실제 , 그러나 나는 우아한 컴퓨터를 본 적이 없다 .
mikeserv

@scottbb 그것을 생각하면 정말 동일합니다. 그러나 기본적으로 조건과 확장에 변수 이름이 필요하기 때문에 더 나아지지 않을까 걱정됩니다. 이름.
peterph

@ mikeserv-아마도 더 "우아한"솔루션을 찾고 있다고 말하는 것보다 더 정확했을 것입니다. 하위 문자열을 PATH 스타일 변수에 추가하는 것이 실제로 본 적이 없으며 더 나은 방법이 누락 된 것처럼 느껴졌습니다. 내 경험에 의하면, 그 느낌을 받으면 보통 더 좋은 방법이 있습니다. 그것이 내가 말한 것입니다. 그러나 당신의 요점은 잘 잡 힙니다. 답변 주셔서 감사합니다. 또한 : @peterph의 의견 편집 중 하나에서에 대한 전체 주장을 인용해야한다고 언급했습니다 export. 그것은 아주 좋은 지적입니다. 나는 그 세부 사항도 묵살했습니다.
scottbb

@scottbb-연마 성이 뛰어나면 미안합니다.- 컴퓨팅과 관련하여 우아함 의 개념을 이해하지 못했습니다 . 컴퓨터는 기계입니다-수십억 번의 3 방향 및 / 또는 게이트 복합. 그것은 모든면에서 하나보다 더 세지 않으며, 그것이하는 모든 일은 무차별 적 입니다. 일부 직관적 인 개념은 다른 개념보다 번역하기가 더 쉬울 수 있지만, 그럴 경우 개념이 다른 무차별 강제 추상화 위에 있기 때문입니다. 컴퓨팅의 핵심은 항상 우아합니다.
mikeserv

1

최근에, 나는 설정 GNU의 스토우을 아래 도서관 같은 저장소 사용자 전체 물건에 내 컴퓨터에서 ~/.local정의 할 때 문제로 및 달렸다 LD_LIBRARY_PATH, CPATHLIBRARY_PATH, 실수가 콜론을 넣는 등 물건을 파괴.

그럼이 질문을 발견하고 대답은 정확히 아니었다 우아한 ;-), 나는, 여기를 찾아주십시오을 처리 할 수있는 작은 함수를 썼다 : https://gist.github.com/rico-chet/0229e4c080d9f51a02535dd25a656a8a

## Copyright (C) 2018 Alex Thiessen <alex.thiessen.de+github@gmail.com>
## Copyright (C) 2018 https://unix.stackexchange.com/users/116858/kusalananda
## SPDX-License-Identifier: GPL-2.0-or-later
## <https://spdx.org/licenses/GPL-2.0-or-later.html>

function join() {
    if [ ${#} -eq 0 ]
    then
        echo "\`join\` appends elements separated by colons to a \`bash\` variable " >&2
        echo "usage: join <variable> <element> [element ...]" >&2
        return 1
    fi
    variable="${1}"

    shift
    export ${variable}="${!variable:+${!variable}:}$(IFS=:; echo "${*}")"
}

// @Kusalananda가 제안한대로 편집


또한 :( IFS=:; set -- 1 2 3 4 5 6; echo "$*" )
Kusalananda

즉 :join () { var=$1; shift; export "$var"="$( IFS=:; echo "$*" )"; }
Kusalananda

... "join"은 표준 유틸리티의 이름이기도 한 불행한 이름입니다.
Kusalananda

변수를 추가하는 대신 덮어 쓰기한다는 점을 제외하고는 좋은 방법입니다. ${!variable:+${!variable}:}올바른 장소에 추가하면 나에게 도움이되었고 모든 테스트가 통과되었습니다. 적절한 이름을 찾는 것은 독자들에게 제공되는 것입니다 :)
Superlexx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.