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


13

"এডিট-অ্যান্ড এক্সিকিউট-কমান্ড (সিএক্স সি)" ব্যবহার করে আপনার সম্পাদক ব্যবহার করে কোনও কমান্ড কীভাবে সম্পাদনা করতে এবং সম্পাদন করতে হয় সে সম্পর্কে অনেক তথ্য রয়েছে বলে মনে হয়, তবে আমি যা অর্জন করতে চাই তা হ'ল বর্তমান শেল কমান্ডটি গ্রহণ করুন, প্রয়োগ করুন নির্দিষ্ট ফিল্টারিং (একটি স্ক্রিপ্ট ব্যবহার করে) এবং তারপরে মৃত্যুদন্ড কার্যকর করার আগে আরও অনুমোদনের / ম্যানুয়াল পরিবর্তনের জন্য প্রম্পটে প্রেরণ করুন। বাশ দিয়ে কি এটা সম্ভব?


এটি প্রশ্নের সঠিক উত্তর নয়, তবে নেটিভ বাশের পরিবর্তে জেডএসএইচ টার্মিনাল ব্যবহার করার চেষ্টা করুন । এটিতে স্বয়ংক্রিয়ভাবে সমাপ্তি রয়েছে তাই সরাসরি কমান্ডগুলি সম্পাদন করবেন না। আমি ব্যক্তিগতভাবে এই নির্দিষ্ট দৃশ্যের চেষ্টা করেছি এবং যখনই আমি একটি করি তখন এটিতে সর্বদা আমাকে এন্টার টিপতে হবে edit-and-execute-command
প্রবীণ প্রেমরত্ন

1
আমার জন্য কাজ করা শর্টকাটটি হ'ল Escape+ Vতবে এটি এখনও কমান্ডটি কার্যকর করতে চলেছে। সুতরাং কর্মক্ষেত্রের জন্য, আমি echoপর্যালোচনা করার জন্য কনসোলে কমান্ডটি মুদ্রণ করে এটি সম্পাদন করতে সম্মুখভাগে যুক্ত করব ।
কেনারব

2
আপনি কি একটি কংক্রিট উদাহরণ তৈরি করতে পারেন? আমি বুঝতে পারি না "নির্দিষ্ট ফিল্টারিং প্রয়োগ করুন (স্ক্রিপ্ট ব্যবহার করে) এবং তারপরে প্রম্পটে ফিরিয়ে দিন"।
কেন্ট

3
@ প্রবীণপ্রিমার্তনে: zsh টার্মিনাল নয় , এটি শেল
আরকাদিউস দ্রবকিজিক

উত্তর:


7

আমার অভিজ্ঞতার সর্বশেষ আপডেট

0"+y$ddনিম্নলিখিত ম্যাপিংয়ের অংশটি সত্যিই এমন কিছু যা আপনার যত্ন সহকারে চিন্তা করতে হবে এবং এটি আপনার স্বাদ / কর্মপ্রবাহ / অভিজ্ঞতা অনুসারে তৈরি করা উচিত।

উদাহরণস্বরূপ, খুব ঘন ঘন আমি নিজেকে বাফারে একাধিক লাইন দিয়ে শেষ করতে দেখেছি, যেখানে আমি কেবল কার্সারটি চালু করতে চাই; এই ক্ষেত্রে আমি 0"+y$dd:%d<CR>পরিবর্তে ব্যবহার করতে পারেন 0"+y$dd

এবং এটি সম্ভাব্য পরিস্থিতিগুলির মধ্যে একটি মাত্র।

যারা পছন্দ করেন তাদের চূড়ান্ত উত্তর vim

আসল উত্তর

আমার প্রায়শই একই কাজ করা প্রয়োজন এবং আমি এটি নিম্নলিখিত হিসাবে করি। (আমি সাধারণত ব্যবহার set -o viমধ্যে bash, তাই নিম্নলিখিত পয়েন্ট 1 এবং 2 যদি আপনি ব্যবহার ভিন্ন set -o emacsডিফল্ট; আপনার প্রশ্নের এটি 1 পয়েন্ট এবং 2 একত্রে আছে দেখে মনে হচ্ছে তার উপর ভিত্তি করে Ctrl+ + xদ্বারা অনুসরণ Ctrl+ + e, যা কঠিন টাইপ করা হয়, এই প্রোগ্রামটিতে ।)

  1. Escapeস্বাভাবিক মোডে থাকতে আঘাত ,
  2. vকমান্ড সম্পাদনা করতে সম্পাদক প্রবেশ করতে আঘাত করুন,
  3. আমার মত কমান্ডটি সম্পাদনা করুন,

