যদি আনসেট না করা হয় তবে শীর্ষস্থানীয় কলোন তৈরি না করে 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 - এটি সিনট্যাক্স ফর্ম - এটি কীভাবে এটি করা হয়। আপনি যদি কোনও শর্তের ভিত্তিতে ভেরিয়েবলের মান সেট করতে চান তবে আপনাকে একটি পরীক্ষা করতে হবে। এখানে যেমন লেখা আছে তেমন একটি ইনলাইন পরীক্ষাও করতে পারেন, বা আপনি স্পষ্টভাবে পরীক্ষা করতে পারেন test- আপনি যেভাবেই মানটি পরীক্ষা করছেন এবং দুবার বর্ণটি লিখেছেন, তবে এই পদ্ধতিটি আপনি একক এক্সিকিউশন স্টেটমেন্টে করেন - এইভাবে এটি ব্যবহারিক , তবে আমি কখনও একটি মার্জিত কম্পিউটারের সাথে দেখা করি নি ।
মাইকজার্ভ

@ স্কটবিবি এটি ভাবতে আসলেই একই রকম। তবে আমি আশঙ্কা করছি যে আপনি এটির চেয়ে ভাল আর পাবেন না, যেহেতু আপনার মূলত শর্তে এবং তারপরে প্রসারণের ক্ষেত্রে ভেরিয়েবলের নাম প্রয়োজন - আমি মনে করি না একটি শেল কনস্ট্রাক্ট আছে যা কেবল একটি ঘটনাক্রমে এটি করবে নাম দিন।
পিটার্ফ

@ মিমকিজার - আমি আরও "মার্জিত" সমাধানের সন্ধানের চেয়ে আমার সম্ভবত আরও সুনির্দিষ্ট হওয়া উচিত ছিল। আমি PATH- শৈলীর ভেরিয়েবলগুলিতে সাবস্ট্রিংগুলি সংযুক্ত করার জন্য সত্যিই এটি কখনও দেখিনি, এবং এটির মতো অনুভূত হয়েছে যেন আমি আরও ভাল উপায় অনুপস্থিত। আমার অভিজ্ঞতায়, যখন আমি এই অনুভূতিটি পাই তখন সাধারণত আরও ভাল উপায় থাকে। এটা আমার বলা উচিত ছিল। তবে আপনার বক্তব্য ভালভাবে নেওয়া হয়েছে। আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ. এছাড়াও: আপনার @ পিটারফের মন্তব্যের একটি সম্পাদনায় আপনি মন্তব্য করেছিলেন যে আমার সম্পূর্ণ যুক্তিটি উদ্ধৃত করা উচিত ছিল export। এটি একটি খুব ভাল পয়েন্ট, আমি পাশাপাশি বিবরণ miffed।
স্কটবিবি

@ স্কটবিবি - দুঃখিত যে এটি ক্ষয়ক্ষতি হিসাবে প্রকাশিত হয়েছিল - ive কম্পিউটারের ক্ষেত্রে কমনীয়তার ধারণাটি কখনও বুঝতে পারে নি । একটি কম্পিউটার একটি মেশিন - একটি ত্রি-মুখী এবং / অথবা গেটটি কয়েক বিলিয়ন বার সংঘটিত হয়। এটি একের চেয়ে বেশি গণনা করতে পারে না - প্রতিটি উপায়ে, এটি করে প্রতিটি জিনিসই নিষ্ঠুর-বাধ্য । কিছু স্বজ্ঞাত ধারণাগুলি অন্যের তুলনায় অনুবাদ করা সহজ হতে পারে, তবে, যদি তা হয় তবেই কেবল ধারণাটি ধারণার ফলে কিছু অন্যান্য জবরদস্তি বিমূর্ততা শীর্ষে বসে। কম্পিউটিং, এর অন্তরে, সবসময় মার্জিত ছাড়াও কিছু।
মাইকজার্ভ

1

ইদানীং, আমি আমার মেশিনগুলিতে লাইব্রেরির মতো ব্যবহারকারীর স্টাফ সংরক্ষণের জন্য জিএনইউ স্টো স্থাপন করেছি ~/.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 "${*}")"
}

// কুসালানন্দ পরামর্শ অনুসারে সম্পাদিত


এছাড়াও:( IFS=:; set -- 1 2 3 4 5 6; echo "$*" )
কুসালানন্দ

অর্থ:join () { var=$1; shift; export "$var"="$( IFS=:; echo "$*" )"; }
কুসালানন্দ

... "যোগদান" ব্যতীত এটি একটি মানক ইউটিলিটির নাম হিসাবে এটি একটি দুর্ভাগ্যজনক নাম।
কুসালানন্দ

ভেরিয়েবলটি যুক্ত করার পরিবর্তে আপনি ওভাররাইটটি লিখেছেন তা বাদ দিয়ে খুব সুন্দর। শুধু ${!variable:+${!variable}:}ঠিক জায়গায় যোগ করা আমার জন্য কাজ করেছিল, সমস্ত পরীক্ষা পাস করেছে। উপযুক্ত নাম সন্ধান করা পাঠকের কাছে
অপ্রয়োজনীয়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.