আমি কি কোনও বাশ স্ক্রিপ্ট থেকে সোর্স না করে পরিবেশে কোনও পরিবর্তনশীল রফতানি করতে পারি?


282

ধরুন আমার কাছে এই লিপি আছে

এক্সপোর্ট.বাশ :

#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"

আমি যখন স্ক্রিপ্টটি কার্যকর করি এবং এতে অ্যাক্সেস করার চেষ্টা করি তখন আমার $VARকোনও মূল্য হয় না!

echo $VAR

সেখানে অ্যাক্সেস করতে কোন উপায় আছে কি $VARশুধু নির্বাহ দ্বারা export.bash এটা গুন ছাড়া?


1
আপনার ভেরিয়েবলটি সংজ্ঞায়িত করতে আপনি স্ক্রিপ্টের পরিবর্তে একটি উলাম ব্যবহার করার চেষ্টা করতে পারেন।
jdigital

আমি যে স্ক্রিপ্টটিতে কাজ করছি, তা একরকম জাভা ভার্চুয়াল ম্যানেজার, আমি কিছু গণনা করি তবে আমার v এনভিএ-তে একটি A জাভাহোমোম রফতানি করা উচিত এবং এটি পাঠাতে সংযোজন করা উচিত।
তারশাল্লাহ

ঠিক আছে, আপনি কোনও ফাইলের তথ্য লিখতে পারেন এবং এটি আবার পড়তে পারেন, তবে সোর্সিং অনেক সহজ বলে মনে হচ্ছে।
jdigital

7
শিশু প্রক্রিয়াগুলি তাদের পিতামাতার পরিবেশকে পরিবর্তন করতে পারে না। পিতা বা মাতা নিজেই (হয় সঙ্গে পরিবর্তন করতে বেছে নিতে হয়েছে sourceবা evalঅথবা ...)
গ্লেন জ্যাকম্যান

1
উত্সে আরও পড়ার জন্য, man sourceকাজ করবে না কারণ sourceব্যাশে তৈরি হয়েছে, আপনাকে চালানো দরকারhelp source
পিটারচৌলা

উত্তর:


318

সর্বাধিক উত্সাহ না দিয়ে $VARকেবল নির্বাহের মাধ্যমে অ্যাক্সেস করার কোনও উপায় আছে কি export.bash?

দ্রুত উত্তর: না

তবে বেশ কয়েকটি সম্ভাব্য কাজের ক্ষেত্র রয়েছে।

সর্বাধিক সুস্পষ্ট একটি, যা আপনি ইতিমধ্যে উল্লেখ করেছেন, হ'ল কলিং শেলটির প্রসঙ্গে স্ক্রিপ্টটি ব্যবহার করা sourceবা .চালানো:

$ cat set-vars1.sh 
export FOO=BAR
$ . set-vars1.sh 
$ echo $FOO
BAR

আরেকটি উপায় হ'ল স্ক্রিপ্ট থাকা, এনভায়রনমেন্ট ভেরিয়েবল সেট করার পরিবর্তে, প্রিন্ট কমান্ড যা পরিবেশের পরিবর্তনশীল সেট করবে:

$ cat set-vars2.sh
#!/bin/bash
echo export FOO=BAR
$ eval "$(./set-vars2.sh)"
$ echo "$FOO"
BAR

তৃতীয় পদ্ধতির মধ্যে একটি স্ক্রিপ্ট থাকা যা আপনার পরিবেশের পরিবর্তনশীল (গুলি) অভ্যন্তরীণভাবে সেট করে এবং তারপরে সেই পরিবেশের সাথে একটি নির্দিষ্ট কমান্ডের অনুরোধ করে:

$ cat set-vars3.sh
#!/bin/bash
export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR

এই শেষ পদ্ধতিরটি বেশ কার্যকর হতে পারে, যদিও এটি ইন্টারেক্টিভ ব্যবহারের জন্য অসুবিধাজনক কারণ এটি আপনাকে আপনার বর্তমান শেলটিতে সেটিংস দেয় না (আপনার তৈরি অন্যান্য সমস্ত সেটিংস এবং ইতিহাস সহ)।


57

ভিএআর ভেরিয়েবলটি রফতানি করার জন্য প্রথমে সর্বাধিক যৌক্তিক এবং কার্যক্ষম উপায় মনে হয় ভেরিয়েবলটির উত্স:

. ./export.bash

অথবা

source ./export.bash

এখন মূল শেল থেকে প্রতিধ্বনি যখন এটি কাজ করে

 echo $VAR
HELLO, VARABLE

আমরা এখন ভিএআর পুনরায় সেট করব

export VAR=""
echo $VAR

ভেরিয়েবলটি উত্স করতে আমরা এখন একটি স্ক্রিপ্ট কার্যকর করব এবং তারপরে এটি আনসেট করব:

./test-export.sh 
HELLO, VARABLE
--
.

