বাশ কমান্ডের প্রথম শব্দটি কীভাবে পরিবর্তন করবেন?


44

আমি আমার কার্যপ্রবাহকে বাশের সাথে কিছুটা উন্নত করতে চাই এবং আমি বুঝতে পারি যে প্রায়শই আমি একই আদেশটি একটি ভিন্ন নির্বাহযোগ্যকে কার্যকর করতে চাই।

কিছু উদাহরণ:

গিট (যেখানে আমি দ্বিতীয় শব্দটি দ্রুত পরিবর্তন করতে চাই):

git diff     foo/bar.c
git checkout foo/bar.c

বিড়াল / আরএম (যেখানে কেবল প্রথম শব্দটি পরিবর্তন করতে হবে):

cat foo/is/a/very/long/path/to/bar.c
rm  foo/is/a/very/long/path/to/bar.c

আমি জানি আমি মারতে পারেন Ctrl+ + aতারপর Delপ্রথম শব্দ মুছে ফেলার জন্য, কিন্তু যদি এটা করতে একটি দ্রুততর উপায় হল আমি হতাশ করছি।



সত্যিই, আমি মনে করি এটি কেবলমাত্র Ctrl + a ব্যবহার করে মুছে ফেলা নিরাপদ। এটি অবশ্যই খুব ধীর নয়।
agweber

উত্তর:


56

!$ আপনার পূর্ববর্তী কমান্ডের শেষ শব্দটিতে প্রসারিত হয়।

সুতরাং আপনি করতে পারেন:

cat foo/is/a/very/long/path/to/bar.c

rm !$

বা:

git diff foo/bar.c

git checkout !$

আপনার উদাহরণগুলি কেবলমাত্র শেষ শব্দটির পুনরাবৃত্তি করার জন্য ঘটেছে, তাই ভাল !$কাজ করেছে। যদি আপনার কাছে আসলে প্রচুর যুক্তি ছিল যা আপনি পুনরাবৃত্তি করতে চেয়েছিলেন এবং আপনি কেবল প্রথম শব্দটি পরিবর্তন করতে চেয়েছিলেন তবে আপনি ব্যবহার করতে পারেন !*যা পূর্বের কমান্ডের জেরোথ বাদে সমস্ত শব্দেই প্রসারিত।

bashম্যান পৃষ্ঠার "ইতিহাস বিবরণ" বিভাগটি দেখুন । সেখানে অনেক নমনীয়তা রয়েছে।


16
সঠিক এবং সঠিক। আমি তো করা চাই সাবধানবাণী : সঙ্গে !$আপনি লাইন আপনি দৌড়াচ্ছে কোন পূর্ণ চাক্ষুষ নিয়ন্ত্রণ । এটি কখনও কখনও ক্ষতিকারক হতে পারে। বিশেষত যদি আপনি কোনও ভুল ছাপে পড়ে থাকেন। এটি historyকি প্রসারিত হতে লাগে takes সুতরাং আপনি যদি শুরুর ফাঁকা জায়গা দিয়ে শেষ কমান্ডটি লিখেন, সম্ভবত এই কমান্ডটি ইতিহাসে শেষ হবে না। আপনি যখন !$শেল দিয়ে আপনার নতুন কমান্ডটি প্রয়োগ করবেন তখন টাইপ করা শেষ কমান্ড লাইন থেকে প্যারামিটারগুলি নেওয়া হবে না কেবল ইতিহাসের শেষ থেকে from এখানে একই আরও শব্দ।
হাস্তুর

1
@ হাস্তুর দুর্ঘটনা রোধ করতে আপনি নিজের শেলটিকে ট্যাব বা প্রবেশের উপরে ইতিহাস প্রসারণ করতে পারেন।
শে

2
@ হস্তুর এজন্য আপনাকে জেডএসে (নির্লজ্জ প্রচার) দু'বার ইন্ট্রো টিপতে হবে
ব্রায়াম

@ হাস্তুর - যখন আমার কী হতে চলেছে সে সম্পর্কে আমার কোনও সন্দেহ আছে বা আমি নির্দ্বিধায় বুঝতে পারি যে আমি সবেমাত্র টাইপ করেছি দীর্ঘ কিছু চালানোর আগে প্রথমে অন্য কিছু করতে হবে, আমি লাইনের শুরুতে গিয়ে একটি #বা একটি যুক্ত echo করলাম যাতে আমি পারি এটি দেখুন এবং এটি ইতিহাসে চলে যায় যাতে আমি এটিকে ঠিক ফিরে পেতে পারি এবং অক্ষম না করা উপসর্গ ছাড়া এটি আবার চালাতে পারি।
জো

