#! / Usr / bin / env বাশ কেন #! / বিন / বাশের চেয়ে বেশি?


212

অগ্রাধিকার হিসাবে ব্যবহার করার জন্য আমি এই সাইটে সুপারিশ সহ বেশ কয়েকটি জায়গায় দেখেছি ( পছন্দের বাশ শেবাং কী? ) । আমি এমনকি একজন উদ্যোগী ব্যক্তিকে দেখেছি যে ব্যবহারটি ভুল ছিল বলে পরামর্শ দেয় এবং ব্যাশ কার্যকারিতা এটি করে হারাতে পারে।#!/usr/bin/env bash#!/bin/bash#!/bin/bash

যা যা বলেছিল, আমি দৃ tight়ভাবে নিয়ন্ত্রিত পরীক্ষার পরিবেশে ব্যাশ ব্যবহার করি যেখানে প্রচলিত প্রতিটি ড্রাইভই মূলত একক মাস্টার ড্রাইভের ক্লোন। আমি বহনযোগ্যতার যুক্তিটি বুঝতে পারি, যদিও এটি আমার ক্ষেত্রে অগত্যা প্রযোজ্য নয়। #!/usr/bin/env bashবিকল্পগুলির চেয়ে বেশি পছন্দ করার আর কি কারণ আছে এবং ধরে নেওয়া বহনযোগ্যতা একটি উদ্বেগ ছিল তা কি ব্যবহারের কার্যকারিতা ভঙ্গ করতে পারে এমন কোনও কারণ আছে?


7
এটি অগত্যা ভাল না। দেখুন এই প্রশ্নের এবং আমার উত্তর unix.stackexchange.com উপর। (আমি এটি একটি সদৃশ হিসাবে বন্ধ করতে ভোট দিতে চাই, তবে আমি মনে করি না যে আপনি এটি সাইটগুলিতে করতে পারেন))
কিথ থম্পসন

2
@ জিগ্গের উত্তর ছাড়াও, এটিতে envনাও থাকতে পারে /usr/bin। শেবাং মন্তব্যগুলি সম্পূর্ণরূপে একটি খারাপ ধারণা আইএমএইচও। যদি আপনার ডিফল্ট স্ক্রিপ্ট ইন্টারপ্রেটার শেবাং মন্তব্যগুলি পরিচালনা না করে তবে এটি কেবল একটি মন্তব্য। তবে, যদি আপনি জানেন যে স্ক্রিপ্ট ইন্টারপ্রেটার শিবাং মন্তব্যগুলি পরিচালনা করতে পারে এবং আপনি বাশ দেওয়ার পথটি জানেন, তবে পথটি দীর্ঘ (অসম্ভাব্য) না হলে এটির পরম পথটি ব্যবহার করে বলার কোনও কারণ নেই বা আপনি সম্ভবত স্ক্রিপ্টটি পোর্ট করতে পারেন এমন একটি সিস্টেমে যেটিতে / বিনে বাশ নেই। তারপরে আবার, আমি আগে যে ক্যাভ্যাটগুলি উল্লেখ করেছি সেগুলি ক্ষেত্রে প্রযোজ্য কারণ এটিতে বহনযোগ্যতা জড়িত।

1
@ কিথথম্পসন, লিঙ্কটির জন্য ধন্যবাদ। প্রশ্ন পোস্ট করার আগে একটি উত্তরের জন্য আমার অনুসন্ধানটি কিছুটা সংকীর্ণ ছিল। এই সমস্ত থেকে আমার গ্রহণযোগ্যতা: (১) লিনাক্স / ইউনিক্স / পিক্সিকস ইত্যাদি gray ধূসর বর্ণের এবং (২) যে কেউ একেবারে সঠিক উত্তর দাবি করছে তাদের কাছে অবশ্যই তাদের নির্দিষ্ট দৃশ্যের সঠিক উত্তর রয়েছে।
spugm1r3

