কেন এই শেল স্ক্রিপ্টে ব্যাকস্ল্যাশগুলি অন্তর্ভুক্ত করা হয়েছে?


21

আমার conda.shস্ক্রিপ্টের অনুলিপিতে , আমি নীচের লাইনগুলি দেখছি:

if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
    SYSP=$(\dirname "${CONDA_EXE}")
else
    SYSP=$(\dirname "${CONDA_EXE}")
    SYSP=$(\dirname "${SYSP}")
fi

আমি কেন সামনে একটি ব্যাকস্ল্যাশ হিসাবে জানতে আগ্রহী নই dমধ্যে dirname। আমি বিশ্বাস করি না এটি প্রয়োজনীয়। ব্যাকস্ল্যাশগুলির এই ব্যবহারটি উত্স ফাইলে অন্য জায়গাগুলিতেও প্রদর্শিত হয়। আমি অনুপস্থিত এটি করার কোনও কারণ আছে কি?


উত্তর:


30

ব্যাকস্ল্যাশ ওরফে প্রসারকে দমন করবে, অর্থাত্ এটি মূল কমান্ডটি কার্যকর করে এবং নিশ্চিত করে যে উলেফ সংস্করণটি চলবে না। সিস্টেমটি shopt -s expand_aliases(কেবলমাত্র BASH) সেট করার পরে বা এটি ব্যবহার করে কার্যকর করা হলে স্ক্রিপ্টগুলি অজান্তে ওরফে প্রসার দিয়ে চালানো যেতে পারে source

./conda.sh          # usually no alias expansion (unless `shopt -s expand_aliases` in BASH)
source ./conda.sh   # alias expansion
. ./conda.sh        # alias expansion

কিছু সিসাডমিনগুলি এলিয়াসের পার্শ্ব-প্রতিক্রিয়াগুলির বিরুদ্ধে প্রতিরোধমূলক ব্যবস্থা হিসাবে সবকিছুতে ব্যাকস্ল্যাশ রাখতে পছন্দ করে, কেবল যদি অন্য কোনও জায়গায় অনিচ্ছাকৃতভাবে এটি অন্যরকমভাবে করা হয় এবং পূর্বে বর্ণিত হিসাবে উপনামটি প্রসারিত হয়। উদাহরণস্বরূপ, যদি সিস্টেমটি এটি alias dirname='dirname -z'অন্য কোথাও সেট করেছে এবং শর্তটি উপন্যাসটি প্রসারিত করার অনুমতি দেয়, তবে দুর্ভাগ্যক্রমে যে স্ক্রিপ্টটি ডায়ারনেম বলার চেষ্টা করে তা কল করবে dirname -z, যা স্ক্রিপ্টের উদ্দেশ্য নয়।

যদি নিশ্চিত হয়ে থাকে যে এইরূপের নাম নেই, তবে আমরা সমস্ত ব্যাকস্ল্যাশ সরিয়ে ফেলতে পারি এবং এটি ঠিকঠাক কাজ করা উচিত।

বিকল্পভাবে, অন্যটি commandদমন করতে ব্যাকস্ল্যাশ সংস্করণের পরিবর্তে কেউ ব্যবহার করতে পারে । সুতরাং, পরিবর্তে \dirname, কেউ ব্যবহার করতে পারেন command dirname, যা আরও পঠনযোগ্য বলে মনে হতে পারে। (অন্তর্নির্মিত কমান্ডগুলির মতো cd, builtinপরিবর্তে একটি ব্যবহার করা উচিত )। আমি এর পরিবর্তে এটি পছন্দ করি, কারণ এটি একই নামের পাশাপাশি কোনও উপাধিকেও বাইপাস করে।


1
এছাড়াও লক্ষণীয় মূল্য হল unalias -a, যা সমস্ত উপকরণগুলি সরিয়ে দেয়।
সেন্টটিমান

19
@ সেন্টিম্যানে হ্যাঁ তবে \unalias -aওরফে সম্প্রসারণ দমন করতে ভুলবেন না
বেন সি

সিসাদমিনও কি লিখতে পারত /usr/bin/dirname?
রন জন

@ রনজাহন হ্যাঁ এই বিশেষ ক্ষেত্রে তিনি থাকতে পারতেন। তবে কিছু প্রোগ্রামের জন্য বিভিন্ন ডিস্ট্রিবিউশনগুলি তাদেরকে বিভিন্ন ডিরেক্টরিতে রেখে দেয়। একটি উদাহরণ যা মনে আসে তা হ'ল সেন্টস /bin/ed- /usr/bin/edএ ওবুন্টু বনাম । পুরো পথে রেখে স্ক্রিপ্টটি কম পোর্টেবল করে তোলে।
didal24

@ didal24 কি এমন কিছু সম্পর্কে DIRNAME=$(which dirname), যেহেতু এলিয়াসগুলি whichদেখেন না?
রন জন

20

যদি conda.shকোনও ফাইলটি উত্সাহিত করার উদ্দেশ্যে হয় তবে ব্যাকস্ল্যাশগুলি এলিয়াসগুলি বাইপাস করার জন্য। স্ক্রিপ এক্সিকিউশনের জন্য বাশ সাধারণত ওরফে প্রসারকে অক্ষম করে, তবে সসেটযুক্ত ফাইলগুলির জন্য, যা ইন্টারেক্টিভ শেলগুলিতে চলতে পারে, এটি ক্ষেত্রে নয়। সুতরাং কেবল dirnameনামের একটি উপনাম চালাতে পারে dirname, তবে \dirnameওরফে সম্প্রসারণ এড়িয়ে যাবে এবং নামকরণ করা একটি ফাংশন বা কমান্ড চালাবে dirname। (কেবল ব্যাকস্ল্যাশগুলি নয়, তবে কোনও উদ্ধৃতি দেবে))


5
বা command dirname
কুসালানন্দ

7
( \command dirname, ঠিক commandতেমন ক্ষেত্রে কেউ কেউ একটি উপাধি তৈরি করেছে )): |
মুড়ু

এটি এলিয়াসগুলি বাইপাস করে কেন? এই কার্যকারিতাটি কোনও কিছুর একটি বিশেষ কেস, বা এটিকে বাশ (যেমন একটি হ্যাক) এ হার্ডকোড করতে হয়েছিল?
চূড়ান্তভাবে 5

@ চূড়ান্তএক্স বাশ শব্দের উদ্ধৃতি দেওয়া থাকলে (কোনও অংশে) ওরফে বিস্তৃতি করে না।
মুড়ু

1
@ চূড়ান্তএক্স 5 যদি আপনি জিজ্ঞাসা করেন যে বৈশিষ্ট্যটি কেন একেবারেই রয়েছে, আমি জানি না। এটা তোলে হয় POSIX মান কিন্তু: "কমান্ড নাম শব্দ [...] কিনা তা নির্ধারণ করতে এটি একটি হল পরীক্ষা করা হইবে unquoted , বৈধ ওরফে নাম"
muru
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.