একটি কমান্ডের জন্য পরিবেশ পরিবর্তনশীল আনসেট করুন


24

আমি একটি নির্দিষ্ট মান জন্য চালানোর ENV_VAR=value commandজন্য চালাতে পারেন । কি আনসেট সমতূল্য জন্য ?commandENV_VARENV_VARcommand


7
একপাশে: commandযেহেতু সেখানে আসলে প্লেসহোল্ডার একজন দুর্ভাগা পছন্দ হয় একটি বিল্ট-ইন নামের কমান্ড। mycommandবা somecommandবা এই ধরনের পেতে একটি উন্নততর অভ্যাস হতে পারে।
চার্লস ডাফি

@ চার্লসডুফি, আমি সাধারণত এটির cmdজন্য ব্যবহার করি।
স্টাফেন চেজেলাস

উত্তর:


35

-iবিকল্পটি ছাড়াও , যা পুরো পরিবেশটি মুছে দেয়, পসিক্স envএকটি ভেরিয়েবল আনসেট করার কোনও উপায় সরবরাহ করে না।

তবে কয়েকটি envবাস্তবায়ন (অন্তত জিএনইউ, busybox'এবং ফ্রিবিএসডি এর অন্তর্ভুক্ত) সহ, আপনি এটি করতে পারেন:

env -u ENV_VAR command

যা ENV_VARপরিবেশ থেকে পরিবর্তনশীল প্রতিটি ঘটনাকে সরিয়ে ফেলতে কাজ করবে (দ্রষ্টব্য যে এটি পরিবেশের ভেরিয়েবলের জন্য খালি নাম দিয়ে কাজ করে না ( env -u ''এটি একটি ত্রুটি দেয় বা বাস্তবায়নের উপর নির্ভর করে অকার্যকর হয় যদিও সমস্ত স্বীকার করে env '=value', সম্ভবত একটি সীমাবদ্ধতা unsetenv()সি ফাংশন দ্বারা ব্যয় হয়েছে যা পসিক্সকে খালি স্ট্রিংয়ের জন্য একটি ত্রুটি ফিরিয়ে নিতে হবে, যদিও এর জন্য এরকম কোনও সীমাবদ্ধতা নেই putenv()))।

বহনযোগ্যভাবে (POSIX শেলগুলিতে), আপনি এটি করতে পারেন:

(unset -v ENV_VAR; exec command)

(দ্রষ্টব্য যে কয়েকটি শাঁস ব্যবহার করে, execযা commandচালিত হয় তা পরিবর্তন করতে পারে : উদাহরণস্বরূপ কোনও ফাংশন বা বিল্টিনের পরিবর্তে ফাইল সিস্টেমে একটি চালায় (এবং aliasস্পষ্টতই সম্প্রসারণকে বাইপাস করে দেবে ) envউপরের মতো You আপনি এই ক্ষেত্রে বাদ দিতে চান) ।

তবে এটি পরিবেশের ভেরিয়েবলগুলির পক্ষে কাজ করবে না যার একটি নাম রয়েছে যা শেল ভেরিয়েবলের জন্য ম্যাপযোগ্য নয় (লক্ষ্য করুন যে কয়েকটি শেল পছন্দসইভাবে mkshপরিবেশের থেকে সেই পরিবর্তনশীলগুলিকে প্রারম্ভকালে ছাঁটাবে) বা ভেরিয়েবলগুলি কেবল পঠনযোগ্য হিসাবে চিহ্নিত হয়েছে।

-vবোর্ন শেলটির জন্য এবং bashযার নাম unsetছাড়া কোনও ভেরিয়েবল-v না থাকলে যার ছাড়া কোনও ENV_VAR ফাংশনটি আনসেট করতে পারে । অপশনটি পাস না করা হলে বেশিরভাগ অন্যান্য শেলগুলি ফাংশনগুলি আনসেট করে না । (অনুশীলনে কোনও পার্থক্য করার সম্ভাবনা নেই)।-f

(এছাড়াও বাগ / misfeature হুঁশিয়ার bash/ mksh/ yashযার unsetঅধীন কিছু পরিস্থিতিতে পরিবর্তনশীল আনসেট না, কিন্তু একটি বাইরের সুযোগ পরিবর্তনশীল প্রকাশ )

যদি perlউপলব্ধ থাকে তবে আপনি এটি করতে পারেন:

perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command

যা খালি নাম সহ পরিবেশের পরিবর্তনশীলগুলির জন্যও কাজ করবে।

এখন আপনি যদি কোনও বিল্টিন বা ফাংশনের জন্য পরিবেশের পরিবর্তনশীল পরিবর্তন করতে চান এবং সেগুলি সাবসেলের মধ্যে চালানো না চান তবে এগুলি সমস্তই কাজ করবে না bash:

env -u LANG printf -v var %.3f 1.2 # would run /usr/bin/printf instead
(unset -v LANG; printf -v var %.3f 1.2) # changes to $var lost afterwards

(এখানে .দশমিক বিভাজক হিসাবে ব্যবহার করা এবং বোঝার বিষয়টি নিশ্চিত করার পথে একটি বিভ্রান্তিক দৃষ্টিভঙ্গি হিসাবে ল্যাংকে আনসেট করা LC_ALL=C printf...that এর জন্য ব্যবহার করা ভাল be

কিছু শেল দিয়ে, আপনি পরিবর্তে একটি ফাংশন ব্যবহার করে ভেরিয়েবলের জন্য স্থানীয় সুযোগ তৈরি করতে পারেন:

without() {
  local "$1" # $1 variable declared as initially unset in bash¹
  shift
  "$@"
}
without LANG printf -v var %.3f 1.2

এর সাথে zsh, আপনি একটি বেনামী ফাংশনও ব্যবহার করতে পারেন:

(){local ENV_VAR; command}

এই পদ্ধতির কিছু শেলগুলিতে (অলকুইস্ট শেলের উপর ভিত্তি করে) কাজ করবে না, যাদের localভেরিয়েবলটি প্রাথমিকভাবে আনসেট হিসাবে ঘোষণা করবেন না (তবে মান এবং বৈশিষ্ট্যের উত্তরাধিকারী)। সেই ক্ষেত্রে, আপনি কি করতে পারেন local ENV_VAR; unset ENV_VAR, কিন্তু যে না না mkshবা yash( typesetপরিবর্তে localএটি কাজ না would হিসাবে যে এক জন্য) unsetশুধুমাত্র বাতিল করা হবে local

¹ এছাড়াও সাবধান যে bash, স্থানীয় ENV_VAR(আনসেট না হওয়া সত্ত্বেও) রফতানির বৈশিষ্ট্য ধরে রাখতে পারে । সুতরাং যদি commandএকটি ফাংশন যা একটি মান ENV_VARনির্ধারিত হয় , ভেরিয়েবল কমান্ডের পরিবেশে পরে বলা হবে। unset ENV_VARযে বৈশিষ্ট্য পরিষ্কার হবে। অথবা আপনি এটি ব্যবহার করতে পারেন local +x ENV_VARযা একটি পরিষ্কার স্লেটও নিশ্চিত করে (যদি না যে পরিবর্তনশীল কেবল পঠনযোগ্য হিসাবে ঘোষণা না করা হয় তবে তারপরে এটি করার মতো কিছুই নেই bash)।


1
এটি একটি পৃথক প্রশ্ন, তবে হ্যাকটি একটি খালি নামের পরিবেশের পরিবর্তনশীল এবং আপনি কীভাবে এটি ব্যবহার করবেন - এমনকি কোনও ধরণের শোষণের জন্যও? আপনার কি এমন কোনও প্রোগ্রাম লিখতে হবে না যা পরিবেশটি পড়বে এবং বিশেষত এরকম কোনও কিছুর সন্ধান করবে?
জো

@ জো, উদাহরণস্বরূপ চেষ্টা করুন env '=foo' python -c 'import os; print os.environ[""]'। আমি আশা করি না যে অনেক লোক এর মতো একটি ভেরিয়েবল সেট করতে চান।
স্টাফেন চেজেলাস

9

আমি যতদূর সচেতন সেখানে সরাসরি সমতুল্য কোনও কিছুই নেই; আপনি একটি সাব-শেল ব্যবহার করতে পারেন:

(unset ENV_VAR; exec command)

(unset ENV_VAR; exec somecommand)আপনি যদি দক্ষতায় আসলটির সমতুল্য হতে চান (সাবসেল গ্রাস করে)। এটি যেমন রয়েছে, এটি একটি অতিরিক্ত কাঁটাচামচ যুক্ত করে।
চার্লস ডাফি

1
@ চারেলস প্রকৃতপক্ষে, যদিও কিছু শেল স্বয়ংক্রিয়ভাবে এটি কাজ করে যেহেতু সাব শেল আবেদনের commandশেষ আদেশ।
স্টিফেন কিট

+1 কারণ ইন্টারেক্টিভ ব্যবহারের জন্য এইভাবে টাইপ করা সহজ। আমি মনে রাখার পরিবর্তে ওয়ান-লাইনারের জন্য শেল পরিবেশে এক-অফ পরিবর্তনের জন্য সাবশেলগুলি ব্যবহার করি env -u
পিটার

0

তুমি ব্যবহার করতে পার ENV_VAR= command

এটি আসলে ভেরিয়েবলটি আনসেট করে না, তবে এটি বেশিরভাগ ক্ষেত্রে কার্যকর হতে পারে (শেল স্ক্রিপ্টগুলি সাধারণত test -nভেরিয়েবল সেট করা আছে কিনা তা পরীক্ষা করতে ব্যবহার করে):

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