ผนวกกับตัวแปรที่เหมือนกับ 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 ลองคิดดูว่ามันเหมือนกันจริงๆ แต่ฉันเกรงว่าคุณจะไม่ทำให้ดีขึ้นเพราะคุณต้องการชื่อตัวแปรในเงื่อนไขและจากนั้นในการขยายตัว - ฉันไม่คิดว่าจะมีการสร้างเชลล์ที่จะทำเช่นนั้นด้วยการเกิดขึ้นเพียงครั้งเดียวของ ชื่อ.
เตอร์

@ mikeserv - ฉันน่าจะแม่นยำกว่าที่บอกว่าฉันกำลังมองหาทางออกที่ "สง่างาม" มากกว่านี้ ฉันไม่เคยเห็นสิ่งนี้ทำเพื่อต่อท้าย substrings กับตัวแปรสไตล์ PATH และมันก็รู้สึกเหมือนว่าฉันขาดวิธีที่ดีกว่า จากประสบการณ์ของฉันเมื่อฉันได้รับความรู้สึกนั้นมักจะมีวิธีที่ดีกว่า นั่นคือสิ่งที่ฉันควรจะพูด แต่ประเด็นของคุณได้รับความสนใจ ขอบคุณสำหรับคำตอบของคุณ นอกจากนี้: หนึ่งในการแก้ไขของคุณของความคิดเห็น @ peterph exportของคุณได้แสดงความคิดเห็นที่ฉันควรจะได้อ้างอาร์กิวเมนต์ทั้งหมด นั่นเป็นจุดที่ดีมากฉัน miffed รายละเอียดเช่นกัน
scottbb

@scottbb - ขอโทษถ้ามันออกมาขัด - ive ไม่เคยเข้าใจแนวคิดของความสง่างามที่เกี่ยวกับการคำนวณ คอมพิวเตอร์เป็นเครื่อง - สามทางและ / หรือทางเข้าออกหลายพันล้านครั้ง มันเอียงนับสูงกว่าหนึ่ง - ในทุกวิถีทางสิ่งที่มันไม่ทุกคนเป็นเดรัจฉานบังคับ แนวคิดที่ใช้งานง่ายบางอย่างอาจแปลได้ง่ายกว่าแนวคิดอื่น แต่ถ้าเป็นเช่นนั้นก็เป็นเพราะแนวคิดตั้งอยู่บนยอดที่เป็นนามธรรม การคำนวณที่เป็นหัวใจของมันนั้นเป็นอะไรที่หรูหรา
mikeserv

1

เมื่อเร็ว ๆ นี้ผมตั้งขึ้นGNU Stowบนเครื่องของฉันในการจัดเก็บสิ่งที่ผู้ใช้ในวงกว้างเช่นห้องสมุดภายใต้~/.localและวิ่งเป็นปัญหาเมื่อกำหนดLD_LIBRARY_PATH, CPATHและLIBRARY_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

... ยกเว้นว่า "เข้าร่วม" เป็นชื่อที่โชคร้ายเนื่องจากเป็นชื่อของยูทิลิตี้มาตรฐาน
Kusalananda

สิ่งที่ดียกเว้นความจริงที่ว่าคุณเขียนทับตัวแปรแทนการต่อท้าย เพียงเพิ่ม${!variable:+${!variable}:}สถานที่ที่เหมาะสมสำหรับฉันการทดสอบทั้งหมดผ่าน หาชื่อที่เหมาะสมเป็น exersize ให้ผู้อ่าน :)
Superlexx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.