সর্বাধিক ভোট দেওয়া ওয়ান-লাইনারে ডাবল উদ্ধৃতি


20

> ৩.৩ কে ভোট সহ স্ট্যাকওভারফ্লো উত্তরটিDIR বর্তমান ব্যাশ স্ক্রিপ্টের ডিরেক্টরিতে নির্ধারিত করার জন্য এই ওয়ান-লাইনার বৈশিষ্ট্যযুক্ত :

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

নেস্টেড ডাবল-কোট দেখে আমি হতবাক হয়েছি। আমি যতদূর বলতে পারি, নিম্নলিখিত টুকরোগুলি ডাবল-কোটেড:

"$( cd "
"${BASH_SOURCE[0]}"
" && pwd )"

... এবং ডানদিকের সমস্ত কিছু =(যেমন $( dirnameএবং )) অব্যক্ত। অন্য কথায়, আমি ধরে নিয়েছি যে ২ য়, চতুর্থ এবং 6th ষ্ঠ "অক্ষর "যথাক্রমে প্রথম, তৃতীয় এবং ৫ ম অক্ষরকে "বন্ধ" করে ।

আমি বুঝতে পারছি ডাবল-কোটগুলি "${BASH_SOURCE[0]}"কী অর্জন করবে, তবে অন্য দুটি জোড়া ডাবল-কোটের উদ্দেশ্য কী?

যদি অন্যদিকে (এবং উচ্চ ভোটের স্কোর সত্ত্বেও), উপরের স্নিপেটটি ভুল হয় তবে এর নামমাত্র অভিপ্রায় অর্জনের সঠিক উপায় কী?

( নামমাত্র অভিপ্রায় অনুসারে আমি বলতে চাইছি: ফিরে আসা ডিরেক্টরিটিতে pwdপ্রথমে-পরে ফিরে আসা মানটি সংগ্রহ করুন এবং সাব-শেল-এ-করে করুন, যাতে প্যারেন্ট শেলটি অপরিবর্তিত থাকে)।cddirname "${BASH_SOURCE[0]}"cd$PWD