3
পসিক্স / ইউনিক্সের অনেক কিছুর আচরণের সংজ্ঞা দেওয়া হয়েছে। অবস্থানগুলি সবসময় এত পরিষ্কার কাট হয় না। সামথিংস এর মতো /etcবা থাকতে হবে /bin/shbashবেশিরভাগ ইউনিক্স সিস্টেমের মতো অ্যাড-অন। এটি কেবলমাত্র লিনাক্সেই রয়েছে যেখানে এটির bashনিশ্চয়তা রয়েছে /binএবং সম্ভবত এটির সাথে যুক্ত রয়েছে /bin/sh। লিনাক্স যেহেতু অনেক লোকের জন্য আধুনিক ডি ফ্যাক্টো ইউনিক্সে পরিণত হয়েছিল লিনাক্স ব্যতীত অন্য সিস্টেমগুলি থাকতে পারে তা ভুলে গিয়েছে। নীচে আমার নিজের উত্তরে আমি লিনাক্স ধরেছিলাম কারণ আপনি বলেছিলেন bash। আমি যে বিএসডি বাক্সগুলির সাথে কাজ করেছি তার অনেকগুলি এটি ইনস্টল করা হয়নি।
শান পেরি 21

2
@ কিথ - বাশের ক্ষেত্রে (অন্যান্য প্রশ্নে পাইথনের বিপরীতে) ... ওপেনবিএসডি এর কোনও নেই /bin/bash। ব্যাশ ডিফল্টরূপে ইনস্টল করা হয় না। যদি আপনি এটি চান, আপনি করতে হবে pkg install bash। একবার ইনস্টল এটি অবস্থিত /usr/local/bin/bash/bin/bashওপেনবিএসডি তে কিছুই ইনস্টল করা নেই । #!/bin/bashইচ্ছার ত্রুটিযুক্ত শেবাং , এবং #!/usr/bin/env bashসফল হবে।
jww

উত্তর:


229

#!/usr/bin/envঅনুসন্ধান PATHজন্য bash, এবং bashসবসময় হয় /bin, বিশেষ করে অ লিনাক্স সিস্টেমে। উদাহরণস্বরূপ, আমার ওপেনবিএসডি সিস্টেমে এটি রয়েছে /usr/local/bin, যেহেতু এটি একটি alচ্ছিক প্যাকেজ হিসাবে ইনস্টল করা হয়েছিল।

আপনি যদি নিশ্চিত হন যে bashএটি /binসর্বদা আছে এবং সর্বদা থাকবে, তবে এটি সরাসরি আপনার শেবাংয়ে রাখার কোনও ক্ষতি নেই — তবে আমি এর বিরুদ্ধে সুপারিশ করব কারণ স্ক্রিপ্টগুলি এবং প্রোগ্রামগুলি আমাদের প্রাথমিকভাবে বিশ্বাস করে যে তারা থাকবে।


29
envলোকেশন সম্পর্কে কি ? পসিক্স এটি জোর করে না।
জুলিও গুয়েরা

1
@ জুলিওগুয়েরা মেল প্রক্রিয়াজাতকরণের জন্য বাইনারি /usr/lib/sendmail(বা খুব সাম্প্রতিককালে /usr/sbin/sendmail) উপলভ্য হওয়ার মতো, এটি ইউনিক্সের মতো সিস্টেমের সবচেয়ে ভাল আগ্রহ, /usr/bin/envকারণ এনভির শেবাং এমন একটি প্রচলিত অনুশীলন। এটি একটি ডি ফ্যাক্টো স্ট্যান্ডার্ড ইন্টারফেস।
জিগগ

8
@ জিগগ এটি ইউএন * এক্স ... <-: মানে, এর জন্য একটি মানক অবস্থান রাখা তাদের পক্ষে সবচেয়ে ভাল আগ্রহ env, তবে কোনওভাবেই কোনও মানক অবস্থান (যা কেবল একটি নরম লিঙ্ক হতে পারে) না রাখার জন্য bash। উল্লেখ করার দরকার নেই, তবে কেন হ্যাশবাং কেবল গ্রহণ করে না #!bash, এবং এর PATHপরিবর্তে আমরা ঠিক একইভাবে করার পরিবর্তে ব্যবহার করি env। দুষ্টুদের জন্য যথেষ্ট বিভ্রান্তিকর নয়, আমার ধারণা।
ddekany

