বাশ এবং মাছের মধ্যে পরিবেশের পরিবর্তনগুলি ভাগ করুন


13

ব্যাশ এবং ফিশ স্ক্রিপ্টগুলি সামঞ্জস্যপূর্ণ নয় তবে আমি এমন একটি ফাইল রাখতে চাই যা কিছু পরিবেশের ভেরিয়েবলকে ব্যাশ এবং ফিশ উভয় দ্বারা আরম্ভ করার জন্য সংজ্ঞা দেয়।

আমার প্রস্তাবিত সমাধানটি এমন একটি ~/.envফাইল সংজ্ঞায়িত করছে যাতে পরিবেশের ভেরিয়েবলের তালিকা থাকতে পারে:

PATH="$HOME/bin:$PATH"
FOO="bar"

আমি তখন কেবল এটিকে বাশনে উত্স করতে এবং এমন একটি স্ক্রিপ্ট তৈরি করতে পারি যা এটিকে মাছের ফর্ম্যাট এবং উত্সগুলিতে রূপান্তরিত করে।

আমি ভাবছিলাম যে এর চেয়ে আরও ভাল সমাধান হতে পারে, তাই আমি বাশ ফিশের মধ্যে পরিবেশের পরিবর্তনগুলি ভাগ করার আরও ভাল উপায়ের জন্য বলছি।

দ্রষ্টব্য: আমি ওএস এক্স ব্যবহার করছি


এখানে একটি উদাহরণ .envফাইল যা আমি হাস্যকর- ফিশের সিনট্যাক্স ব্যবহার করে মাছ এবং ব্যাশ উভয়ই পরিচালনা করতে চাই (ধরুন ~ / বিন এবং ~ / বিন 2 খালি ডিরেক্টরি):

setenv _PATH "$PATH"
setenv PATH "$HOME/bin"
setenv PATH "$PATH:$HOME/bin2"
setenv PATH "$PATH:$_PATH"

উত্তর:


17

পরিবেশে ভেরিয়েবল সেট করার জন্য বাশের একটি বিশেষ বাক্য গঠন রয়েছে, যখন মাছ একটি বিল্টিন ব্যবহার করে। আমি আপনার .env ফাইলটি এমনভাবে লেখার পরামর্শ দেব:

setenv VAR1 val1
setenv VAR2 val2

এবং তারপরে setenvসংশ্লিষ্ট শেলগুলিতে যথাযথভাবে সংজ্ঞা দেওয়া । ব্যাশে (উদা। বাশ্রাক):

function setenv() { export "$1=$2"; }
. ~/.env

মাছগুলিতে (যেমন কনফিগারেশন ফিশ):

function setenv; set -gx $argv; end
source ~/.env

নোট করুন যে পাঠের জন্য কিছু বিশেষ হ্যান্ডলিং প্রয়োজন হবে, যেহেতু এটি মাছের একটি অ্যারে তবে ব্যাশে কোলোন সীমানাযুক্ত স্ট্রিং। আপনি যদি setenv PATH "$HOME/bin:$PATH".env এ লিখতে পছন্দ করেন তবে আপনি মাছের সেটেনভটি এভাবে লিখতে পারেন:

function setenv
    if [ $argv[1] = PATH ]
        # Replace colons and spaces with newlines
        set -gx PATH (echo $argv[2] | tr ': ' \n)
    else
        set -gx $argv
    end
 end

এটি PATH- তে এমন উপাদানগুলিকে ভুলভাবে ছড়িয়ে দেবে যাতে স্পেস, কলোন বা নিউলাইন থাকে।

সত্যিকারের অ্যারেগুলির সাথে কোলন-সীমাবদ্ধ স্ট্রিংগুলি মিশ্রিত করার কারণে PATH- এ বিশ্রী মনোভাব। মাছগুলিতে PATH এ যুক্ত হওয়ার পছন্দের উপায়টি হ'ল সহজ set PATH $PATH ~/bin


1
উইল PATHস্পেস: সঙ্গে পাথ দিয়ে মাছ কাজের জন্য ফিক্স? নতুন লাইন? অন্যান্য জিনিস খুঁজছেন?
Tyilo

