`উত্স` কমান্ডের বিপরীতে


9

sourceভেরিয়েবলের মানগুলি পড়তে / মুদ্রণের জন্য আমি আমার বাশ স্ক্রিপ্টে কমান্ডটি ব্যবহার করি

more linuxmachines_mount_point.txt

export linuxmachine01="sdb sdc sdf sdd sde sdg"
export linuxmachine02="sde sdd sdb sdf sdc"
export linuxmachine03="sdb sdd sdc sde sdf"
export linuxmachine06="sdb sde sdf sdd"

source  linuxmachines_mount_point.txt

echo $linuxmachine01
sdb sdc sdf sdd sde sdg

sourceভেরিয়েবল আনসেট করার জন্য বিপরীতটি কী ?

প্রত্যাশিত ফলাফল

echo $linuxmachine01

< no output >

14
এটি sourceআপনার পরিবেশে ভেরিয়েবলগুলি সেট করে না এমন নয় , তবে exportফাইলটিতে থাকা বিবৃতিগুলি source। সুতরাং বিপরীত sourceহতে পারে source, আপনি যদি sourceএকটি ভিন্ন ফাইল যা unsetসমস্ত একই ভেরিয়েবল।
ব্যবহারকারী 4556274

2
yael, রফতানি ব্যবহার করবেন না, কেবল নাম = "ভাল" ব্যবহার করুন। রফতানি স্ক্রিপ্ট থেকে বাইনারি ভেরিয়েবল (পরিবেশ) এর জন্য।
ctrl-d

1
সম্পর্কিত: unix.stackexchange.com/q/382618/117549
জেফ

2
এটা অসম্ভব. আপনি যে ধারণাটির জন্য সন্ধান করছেন তাকে রিভার্সিবল কম্পিউটিং বলে । বিপরীতমুখী হওয়ার জন্য প্রোগ্রামিং ভাষাগুলিকে কিছু গুরুতর বিধিনিষেধের সাথে বিশেষভাবে ডিজাইন করা দরকার । বাশ সেই প্রোগ্রামিং ভাষার একটি নয়।
জের্গ ডব্লু মিত্তাগ

1
@ আইয়েল, এটি অসত্য (এবং আপনি অবশ্যই ctrl-d বলার জন্য পরীক্ষাটি কখনও চালাতে পারেননি); আপনার একেবারে এসগুলির দরকার নেই export। সব exportকিছুই হ'ল পরিবেশে মানগুলি অনুলিপি করা - তবে তারা শেল ভেরিয়েবল হিসাবে উপস্থিত রয়েছে কিনা সেগুলি পরিবেশের ভেরিয়েবল হিসাবে সংজ্ঞায়িত করা হয়েছে কিনা। তদতিরিক্ত, অপ্রয়োজনীয় পরিবেশের ভেরিয়েবলগুলি সংজ্ঞায়িত করা আপনার সর্বাধিক কমান্ড লাইনের দৈর্ঘ্যকে হ্রাস করে, কারণ তারা প্রতি-প্রক্রিয়া স্থানে একই (সীমাবদ্ধ!) সঞ্চিত থাকে।
চার্লস ডাফি

উত্তর:


21

একটি সাব-শেল ব্যবহার করা (প্রস্তাবিত)

সাবসেলে সোর্স কমান্ডটি চালান:

(
source linuxmachines_mount_point.txt
cmd1 $linuxmachine02
other_commands_using_variables
etc
)
echo $linuxmachine01  # Will return nothing

Subshells ডান বন্ধনী দ্বারা সংজ্ঞায়িত করা হয়: (...)। সাবশেলের মধ্যে সেট করা কোনও শেল ভেরিয়েবল ভুলে গেলে সাবস্কেলটি শেষ হয়।

আনসেট ব্যবহার করা হচ্ছে

এটি রফতানি করে যে কোনও চলক আনসেট করে linuxmachines_mount_point.txt:

unset $(awk -F'[ =]+' '/^export/{print $2}' linuxmachines_mount_point.txt)
  • -F'[ =]+' ফিল্ড বিভাজক হিসাবে ফাঁকা এবং সমান চিহ্নের যে কোনও সংমিশ্রণ ব্যবহার করতে অ্যাডকে বলুন।

  • /^export/{print $2}

    এটি শুরু করে exportএবং দ্বিতীয় ক্ষেত্রটি মুদ্রণ করে এমন লাইনগুলি নির্বাচন করতে বিশ্রীকে বলে ।

  • unset $(...)

    এটি কমান্ডটি অভ্যন্তরে চালায় $(...), এটির স্টডআউটটি ক্যাপচার করে এবং এর আউটপুট দ্বারা চিহ্নিত কোনও ভেরিয়েবল আনসেট করে।


