আমি যখন #!/usr/bin/env python
স্ক্রিপ্ট চালানোর জন্য শেবাং ব্যবহার করি , তখন সিস্টেমটি কীভাবে ব্যবহার করবে তা কীভাবে জানতে python
পারে? যদি আমি python
পরিবেশের পরিবর্তনশীলগুলিতে একটি বিন পথের সন্ধান করি তবে আমি কিছুই পাই না।
env | grep -i python
আমি যখন #!/usr/bin/env python
স্ক্রিপ্ট চালানোর জন্য শেবাং ব্যবহার করি , তখন সিস্টেমটি কীভাবে ব্যবহার করবে তা কীভাবে জানতে python
পারে? যদি আমি python
পরিবেশের পরিবর্তনশীলগুলিতে একটি বিন পথের সন্ধান করি তবে আমি কিছুই পাই না।
env | grep -i python
উত্তর:
শেবাং দোভাষীর ব্যবহারের সম্পূর্ণ পথ আশা করে যাতে নিম্নলিখিত বাক্য গঠনটি ভুল হতে পারে:
#!python
এটির মতো একটি পুরো পথ নির্ধারণ করা কার্যকর হতে পারে:
#!/usr/local/bin/python
কিন্তু অ পোর্টেবল হবেন পাইথন ইনস্টল করা যেতে পারে হবে /bin
, /opt/python/bin
অথবা যেখানেই থাকুন না কেন অন্য একটি স্থানে।
ব্যবহার env
#!/usr/bin/env python
ওএসের কাছে পোর্টেবল উপায়টিকে python
প্রথমে যেখানে অবস্থিত সেখানে তার সমপরিমাণের একটি পূর্ণ পথের অনুমতি দেওয়ার একটি পদ্ধতি PATH
।
কুঁড়েঘর লাইন ( "ধারালো ঠুং", 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
env
এবং which
? যেহেতু আমার पथ পরিবেশ থেকে সর্বাধিক যোগ্য নির্বাহযোগ্যও পাবেন।
which
আবিষ্কার করে এবং তার পথটি মুদ্রণ করে। env
প্রোগ্রামটি প্রথম আর্গুমেন্ট দ্বারা সুনির্দিষ্টভাবে সন্ধান করে এবং এটি কার্যকর করে, বাকি আর্গুমেন্টগুলি পাস করে।
env
মূলত একটি eval সংস্করণ which
।
ঠিক আছে, তাই চালান:
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']
) এর মধ্যে অজগরের মধ্যে পার্থক্য দেখছি ।