কেন বিপিডিডিআর = "~ / বিন /" সহ কোনও স্ক্রিপ্টে এমকিডির ব্যর্থ হয় (এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই)?


10

Mkdir কমান্ড কেন ব্যর্থ হয়: "এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই"?

#!/bin/bash

set -e

BIN_DIR="~/bin/"

if [ ! -d "$BIN_DIR" ]; then
  mkdir "$BIN_DIR"
fi

উত্তর:


11

ত্রুটির বার্তাটি উত্পাদিত হয়েছে কারণ ~জিলার উত্তরে বর্ণিত হিসাবে টিলডের উদ্ধৃতি দেওয়া হয়েছে । আপনি যদি এটি ব্যবহার করতে চান ~তবে স্ক্রিপ্টের প্রাসঙ্গিক অংশটি হ'ল:

BIN_DIR=~/bin/

আপনি যদি স্ট্রিংটি উদ্ধৃত করতে চান তবে যে কোনও কারণে , আপনি পরিবেশের পরিবর্তনশীলটি ব্যবহার করতে পারেন $HOME:

BIN_DIR="$HOME/bin/"

আমার মতে দ্বিতীয় পদ্ধতির আরও ভাল অনুশীলন is


6
~স্ক্রিপ্ট ব্যবহার করে কোনও ভুল নেই । এটি কমান্ড লাইনের মতো ঠিক একইভাবে কাজ করে। সমস্যাটি হ'ল জান্নার উত্তরে বর্ণিত ব্লক টিলডে সম্প্রসারণের কথা উল্লেখ করা
টেরডন

@ স্টারডন, আমি একমত তবে আমি এখানে কিছু ভুল আছে তা বলিনি, তবে এটি একটি ভাল ধারণা, কারণ আপনার কম মনোযোগ দেওয়া উচিত।
pa4080

5
কমান্ড লাইন এবং এখানে একটি স্ক্রিপ্ট মধ্যে একেবারে পার্থক্য নেই। এটি যে কোনও স্ক্রিপ্টে রয়েছে তা সম্পূর্ণ অপ্রাসঙ্গিক, আপনার কমান্ডলাইনে ঠিক একই ত্রুটি থাকবে। বিষয়টি হ'ল উদ্ধৃতি, এটি কোনও স্ক্রিপ্টে নয়।
টেরডন

যদিও এটি সম্পূর্ণ সত্য তবে এটি ঠিক যে $HOMEস্ক্রিপ্টগুলিতে ব্যবহার করা ভাল ধারণা।
মিষ্টান্ন

3
@ pa4080 টিল্ড সম্প্রসারণের চেয়ে সম্প্রসারণ করা কেন ভাল বলে আপনি তার ব্যাখ্যা যুক্ত $HOMEকরতে পারেন? আপনার দেওয়া একমাত্র ব্যাখ্যাটি বলতে হবে, "এটি একটি ভাল ধারণা, কারণ আপনার কম মনোযোগ দেওয়া উচিত" " এর অর্থ কী তা আমার কোনও ধারণা নেই। আপনি একটি সম্পাদনা এ ব্যাখ্যা করতে পারেন? এটি ছাড়া আপনার উত্তরকে সমর্থন করার মতো কিছুই নেই, সুতরাং অবশ্যই এটি এতে অন্তর্ভুক্ত। পিলিক্স দ্বারা টিল্ড সম্প্রসারণের জন্য বেশ কিছু সময়ের জন্য প্রয়োজন ছিল এবং স্ক্রিপ্টটির হ্যাশবাং লাইন #!/bin/bashতাই আমার মনে হয় বহনযোগ্যতা কারণ নয় isn't
এলিয়াহ

23

~উদ্ধৃত হওয়ার কারণে এটি কাজ করে না । ডাবল উদ্ধৃতিগুলি " টিলডের প্রসারকে দমন করে । আক্ষরিক নাম সহ কোনও ডিরেক্টরি নেই ~/bin। হিসাবে ব্যাখ্যা man bash(জোর খনি):

তিলদে সম্প্রসারণ

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

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

অথবা আপনি ব্যবহার করতে পারেন $HOMEপরিবর্তে এর ~কারণ প্যারামিটার সম্প্রসারণ শুধুমাত্র দ্বারা, ডবল কোট দ্বারা দমন করা হয় না একক উদ্ধৃতি । ডবল কোট না করে নিশ্চিত করুন যে প্রসারিত মান নিজেই কোনও প্রসারণও সাপেক্ষে, নয় তাই শব্দ বিভাজন বা ফাইলের নাম সম্প্রসারণ সৃষ্টি হবে না। সুতরাং $HOMEএমনকি অদ্ভুত নামে ডিরেক্টরি, খুব সাথে কাজ করে, তাই যতদিন আপনি উদ্ধৃতি চিহ্ন রাখা।


এই বিবৃতি অনুসারে "প্যারামিটার সম্প্রসারণ ডাবল উদ্ধৃতি দ্বারা দমন করা হয় না, শুধুমাত্র একক উদ্ধৃতি দ্বারা" : এর আউটপুট cd '~'হয় -bash: cd: ~: No such file or directory
pa4080

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