1
@ জুলিও গুয়েরা উইকিপিডিয়া অনুসারে আপনি সত্য: এটি "গ্যারান্টিযুক্ত" নয়। পরিবর্তে, এটি "আরও সম্ভাব্য" বলে মনে হচ্ছে। উইকিপিডিয়া This mostly works because the path /usr/bin/env is commonly used for the env utilityএখানে এন.ইউইকিপিডিয়া.org / উইকি / শেবাং_( ইউনিক্স) বলেছে - আমাদের অবশ্যই envসমস্ত সিস্টেমে "সম্ভবত" থাকার কথা নিশ্চিত করতে হবে।
জাভি মন্টেরো

2
@ জাভিমন্টেরো: আমি এমন একটি সিস্টেম ব্যবহার করেছি যেখানে envছিল /binনা /usr/bin(যা নিশ্চিত নয় যেটি সম্ভবত, সানোস 4)। এই দিনগুলি সম্ভবত /usr/bin/envএটি #!/usr/bin/envহ্যাকের জনপ্রিয়তার কারণে পাওয়া যাবে available
কিথ থমসন

39

বাশের আদর্শ অবস্থান /binএবং আমি সন্দেহ করি যে এটি সমস্ত সিস্টেমে সত্য। তবে, আপনি যদি সেই সংস্করণ বাশ পছন্দ না করেন তবে কী করবেন? উদাহরণস্বরূপ, আমি ব্যাশ 4.2 ব্যবহার করতে চাই, তবে আমার ম্যাকের ব্যাশটি 3.2.5 এ রয়েছে।

আমি ব্যাশ পুনরায় ইনস্টল করার চেষ্টা করতে পারি /binতবে এটি একটি খারাপ ধারণা হতে পারে। আমি যদি আমার ওএস আপডেট করি তবে এটি ওভাররাইট করা হবে।

তবে, আমি ব্যাশ ইন ইনস্টল করতে /usr/local/bin/bashএবং আমার প্যাথ সেট আপ করতে পারলাম :

PATH="/usr/local/bin:/bin:/usr/bin:$HOME/bin"

এখন, যদি আমি উল্লেখ করি তবে আমি bashপুরানো ক্রুডিটি পাই না /bin/bash, তবে নতুন, আরও চকচকে /usr/local/bin। নিস!

আমার শেল স্ক্রিপ্ট বাদে সেই !# /bin/bashশেবাং রয়েছে। এইভাবে, আমি যখন আমার শেল স্ক্রিপ্টগুলি চালিত করি, তখন আমি বাশের সেই পুরানো এবং লঘু সংস্করণটি পাই যা এমনকি সংঘবদ্ধ অ্যারেও নেই।

ব্যবহার করা /usr/bin/env bashআমার প্যাথে পাওয়া ব্যাশের সংস্করণটি ব্যবহার করবে। যদি আমি আমার প্যাথ সেটআপ করি, যাতে এটি /usr/local/bin/bashকার্যকর হয়, এটি আমার স্ক্রিপ্টগুলি ব্যবহার করবে ash