28

Ctrl+ aলাইনের শুরুতে যেতে, তারপরে Alt+ dপ্রথম শব্দটি মুছতে।


9
মুছে ফেলা শর্টকাটটি আসলে মেটা + ডি এবং মেটাকে সাধারণত লিনাক্স মেশিনে আল্টে ম্যাপ করা হয়। প্ল্যাটফর্মগুলিতে যেখানে এটি হয় না, সেখানে মেটা সংশোধক পাওয়ার একটি বিকল্প হ'ল এস্কেপটিকে একটি উপসর্গ হিসাবে ব্যবহার করা। দেখুন en.wikipedia.org/wiki/Meta_key
গুস্তাভো Giráldez

2
আপনি যদি আরও গভীরে যেতে চান তবে @ গুস্তাভোগিরাল্ডিজ, সক্ষম Meta+Dহলেই কার্যকর emacsহয় ( set -o emacsকেবলমাত্র বা কেবলমাত্র ডিফল্টরূপে)। এটি নিকৃষ্ট সম্পাদক- মোডে বা emacsঅক্ষম থাকলে কার্যকর হবে না ।
টিসি 1

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

1
@ মাইক অন্যদিকে, C-aএবং M-dযদি আপনার হাতগুলি ইতিমধ্যে টাইপিং অবস্থায় থাকে তবে টাইপ করতে অনেক দ্রুত হয়।
jjlin