কোড: বিড়াল test-export.sh

    #!/bin/bash
    # Source env variable
    source ./export.bash

    # echo out the variable in test script
    echo $VAR

    # unset the variable 
    unset VAR
    # echo a few dotted lines
    echo "---"
    # now return VAR which is blank
    echo $VAR

এখানে একটি উপায়

অনুগ্রহ করে দ্রষ্টব্য: রফতানিগুলি আপনার মূল কনসোলে রফতানি কার্যকর করে এমন স্ক্রিপ্টের মধ্যে সীমাবদ্ধ - সুতরাং ক্রোন জব হিসাবে আমি এটিকে নীচের মত কনসোলের মতো যুক্ত করব ... কমান্ড অংশটি এখনও প্রশ্নবিদ্ধ: এখানে আপনি কীভাবে করবেন আপনার শেল থেকে চালানো:

আপনার কমান্ড প্রম্পটে (যতক্ষণ এক্সপোর্ট.ব্যাশের একাধিক প্রতিধ্বনির মান রয়েছে)

IFS=$'\n'; for entries in $(./export.bash); do  export $entries;  done; ./v1.sh 
HELLO THERE
HI THERE

বিড়াল v1.sh

#!/bin/bash
echo $VAR
echo $VAR1

এখন এত দিন এটি আপনার ব্যবহারের জন্য - আপনি কোনও স্ক্রিপ্টগুলির জন্য যেকোন সময় এই জাতীয় বাশ ওরফে ব্যবহার করে ভেরিয়েবলগুলি উপলব্ধ করতে পারতেন:

myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.

এটি আপনার .bashrc এ যুক্ত করুন

function myvars() { 
    IFS=$'\n'; 
    for entries in $(./export.bash); do  export $entries;  done; 

    "$@"; 

    for entries in $(./export.bash); do variable=$(echo $entries|awk -F"=" '{print $1}'); unset $variable;
done

}

আপনার বাশার্ক ফাইলটি উত্স করুন এবং আপনি যে কোনও সময় এর মতো করতে পারেন ...

যাই হোক না কেন এটি বাকি ...

এটি এটি বিশ্বব্যাপী উপলব্ধ করে স্ক্রিপ্টটি সম্পাদন করে ..

সহজেই এটি প্রতিধ্বনিত হয় তবে ইকোতে রফতানি চালান!

বিড়াল রপ্তানি.বাশ

#!/bin/bash
echo "VAR=HELLO THERE"

এখন স্ক্রিপ্ট বা আপনার কনসোল রান মধ্যে:

 export "$(./export.bash)"

চেষ্টা করুন:

echo $VAR
HELLO THERE

একাধিক মান এতক্ষণ আপনি জানেন যে আপনি উপরের পদ্ধতিটি ব্যবহার করে অন্য স্ক্রিপ্টে কী আশা করছেন:

বিড়াল রপ্তানি.বাশ

#!/bin/bash
echo "VAR=HELLO THERE"
echo "VAR1=HI THERE"

বিড়াল পরীক্ষা- রপ্তানি.শ

#!/bin/bash

IFS=$'\n'
for entries in $(./export.bash); do
   export $entries
done

echo "round 1"
echo $VAR
echo $VAR1

for entries in $(./export.bash); do
     variable=$(echo $entries|awk -F"=" '{print $1}');
     unset $variable
done

echo "round 2"
echo $VAR
echo $VAR1

এখন ফলাফল

 ./test-export.sh 
round 1
HELLO THERE
HI THERE
round 2


.

এবং স্বয়ংক্রিয়ভাবে নিয়োগের জন্য চূড়ান্ত চূড়ান্ত আপডেটটি বিভিন্নগুলি পড়ুন:

./test-export.sh 
Round 0 - Export out then find variable name - 
Set current variable to the variable exported then echo its value
$VAR has value of HELLO THERE
$VAR1 has value of HI THERE
round 1 - we know what was exported and we will echo out known variables
HELLO THERE
HI THERE
Round 2 - We will just return the variable names and unset them 
round 3 - Now we get nothing back

স্ক্রিপ্ট: বিড়াল পরীক্ষা- এক্সপোর্ট.শ

#!/bin/bash

IFS=$'\n'
echo "Round 0 - Export out then find variable name - "
echo "Set current variable to the variable exported then echo its value"
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 export $entries
 eval current_variable=\$$variable
 echo "\$$variable has value of $current_variable"
done


echo "round 1 - we know what was exported and we will echo out known variables"
echo $VAR
echo $VAR1

echo "Round 2 - We will just return the variable names and unset them "
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 unset $variable
done

echo "round 3 - Now we get nothing back"
echo $VAR
echo $VAR1

আমি ভিআরআর রফতানি করতে চাই ফাইলটি চালিয়ে না, সোর্স না করে।
তারশালাহ

@ বাহিদের আপনার স্ক্রিপ্টটি কী করছে তা বোঝানো উচিত।
এফডিনফ

