নির্দিষ্ট ডিরেক্টরিকে সিডি না করেই একটি নির্দিষ্ট কমান্ড চালাবেন?


42

ভিন্ন ডিরেক্টরিতে কোনও কমান্ড না নিয়েই এটি চালানোর কোনও উপায় আছে cd? আমি জানি যে আমি কেবল বাইরে cdএবং cdবাইরে যেতে পারতাম , তবে আমি অতিরিক্ত পদক্ষেপগুলি ভুলে যাওয়ার সম্ভাবনাগুলিতে কেবল আগ্রহী :)


এটা একটা স্ক্রিপ্ট যে এই পারে তা নিশ্চিত করার বরং তুচ্ছ আছে: echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory। আপনি যদি এটি "বিকল্প" যেমন -dস্টাফ হিসাবে "বিকল্প" সমর্থন করতে চান তবে আরও কিছু প্রচেষ্টা করা দরকার ।
লরেন্স

ব্যবহারকারী-অজানা একটি উত্তরে বলা হয়েছে, আপনি এখানে এবং মন্তব্যে যে সমস্ত উদাহরণ দিয়েছেন তা অন্য সমাধানগুলির দ্বারা আরও ভালভাবে মোকাবেলা করা হয়েছে, সুতরাং এখানে সমস্যা সমাধানের দরকার আছে এমন কোনও সমস্যা আছে কিনা তা অস্পষ্ট। আপনি আরও ভাল উদাহরণ সঙ্গে আসতে পারেন?
কালেব

উত্তর:


55

আমি জানি না এটি গণনা করা হয় তবে আপনি সাবসেল করতে পারেন:

$ (cd /var/log && cp -- *.log ~/Desktop)

ডিরেক্টরিটি কেবলমাত্র সেই সাব-শেলের জন্য পরিবর্তিত হয়, সুতরাং আপনি cd -পরবর্তী সময়ে প্রয়োজনের কাজটি এড়িয়ে যান।


2
আমি সাধারণত তাই করি।
অ্যাডাম বাইরটেক

ভাল, আমি সাব-শেলগুলি সম্পর্কে পুরোপুরি ভুলে গিয়েছিলাম, এই ক্ষেত্রে খুব সহজ।
নাফতুলি কে ২

4
দুটি ampersands সঙ্গে সম্ভাব্য বিশৃঙ্খলা, সেমিকোলন আউট সাব বাঁচার জন্য: $ (cd /var/log && cp *.log ~/Desktop)। এইভাবে, ডিরেক্টরি উপস্থিত না থাকলে, আর কোনও কমান্ড কার্যকর করা হয় না।
নাফটুলি কে

আমার মতো নির্বোধ আর কারও জন্য নোট করুন: start শুরুতে কমান্ডের অংশ নয়, তার পরে সবকিছুই।
ম্যালট্রোনিক

14

কিছু প্রোগ্রাম অপশন যার সাহায্যে আপনি তাদের বলতে পারেন আছে chdir (2) নিজেদের (যেমন গনুহ আলকাতরা এর -C/ --directory)।

এই জাতীয় কর্মসূচীর বাইরে যদিও কিছু না কিছু চিডির করতে হবে । আপনি শেলটি না করে কিছু সংকলিত "বাইনারি" প্রোগ্রাম লিখতে এবং ব্যবহার করতে পারেন তবে এটি সম্ভবত খুব বেশি উপকার পাবেন না।

অন্য উত্তরের মন্তব্যে আপনি একটি উদাহরণ দিয়েছেন:

execindirectory -d /var/log "cp *.log ~/Desktop"

যেহেতু *.logশেলটি নিজেই প্যাটার্নটি প্রসারিত করেছে ( সিপি নয় ), শেল আপনার কমান্ডটি মূল্যায়ন করার আগে কোনও কিছু ডিরেক্টরিতে chdir করতে হবে ।

আপনি যদি "সিডি ব্যাক" না এড়ানোতে আগ্রহী হন তবে আপনি নিজের শেল ইনস্ট্যান্স থেকে সিডির প্রভাব আলাদা করতে একটি সাবশেল ব্যবহার করতে পারেন ।