@ মাইক এটি একটি বাশ জিনিস। catহোম ( ^[[Hএখানে) এবং Ctrl + a ( ^A) চাপলে আপনি কী পান তা টাইপ করুন এবং তুলনা করুন ।
জোনাস শোফার

17

আমি নিশ্চিত না এটি আসলে দ্রুততর হবে বা না, তবে এই নিবন্ধটি দেখুন, বিশেষত পয়েন্ট # .3:

  1. Command str1 ^ str2 ^ ব্যবহার করে পূর্ববর্তী কমান্ড থেকে একটি স্ট্রিং প্রতিস্থাপন করুন ^

নিম্নলিখিত উদাহরণে, প্রথমে আমরা একটি ফাইল যাচাই করার জন্য ls কমান্ড কার্যকর করি। পরে আমরা বুঝতে পারি যে আমরা ফাইলটির সামগ্রী দেখতে চাই। পুরো ফাইলের নাম আবার টাইপ করার পরিবর্তে, আমরা কেবল আগের কমান্ডের "ls" কে "ক্যাট" দিয়ে প্রতিস্থাপন করতে পারি নীচের মত।

$ ls /etc/cron.daily/logrotate

$ ^ls^cat^
cat /etc/cron.daily/logrotate

15

Alt+ +.

যদি আপনার কেবল পূর্ববর্তী কমান্ডগুলির একটির শেষ অংশটির পুনরাবৃত্তি করার প্রয়োজন হয় তবে আপনি Alt+ ব্যবহার করতে পারেন .যা ইতিহাসের শেষ লাইন থেকে নেওয়া সর্বশেষ যুক্তিটি পেস্ট করবে।

যদি একাধিকবার চাপা থাকে তবে তার পরিবর্তে লাইনের শেষ যুক্তির সাথে যা ঠিক তা আগে পোস্ট করা হয়েছিল ...

উদাহরণস্বরূপ যদি শেষ 2 কমান্ডগুলি ছিল:

cat foo/is/a/very/long/path/to/bar.c
pico foo/is/a/very/long/path/to/SomeWhereElse.c

আমি যে শেলটি লিখছি rmএবং আমি টিপছি Alt+ .এটি উপস্থিত হবে:

rm foo/is/a/very/long/path/to/SomeWhereElse.c

যদি আমি আবার টিপুন Alt+ তবে .এটি পরিবর্তে উপস্থিত হবে

rm foo/is/a/very/long/path/to/bar.c

এবং তাই ...


নিশ্চিত না কেন তবে এটি আমার ম্যাক কনসোলটিতে কাজ করে না।
লুলালালা

এখানে কীবোর্ড শর্টকাট রয়েছে যা কাজ করে বলে পরিচিত bash। বিটিডব্লিউ আপনি কি নিশ্চিত যে আপনি বাশকে শেল হিসাবে ব্যবহার করছেন ?
হাস্তুর

1
আমার ধারণা এটি ম্যাক জিনিস। আমি যখন টাইপ করি আমি পাই
লুলালালা


12

@Jjlin উত্তর ছাড়াও, আপনি নিম্নলিখিত টিপস দ্বারা আগ্রহী হতে পারেন:

  • Ctrl+ wশব্দটি আপনার বামে মুছে দেয়
  • Ctrl+ + kকম্যান্ড লাইন এর শেষে কার্সার থেকে মুছে ফেলে
  • Ctrl+ + uকম্যান্ড লাইন শুরুর কার্সার থেকে মুছে ফেলে
  • Alt+ + bএক শব্দ অনুন্নত কার্সার প্যাচসমূহ
  • Alt+ + fএক শব্দ এগিয়ে কার্সার প্যাচসমূহ
  • $_ পূর্ববর্তী কমান্ড লাইনের শেষ যুক্তি রয়েছে

এগুলি সম্পর্কে আরও জানার জন্য, ম্যানপেজের "পঠন কমান্ডের নামগুলি" বিভাগটি দেখুন bash

উদাহরণ:

cat foo/is/a/very/long/path/to/bar.c
rm $_

এগুলি দুর্দান্ত টিপস, তবে তারা প্রশ্নের উত্তর দেয় না।

@ এসএলএইচএইচএচএমএইচএইচএচ এটি করে কারণ প্রশ্ন শিরোনাম প্রদত্ত উদাহরণগুলির সাথে মেলে না। যদি আমি উদাহরণগুলিতে মনোনিবেশ করি, যেমনটি আমি করেছি, শিরোনামটি হওয়া উচিত "কীভাবে বাশ কমান্ডে কোনও শব্দ পরিবর্তন করবেন?" । এই কারণেই আমার উত্তর "@jjlin" এর সাথে যুক্ত হয়েছে। তবে আমি অনুমান করি যে প্রশ্নটি পরিষ্কার করা উচিত।
মাইকি

ওপি সর্বদা nকমান্ডের প্রথম শব্দটি n = 1প্রথম উদাহরণ এবং n = 2দ্বিতীয়টিতে সরিয়ে ফেলতে (বিনিময়) করতে চায় । জজলিনের উত্তরটি দেখায় যে কীভাবে প্রথম শব্দটি মুছতে হয় (এবং শর্টকাটটি পুনরায় প্রয়োগ করে nশব্দ পর্যন্ত মুছে ফেলা যায় )। আপনার উত্তরে কয়েকটি বাশ শর্টকাট তালিকাভুক্ত করা হয়েছে (যা প্রকৃতপক্ষে কার্যকর) তবে এগুলির কোনওটিই প্রথম nশব্দগুলি মুছানোর কার্যকর উপায় নয় ।

এইচএম, আবার পড়া, $_প্যারামিটারটি সম্ভবত একটি যুক্তি থাকলে (যেমন যদি আর্গুমেন্টের সংখ্যাটি n = m - 1কোথায় mথাকে) কাজ করবে। শর্টকাটের বাকী অংশটি যদিও প্রশ্নটির সাথে অপ্রাসঙ্গিক।
slhck

@ এসএলএইচএইচকি তর্ক করার জন্য আমি প্রথম উদাহরণটি "দ্বিতীয় শব্দটি প্রতিস্থাপন করুন" হিসাবে পড়েছি :-)
মাইকি

8

আপনি যদি vi এর বিষয়ে দক্ষ হন তবে আপনি কমান্ডটি ব্যবহার করে বাশ (বেশিরভাগ শেল?) এ vi বাইন্ডিংগুলি সক্রিয় করতে পারেন set -o vi। তারপরে, আপনি আপনার আদেশটি সম্পাদনা করতে স্বাভাবিক vi কী ব্যবহার করতে পারেন। আপনার প্রথম উদাহরণে, আপনি ^wcw"ডিফ" মুছতে পারেন , তারপরে এটিকে চেকআউটে পরিবর্তন করুন।

কমান্ড লাইনটি সম্পাদনা করার জন্য vi কাইবাইন্ডিংগুলি শেখার পক্ষে এটি উপযুক্ত নাও হতে পারে তবে আপনি যদি তাদের ইতিমধ্যে জানেন তবে এটি একটি ঝরঝরে উত্পাদনশীলতা বুস্টার।


আমি কর্নশেলে শিখেছি, set -o viআমার জীবন কেমন ছিল! আমি এমনকি আমার ব্যাশ প্রম্পটেও এটি করি।
বিজিস্ট্যাক

bindkey -vzsh জন্য। Esc 0 c w
ব্যবহারকারীর 3030873

6

এই বিড়ালটির ত্বকের বিভিন্ন উপায় রয়েছে!

একটি নির্দিষ্ট স্ট্রিং প্রতিস্থাপন করতে, ^old^new^extraআপনার পূর্ববর্তী কমান্ড নিতে হবে, oldসঙ্গে প্রতিস্থাপন new, এবং সংযোজন extra। আপনি যত তাড়াতাড়ি আপনি থামাতে পারেন; উদাহরণস্বরূপ খালি স্ট্রিংয়ের সাথে ^oldপ্রতিস্থাপন করা হবে oldএবং খালি স্ট্রিং সংযোজন করা হবে (মূলত মোছা oldএবং আরও কিছু না করা)।

1. ^diff^checkout
2. ^cat^rm

এর বিশেষত দরকারী বৈকল্পিক:

for i in `seq 1 10`; do echo something complicated; done
# inspect the output to see if it looks right
^echo

একটি নির্দিষ্ট শব্দ প্রতিস্থাপন করতে, আপনি কমান্ডের মাধ্যমে !m:n-pশব্দগুলি উল্লেখ করতে ব্যবহার করতে পারেন (বর্তমান কমান্ড থেকে ফিরে গণনা করতে নেতিবাচক সংখ্যা ব্যবহার করুন)। আপনি একক শব্দের উল্লেখ করার জন্য অংশটি বাদ দিতে পারেন এবং একটি সম্পূর্ণ কমান্ড উল্লেখ করার জন্য অংশটি বাদ দিতে পারেন। বিশেষ ফরম জন্য , পূর্ববর্তী কমান্ডের শেষ কথা জন্য, এবং আর্গুমেন্ট (সমস্ত কিন্তু শব্দের জন্য পূর্ববর্তী কমান্ডের) চমত্কার সুবিধাজনক হয়।npm-p:m-p!!!-1!$!*0

1. !!:0 checkout !!:2-
2. rm !*

আমি প্রায়শই এই দুটি ব্যবহার করি; zsh এখানে বিশেষত দুর্দান্ত, কারণ হিট ট্যাবটি আপনার ঠিক আছে কিনা তা নিশ্চিত করার জন্য ক্রিপ্টিক স্টাফগুলি প্রসারিত করবে।

লাইন সম্পাদনা করে এটি করার অনেকগুলি উপায় রয়েছে। আপনার শেলের কীবাইন্ডিংগুলি পড়ুন।


-2

বেশিরভাগ টার্মিনাল প্রোগ্রাম সমর্থন করে ...

  • <Up-Arrow>ইতিহাস থেকে পূর্ববর্তী কমান্ড লাইনের একটি পুনরায় খেলতে প্রয়োজন হিসাবে টিপুন ।
    • <Down-Arrow>ইতিহাস তালিকার মাধ্যমে এগিয়ে যাওয়ার জন্য চাপুন ।
  • <Left-Arrow>দ্বিতীয় শব্দের শেষে কার্সারটি সরানোর জন্য প্রয়োজনীয় হিসাবে চাপুন ।
  • <Backspace>দ্বিতীয় শব্দটি মোছার জন্য প্রয়োজনীয় হিসাবে টিপুন ।
  • প্রতিস্থাপন দ্বিতীয় শব্দ টাইপ করুন।
    • আরও পরিবর্তনের জন্য পুনরায় অবস্থানের জন্য <Right-Arrow>/ চাপুন <Left-Arrow>
  • <RETURN>কমান্ড কার্যকর করতে আঘাত করুন

আপনি যে কমান্ড লাইনটি চান তা সাম্প্রতিক না হলে, <Ctrl-r>উল্লিখিত প্রশ্নের সাথে উল্টো আই-সন্ধান করুন ...
বাশ-এ কমান্ডের অংশটি টাইপ করার পরে কি সিটিআরএল-আর ব্যবহার করার কোনও উপায় আছে?
তারপরে প্রয়োজন অনুসারে তীর কীগুলির মাধ্যমে সম্পাদনা করুন।


-3

আমি যা করি (উবুন্টু / বাশ):

1) Arrow upআরে পূর্ববর্তী কমান্ডটি ফেরত
2) Homeকী শুরুতে ফিরে আসতে
3) কমান্ডটি প্রয়োজনীয় হিসাবে পরিবর্তন করুন।

ইডিয়ট-প্রুফ এবং বিশেষত মাল্টি-লাইন কমান্ডগুলির জন্য দরকারী।

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