$ আইএফএস ভেরিয়েবলটি "ব্যাক আপ" করা কি বুদ্ধিমান পদ্ধতি?


19

আমি সর্বদা সাথে জগাখিচুড়ি করতে সবসময় দ্বিধায় থাকি $IFSকারণ এটি বিশ্বব্যাপী ক্লোবার্বিং।

তবে প্রায়শই এটি একটি বাশ অ্যারেতে লোডিং স্ট্রিংগুলি সুন্দর এবং সংক্ষিপ্ত করে তোলে এবং ব্যাশ স্ক্রিপ্টিংয়ের জন্য, সংক্ষিপ্ততাটি আসা শক্ত।

সুতরাং আমি অনুমান করি যে এটির চেয়ে ভাল কিছু হতে পারে যদি আমি আরম্ভের বিষয়বস্তুগুলিকে $IFSঅন্য পরিবর্তনশীলটিতে "সংরক্ষণ" করতে চেষ্টা করি এবং তারপরে $IFSকিছু কিছু ব্যবহার করে সম্পন্ন করার সাথে সাথেই এটি পুনরুদ্ধার করি ।

এটা কি ব্যবহারিক? অথবা এটি মূলত অর্থহীন এবং IFSএর পরবর্তী ব্যবহারের জন্য যা প্রয়োজন তা কেবল সরাসরি আমার পিছনে সেট করা উচিত ?


এটি ব্যবহারিক হবে না কেন?
ব্র্যাচলে

কারণ আনসেট করা আইএফএস কাজটি সূক্ষ্মভাবে করবে।
llua

1
যারা বলছেন যে অ্যান্ডসেটিং আইএফএস ঠিকঠাক কাজ করবে, তাদের মনে রাখবেন যে এটি পরিস্থিতিগত: স্ট্যাকওভারফ্লো . com / প্রশ্নস / 95৯৫৫83৩837/২ । আমার অভিজ্ঞতায়, আপনার শেল ইন্টারপ্রেটারের জন্য ডিফল্টে ম্যানুয়ালি আইএফএস সেট করা ভাল, যথা $' \t\n'আপনি যদি ব্যাশ ব্যবহার করছেন। unset $IFSআপনি সর্বদা ডিফল্ট হিসাবে যা প্রত্যাশা করেন তা এটিকে সর্বদা পুনরুদ্ধার করে না।
ড্যারাল হোল্ট

উত্তর:


9

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

@ লুলুয়া আপনার প্রশ্নের মন্তব্যে যেমন উল্লেখ করেছেন, কেবল আইএফএস সেট না করা ডিফল্ট আচরণ পুনরুদ্ধার করবে, এটি একটি স্পেস-ট্যাব-নিউলাইন বরাদ্দ করার সমতুল্য।

এটি কীভাবে পরিষ্কারভাবে আইএফএস সেট / সেট না করা আরও সমস্যাযুক্ত হতে পারে তা বিবেচনা করার মতো।

পসিক্স 2013 সংস্করণ থেকে 2.5.3 শেল ভেরিয়েবলগুলি :

বাস্তবায়নের ফলে পরিবেশে আইএফএসের মান বা পরিবেশের থেকে আইএফএসের অনুপস্থিতি উপেক্ষা করা যেতে পারে শেলটি চালিত হওয়ার সময়, এই ক্ষেত্রে শেলটি আইফএসকে <space> <tab> <নিউলাইন> সেট করা হয় ।

একটি পসিক্স-সম্মতিযুক্ত, চালিত শেল তার পরিবেশ থেকে আইএফএসের উত্তরাধিকারী হতে পারে বা নাও পেতে পারে। এর থেকে নিম্নলিখিত:

  • একটি পোর্টেবল স্ক্রিপ্ট নির্ভরযোগ্যভাবে পরিবেশের মাধ্যমে আইএফএসের উত্তরাধিকারী হতে পারে না।
  • একটি স্ক্রিপ্ট যা কেবলমাত্র ডিফল্ট বিভাজনমূলক আচরণ (বা ক্ষেত্রে যোগদানের ক্ষেত্রে "$*") ব্যবহার করতে চায় তবে পরিবেশের অনুপ্রবেশের বিরুদ্ধে নিজেকে রক্ষা করতে আইএফএসকে স্পষ্টভাবে সেট / আনসেট করতে হবে যা পরিবেশ থেকে আইএফএস শুরু করে।

