বাশ ভেরিয়েবলগুলি ব্যবহার করে ডিরেক্টরিতে যেতে কাজ করে না যখন ডিরেক্টরিগুলির নামের ফাঁকা থাকে


11

ধরা যাক আমি নীচের কমান্ডটি একটি ভেরিয়েবলে সঞ্চয় করতে চাই

cd "/cygdrive/c/Program Files/"

সুতরাং আমি এই কাজ

dir="cd \"/cygdrive/c/Program Files/\""

প্রোগ্রাম ফাইল ডিরেক্টরিতে নেভিগেট করার জন্য কমান্ডটি সংরক্ষণ করা উচিত, সুতরাং আমি যখন $ dir টাইপ করি তখন এটি আমাকে সেই ডিরেক্টরিতে নিয়ে যায়। উদ্ধৃতিগুলি সঠিকভাবে পালিয়ে গেছে কিনা তা পরীক্ষা করতে, আমি টাইপ করি

echo $dir

যা আমাকে দেয়

cd "/cygdrive/c/Program Files/"

সুতরাং সবকিছু ঠিকঠাক করা উচিত। তবে, আমি যখন টাইপ করি,

$dir

আমি পাই

bash: cd: "/cygdrive/c/Program: No such file or directory

আমি কি ভুল করছি? আমি সাইগউইন ব্যবহার করছি তবে আমি ধরে নিই যে এই সমস্যাটি সাধারণভাবে ব্যাশের ক্ষেত্রে প্রযোজ্য।


ডিরেক্টরি নামের আশেপাশের উদ্ধৃতিগুলি সরানোর চেষ্টা করুন এবং পরিবর্তে ব্যাকস্ল্যাশ দিয়ে স্পেসটি ছেড়ে যান।
মাইক ফিৎসপ্যাট্রিক

উত্তর:


8

সংক্ষিপ্ত উত্তর: বাশফ্যাঙ্ক # 050 দেখুন ("আমি একটি ভেরিয়েবলের মধ্যে একটি কমান্ড দেওয়ার চেষ্টা করছি, তবে জটিল ক্ষেত্রে সবসময় ব্যর্থ হয়!")।

দীর্ঘ উত্তর: বাশ যখন একটি কমান্ডকে বিশ্লেষণ করে তখন ভেরিয়েবলগুলি প্রতিস্থাপনের আগে এটি উদ্ধৃতিগুলি পার্স করে; এটি কখনই ফিরে যায় না এবং ভেরিয়েবলের মানগুলিতে উদ্ধৃতিগুলি পুনরায় বিশ্লেষণ করে, তাই তারা দরকারী কিছু না করে শেষ হয়। কমান্ডটি যাচাই করতে ইকো ব্যবহার করা সম্পূর্ণ বিভ্রান্তিকর কারণ এটি কমান্ডটি বিশ্লেষণের পরে দেখায় ; আপনি যদি দেখতে চান যে আসলে কী সম্পাদিত হচ্ছে তা হয় set -xশেল প্রিন্ট কমান্ডগুলি কার্যকর হওয়ার সাথে সাথে ব্যবহার করুন, বা printf "%q " $dir; echoসরল প্রতিধ্বনির পরিবর্তে ব্যবহার করুন।

যদি আপনি একটি জটিল কমান্ড (যেমন "শব্দের" মধ্যে স্পেস বা অন্যান্য বিশেষ অক্ষরযুক্ত একটি) সঞ্চয় করতে চান তবে আপনাকে এটিকে একটি সাধারণ পাঠ্য ভেরিয়েবলের পরিবর্তে একটি অ্যারেতে রাখতে হবে, এবং তারপরে আইডিয়োম দিয়ে এটি প্রসারিত করতে হবে `" $ { অ্যারে [@]} ", এর মতো:

dir=(cd "/cygdrive/c/Program Files/")
"${dir[@]}"

এখন, উদ্দেশ্য যদি কোনও সহজে-টাইপ শর্টহ্যান্ড তৈরি করা হয়, তবে এটি পরিষ্কারভাবে যাওয়ার উপায় নয়। পরিবর্তে একটি শেল ওরফে বা ফাংশন ব্যবহার করুন:

alias dir='cd "/cygdrive/c/Program Files/"'
dir

অথবা

dir() { cd "/cygdrive/c/Program Files/"; }
dir

7

যখন ব্যাশ প্রসারিত হয় $dir, তখন এটি কেবল শব্দ বিভাজন এবং এটিতে গ্লোববিং করে। ওয়ার্ড বিভাজন তিনটি শব্দের সৃষ্টি করে: cd, "/cygdrive/c/Programএবং Files/"। তারপরে মৃত্যুদন্ড কার্যকর করার আদেশ cdদুটি যুক্তি সহকারে রয়েছে; cdশুধুমাত্র এটির প্রথম যুক্তিটি দেখায় "/cygdrive/c/Program, যা কোনও বিদ্যমান ডিরেক্টরি নয়।

আপনি যদি কোনও ভেরিয়েবলের সামগ্রীতে পূর্ণ শেল মূল্যায়ন করতে চান তবে ব্যবহার করুন eval:

eval "$dir"

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

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

dir () {
  cd "/cygdrive/c/Program Files/"
}

আপনি যদি $dirকোনও বিশেষ ডিরেক্টরিতে স্যুইচ করতে টাইপ করতে সত্যিই আগ্রহী হন এবং এটি কেবল একটি সাধারণ উদাহরণ নয়, যেহেতু ব্যাশ 4, shopt -s autocdআপনার .bashrcএবং সেটটিতে রাখুন

dir="/cygdrive/c/Program Files/"

এর পরে আপনি ডিরেক্টরিটিতে স্যুইচ করতে কেবল "/cygdrive/c/Program Files/"বা "$dir"শেল প্রম্পটে টাইপ করতে পারেন । আপনার এখনও চারপাশে ডাবল উদ্ধৃতি প্রয়োজন $dir; যদি আপনি এটি পছন্দ না করেন তবে ব্যাশের পরিবর্তে zsh ব্যবহার করুন।


6

ভেরিয়েবলগুলিতে কমান্ড সংরক্ষণ করা ভাল ধারণা নয়। এটি ফাংশন এবং উপকরণগুলির জন্য যা।

বরং

dir="cd \"/cygdrive/c/Program Files/\""

এর মধ্যে একটি ব্যবহার করে দেখুন:

dir="/cygdrive/c/Program Files"
...
cd "$dir"

অথবা

dir() { cd "/cygdrive/c/Program Files"; }
dir

অথবা

alias dir='cd "/tmp/Program Files"'
...
dir

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

সম্পাদনা:

এবং dirসম্ভবত একটি উপনাম বা ফাংশনটির একটি খারাপ নাম, যেহেতু সেই নামের সাথে একটি বিদ্যমান কমান্ড রয়েছে (এটি মূলত একটি সংস্করণ ls, কমপক্ষে যদি আপনার জিএনইউ কোর্টিল থাকে)।


upvoteStoring commands in variables is generally not a good idea. That's what functions and aliases are for.
রব

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