/ ইউএসআর / বিন / এনভিভি কীভাবে কোন প্রোগ্রামটি ব্যবহার করবেন তা জানেন?


62

আমি যখন #!/usr/bin/env pythonস্ক্রিপ্ট চালানোর জন্য শেবাং ব্যবহার করি , তখন সিস্টেমটি কীভাবে ব্যবহার করবে তা কীভাবে জানতে pythonপারে? যদি আমি pythonপরিবেশের পরিবর্তনশীলগুলিতে একটি বিন পথের সন্ধান করি তবে আমি কিছুই পাই না।

env | grep -i python

6
ওহ, আমি মনে করি আমি এটি খুঁজে
পেয়েছি

আমি সে সম্পর্কেও ভাবছি। এবং কেন / usr / বিন / env? যেমনটি / বিন / এনভি বা এনভির বিরোধী, এটি যদি কেবল এনভির থেকে পাথের একটি তালিকা পেয়ে থাকে?
ফাহিম মিঠা

কেবল 'এনভিভ' কাজ করবে না কারণ এটি পুরোপুরি চলতে হবে। 'এনএভিভি' প্রোগ্রামটি সাধারণত / ব্যবহারকারী / বিন / এনভির মধ্যে পাওয়া যায়। কিছু ডিস্ট্রোজে এটি / বিন / এনভি হিসাবেও পাওয়া যেতে পারে তবে / ইউএসআর / বিন / এনভির সাথে যাওয়া আরও নিরাপদ।
21

উত্তর:


54

শেবাং দোভাষীর ব্যবহারের সম্পূর্ণ পথ আশা করে যাতে নিম্নলিখিত বাক্য গঠনটি ভুল হতে পারে:

#!python

এটির মতো একটি পুরো পথ নির্ধারণ করা কার্যকর হতে পারে:

#!/usr/local/bin/python

কিন্তু অ পোর্টেবল হবেন পাইথন ইনস্টল করা যেতে পারে হবে /bin, /opt/python/binঅথবা যেখানেই থাকুন না কেন অন্য একটি স্থানে।

ব্যবহার env

#!/usr/bin/env python

ওএসের কাছে পোর্টেবল উপায়টিকে pythonপ্রথমে যেখানে অবস্থিত সেখানে তার সমপরিমাণের একটি পূর্ণ পথের অনুমতি দেওয়ার একটি পদ্ধতি PATH


56

কুঁড়েঘর লাইন ( "ধারালো ঠুং", IE থেকে #!) কার্নেল দ্বারা প্রক্রিয়াকৃত হয়। কার্নেল যেমন পরিবেশের ভেরিয়েবল সম্পর্কে জানতে চায় না PATH। সুতরাং শেবাং লাইনের নামটি অবশ্যই কার্যকর করা যায় to আপনি স্ক্রিপ্ট নামের আগে (এক্সিকিউটিভ) এই নির্বাহযোগ্যকে পাস করার জন্য একটি অতিরিক্ত যুক্তিও নির্দিষ্ট করতে পারেন (সিস্টেম-নির্ভর বিধিনিষেধের সাথে আমি এখানে যাব না)। উদাহরণস্বরূপ, পাইথন স্ক্রিপ্টের জন্য, আপনি উল্লেখ করতে পারেন

#!/usr/bin/python

প্রথম লাইনে এবং যখন আপনি স্ক্রিপ্টটি কার্যকর করেন, কার্নেলটি আসলে কার্যকর হবে /usr/bin/python /path/to/script। তবে এটি সুবিধাজনক নয়: আপনাকে কমান্ডের পুরো পথ নির্দিষ্ট করতে হবে। আপনি কি আছে যদি pythonমধ্যে /usr/binকিছু মেশিনে এবং /usr/local/binঅন্যদের উপর? অথবা আপনি আপনার সেট করতে চান PATHকরতে /home/joe/opt/python-2.5/binতাই হিসাবে পাইথন একটি নির্দিষ্ট সংস্করণ ব্যবহার করতে হয়? যেহেতু কার্নেল আপনার জন্য PATHঅনুসন্ধান করবে না , তাই ধারণাটি হ'ল কার্নেলটি একটি কমান্ড চালানো হবে যা পরিবর্তিতভাবে পছন্দসই দোভাষীটি দেখবে PATH:

#!/fixed/path/to/path-lookup-command python

এটি path-lookup-commandঅবশ্যই একটি কার্যনির্বাহকের নাম হিসাবে যুক্তি হিসাবে গ্রহণ করবে এবং এটি সন্ধান করবে PATHএবং এটি সম্পাদন করবে: কার্নেলটি চলবে /fixed/path/to/path-lookup-command python /path/to/script। যেমনটি ঘটে, envকমান্ডটি ঠিক তাই করে। এর মূল উদ্দেশ্যটি একটি ভিন্ন পরিবেশের সাথে একটি কমান্ড চালানো, তবে যেহেতু এটি কমান্ডের নামটি সন্ধান করে $PATH, এটি আমাদের উদ্দেশ্যে এখানে উপযুক্ত perfect

যদিও এটি আনুষ্ঠানিকভাবে গ্যারান্টিযুক্ত নয়, historicতিহাসিক ইউনিক্স সিস্টেমগুলি সরবরাহ করা envহয়েছে /usr/binএবং আধুনিক সিস্টেমগুলি ব্যাপকভাবে ব্যবহারের কারণে সেই অবস্থানটি যথাযথভাবে রেখেছে #!/usr/bin/env। সুতরাং, অনুশীলনে, নির্দিষ্ট করার উপায়টি যে কোনও স্ক্রিপ্ট অবশ্যই ব্যবহারকারীর প্রিয় পাইথন দোভাষী দ্বারা সম্পাদন করা উচিত

#!/usr/bin/env python

2
যা এক মধ্যে পছন্দ করা হয় envএবং which? যেহেতু আমার पथ পরিবেশ থেকে সর্বাধিক যোগ্য নির্বাহযোগ্যও পাবেন।
নিখিল মুলি

8
@ নিখিলমুলি কার্যকর কার্যকর whichআবিষ্কার করে এবং তার পথটি মুদ্রণ করে। envপ্রোগ্রামটি প্রথম আর্গুমেন্ট দ্বারা সুনির্দিষ্টভাবে সন্ধান করে এবং এটি কার্যকর করে, বাকি আর্গুমেন্টগুলি পাস করে।
কেভিন

3
সুতরাং এটি envমূলত একটি eval সংস্করণ which
নিখিল মুলি 2'12

6

ঠিক আছে, তাই চালান:

env | grep PATH

আপনার AT PATH ডিরেক্টরিগুলির একটি তালিকা। "অজগর" না পাওয়া অবধি ইউনিক্স সেই তালিকাগুলির তালিকায় থাকবে order

আপনি দেখতে পাবেন যে এটি 'কোন' কমান্ডের সাহায্যে কোন ডিরেক্টরিটি আবিষ্কার করে:

which python

মজার বিষয় হচ্ছে, আমি sys.pathঅ্যাকটিভেটেড এনভির $ env python3 ( ['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/.local/lib/python3.4/site-packages', '/usr/lib/python3.4/site-packages', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']) এবং ./env/bin/python3 (['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/test/env3/lib/python3.4/site-packages']) এর মধ্যে অজগরের মধ্যে পার্থক্য দেখছি ।
থারস্মমনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.