अगर परेशान नहीं है तो अग्रणी बृहदान्त्र बनाए बिना पैठ की तरह परिवर्तनशील में आवेदन करें


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। किसी भी तरह से, वे दोनों वास्तव में बदसूरत महसूस करते हैं। मैं कुछ के लिए उम्मीद कर रहा था ... अधिक सुरुचिपूर्ण, मुझे लगता है?
20

@scottbb - यह वाक्य रचना रूप है - यह है कि यह कैसे किया जाता है। यदि आप एक शर्त के आधार पर एक चर का मूल्य निर्धारित करना चाहते हैं तो आपको एक परीक्षण करना होगा। आप इनलाइन परीक्षण कर सकते हैं जैसा कि यहां लिखा गया है, या आप स्पष्ट रूप से परीक्षण कर सकते हैं test- या तो आप मान का परीक्षण कर रहे हैं और दो बार varname लिख रहे हैं, लेकिन इस तरह से आप इसे एकल निष्पादन विवरण में करते हैं - इस तरह से यह व्यावहारिक है , लेकिन मैं एक सुरुचिपूर्ण कंप्यूटर से कभी नहीं मिला ।
माइकर्स

@scottbb यह सोचकर कि यह वास्तव में एक ही है। लेकिन मुझे डर है कि आप इसे किसी भी बेहतर तरीके से प्राप्त नहीं करेंगे, क्योंकि आपको मूल रूप से स्थिति में परिवर्तनशील नाम की आवश्यकता है और फिर विस्तार में - मुझे नहीं लगता कि एक शेल निर्माण होता है जो कि केवल एक घटना के साथ होता है नाम दें।
पेट्रॉफ

@mikeserv - मुझे शायद यह कहने की तुलना में अधिक सटीक होना चाहिए था कि मैं अधिक "सुरुचिपूर्ण" समाधान की तलाश कर रहा था। मैंने वास्तव में पैठ शैली के चर के लिए सब्सट्रिंग के लिए ऐसा किया कभी नहीं देखा है, और यह किसी तरह लगा जैसे मुझे एक बेहतर तरीका याद आ रहा था। मेरे अनुभव में, जब मुझे वह एहसास मिलता है, तो आमतौर पर एक बेहतर तरीका होता है। मुझे यही कहना चाहिए था। लेकिन आपकी बात को अच्छे से लिया गया है। आपके प्रतिक्रिया के लिए धन्येवाद। इसके अलावा: @ peterph की टिप्पणी के आपके एक संपादन में, आपने टिप्पणी की कि मुझे पूरे तर्क को उद्धृत करना चाहिए था export। यह एक बहुत अच्छा बिंदु है, मैंने उस विवरण को भी बदल दिया है।
scottbb

@scottbb - अगर यह अपघर्षक के रूप में आया तो क्षमा करें - ive ने कंप्यूटिंग के संबंध में लालित्य की अवधारणा को कभी नहीं समझा । कंप्यूटर एक मशीन है - तीन-तरफ़ा और / या गेट कंपाउंडेड अरबों बार। यह एक से अधिक की गणना नहीं कर सकता है - हर तरह से, हर चीज जो वह करता है वह पाशविक है । कुछ सहज ज्ञान युक्त अवधारणाएं दूसरों की तुलना में अनुवाद करना आसान हो सकता है, लेकिन यदि ऐसा है, तो यह केवल इसलिए है क्योंकि अवधारणा कुछ अन्य क्रूर-मजबूर अमूर्त के ऊपर बैठती है। कंप्यूटिंग, इसके दिल में, हमेशा कुछ भी लेकिन सुरुचिपूर्ण है।
मोकेसर

1

हाल ही में, मैंने अपनी मशीनों पर GNU स्टोव की स्थापना की, जिसमें पुस्तकालयों की तरह उपयोगकर्ता-विस्तृत सामान को संग्रहीत किया गया था ~/.localऔर परिभाषित करते समय मुसीबतों में भाग गया LD_LIBRARY_PATH, CPATHऔर LIBRARY_PATH, अनजाने में वहाँ एक बृहदान्त्र डाल रहा है और इसलिए सामान को तोड़ रहा है।

तब मैंने पाया कि आपका प्रश्न और उत्तर बिल्कुल सुरुचिपूर्ण नहीं था ;-), और मैंने इसे संभालने के लिए एक छोटा सा कार्य लिखा, कृपया इसे यहाँ देखें: https://gist.github.com/rico-chet/0229e4c080d9f51a0a3535dd25a656a8a

## 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 "${*}")"
}

// संपादित किया गया जैसा कि @ कुसलानंद द्वारा सुझाया गया है


इसके अलावा:( IFS=:; set -- 1 2 3 4 5 6; echo "$*" )
Kusalananda

अर्थात्:join () { var=$1; shift; export "$var"="$( IFS=:; echo "$*" )"; }
Kusalananda

... सिवाय इसके कि "ज्वाइन" एक दुर्भाग्यपूर्ण नाम है क्योंकि इसका एक मानक उपयोगिता का नाम भी है।
Kusalananda

एक अच्छी बात यह है कि इस तथ्य को छोड़कर कि आप इसे जोड़ने के बजाय चर को अधिलेखित कर देंगे। बस ${!variable:+${!variable}:}सही जगह पर जोड़ने से मेरे लिए काम किया गया, सभी परीक्षण पास हुए। एक उपयुक्त नाम खोजना पाठक के लिए एक अपवाद है :)
सुपरप्लेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.