কীভাবে একটি কমান্ড একটি ডিরেক্টরি দিয়ে যুক্তি হিসাবে চালানো যায়, তারপরে একই সিডি করুন? আমি "এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই"


15

আমি নিম্নলিখিতটি করতে একটি সংক্ষিপ্ত ফাংশন তৈরি করতে চাই। ধরা যাক যে আমি ফাইলটি 'file.tex' আমার ডকুমেন্ট ডিরেক্টরিতে স্থানান্তরিত করেছি:

mv file.tex ~/Documents

তারপরে, আমি cdসেই ডিরেক্টরিতে চাই :

cd ~/Documents

আমি এটি কোনও ডিরেক্টরিতে সাধারণীকরণ করতে চাই, যাতে আমি এটি করতে পারি:

mv file.tex ~/Documents
follow

এবং followকমান্ডটি পূর্ববর্তী কমান্ড থেকে গন্তব্যটি পড়তে হবে, তারপরে সেই অনুসারে কার্যকর করুন। একটি সাধারণ ডিরেক্টরিতে, এটি বেশি সময় সাশ্রয় করে না, তবে নেস্টেড ডিরেক্টরিগুলির সাথে কাজ করার সময়, কেবলমাত্র ব্যবহার করতে সক্ষম হওয়া অসাধারণ হবে

mv file.tex ~/Documents/folder1/subfolder1
follow

আমি ভেবেছিলাম এটি তুলনামূলক সহজ হবে এবং আমি এরকম কিছু করতে পারি:

follow()
{
    place=`history 2 | sed -n '1p;1q' | rev | cut -d ' ' -f1 | rev`
    cd $place
}

কিন্তু এটি কাজ করে না বলে মনে হচ্ছে। যদি আমি প্রতিধ্বনিত হয় তবে আমি $placeপছন্দসই স্ট্রিংটি পেয়েছি (আমি এটি দিয়ে পরীক্ষা করছি ~/Documents) তবে শেষ কমান্ডটি ফিরে আসবে

No such file or directory

ডিরেক্টরি অবশ্যই বিদ্যমান। আমি ক্ষতিতে আছি আপনি আমাকে সাহায্য করতে পারে?


আমি এটি উল্লেখ করতে চাই যে আপনি যদি file.texমূল অবস্থানটিতে রাখতে আপত্তি না করেন তবে সিমলিংকগুলি একটি খুব ভাল বিকল্প, যেহেতু আপনাকে কেবল একবার লিঙ্ক করতে হবে এবং তারপরে এটি সর্বদা সর্বশেষতম সংস্করণটির দিকে নির্দেশ করবে।
Kroltan

5
সহজ উপায়: পূর্ববর্তী কমান্ডের শেষ টোকেনটি বিকল্প হিসাবে লিখুন cd Alt + টাইপ করুন .। চূড়ান্ত টোকেনের ইতিহাসে আরও পিছনে যেতে পুনরাবৃত্তি করুন। (আমি না ARG কারণ টোকেনটি বলে, foo &দখল &(উদাহরণস্বরূপ নিয়ে পালানোর -3 জন্য alt +।) আপনি একটি সাংখ্যিক যুক্তি ব্যবহার করতে পারেন চূড়ান্ত টোকেন হিসাবে।)।
পিটার কর্ডস


উত্তর:


18

কোনও ফাংশন সংজ্ঞায়িত করার পরিবর্তে, আপনি ভেরিয়েবলটি ব্যবহার করতে পারেন $_যা পূর্ববর্তী কমান্ডের দ্বারা সর্বশেষ যুক্তিতে প্রসারিত হয় bash। সুতরাং ব্যবহার করুন:

cd "$_"

mvকমান্ড পরে ।

আপনি ইতিহাসের বিস্তারটিও ব্যবহার করতে পারেন:

cd !:$

আপনি যদি একটি ফাংশন ব্যবহার করতে হবে:

follow () { cd "$_" ;}

$ follow () { cd "$_" ;}
$ mv foo.sh 'foo bar'
$ follow 
foo bar$ 

এনবি: আমরা উত্তর অবস্থানের প্যারামিটারগুলির সাথে কাজ করে যাচ্ছি তাই এই উত্তরটি আপনি যে সঠিক কমান্ড লাইন আর্গুমেন্ট ফর্ম্যাটটি ব্যবহার করেছেন তা লক্ষ্যবস্তু। অন্যান্য ফর্ম্যাটগুলির উদাহরণস্বরূপ mv -t foo bar.txt, আপনাকে আগে আগে নির্দিষ্ট চেকিং অন্তর্ভুক্ত করতে হবে, তখন একটি মোড়ক উপযুক্ত হবে।


আপনার ইতিহাস সম্প্রসারণ (সিডি!: $) পুরোপুরি কাজ করে। ধন্যবাদ. যাইহোক, অন্য (সিডি "$ _") এমভি ফাইল.টেক্স ~ / ডাউনলোডস / সিডি "$ _" বাশ: সিডি: __bp_preexec_invoke_exec: এই জাতীয় কোনও ফাইল বা ডিরেক্টরি আমি খুব খুশি হয়ে আপনার উত্তর পুরোপুরি সঠিক হিসাবে গ্রহণ করব না, এবং ধন্যবাদ.
ফায়ার

