ভিন্ন ডিরেক্টরিতে কোনও কমান্ড না নিয়েই এটি চালানোর কোনও উপায় আছে cd
? আমি জানি যে আমি কেবল বাইরে cd
এবং cd
বাইরে যেতে পারতাম , তবে আমি অতিরিক্ত পদক্ষেপগুলি ভুলে যাওয়ার সম্ভাবনাগুলিতে কেবল আগ্রহী :)
ভিন্ন ডিরেক্টরিতে কোনও কমান্ড না নিয়েই এটি চালানোর কোনও উপায় আছে cd
? আমি জানি যে আমি কেবল বাইরে cd
এবং cd
বাইরে যেতে পারতাম , তবে আমি অতিরিক্ত পদক্ষেপগুলি ভুলে যাওয়ার সম্ভাবনাগুলিতে কেবল আগ্রহী :)
উত্তর:
আমি জানি না এটি গণনা করা হয় তবে আপনি সাবসেল করতে পারেন:
$ (cd /var/log && cp -- *.log ~/Desktop)
ডিরেক্টরিটি কেবলমাত্র সেই সাব-শেলের জন্য পরিবর্তিত হয়, সুতরাং আপনি cd -
পরবর্তী সময়ে প্রয়োজনের কাজটি এড়িয়ে যান।
$ (cd /var/log && cp *.log ~/Desktop)
। এইভাবে, ডিরেক্টরি উপস্থিত না থাকলে, আর কোনও কমান্ড কার্যকর করা হয় না।
কিছু প্রোগ্রাম অপশন যার সাহায্যে আপনি তাদের বলতে পারেন আছে 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
অন্যান্য ব্যক্তিদের দেওয়া উত্তরের মূল্য হ্রাস করার জন্য নয়, তবে আমি বিশ্বাস করি আপনি যা চান তা হ'ল:
(cd /path/to && ./executable [ARGS])
cd
সাব-শেলটি চালাবার জন্য প্যারেনগুলি নোট করুন ।
এখানে এমন কিছু যা 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 এর জন্য ধন্যবাদ)
pushd other-dir
চেয়ে বরং পারতেনpushd .; cd other-dir
দুঃখের বিষয়, আপনার উদাহরণ:
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 প্রয়োজন হতে পারে যা সাধারণত লিনাক্সে ব্যবহৃত হয়।
কীভাবে ./your/path/command.sh
?
execindirectory -d /var/log "cp *.log ~/Desktop"
।
echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory
। আপনি যদি এটি "বিকল্প" যেমন-d
স্টাফ হিসাবে "বিকল্প" সমর্থন করতে চান তবে আরও কিছু প্রচেষ্টা করা দরকার ।