পাথ স্ল্যাশের পরে বাশ ধনুকের প্রসারণ


12

আমি ব্রেস এক্সপেনশন ব্যবহার করে একই ডিরেক্টরিতে একটি আলাদা নামে একটি ফাইল অনুলিপি করার চেষ্টা করছি। আমি ব্যাশ ব্যবহার করছি 4.4.18।

আমি যা করেছি তা এখানে:

cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}

তবে আমি এই ত্রুটি পেয়েছি:

cp: cannot stat '/home/xyz/some/dir/{my-file-to-rename.bin,': No such file or directory

এমনকি এর মতো সাধারণ ব্রেস সম্প্রসারণও আমাকে একই ত্রুটি দেয়:

cp {my-file-to-rename.bin, new-name-of-file.bin}

আমি কি ভুল করছি?

উত্তর:


29

বক্রবন্ধনী সম্প্রসারণ সিনট্যাক্স কমা গ্রহণ, কিন্তু এটা কমার পর কোন space গ্রহণ করে না। অনেক প্রোগ্রামিং ভাষায়, কমা পরে স্থানগুলি সাধারণ, তবে এখানে নয়। বাশে, একটি অনাদৃত স্থানের উপস্থিতি ব্রেস সম্প্রসারণকে সঞ্চালিত হতে বাধা দেয়।

স্থান সরান, এবং এটি কাজ করবে:

cp ~/some/dir/{my-file-to-rename.bin,new-name-of-file.bin}

কিছুটা প্রয়োজন না হলেও নোট করুন যে আপনি ব্রেসগুলির .binবাইরে ট্রিলিংটি সরিয়ে নিতে পারেন :

cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin

আপনি বক্রবন্ধনী সম্প্রসারণ প্রভাব পরীক্ষা করতে চান তাহলে, আপনি ব্যবহার করতে পারেন echoবা printf '%s ', বা printfযাই হোক না কেন ফরম্যাট স্ট্রিং আপনি পছন্দ সঙ্গে, যে কাজ করতে। (ব্যক্তিগতভাবে আমি কেবল এটির echoজন্য ব্যবহার করি , যখন আমি ব্যাশে থাকি, কারণ ব্যাশের echoঅন্তর্নির্মিত পূর্বনির্ধারিতভাবে পালানোর ক্রমগুলি প্রসারিত করে না এবং এইভাবে কমান্ডটি আসলে কী চলবে তা যাচাই করার পক্ষে যুক্তিসঙ্গতভাবে উপযুক্ত)) উদাহরণস্বরূপ:

ek@Io:~$ echo cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
cp /home/ek/some/dir/my-file-to-rename.bin /home/ek/some/dir/new-name-of-file.bin

23

string{foo, bar}ধনুর্বন্ধনী সম্প্রসারণ নয়; এটি দুটি শব্দ string{foo,এবং bar}। ব্রেস প্রসারণ ব্যবহার করতে, বন্ধনীগুলি একই শব্দের মধ্যে থাকা দরকার। আপনার যদি প্রয়োজন না হয় তবে অতিরিক্ত স্থান সরিয়ে ফেলতে হবে, অথবা আপনার যদি প্রয়োজন হয় তবে তা উদ্ধৃত করতে হবে:

$ printf "%s\n" aa{bb, cc}
aa{bb,
cc}
$ printf "%s\n" aa{bb,cc}
aabb
aacc
$ printf "%s\n" aa{bb," cc"}
aabb
aa cc

সুস্পষ্ট উদাহরণের জন্য +1, এবং আপনাকে ধন্যবাদ। আমার খ্যাতি যথেষ্ট হলে আমি আমার উঁচুতে দেব। :)
নানঙ্গারসিয়াদ

"শেল শব্দের" সম্পর্কে আরও কিছু উল্লেখ করা উচিত। । । শেল কীভাবে শব্দগুলি বিভক্ত করতে পারে তা কীভাবে জানে;)
সের্গি কলডিয়াজন্য

-1

বাশ সেই স্থানটির সাথে এটির মতো আচরণ করে any আইএফএস হিসাবে, অভ্যন্তরীণ ক্ষেত্র পৃথককারী। এটি প্রসারিত হওয়ার পরে শব্দের বিভাজন এবং পঠিত বিল্টিন কমান্ডের সাহায্যে শব্দগুলিতে লাইনগুলি বিভক্ত করতে ব্যবহৃত হয়।

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

ডিলিমিটার সন্নিবেশিত না করে thenুকিয়ে দিয়ে আপনি তারপর আপনার আদেশটি বাশকে বলেছিলেন এবং আর্গুমেন্টগুলি হ'ল:

  1. "CP"
  2. "~ / কিছু / Dir / {আমার ফাইল টু rename.bin,"
  3. "নতুন-নাম-অফ-file.bin}"

আপনার যদি উদ্ধৃতি বা "" "" অব্যাহতি থাকে, আপনার কাছে এমনটি ছিল:

  1. "CP"
  2. "~ / কিছু / দির / {আমার ফাইল-থেকে-পুনর্নামকরণ.বিন, \ ফাইলের নতুন নাম।"

যা আপনি চেয়েছিলেন সেটি না হতে পারে, যদি না "new-name-of-file.bin" আপনি যে নতুন ফাইল নামটি চান তা না হয়। স্থান অন্তর্ভুক্ত। প্রথমে বন্ধনী সম্প্রসারণ হওয়ার পরে, এবং তারপরে টিলডের সম্প্রসারণ, বাশ কার্যকর করবে:

  1. "CP"
  2. "/Path/to/home/some/dir/my-file-to-rename.bin"
  3. "/ পথ / থেকে / বাড়িতে / কিছু / দির / \ ফাইলের নতুন নাম-ফাইল"

কেবল স্থান সরিয়ে ফেললে তা সব ঠিক হয়ে যায়।


5
এটি বেশিরভাগই ভাল তবে আপনি বলে মনে করছেন শব্দের বিভাজন ঘটে cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}এবং IFSফলাফলকে প্রভাবিত করে। না হয় তাই না। এখানে, স্থান একটি হল metacharacter tokenization মধ্যে ( ধাপ 2 )। বিভাজন ঘটে যখন 3.5.7 দেখুন । IFS=xতাহলে চেষ্টা করুন printf '[%s]\n' {a,b} printf '[%s]\n' {a, b} printf '[%s]\n' {a,xb} printf '[%s]\n' {a, xb}
এলিয়াহ কাগন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.