আমি সর্বদা টাইপ করেছি (কিছুটা অপ্রয়োজনীয়) হয় cd !$বা হয় cd $(dirname !$)$_ভেরিয়েবল সম্পর্কে জানতেন না !
কালভিন লী

এখন আমি কি mv -t ~/Documents file.texপরিবর্তে কি যদি হয় mv file.tex ~/Documents? নীচের লাইন, আমি নিশ্চিত নই যে এটি সাধারণ ক্ষেত্রে সমাধানযোগ্য ... চারপাশে একটি মোড়কের ফাংশন বা সেই সংশোধনগুলি mvআরও ভাল হতে পারে ...
একটি সিভিএন

@ মাইকেলকার্জলিং কেবল কাজ করবে না..এই উদাহরণটি কেবল ওপির কেসটি আবরণ করার জন্য, প্রান্তটি (বা সমস্ত) কেস নয় ...
হিমাইল

আপনার কোলনের দরকার নেই; টাইপ !$সমান !:$এবং দ্রুত।
ওয়াইল্ডকার্ড

14

স্ট্যান্ডার্ড বাশ কী-বাইন্ডিংগুলির সাথে, সংমিশ্রণটি Alt.পূর্ববর্তী কমান্ড লাইনের শেষ যুক্তিকে বর্তমানের মধ্যে অনুলিপি করবে। সুতরাং, টাইপিং

$ mv foo ~/some/long/path/
$ cd <Alt><.>

ফলন হবে

$ mv foo ~/some/long/path/
$ cd ~/some/long/path/

এবং শব্দের চেয়ে আরও কম টাইপ করা হবে follow

অতিরিক্ত সুবিধার জন্য, Alt.সংমিশ্রণটি পুনরাবৃত্তি করা সমস্ত পূর্ববর্তী কমান্ড লাইনের শেষ যুক্তিগুলির মাধ্যমে ব্রাউজ করবে।

সংযোজন: এই কী সংমিশ্রণের সাথে সম্পর্কিত বাশ কমান্ডের নামটি হয় yank-last-argবা insert-last-argument। এটি "ইতিহাসের হস্তক্ষেপের আদেশগুলি" এর অধীনে বাশ ম্যানপেজে বা আরও বিস্তৃত বাশ রেফারেন্স ম্যানুয়ালটিতে পাওয়া যাবে )


1
যে চালাক। ধন্যবাদ! আমার এই ধারণা ছিল না।
ফায়ার

@ ফায়ার আমি এই কমান্ডগুলির জন্য রেফারেন্স যুক্ত করেছি, যাতে আপনি আরও অনেক আকর্ষণীয় কী বাইন্ডিংগুলি খুঁজে পেতে পারেন (এবং সাথে সাথে তাদের আবার ভুলে যান, যেমন আমি সবসময় করি)।
দুবু

1
এছাড়াও আপনি ব্যবহার করতে পারেন <esc>তারপর .যেমন একই ফলাফল পেতে <alt>+., এই আপনি যদি অব্যাহতি :) remapped CapsLock আছে
gnur

1
@gnur vi (মি) ব্যবহারকারী, আমি মনে করি। ;-)
ডাবু

6

প্যারামিটার সম্প্রসারণের আগে টিল্ড সম্প্রসারণের আগে যে সমস্যাটি ঘটেছিল তা আপনি প্রায় নিশ্চিতভাবেই চলছেন, যা একটি সংক্ষিপ্ত উদাহরণের মাধ্যমে ব্যাখ্যা করা যেতে পারে:

$ cd ~kaz
kaz $ var='~kaz'
kaz $ echo $var
~kaz
kaz $ cd $kaz
bash: cd: ~kaz: No such file or directory

এর সাথে সম্বোধন করা যেতে পারে eval। যাইহোক, আপনার প্রয়োজন হবে eval, কারণ আপনি ইতিহাস থেকে কমান্ডগুলি টানছেন এবং সেগুলিতে নির্বিচারে বিস্তৃতি থাকতে পারে:

$ mv file.tex ~/Documents/$(compute_folder_name foo-param)/subfolder1
$ follow

(এখানে কিছু সমস্যা রয়েছে যেমন এই মানগুলির পুনঃ-প্রসারণ সম্ভবত ঘটে যাওয়া মূল প্রসারণের সাথে আর মেলে না Supp compute_folder_nameমনে করুন এমন একটি ফাংশন যা কিছু বৈশ্বিক পরিবর্তনশীলকে বাড়িয়ে দেয়))


4
আপনি প্রয়োজন হবে না eval। (এভার।) তবে এক্সপেনশন সিকোয়েন্স সমস্যাগুলি ভাল দেখায়। আপনি যদি evalএখানে ব্যবহারের ইতিহাস বিস্তারের বৃহত্তর পরামর্শের কথা উল্লেখ করেন তবে এটি আমার মতে সেরা উত্তর হবে; অরিজিনাল পোস্টারের সমাধান কেন কাজ করতে ব্যর্থ হয়েছিল তা অন্যরা কেউই আসলে ব্যাখ্যা করে না explain
ওয়াইল্ডকার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.