(আপনি এখানে প্রশ্ন জিজ্ঞাসা করেছেন))

  1. আঘাত Escape0"+y$dd:wq,
    • দ্রষ্টব্য: 0"+y$সহজভাবে নয় "+yy, কারণ আধুনিককৃতরাও নিউলাইনটি অনুলিপি করতে পারে এবং এর ফলে কমান্ড লাইনে এটি আটকানোর পরে আদেশটি কার্যকর করা যায়,
  2. কমান্ড লাইনে ক্লিপবোর্ড আটকান
    • আপনি যে টার্মিনালটি ব্যবহার করছেন তার উপর এটি কীভাবে নির্ভর করবে, আমার ধারণা; আমি Ctrl+ Alt+ vইন আঘাত URxvt
  3. অনুমোদনের / ম্যানুয়াল সম্পাদনাতে এগিয়ে যান।

স্পষ্টতই এটি পুরোপুরি কাজ, পুরো কমান্ডটি মোছার আগে ক্লিপবোর্ডে সম্পাদিত কমান্ডটি অনুলিপি করে তৈরি করা, যাতে সম্পাদক থেকে বেরিয়ে আসার পরে কিছুই কার্যকর না হয়; তবে আমি নিজের জন্য এটি সেরা।

হালনাগাদ

আমার EDITOR(এবং VISUAL) সমান হিসাবে vim, আমি যখন আদেশটি সম্পাদনা করি তখন আমি এটিকে সম্পাদনা করি vim

এই সম্মানের সাথে, আমি লক্ষ্য করেছি যে বাফারের নামকরণ হয়েছে /tmp/bash-fc.random, যেখানে randomএকটি 6-অক্ষরের বর্ণমালা র্যান্ডম স্ট্রিং রয়েছে।

আপনি যদি vimআপনার সম্পাদক হিসাবে ব্যবহার করেন তবে .vimrcএটি পুরো ক্রমটি সম্পাদন করতে আপনার কিছু ম্যাপিং সংজ্ঞায়িত করতে পারে বলে এটি অনেকগুলি সম্ভাবনার স্থান দেয় Escape0"+y$dd:wq। উদাহরণস্বরূপ, কমান্ড লাইন সম্পাদনার সময় আপনি যে কমান্ডটি খুব কমই ব্যবহার করতে চান তা হ'ল Leaderd; সুতরাং আপনি mapআপনার .vimrcফাইলটিতে নিম্নলিখিত পিংটি রাখতে পারেন

au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>

সুতরাং উপরের রেসিপি 4 ধাপ হয়ে যায়

  1. হিট EscapeLeaderd

আমার পক্ষে কমান্ডগুলি সম্পাদন করার সর্বোত্তম উপায়
ভিলেগাস

2

বাশ / রিডলাইনে এটি করা সম্ভব নয় তবে edit-command-lineকমান্ড ব্যবহার করে zsh এ এটি সম্ভব :

darkstar% autoload edit-command-line; zle -N edit-command-line
darkstar% bindkey "^X^E" edit-command-line

এখন টিপুন Control- x Control- eআপনার সম্পাদক খোলার জন্য, লাইন সম্পাদনা করতে, সম্পাদকটি ছেড়ে দিন - আপনি আপডেট হওয়া কমান্ড লাইনটি দেখতে পাবেন তবে এটি স্বয়ংক্রিয়ভাবে কার্যকর হবে না।


1

এখন আমি এটা আমার মনে হয় যে, হয়তো কি একটি মন্তব্যে প্রস্তাব @kenorb একটি প্রকরণ সেরা কার্যসংক্রান্ত (যেমন মনে হয় কোন সমাধান থাকে), যদি আমরা বিদ্ধ করতে চান bash

আপনি যা করতে পারেন তা হ'ল কমান্ডের পরিবর্তে একটি #(মন্তব্য চরিত্রের bash) প্রিপেন্ড করা echo। তারপরে আপনি যখন এক্সেটর থেকে প্রস্থান করবেন, আদেশটি অকার্যকর হবে এবং আপনাকে কেবল টিপতে হবে arrow up(বা k, আপনি যদি ব্যবহার করেন set -o vi), মুছে ফেলুন #এবং নিশ্চিত করুন।

নোট করুন যে এই কৌশলটি কেবল কয়েকটি কীস্ট্রোক যুক্ত করেছে, তাই এটি আপনার টাইপিং স্তরের উপর নির্ভর করে মোটামুটি দক্ষ হতে পারে।


1

এই টুকরোগুলি আপনাকে আরও কাছে পেতে পারে:

ক) নিউলাইনের নতুন লাইনের (সিআরটিএল-এম) জন্য সাধারণ বাইন্ডিং প্রতিস্থাপন করুন bind -x '"\C-M":date"

খ) ইতিহাস ব্যবহার করে বর্তমান লাইনটি ধরুন !#

আপনি যা চান স্ক্রিপ্টের সাথে তারিখ প্রতিস্থাপন করুন।

গ) ম্যানুয়ালি সম্পাদনা করুন