এটি বাশ দিয়ে দেখতে বিরল, তবে পার্ল এবং পাইথনের সাথে এটি অনেক বেশি সাধারণ:

  • কিছু ইউনিক্স / লিনাক্স রিলিজ যা স্থিতিশীলতার দিকে মনোনিবেশ করে তা কখনও কখনও এই দুটি স্ক্রিপ্টিং ভাষার প্রকাশের পিছনে থাকে। খুব বেশি দিন আগে, আরএইচইএলের পার্ল ছিল ৮.৮.৮ - পার্লের একটি আট বছরের পুরানো সংস্করণ! যদি কেউ আরও আধুনিক বৈশিষ্ট্য ব্যবহার করতে চায় তবে আপনাকে নিজের সংস্করণ ইনস্টল করতে হবে।
  • পার্লব্রু এবং পাইথনব্রিউয়ের মতো প্রোগ্রাম আপনাকে এই ভাষার একাধিক সংস্করণ ইনস্টল করতে দেয়। এগুলি এমন স্ক্রিপ্টগুলির উপর নির্ভর করে যা আপনার পছন্দের সংস্করণটি পেতে আপনার পাঠকে হেরফের করে। পাথটিকে শক্ত কোডিংয়ের অর্থ আমি আমার স্ক্রিপ্ট ব্রিউয়ের অধীনে চালাতে পারি না ।
  • পার্ল এবং পাইথন বেশিরভাগ ইউনিক্স সিস্টেমে অন্তর্ভুক্ত কোনও স্ট্যান্ডার্ড প্যাকেজ ছিল না এটি খুব বেশি আগে ছিল না (ঠিক আছে, এটি অনেক আগেই ছিল)। এর অর্থ এই দুটি প্রোগ্রাম কোথায় ইনস্টল করা হয়েছে তা আপনি জানতেন না। এটি অধীনে ছিল /bin? /usr/bin? /opt/bin? কে জানে? ব্যবহারের #! /usr/bin/env perlঅর্থ আমার জানা ছিল না।

এবং এখন কেন আপনার ব্যবহার করা উচিত নয় #! /usr/bin/env bash

পথটি যখন শেবাংকে হার্ডকোড করা হয় তখন আমাকে সেই দোভাষী নিয়ে দৌড়াতে হয়। সুতরাং, #! /bin/bashআমাকে ব্যাশের ডিফল্ট ইনস্টলড সংস্করণ ব্যবহার করতে বাধ্য করে। যেহেতু বাশ বৈশিষ্ট্যগুলি খুব স্থিতিশীল (পাইথন ৩.x এর অধীনে পাইথন স্ক্রিপ্টের ২.x সংস্করণ চালানোর চেষ্টা করুন) এটি সম্ভবত খুব সম্ভবত আপনার বিশেষ বেস স্ক্রিপ্টটি কাজ করবে না, এবং যেহেতু আমার বাশ স্ক্রিপ্ট সম্ভবত এই সিস্টেম এবং অন্যান্য সিস্টেম দ্বারা ব্যবহৃত হয়েছে , ব্যাশের একটি অ-মানক সংস্করণ ব্যবহার করার ফলে অনাকাঙ্ক্ষিত প্রভাব থাকতে পারে। এটি খুব সম্ভবত আমি নিশ্চিত করতে চাই যে ব্যাশের স্থিতিশীল মানক সংস্করণটি আমার শেল স্ক্রিপ্টের সাথে ব্যবহৃত হয়েছে। সুতরাং, আমি সম্ভবত আমার শেবাংয়ের পথটি হার্ড কোড করতে চাই।


5
এটি সত্য নয়: "বাশের মানক অবস্থান / বিন," (আপনি যদি কোনও মান নথির উদ্ধৃতি না দিয়ে থাকেন) তবে এটি সম্ভবত আরও সঠিক যে এটি বেশিরভাগ লিনাক্স বিতরণ এবং ম্যাকোগুলিতে "স্বাভাবিক" অবস্থান, তবে এটি একটি নয় সাধারণভাবে ইউনিক্স সিস্টেমে মানক (এবং উল্লেখযোগ্যভাবে * বিএসডিএস-তে অবস্থান নয়)।
tesch1

13

অনুরোধ করার জন্য bashএটি কিছুটা ওভারকিল। bashআপনার নিজের মতো একাধিক বাইনারি ~ / বিনে না থাকলে তবে এর অর্থ আপনার কোডটি নির্ভর করে। PATH এর মধ্যে সঠিক জিনিস রয়েছে।