[ব্যাশ এবং ফিশ উভয় ক্ষেত্রেই অন্তর্নির্মিত, তাই ব্যবহারের জন্য PATH সঠিকভাবে সেট করার দরকার নেই [। সেলেনভ নমুনাটি কোলন এবং নিউলাইনগুলি ব্যতীত PATH এর সমস্ত অক্ষরের সাথে কাজ করা উচিত।
ridiculous_fish

আমার trসাথে প্রতিস্থাপন করা এবং আমার প্রশ্নে প্রদত্ত ফাইলটি /usr/bin/trব্যবহার করে .env, মাছ শুরু করার সময় আমি অনেক ত্রুটি পাই। আমি মনে করি না যে PATH পরিচালনা সঠিক।
Tyilo

ওহ, ঠিক আছে, মাছগুলি উদ্ধৃতিগুলির অভ্যন্তরে স্থান পৃথক করবে। আমি মন্তব্য আপডেট করব।
ridiculous_fish

হ্যাঁ এটা এখন কাজ করে। আমি মনে করি না অন্য কোনও শেল (মাছ বাদে?) যাইহোক PATH এ কলোন দিয়ে পাথের অনুমতি দেয়।
Tyilo

6

@ জাঞ্চির উত্তর অনুসারে এখানে (এখন?) আরও সহজ উপায় রয়েছে

ফিশ শেল: এক্সপোর্ট ব্যবহার করে কোনও ফাইল থেকে একাধিক পরিবেশের ভেরিয়েবল কীভাবে সেট করা যায়

হজম যদিও:

মাছ:

echo -e "foo=3\nfoobar=4" > .env; export (cat .env); env | grep foo

ব্যাশ:

echo -e "foo=3\nfoobar=4" > .env; export $(cat .env | xargs); env | grep foo

পার্থক্য $এবং ব্যবহারের সাথেxargs


আরও অনেক দৃin় বিশ্বাসযোগ্য এবং কোনও বিশেষ বাক্য গঠন ছাড়াই। আপনাকে ধন্যবাদ
পানাইওটিস

Ra

5

বেশিরভাগ ইউনিক্স সিস্টেমগুলি প্যাম ব্যবহার করে । pam_envমডিউল আপনার মত খুব একটি ফাইল সার্চ .env

লিনাক্সে , pam_envএকটি সিস্টেম ফাইল /etc/environmentএবং একটি ব্যবহারকারী ফাইল পড়ে ~/.pam_environmentওএস এক্স (এবং অন্যান্য * বিএসডি, যা একইভাবে ওপেনপ্যাম ব্যবহার করে) তে দেখা যায় যে pam_envকেবল সিস্টেম ফাইলটি পড়ে, সুতরাং আপনি প্রতিটি ব্যবহারকারীদের জন্য এই পদ্ধতিতে ভেরিয়েবল সেট করতে পারবেন না।


1

@ হাস্যকর_ফিশের জবাবটি প্রসারিত করা, বাশের জন্য নিম্নলিখিত ফাংশন সহ এটি ফাঁকাগুলি থাকা অ্যারেগুলির জন্যও কাজ করে যেমন $PATHআপনার নিজের পথগুলিতে ফাঁকা স্থান রয়েছে। তবে setenvআজকাল ফিশ স্ট্যান্ডার্ড লাইব্রেরিতে একটি ফাংশন হিসাবে ইতিমধ্যে সংজ্ঞায়িত হয়ে গেছে তাই আমি নামটি এখানে পরিবর্তন করেছিshenv

function shenv { 
        var="$1"
        shift
        export "$var=$(printf "%s\n" "$@" | paste -s -d: -)"
}
. ~/.env

এখন আপনার .envফাইলে আপনি অ্যারের উপাদানগুলি setenvকমান্ডের পৃথক যুক্তি হিসাবে নির্দিষ্ট করতে পারবেন :

shenv PATH /my/path /my/path\ with\ spaces "/my/quoted path" $PATH

মাছের জন্য @ হাস্যকর_ফিশের সহজ বাস্তবায়নটি করবে:

function shenv; set -gx $argv; end
source ~/.env

1

কেবলমাত্র content হোম / .কনফিগ / ফিশ / ফাংশন / এনভ.ফিশে সামগ্রী সহ একটি ফাংশন তৈরি করুন:

for f in /etc/profile.d/*.sh
    sh $f
end

/etc/profile.d ফোল্ডারে বাশ-এ তৈরি করা সমস্ত ভাগ ভাগ করে নিয়েছে

উদাহরণস্বরূপ: /etc/profile.d/golang.sh

#!/bin/sh
export GOPATH=$HOME/gopath
export GOROOT=$HOME/go
export GOBIN=$HOME/gobin

export PATH=$PATH:$GOROOT/bin:$GOBIN

শুধু মাছ বা ব্যাশে লগইন করুন, echo $GOPATH $GOROOT $GOBIN $PATHযাদু করুন এবং দেখুন :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.