d) যদি প্রয়োজন হয় তবে কোনওভাবে টাই করুন যাতে !!:pকমান্ড লাইনে নতুন কমান্ড প্রিন্ট করে তবে এটি কার্যকর করে না, সুতরাং এটি আপনাকে ম্যানুয়ালি সম্পাদনা করতে দেয়।

ঙ) সিআরটিএল-জে ব্যবহার করে একটি নতুন লাইনের পরিবর্তে সম্পাদিত কমান্ড জমা দিন

অথবা তারা না পারে ....


1

ইতিহাস থেকে কমান্ডটি কার্যকর না করেই কমান্ডটি সংশোধন করার জন্য ব্যাশে একটি বিকল্প রয়েছে। আমি নিশ্চিত নই যে এটির জন্য স্ক্রিপ্ট ব্যবহার করা সম্ভব, সম্ভবত বলে মনে হয় না। যদিও, আপনি ইতিহাসের সংশোধক ব্যবহার করে পরিবর্তন করতে পারেন।

  1. পরিবর্তিত কমান্ড কার্যকর করা রোধ করতে বিকল্প হিস্টওয়ার্ফাই সক্ষম করুন
  2. শেষ কমান্ডটি পরিবর্তন করতে পরিবর্তনকারীদের চেইন ব্যবহার করুন
  3. "!!" ব্যবহার করুন আপনার ফলাফলটি চূড়ান্ত সম্পাদনার জন্য কমান্ড লাইনে রেখে দেওয়া

এটি কেমন দেখাচ্ছে তা এখানে:

$ shopt -s histverify
$ ls *.sh
script1.sh  script2.sh  script3.sh  script-return.sh
$ !!:s/*/script1/:p
ls script1.sh
$ !!:s/1/2/:p
ls script2.sh
$ !!
$ ls script2.sh
script2.sh

1

আমি আপনাকে বাশের জন্য সুরকার কাঠামোতে নির্দেশ করতে চাই (আমি এর সাথে অনুমোদিত নয়): https://github.com/erichs/composure

এটি এমনগুলি প্রদান করে draftএবং reviseফাংশনগুলি মনে হয় যা তারা আপনাকে যা করার চেষ্টা করছেন তাতে তারা সহায়তা করতে পারে। প্রকল্পের রেডমে ফাইল থেকে একটি (দীর্ঘ) উদ্ধৃতি এখানে:

কমপোজার আপনাকে সহজেই সহজ শেল ফাংশনগুলি খসড়া তৈরি করে, আপনার দীর্ঘ পাইপ ফিল্টারগুলি এবং জটিল কমান্ডগুলিকে পঠনযোগ্য এবং পুনঃব্যবহারযোগ্য খণ্ডগুলিতে ভেঙে দিয়ে সহায়তা করে।

প্রথমে খসড়া, পরে প্রশ্ন জিজ্ঞাসা করুন

একবার আপনি যদি কোনও আদেশের রত্ন তৈরি করেন তবে এটিকে ফেলে দেবেন না! এটি ব্যবহার করুন draft ()এবং একটি ভাল নাম দিন। এটি আপনার শেষ কমান্ডটিকে একটি ফাংশন হিসাবে সংরক্ষণ করে যা আপনি পরে পুনরায় ব্যবহার করতে পারেন। এটিকে কোনও রুক্ষ খসড়ার মতো ভাবেন।

  $ cat servers.txt
  bashful: up
  doc: down

  up-arrow

  $ cat servers.txt | grep down
  doc: down

  $ draft finddown

  $ finddown | mail -s "down server(s)" admin@here.com

সংশোধন, সংশোধন, সংশোধন!

এখন আপনি একটি ন্যূনতম শেল ফাংশন পেয়েছেন, আপনি রিফ্যাক্টরিং এবং পুনর্বিবেচনার মাধ্যমে এটি আরও ভাল করতে চাইতে পারেন। revise ()আপনার প্রিয় সম্পাদকের শেল ফাংশনটি সংশোধন করতে কমান্ডটি ব্যবহার করুন ।

  • ইনপুট পরামিতি সহ ফাংশন সাধারণকরণ
  • কার্যকারিতা যুক্ত বা সরান
  • ডকুমেন্টেশনের জন্য সহায়ক মেটাডেটা যুক্ত করুন

    $ revise finddown
    finddown ()
    {
      about finds servers marked 'down' in text file
      group admin
      cat $1 | grep down
    }
    
    $ finddown servers.txt
    doc: down

0

কোনও কি-বোর্ড শর্টকাট দিয়ে এটি সম্ভব বলে মনে হচ্ছে না:

$ bind -P | grep -e command -e edit
complete-command can be found on "\e!".
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
possible-command-completions can be found on "\C-x!".
vi-editing-mode is not bound to any keys
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.