1
কেন সোর্সিং পরে পরিবর্তনশীল আনসেট না? আপনার নিজের চেষ্টা করার ব্যথা টেস্ট-এক্সপোর্ট স্ক্রিপ্টটি আপডেট করবে এমন ব্যথার চেয়ে অনেক সহজ হতে পারে
ভিএইচ

আমি তার্সালাহ করার একটি বিকল্প উপায় দিয়েছি
ভিএইচ

ঠিক আছে চূড়ান্ত আপডেট - প্রস্তাবিত পদ্ধতি এবং বাশার্ক ওরফে ধারণাটির চারপাশের কাজের সমস্যাগুলি সম্ভবত একটি দুর্দান্ত উপায় হতে পারে
ভিএইচ

22

এক্সিকিউট

set -o allexport

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

source conf-file

আপনি যখন মৃত্যুদন্ড কার্যকর করা হবে। এটি অ্যালেক্সপোর্ট মোডটি অক্ষম করবে।

set +o allexport

7
প্রশ্নের পুরো বিষয়টি হ'ল "উত্স ছাড়াই রফতানি কীভাবে"। এই উত্তরটি উত্স ব্যবহার করে।
গোনেন আমি

@ ইকিস হ্যাঁ এটি প্রশ্নের সঠিক উত্তর দেয় না, তবে যখনই আমি এই ফাইলটি থেকে ভেরিয়েবল রফতানি করতে পারি তা এই থ্রেডটি উঠে আসে। সুতরাং আমি কেবল এটি নিজের জন্য রেখেছি।
mdornfe1

সহজ এবং ব্যবহার সহজ. এটি উত্তর হিসাবে চিহ্নিত করা উচিত।
কিকিজেড

1
আমি এটিকে উত্সাহিত করেছি কারণ মূল সমস্যা বিবৃতিটি আমাকে বুঝতে সাহায্য করে যে এটিই ছিল আমার মৌলিক সমাধান। অ্যালেক্সপোর্টে এখানে সরকারী দস্তাবেজ রয়েছে: gnu.org/software/bash/manual/html_node/The-Set-
বুলেটিন

আহ, +1 এই প্রশ্নটি bash source exportগুগলে কীওয়ার্ডের শীর্ষ ফলাফল
ttimasdf

14

একটি ফাইল থেকে পরিবেশের ভেরিয়েবলগুলি রফতান করার একটি আকর্ষণীয় এবং ঝরঝরে উপায় খুঁজে পেয়েছি:

ইন env.vars:

foo=test

পরীক্ষার স্ক্রিপ্ট:

eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => 

export eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

# a better one
export `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

7

আর একটি কার্যকারিতা যা কেসটির উপর নির্ভর করে, এটি কার্যকর হতে পারে: রফতানযোগ্য ভেরিয়েবলের উত্তরাধিকারসূত্রে প্রাপ্ত আরও একটি বাশ তৈরি করা। এটি @ কিথ থম্পসন উত্তরের একটি বিশেষ কেস, এই সমস্ত ত্রুটিগুলিই ঘটবে।

export.bash:

# !/bin/bash
export VAR="HELLO, VARIABLE"
bash

এখন:

./export.bash
echo $VAR

আপনি কি নিশ্চিত যে আপনি যা লিখেছেন তা কাজ করে !? আমি বিশ্বাস করি যে আপনাকে লাইন কমান্ডটি কার্যকর করতে হবে:. ./export.bash
স্যার জো ব্ল্যাক

@ স্যার জো ব্ল্যাক, হ্যাঁ, নিশ্চিত এক্সপোর্ট.বাশ ফাইলের শেষ লাইনটি bashবর্তমান শেলটির সন্তানের হিসাবে প্রার্থনা করে । এবং যেহেতু VARআগে রফতানি হয়েছিল, সেই অনুরোধটিতে চলক অন্তর্ভুক্ত থাকবে। অবশ্যই, আপনি টাইপ exitকরলে VARবেরিয়ে যাবে। আপনি চেক করা আছে?
গনমাটর

ঠিক আছে! আমি এই অনুরোধটি দেখিনি ...: পি
স্যার জো ব্ল্যাক

1

উত্তরটি না, তবে আমার জন্য আমি নিম্নলিখিতটি করেছি did

স্ক্রিপ্ট: মাই এক্সপোর্ট

#! \bin\bash
export $1

আমার .bashrc এ একটি উপন্যাস

alias myExport='source myExport' 

তবুও আপনি এটি উত্স করেছেন, তবে সম্ভবত এইভাবে এটি বেশি ব্যবহারযোগ্য এবং এটি অন্য কারও জন্য আকর্ষণীয়।


1

হতে পারে আপনি function / .zshrc, ~ / .bashrc এ কোনও ফাংশন লিখতে পারেন।

# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }

বাইরে পরিবর্তনশীল ব্যবহারের কারণে আপনি স্ক্রিপ্ট ফাইলটি এড়াতে পারবেন।

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