এনবি এটি বোঝার জন্য গুরুত্বপূর্ণ যে এই আলোচনার জন্য "আহ্বান" শব্দের একটি বিশেষ অর্থ রয়েছে। একটি শেল কেবল তখনই ডাকা হয় যখন এটির নাম (একটি #!/path/to/shellশেবাং সহ ) ব্যবহার করে স্পষ্টভাবে বলা হয় । একটি সাব- শেল - যেমন তৈরি করা হতে পারে $(...)বা cmd1 || cmd2 &- এটি একটি চালিত শেল নয় এবং এর আইএফএস (এর বেশিরভাগ এক্সিকিউটিভ পরিবেশের সাথে) তার পিতামাতার অনুরূপ। একটি চালিত শেল $তার পিডের মান সেট করে , যখন সাব-শেলগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হয়।


এটি নিছক পেডেন্টিক ডিসকুইজেশন নয়; এই এলাকায় প্রকৃত বিচ্যুতি আছে। এখানে একটি সংক্ষিপ্ত স্ক্রিপ্ট যা বিভিন্ন শেল ব্যবহার করে দৃশ্যের পরীক্ষা করে। এটি একটি পরিবর্তিত আইএফএস (সেট করা :) একটি চালিত শেলকে রফতানি করে যা তার ডিফল্ট আইএফএস প্রিন্ট করে।

$ cat export-IFS.sh
export IFS=:
for sh in bash ksh93 mksh dash busybox:sh; do
    printf '\n%s\n' "$sh"
    $sh -c 'printf %s "$IFS"' | hexdump -C
done

আইএফএসকে সাধারণত রফতানির জন্য চিহ্নিত করা হয় না, তবে এটি যদি হয় তবে খেয়াল করুন যে কীভাবে ব্যাশ, ksh93, এবং ম্যাক্স তাদের পরিবেশের দিকে অগ্রাহ্য করবেন IFS=:, যখন ড্যাশ এবং ব্যস্তবক্স এটি সম্মান করে।

$ sh export-IFS.sh

bash
00000000  20 09 0a                                          | ..|
00000003

ksh93
00000000  20 09 0a                                          | ..|
00000003

mksh
00000000  20 09 0a                                          | ..|
00000003

dash
00000000  3a                                                |:|
00000001

busybox:sh
00000000  3a                                                |:|
00000001

কিছু সংস্করণ তথ্য:

bash: GNU bash, version 4.3.11(1)-release
ksh93: sh (AT&T Research) 93u+ 2012-08-01
mksh: KSH_VERSION='@(#)MIRBSD KSH R46 2013/05/02'
dash: 0.5.7
busybox: BusyBox v1.21.1

যদিও বাশ, ksh93, এবং mksh পরিবেশ থেকে আইএফএস আরম্ভ করে না, তারা তাদের পরিবর্তিত আইএফএস পুনরায় রফতানি করে।

যদি আপনার কোনও কারণে পরিবেশের মাধ্যমে আইএফএস পাসপোর্ট করার প্রয়োজন হয় তবে আপনি নিজেই আইএফএস ব্যবহার করে এটি করতে পারবেন না; আপনাকে আলাদা ভেরিয়েবলের মান নির্ধারণ করতে হবে এবং রফতানির জন্য সেই পরিবর্তনশীলটি চিহ্নিত করতে হবে। তারপরে বাচ্চাদের তাদের আইএফএসে স্পষ্টভাবে সেই মান নির্ধারণ করতে হবে।


আমি দেখতে পাচ্ছি, তাই যদি আমি প্যারাফ্রেজ করতে পারি তবে বেশিরভাগ ক্ষেত্রে যেখানে এটি ব্যবহার করা হবে সেখানে স্পষ্টভাবে মান নির্দিষ্ট করে দেওয়ার পক্ষে এটি যুক্তিযুক্তভাবে আরও বহনযোগ্য IFSএবং তাই এটির মূল মানটিকে "সংরক্ষণ" করার চেষ্টা করা প্রায়শই মারাত্মক ফলদায়ক হয় না।
স্টিভেন লু

1
প্যারামাউন্ট ইস্যুটি হ'ল যদি আপনার স্ক্রিপ্টটি আইএফএস ব্যবহার করে তবে এটির মানটি যা আপনি চান তা হ'ল তা নিশ্চিত করার জন্য এটি স্পষ্টভাবে আইএফএস সেট / আনসেট করা উচিত। সাধারণত, কোনও স্ক্রিপ্টের আচরণ আইএফএসের উপর নির্ভর করে যদি কোনও অব্যক্ত প্যারামিটার বিস্তৃতি, অব্যক্ত কমান্ডের বিকল্প, অনুমানিত পাটিগণিতের বিস্তৃতি, readগুলি বা ডাবল-উদ্ধৃত উল্লেখ রয়েছে $*। এই তালিকাটি আমার মাথার শীর্ষে রয়েছে, সুতরাং এটি বিস্তৃত নাও হতে পারে (বিশেষত আধুনিক শেলগুলির পসিক্স-এক্সটেনশনগুলি বিবেচনা করার সময়)।
বেয়ারফুট আইও

10

সাধারণভাবে, শর্তগুলি ডিফল্টে ফিরিয়ে দেওয়া ভাল অভ্যাস।

তবে এক্ষেত্রে তেমন কিছু হয় না।

কেন ?:

এছাড়াও, আইএফএস মান সংরক্ষণের একটি সমস্যা আছে।
যদি মূল আইএফএসটি সেট না করা হয়, কোডটি IFS="$OldIFS"আইএফএস সেট করবে "", এটি আনসেট না করে।

আসলে আইএফএসের মান রাখতে (এমনকি সেট না করা থাকলেও), এটি ব্যবহার করুন:

${IFS+"false"} && unset oldifs || oldifs="$IFS"    # correctly store IFS.

IFS="error"                 ### change and use IFS as needed.

${oldifs+"false"} && unset IFS || IFS="$oldifs"    # restore IFS.

আইএফএস সত্যই আনসেট করা যায় না। আপনি যদি এটি সেট না করে রাখেন, শেল এটিকে ডিফল্ট মানটিতে ফিরিয়ে দেয়। সুতরাং এটি সংরক্ষণ করার সময় আপনার সত্যিকারের জন্য এটি পরীক্ষা করার দরকার নেই।
ফিলাব্রেন্ডেন

সতর্ক থাকুন যে bash, unset IFSআইএফএসটি যদি বর্তমান প্রসঙ্গে না হয়ে প্যারেন্ট প্রসঙ্গে (ফাংশন প্রসঙ্গে) স্থানীয় হিসাবে ঘোষণা করা হয় তবে তা আনসেট করতে ব্যর্থ।
স্টাফেন চেজেলাস

5

আপনি বিশ্বব্যাপী ক্লোবার্বিংয়ের বিষয়ে দ্বিধা বোধ করবেন ঠিকই। ভীত হবেন না, আসল বিশ্বব্যাপী কোনও পরিবর্তন না করে IFSবা জটিল এবং ত্রুটি-ঝুঁকিপূর্ণ সংরক্ষণ / নাচ পুনরুদ্ধার না করে পরিষ্কার ওয়ার্কিং কোড লেখা সম্ভব ।

আপনি পারেন:

  • একক অনুরোধের জন্য আইএফএস সেট করুন:

    IFS=value command_or_function

    অথবা

  • সাবএসেলের ভিতরে আইএফএস সেট করুন:

    (IFS=value; statement)
    $(IFS=value; statement)

উদাহরণ

  • একটি অ্যারে থেকে কমা-বিস্মৃত স্ট্রিং পেতে:

    str="$(IFS=, ; echo "${array[*]-}")"

    দ্রষ্টব্য: আনসেট না করা হলে ডিফল্ট মান সরবরাহ করে কেবল -একটি ফাঁকা অ্যারে রক্ষা করা হয় (এই ক্ষেত্রে এই মানটি খালি স্ট্রিং হয়ে থাকে)set -u

    এই IFSপরিবর্তনটি কেবলমাত্র $() কমান্ড প্রতিস্থাপন দ্বারা চালিত সাব-শেলের ভিতরেই প্রযোজ্য । এটি হ'ল সাব্হেলগুলিতে ইনভোকেটিং শেলের ভেরিয়েবলগুলির অনুলিপি রয়েছে এবং সে কারণে তাদের মানগুলি পড়তে পারে তবে সাবস্কেলের দ্বারা সম্পাদিত যে কোনও পরিবর্তনগুলি কেবল সাব-শেলের অনুলিপিগুলিকেই প্রভাবিত করে না পিতামাতার ভেরিয়েবলকে।

    আপনিও ভাবতে পারেন: সাবশেলটি এড়িয়ে যাবেন না এবং কেবল এটি করুন:

    IFS=, str="${array[*]-}"  # Don't do this!

    এখানে কোনও আদেশ আদেশ নেই, এবং এই লাইনটি পরিবর্তে দুটি স্বতন্ত্র পরবর্তী পরিবর্তনশীল অ্যাসাইনমেন্ট হিসাবে ব্যাখ্যা করা হয়েছে, যেন তা হ'ল:

    IFS=,                     # Oops, global IFS was modified
    str="${array[*]-}"

    অবশেষে, এই রূপটি কেন কাজ করবে না তা ব্যাখ্যা করি:

    # Notice missing ';' before echo
    str="$(IFS=, echo "${array[*]-}")" # Don't do this! 

    echoকমান্ড প্রকৃতপক্ষে তার সঙ্গে বলা হবে IFSপরিবর্তনশীল সেট ,, কিন্তু echoপরোয়া বা ব্যবহার করে না IFS। বিস্তৃত জাদু "${array[*]}"একটি স্ট্রিং করার জন্য (উপ-) দ্বারা সম্পন্ন করা হয় নিজেই আগে শেল echoএমনকি প্রার্থনা করা হয়।

  • একটি সম্পূর্ণ ফাইলে পড়তে (এতে NULLবাইট থাকে না ) নামের একক ভেরিয়েবলটিতে VAR:

    IFS= read -r -d '' VAR < "${filepath}"

    দ্রষ্টব্য: আইএফএসের সমস্তটি খালি স্ট্রিংয়ের IFS=মতো একই IFS=""এবং IFS=''এটির থেকেও পৃথক unset IFS: যদি IFSসেট না করা হয় তবে অভ্যন্তরীণভাবে ব্যবহৃত সমস্ত ব্যাশ কার্যকারিতার আচরণ IFSহুবহু একই রকমের IFSডিফল্ট মান হিসাবে রয়েছে $' \t\n'

    IFSখালি স্ট্রিংয়ে সেট করা নিশ্চিত করে যে শীর্ষস্থানীয় এবং অনুসরণযোগ্য শ্বেত স্থান সংরক্ষণ করা হবে।

    -d ''অথবা -d ""শুধুমাত্র একটি উপর তার বর্তমান আবাহন থামাতে পড়া বলে NULLস্বাভাবিক সম্পর্কে newline পরিবর্তে বাইট।

  • $PATHএর :সীমানা বিভক্ত করতে :

    IFS=":" read -r -d '' -a paths <<< "$PATH"

    এই উদাহরণটি বিশুদ্ধরূপে বর্ণনামূলক। আপনি যে কোনও ডিলিমিটারের সাথে বিভাজন করছেন সেই সাধারণ ক্ষেত্রে, পৃথক ক্ষেত্রগুলির পক্ষে সেই সীমানারটি (একটি পালিয়ে যাওয়া সংস্করণ) ধারণ করা সম্ভব। এমন কোনও .csvফাইলের সারি পড়ার চেষ্টা করার কথা ভাবুন যার কলামগুলিতে তারা কমা থাকতে পারে (পালিয়ে বা কোনওভাবে উদ্ধৃত)। উপরের স্নিপেট এ জাতীয় ক্ষেত্রে যেমন কাজ করবে তেমন কাজ করবে না।

    এটি বলেছিল, আপনার মধ্যে এই জাতীয় :-কন্টেন্টিং-পাথের মুখোমুখি হওয়ার সম্ভাবনা নেই $PATH। ইউএনআইএক্স / লিনাক্স :পাথের নামগুলিতে একটি ধারণ করার অনুমতি থাকলেও মনে হয় বাশ এ জাতীয় পাথগুলি হ্যান্ডেল করতে সক্ষম হবে না যদি আপনি এগুলিকে আপনার $PATHএবং তাদের মধ্যে এক্সিকিউটেবল ফাইলগুলি সংরক্ষণ করার চেষ্টা করেন, কেননা পলায়ন / উদ্ধৃত কলোন পার্স করার কোনও কোড নেই is : বাশ এর সোর্স কোড ৪.৪

    পরিশেষে, দ্রষ্টব্য যে স্নিপেটটি ফলাফলের অ্যারের শেষ উপাদানটিতে একটি চলন্ত নিউলাইন যুক্ত করেছে (এখন-মুছে ফেলা মন্তব্যগুলিতে @ স্টাফেন চ্যাজেলাস বলেছে), এবং যদি ইনপুটটি খালি স্ট্রিং হয় তবে আউটপুটটি একক উপাদান হবে অ্যারে, যেখানে উপাদানটিতে একটি নতুন লাইন থাকবে ( $'\n')।

প্রেরণা

স্ক্রিপ্টগুলির সহজতম জন্য প্রত্যাশা অনুযায়ী old_IFS="${IFS}"; command; IFS="${old_IFS}"গ্লোবালকে স্পর্শ করে এমন বেসিক অ্যাপ্রোচটি IFSকাজ করবে। তবে, আপনি কোনও জটিলতা যুক্ত করার সাথে সাথে এটি সহজেই বিচ্ছিন্ন হয়ে যেতে পারে এবং সূক্ষ্ম সমস্যার কারণ হতে পারে:

  • যদি commandকোনও বাশ ফাংশন যা গ্লোবালকেও সংশোধন করে IFS(সরাসরি হয় বা, লুকায়িত থাকে, এর মধ্যে আরও একটি ফাংশন যা এটি কল করে), এবং ভুলভাবে old_IFSসেভ / পুনরুদ্ধার করতে একই গ্লোবাল ভেরিয়েবল ব্যবহার করে আপনি একটি বাগ পাবেন get
  • হিসাবে নির্দিষ্ট @Gilles এই মন্তব্যে , যদি মূল রাষ্ট্র IFSসেট না সরল ছিল সংরক্ষণ-এবং-পুনঃস্থাপন কাজ না করবে না, এবং এমনকি সরাসরি ব্যর্থতা স্থাপিত হবে সাধারণভাবে (ভুল-) ব্যবহার set -u(ওরফে set -o nounset) শেল বিকল্প বল প্রয়োগ করা হয়।
  • কিছু শেল কোডের পক্ষে মূল সম্পাদন প্রবাহে অ্যাসিক্রোনিক্যালি কার্যকর করা সম্ভব যেমন সিগন্যাল হ্যান্ডলারের সাথে (দেখুন help trap)। যদি সেই কোডটি বিশ্বব্যাপীও পরিবর্তন করে IFSবা ধরে নেয় এর একটি নির্দিষ্ট মান রয়েছে তবে আপনি সূক্ষ্ম বাগ পেতে পারেন।

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

লাইব্রেরির মতো স্ক্রিপ্টগুলির জন্য অতিরিক্ত বিবেচনা

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

লাইব্রেরি কোড লেখার সময় আপনি IFSকোনও নির্দিষ্ট মান (এমনকি ডিফল্টও নয়) বা এমনকি সেট করার পরেও নির্ভর করতে পারবেন না । পরিবর্তে, আপনার IFSআচরণের উপর নির্ভর করে যে কোনও স্নিপেটের জন্য আপনাকে সুস্পষ্টভাবে সেট করতে হবে IFS

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

IFSযাইহোক কোন কোড দ্বারা প্রভাবিত হয় ?

ভাগ্যক্রমে, এমন অনেক পরিস্থিতি নেই যেখানে IFSবিষয়টি বিবেচনা করে (আপনি সর্বদা আপনার বিস্তৃতি উদ্ধৃত করে ):

  • "$*"এবং "${array[*]}"বিস্তৃতি
  • এর আমন্ত্রণ readবিল্ট-ইন একাধিক ভেরিয়েবল (লক্ষ্য করে read VAR1 VAR2 VAR3) অথবা একটি অ্যারের পরিবর্তনশীল ( read -a ARRAY_VAR_NAME)
  • এর আমন্ত্রণ readএকটি একক পরিবর্তনশীল লক্ষ্য করে যখন এটি নেতৃস্থানীয় / প্রদর্শনে হোয়াইটস্পেস বা অ- হোয়াইটস্পেস অক্ষর trailing আসে IFS
  • শব্দ বিভাজন (যেমন উদ্ঘাটন বিস্তারের জন্য, যা আপনি প্লেগের মতো এড়াতে চাইতে পারেন )
  • কিছু অন্যান্য কম সাধারণ পরিস্থিতি (দেখুন: আইএফএস @ গ্রেগের উইকি )

আমি বলতে পারি না যে আমি বিভক্ত করতে understand পাথটিকে এর সাথে বরাবর বুঝেছি : অনুমানকারীরা অনুমান করে যে কোনও উপাদানই একটিতে নেই: নিজের বাক্য। ডিলিমিটার :যখন থাকে তখন কীভাবে উপাদানগুলি থাকতে পারে :?
স্টাফেন চেজেলাস

@ StéphaneChazelas ওয়েল, :বেশিরভাগ ইউনিক্স / লিনাক্স ফাইল সিস্টেমে ফাইলের নাম ব্যবহার করার জন্য একটি বৈধ চরিত্র, সুতরাং একটি নাম সম্বলিত ডিরেক্টরি থাকা সম্পূর্ণভাবে সম্ভব :। সম্ভবত কিছু শেলের :মধ্যে PATH এ জাতীয় কিছু ব্যবহার করে পালানোর ব্যবস্থা রয়েছে \:এবং তারপরে আপনি এমন কলামগুলি দেখতে পাবেন যা প্রকৃত বিভেদক নয় (এটি মনে হয় বাশ যেমন পালানোর অনুমতি দেয় না $PATHjust কেবল অনুসন্ধানে পুনরাবৃত্তি করার সময় নিম্ন-স্তরের ফাংশন ব্যবহৃত :হয় একটি সি স্ট্রিং: git.savannah.gnu.org/cgit/bash.git/tree/general.c#n891 )।
sls

আমি উত্তরটি সংশোধন করে আশা করি বিভক্তির $PATHউদাহরণটিকে :আরও স্পষ্ট করে তুলব ।
এসএসএস

1
তাই আপনাকে স্বাগতম! গভীরতর উত্তরের জন্য ধন্যবাদ :)
স্টিভেন লু

1

এটা কি ব্যবহারিক? বা এটি মূলত অর্থহীন এবং এর পরবর্তী ব্যবহারের জন্য যা দরকার তা হ'ল সরাসরি আইএফএসের পিছনে সেট করা উচিত?

আপনার $' \t\n'যখন যা করতে হবে তা হ'ল কেন টাইফোর সেটিং আইএফএসের জন্য ঝুঁকিপূর্ণ

OIFS=$IFS
do_your_thing
IFS=$OIFS

বিকল্পভাবে, আপনার যদি কোনও ভেরিয়েবল সেট / মডিফাই করার প্রয়োজন না হয় তবে আপনি একটি সাবশেল কল করতে পারেন:

( IFS=:; do_your_thing; )

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