এটি pythonযদিও মত জিনিস জন্য সুবিধাজনক । এখানে মোড়ক স্ক্রিপ্ট এবং পরিবেশ রয়েছে যা বিকল্প pythonবাইনারি ব্যবহারের দিকে নিয়ে যায়।

বাইনারিটির সঠিক পথটি ব্যবহার করে কোনও কিছুই হারাবে না যতক্ষণ না আপনি নিশ্চিত যে এটি বাইনারি আপনি সত্যই চান।


জন্য স্পট python। আমি হারিয়েছি জায়গাগুলির সংখ্যা pythonখুঁজে পাওয়া যাবে
😀

2
/usr/bin/envপাইথনের জন্য আরও কার্যকর যে সম্মত হয়েছে , বিশেষত যদি আপনি ভার্চুয়ালেনভ ব্যবহার করেন।
ডেনিস

10

এমন অনেকগুলি সিস্টেম রয়েছে যার মধ্যে বাশ নেই /bin, ফ্রিবিএসডি এবং ওপেনবিএসডি কেবল কয়েকটি নাম রাখার জন্য। যদি আপনার স্ক্রিপ্টটি বোঝা যায় যে অনেকগুলি বিভিন্ন ইউনিয়নে পোর্টেবল হতে পারে তবে আপনি এর #!/usr/bin/env bashপরিবর্তে ব্যবহার করতে পারেন #!/bin/bash

মনে রাখবেন যে এটি সত্য বলে মনে করে না sh; বোর্ন-অনুবর্তী স্ক্রিপ্ট আমি একচেটিয়াভাবে ব্যবহার #!/bin/sh, যেহেতু আমি অস্তিত্ব প্রায় কাছাকাছি যে ইউনিক্স মনে হয়েছে sh/bin


উবুন্টু 18.04 /bindir, আমি দেখতে sh -> dash। প্রতীকীভাবে এর সাথে যুক্ত dash, উবুন্টুর দেবিয়ান প্রকৃতি প্রকাশ করে। এই তিনটি কমান্ড স্ট্রিং চালান বুঝতে এটি সব পৃথক পছন্দের নিচে boils: which bashতারপর which shতারপর which dash
noobninja

0

আমি bashসিস্টেমে উপলব্ধ সমস্ত যাচাই করতে নীচের মতো একটি স্ক্রিপ্টে মূল প্রোগ্রামটি মোড়ানো পছন্দ করি । এটি ব্যবহার করা সংস্করণে আরও নিয়ন্ত্রণ রাখা ভাল।

#! /usr/bin/env bash

# This script just chooses the appropriate bash
# installed in system and executes testcode.main

readonly DESIRED_VERSION="5"

declare all_bash_installed_on_this_system
declare bash

if [ "${BASH_VERSINFO}" -ne "${DESIRED_VERSION}" ]
then
    found=0

    all_bash_installed_on_this_system="$(\
        awk -F'/' '$NF == "bash"{print}' "/etc/shells"\
        )"

    for bash in $all_bash_installed_on_this_system
    do
        versinfo="$( $bash -c 'echo ${BASH_VERSINFO}' )"
        [ "${versinfo}" -eq "${DESIRED_VERSION}" ] && { found=1 ; break;}
    done
    if [ "${found}" -ne 1 ]
    then
        echo "${DESIRED_VERSION} not available"
        exit 1
    fi
fi

$bash main_program "$@"

0
 #!/usr/bin/env bash

অবশ্যই এটি আরও ভাল কারণ এটি আপনার সিস্টেমের পরিবেশের পরিবর্তনশীল থেকে বাশ কার্যকর করতে সক্ষম পাথ খুঁজে পায়।

আপনার লিনাক্স শেল এ গিয়ে টাইপ করুন

env

এটি আপনার সমস্ত পরিবেশের ভেরিয়েবল মুদ্রণ করবে।

আপনার শেল স্ক্রিপ্টে যান এবং টাইপ করুন

echo $BASH

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

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