(cd /path/to/dir && some command)

আপনি এটি শেল ফাংশনে প্যাকেজ করতে পারেন। ( -dডিরেক্টরিটি প্রকৃতপক্ষে alচ্ছিক হলে এই কমান্ডটির সামান্য বিন্দু নেই বলে আমি আপনার উদাহরণ ব্যবহার থেকে বিকল্পটি বাদ দিয়েছি ))

runindir() { (cd "$1" && shift && eval "$@"); }

runindir /var/log 'cp *.log ~/Desktop'  # your example
runindir /var/log cp \*.log \~/Desktop  # eval takes multiple args

runindir /var/log cp \*.log ~/Desktop   # it is okay to expand tilde first

2
আমি এই সমাধানটি পছন্দ করি, ব্যক্তিগতভাবে আমি পুশড / পপড ব্যবহার করব
এনজে

10

অন্যান্য ব্যক্তিদের দেওয়া উত্তরের মূল্য হ্রাস করার জন্য নয়, তবে আমি বিশ্বাস করি আপনি যা চান তা হ'ল:

(cd /path/to && ./executable [ARGS])

cdসাব-শেলটি চালাবার জন্য প্যারেনগুলি নোট করুন ।


আমি তাই মনে করি না. আমি যেমন বুঝতে পারি, সে প্রাথমিক ডিরেক্টরিতে শেষ হতে চায়।
অ্যাডাম বাইরটেক

ওহ, আমি সাব-শেল এ মোড়ানো পুরোপুরি ভুলে গেছি। আমার উত্তর সংশোধন করেছেন, আপনাকে ধন্যবাদ।
অ্যালেক্স

4

এখানে এমন কিছু যা cdআপনাকে (বাশ ব্যবহার করে) কোথায় ছিল সেটাই আপনাকে ফিরিয়ে দেবে, যেহেতু এটি করতে ভুলে যাওয়া এই প্রশ্নের উদ্দেশ্য বলে মনে হচ্ছে না:

# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir

run-your-command

# Get back where you were at the beginning.
popd

(সম্পাদনা: সামান্য সংক্ষিপ্ত সংস্করণ, @ র্যান্ডম 832 এর জন্য ধন্যবাদ)


1
আপনি কেবল pushd other-dirচেয়ে বরং পারতেনpushd .; cd other-dir
এলোমেলো 832

@ র্যান্ডম 832, ভাল পয়েন্ট!
ব্রুনো

2

দুঃখের বিষয়, আপনার উদাহরণ:

execindirectory -d /var/log "cp *.log ~/Desktop"

দিরের কোনও পরিবর্তন দরকার নেই, কারণ

cp /var/log/*.log ~/Desktop

একই কাজ করবে। আপনি কি আপনার আসল সমস্যার কাছাকাছি যেতে পারবেন না? কারণ আমরা এটির জন্য আরও ভাল সমাধান জানতে পারি।

আপনার সমস্যা সমাধানের একটি জটিল উপায়, যা মাইচেলস সমাধানের কমনীয়তা থেকে অনেক দূরে, এটি অনুসন্ধানের ব্যবহার, যার একটি স্যুইচ '-এক্সেকডির' রয়েছে যা ডিয়ারে সঞ্চালিত হবে, যেখানে একটি ফাইল পাওয়া যায়। আপনার উদাহরণটিকে খারাপভাবে গ্রহণ করা হয়েছে:

find /var/log -maxdepth 1 -type f -name "*.log" -execdir echo cp {} ~/Desktop ";"

হতে পারে এটি আপনার আসল সমস্যার জন্য কার্যকর। -Exddir এর পরিবর্তে -কডির আপনাকে প্রতিটি অনুরোধটি নিশ্চিত করতে বলবে।

-Okdir এবং -execdir এর জন্য gnu-find প্রয়োজন হতে পারে যা সাধারণত লিনাক্সে ব্যবহৃত হয়।


1

কীভাবে ./your/path/command.sh?


না, আমি আসলে নিচের মত কিছু বোঝানো: execindirectory -d /var/log "cp *.log ~/Desktop"
নাফতুলি কে ২

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