কেন এটি ব্যবহার করবেন না - আমার জন্য `awk '{মুদ্রণ $ 2}' ফাইল | awk -F "=" '{মুদ্রণ $ 1}' `; আনসেট না করা $ i; সম্পন্ন ? (
আনসেটের

2
@ আইয়েল যে কোনও অতিরিক্ত প্রক্রিয়া এবং একটি লুপ ব্যবহার করে যখন প্রয়োজন হয় না। মতামতগুলি ভিন্ন হতে পারে তবে আমি এটিকে এত সহজ দেখছি না। এছাড়াও এবং সম্ভাব্য বিপজ্জনক, এটি ধরে নিয়েছে যে প্রতিটি লাইনই fileএকটি রফতানি বিবৃতি।
1024

8
@ আইয়েল এছাড়াও, ভেরিয়েবলগুলি আনসেট করা এবং অন্যান্য কোডের পার্শ্ব-প্রতিক্রিয়াগুলি পূর্বাবস্থায় ফিরিয়ে আনাই সাবশেলের জন্য ঠিক তাই exactly তারা এটি সহজ এবং নির্ভরযোগ্যতার সাথে করে। অন্যথায় যদি কোনও বিশেষ কারণ না থাকে তবে সাবশেলগুলি আপনাকে ব্যবহার করা উচিত।
1024

4

আপনি sourceস্ক্রিপ্টটি আন করতে পারবেন না ।

আপনি যা করতে পারেন তা হ'ল অস্থায়ী ফাইলে সমস্ত রফতানি ভেরিয়েবল সংরক্ষণ করা, স্ক্রিপ্ট উত্সাহ পাওয়ার পরে ভেরিয়েবলের সাথে এটির তুলনা করা, এবং তারপরে ওভারফ্লো অপসারণ করা unset, উদাহরণস্বরূপ:

export > temp_file
source myscript

#... do some stuff

unset "$(comm -3 <(sort temp_file) <(export | sort) | awk -F'[ =]' '{print $3}' | tr '\n' ' ')"

কেন এটি ব্যবহার করবেন না - আমার জন্য `awk '{মুদ্রণ $ 2}' ফাইল | awk -F "=" '{মুদ্রণ $ 1}' `; আনসেট না করা $ i; সম্পন্ন ? (
আনসেটের

@ আইয়েল এটি কেবল তখনই কাজ করবে যদি স্ক্রিপ্টটিতে কেবলমাত্র exportগুলি থাকে।
jimmij

আপনার "এক্সপোর্ট এস" বলতে কী বোঝায়, আমার ফাইলে লিনাক্সমাচিন01 = "এসডিবি এসডিসি এসডিডি এসডিডি এসডিজি" এবং আরও কিছু অন্তর্ভুক্ত রয়েছে এবং আমি যখন অর্ক লুপটি ব্যবহার করি তখন এটির সমস্যাটি ছাড়াই ভেরিয়েবলটি সেট করে না
yael

@ আইয়েল আপনার ফাইলটি ঠিক কেমন দেখাচ্ছে তা আমি জানি না, তাই আমি কিছু সাধারণ উত্তর দিয়েছি, উদাহরণস্বরূপ, যদি স্ক্রিপ্টের উপরে শীর্ষে কোনও মন্তব্য থাকে তবে "# মাউন্ট পয়েন্টগুলির সাথে রফতানি করার জন্য এখানে কিছু পরিবর্তনশীল রয়েছে।"
jimmij

2

আপনি unsetভেরিয়েবলগুলি "ভুলে" যেতে কমান্ডটি ব্যবহার করতে পারেন ।


ফাইলটি বিভিন্ন মেশিনের সাথে থাকতে পারে, তবে কীভাবে ফাইলের দ্বিতীয় ভেরিয়েবল আনসেট করা যায়?
yael

আনসেট ভেরিয়েবলের নামটি এটি ভুলে যাবে (এটি আপনি বাশ / শ / কেএসএইচ / জেডএস ম্যান পৃষ্ঠায় ব্যাখ্যা করেছেন) এর ডেমো: পেস্টবিন
ফ্র্যাঙ্কোয়াস পি

হ্যাঁ তবে ভেরিয়েবলগুলি পৃথক হতে পারে, তাই ফাইল থেকে ভেরিয়েবলটি পড়ে সেগুলি সেট করতে বাশ স্ক্রিপ্টটি করা দরকার, এটি স্থির হতে পারে না কারণ ভেরিয়েবল অজানা
yael

তারপর, grep পুলিশের ফাইল থেকে তালিকা ভেরিয়েবল লাইনের (কাটা) রপ্তানি সেট না রপ্তানি linuxmachine06 হতে = "sdb SDE এসডিএফ SDD" তারপর আপনি linuxmachine06 সেট না উদাহরণ থেকে নামের পাবেন: pastebin.com/M9eCtLc7 হিসাবে আপনি সেট না কমান্ড এখানে doen দেখতে পরিবর্তনশীল নামটি জানেন না এটি কেবল শেষে জানা যায়
ফ্র্যাঙ্কোইস পি

ঠিক আছে আমি আনসেট করতে এই বাক্য গঠনটি ব্যবহার করব - আমি for awk '{মুদ্রণ $ 2}' ফাইলের জন্য | awk -F "=" '{মুদ্রণ $ 1}' `; আনসেট না করা $ i; সম্পন্ন
yael

2

আপনি যে আউটপুটটি প্রত্যাশা করেছেন তার সহজ সমাধান (কিছুই নয়) হ'ল ভেরিয়েবলটি খালি হিসাবে ঘোষণা করা:

$ export linuxmachine01="sdb sdc sdf sdd sde sdg"
$ echo "$linuxmachine01"
sdb sdc sdf sdd sde sdg

$ linuxmachine01=""
$ echo "$linuxmachine01"
$

অবশ্যই ভেরিয়েবলটি এখনও সংজ্ঞায়িত (এবং রফতানি করা), খালি তবে সংজ্ঞায়িত:

$ declare -p linuxmachine01
declare -x linuxmachine01=""

পরিবেশ এবং চলমান শেল উভয় থেকে ভেরিয়েবলটি সঠিকভাবে অপসারণ করতে আপনার আনসেটটি ব্যবহার করা উচিত (প্রস্তাবিত উপায়):

$ unset linuxmachine01
$ declare -p linuxmachine01
bash: declare: linuxmachine01: not found
$ echo "$linuxmachine01"
$

1

এটি করার সহজতম উপায় হ'ল আপনার স্ক্রিপ্টটি সংশোধন করা যাতে এটি স্ক্রিপ্টের প্রভাবটি পূর্বাবস্থায়িত করার জন্য একটি আদেশও সংজ্ঞায়িত করে:

export linuxmachine01="sdb sdc sdf sdd sde sdg"
export linuxmachine02="sde sdd sdb sdf sdc"
export linuxmachine03="sdb sdd sdc sde sdf"
export linuxmachine06="sdb sde sdf sdd"
alias linuxmachines_mount_point='for v in linuxmachine01 linuxmachine02 linuxmachine03 linuxmachine04; do unset $v; done; unalias linuxmachines_mount_point'

কোনও ফাংশন না দিয়ে কোনও উপাধি কেন? নোট করুন যে পূর্বনির্ধারিত নামগুলি ডিফল্টরূপে নন-ইন্টারেক্টিভ শেলগুলিতে অক্ষম থাকে তাই বাক্সের বাইরে, এটি কোনও স্ক্রিপ্টে কাজ করবে না।
চার্লস ডাফি

... প্রকৃতপক্ষে, এটি আরও সহজ হবে যদি আমরা কেবলমাত্র একটি ভেরিয়েবল সংজ্ঞায়িত করি এবং এর মধ্যে কেবল সেটটি সেট না করা থাকে: declare -A linuxmachines=( [01]="sdb sdc sdf" [02]="sde sdd sdb" [03]="whatever" )তবে এটি কেবল unset linuxmachinesফিরে যাওয়া vert
চার্লস ডাফি

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

আমি বিশ্বাস করি উপরে আমার পয়েন্ট হল যে alias লেখা হয় না জরিমানা উদ্দেশ্যে, যদি "উদ্দেশ্য" নন-ইন্টারেক্টিভ ব্যবহার (অর্থাত। স্ক্রিপ্ট থেকে আবাহন) অন্তর্ভুক্ত করা হয়েছে।
চার্লস ডাফি

0

আপনি আপনার লিনাক্সমাচাইন_মাউন্ট_পয়েন্ট.টিএসটি লিখতে পারেন

test "$linuxmachine01" && unset -v linuxmachine01 || linuxmachine01="sdb sdc sdf sdd sde sdg"

যখন আপনার ভেরিয়েবলগুলি দরকার হয়

source linuxmachines_mount_point.txt

আপনি যখন ভেরিয়েবলগুলি মুছতে চান

source linuxmachines_mount_point.txt

0

আপনি যদি sourceএকটিটি সক্রিয় VirtualEnvironmentকরতে কমান্ডটি ব্যবহার করেন তবে আপনি কমান্ডটি ব্যবহার করে এটি প্রস্থান করতে পারেন deactivate

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