1
এটা $ একটি বৈশিষ্ট্যের কারণ (...): $( here, it's a subshell, but you are writing code as if you were writing it on the "first level" of the shell .... )
অলিভিয়ার দুলাক

ডকার ইনস্টল স্ক্রিপ্টের কারণে আমি এখানে এসেছি। lsb_dist="$(. /etc/os-release && echo "$ID")"; echo "$lsb_dist"
ডিসট্রোর

নোট করুন যে লাইনের ফাঁকা স্থানগুলির প্রয়োজন নেই: DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"পাশাপাশি কাজ করে।
ডেভিড টোনহোফার

উত্তর:


12

আপনার ধাঁধাটি কীভাবে bash(এবং সাধারণভাবে শেল) ইনপুট পার্স করে দেয় সে সম্পর্কে সঠিক নয় । ভিতরে:

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

প্রথমত, bashএক দীর্ঘ স্ট্রিং নিয়োগ ডান দিকে পার্স $( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )ডাবল উদ্ধৃতি ভিতরে প্রদর্শিত করতে পারেন কারণ উদ্ধৃতি চিহ্ন

তারপরে, bashকমান্ড বিকল্পটি বিশ্লেষণ শুরু করুন। যেহেতু খোলা প্রথম বন্ধনী অনুসরণকারী বন্ধনীগুলি অনুসরণ করে সমস্ত অক্ষর কমান্ড প্রতিস্থাপনের ভিতরে কমান্ডটি তৈরি করতে ব্যবহৃত হয়, আপনি পাবেন:

cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd

শেলটি সেই যৌগিক কমান্ডটি বিশ্লেষণ করে চালিয়ে যায়, এটি দুটি ভাগে বিভক্ত করুন:

  • cd "$( dirname "${BASH_SOURCE[0]}" )"
  • PWD

তারপরে একই পার্সিং বিধি প্রয়োগ করুন cd "$( dirname "${BASH_SOURCE[0]}" )", তবে এবার ডাবল উদ্ধৃতিগুলি অনর্থক নয়, তবে তা বোঝা। তারা ফলশ্রুতিতে ক্ষেত্র বিভাজন রোধ করে $( dirname "${BASH_SOURCE[0]}" )এবং প্রসারিত ${BASH_SOURCE[0]}(বাইরের সর্বাধিক দ্বিগুণ উদ্ধৃতিগুলির বিপরীতে, প্রতিরোধের জন্য পরিবর্তনশীল কার্যভারের আরএইচএসে প্রয়োজনীয়split+glob হবে না )।


এই নিয়মটি সমস্ত পসিক্স শেলের কমান্ড প্রতিস্থাপনের ক্ষেত্রে প্রযোজ্য । আপনি পসিক্স স্পেকের টোকেন সনাক্তকরণ বিভাগে আরও বিশদ ধাঁধা পড়তে পারেন ।


21

একবার ভিতরে $(...),ুকে গেলে , উদ্ধৃতিটি শুরু থেকে শুরু হয়।

অন্য কথায়, "..."এবং একে অপরের মধ্যে বাসা বাঁধতে$(...) পারে । প্রক্রিয়া প্রতিস্থাপন,, এক বা একাধিক সম্পূর্ণ ডাবল-কোটযুক্ত স্ট্রিংগুলি ধারণ করতে পারে । এছাড়াও, ডাবল-কোটেড স্ট্রিংগুলিতে এক বা একাধিক সম্পূর্ণ প্রক্রিয়া বিকল্প থাকতে পারে । কিন্তু, তারা স্থানান্তরিত করে না। সুতরাং, একটি প্রক্রিয়া প্রতিস্থাপনের ভিতরে শুরু হওয়া একটি ডাবল-কোটেড স্ট্রিং এর বাইরে বা বিপরীতে কখনও প্রসারিত হবে না।$(...)

সুতরাং, বিবেচনা করুন:

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

ভিতরের অভ্যন্তরটি $(...)হল:

dirname "${BASH_SOURCE[0]}"

উপরে ${BASH_SOURCE[0]}ডাবল উদ্ধৃত করা হয়। দ্বিগুণ বা একক, এর বাইরে $(...)যে কোনও উদ্ধৃতিগুলি ${BASH_SOURCE[0]}দ্বিগুণ-উদ্ধৃত হয় তা নির্ধারণের সময় অপ্রাসঙ্গিক ।

বাইরের $(...)মধ্যে রয়েছে:

cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd

এখানে, প্রকাশটি $( dirname "${BASH_SOURCE[0]}" )ডাবল-কোটেড হয়। বাইরের বাইরের কোট রয়েছে এমন $(...)বিষয়টি এর ভিতরে কী রয়েছে তা বিবেচনা করার ক্ষেত্রে অপ্রাসঙ্গিক। অভ্যন্তরের অভ্যন্তরের উদ্ধৃতিগুলি থাকা সত্যও $(...)অপ্রাসঙ্গিক।

এখানে ডাবল-কোটস কীভাবে মেলে:

এখানে চিত্র বর্ণনা লিখুন


মানে কি irrelevant? বহিরাগত সর্বাধিক প্রথম বন্ধনীর ব্যতীত অন্য সমস্তগুলির নিজস্ব অর্থ রয়েছে।
cuonglm

4
এবং, এজন্য আপনার ব্যাকটিক্স ব্যবহার করা উচিত নয়: উদ্ধৃতি বিধিগুলি অত্যন্ত উদ্ভট এবং স্বজ্ঞাত নয়।
ওয়াইল্ডকার্ড

"আরও $(...)শক্ত করে বাঁধা " বাক্যটি "..."বোঝা যায় না। এগুলি ইনফিক্স অপারেটর নয়, এবং তাদের মধ্যে কোনও শ্রেণিবিন্যাস নেই (যদি সেখানে থাকে তবে এর অর্থ হ'ল হয় কোটগুলি প্রথম বন্ধনীগুলির মধ্যে থাকতে পারে না বা প্রথম বন্ধনী কোটের ভিতরে থাকতে পারে না, তবে এটি ক্ষেত্রে নেই)। প্রযুক্তিগত শব্দটি হ'ল $(…)এবং "…"নীড়।
গিলস 'অশুভ হওয়া বন্ধ করুন'

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