শেষ কমান্ডে ফরোয়ার্ড স্ল্যাশের জন্য বিকল্প ব্যাকস্ল্যাশ


10

আমি cd C:\foo\bar\পাওয়ারশেল থেকে সাইগউইনের কাছে কমান্ডটি অনুলিপি করেছি এবং খুব সহজেই আশা করেছি যে এটি কার্যকর হবে। আমি এখন সমস্ত প্রতিস্থাপন করার জন্য একটি প্রতিস্থাপন চালানোর চেষ্টা করছি \সঙ্গে /:

$ !!:gs/\\/\/
bash: :gs/\\/\/: substitution failed

কেন আমি প্রতিস্থাপন ব্যর্থ তা নিশ্চিত নয়।

আমি চেষ্টাও করেছি:

$ !!:gs/\\/q

প্রতিস্থাপনের সমস্যা ছিল কিনা তা কেবল দেখার জন্য। এটা না। এখন আমি কৌতুহলী!

কেন আমি "প্রতিস্থাপন ব্যর্থ" হচ্ছি?


2
এই মুহূর্তে আমার হাতে কোনও সাইগউইন নেই, তবে আমি ভেবেছিলাম, উইন্ডোজ পাথগুলি কাজ করছে ... আপনি কি যুক্তিটি গানে-উদ্ধৃত করার চেষ্টা করেছেন? অর্থাৎcd 'C:\foo\bar'
এমপি

@ এমপি এটি আসলে খুব কার্যকর! আমি জানতাম না আমি প্রতিস্থাপনে আটকে নেই।
ট্যানার ফকনার 21

1
"Zsh ব্যবহার করে একটি উত্তরের জন্য উন্মুক্ত হবে"। আপনার আসলটি !!:gs/\\/\/zsh এ কাজ করে ...
কামিল ম্যাকিয়েরোস্কি

@ ট্যাননারফালকনার fc -s '\'='/' -1উবুন্টু এলটিএস ডিফল্ট ব্যাশের অধীনে কাজ করে। এটি যদি সাইগউনের অধীনেও কাজ করে তবে আমাকে জানান। আমি উত্তর আরও শব্দ পোস্ট।
হাস্তুর

1
আমি মনে করি যে এখানে সাধারণ বাশ আচরণটি হ'ল প্রতিস্থাপনের আগে পলায়ন হিসাবে ব্যাকস্ল্যাশগুলি প্রক্রিয়াজাত করা হয় !!:gs/\\/\//। @ হস্তুরের fc -s '\'='/' -1প্রত্যাশিত আচরণ পাওয়া যায়। এটি ব্যাশ একটি বাগ হতে পারে।
কুইসোটিক

উত্তর:


6

একটি ফরোয়ার্ড স্ল্যাশও আপনার বিকল্প কমান্ডের ডিলিমিটার হয়, সুতরাং আপনাকে অবশ্যই প্রতিস্থাপনের স্ট্রিং হিসাবে এড়িয়ে চলতে হবে যাতে প্রতিস্থাপনটি শেষ না হয় early

!!:gs/\\/\//

বা আরও স্পষ্টতই মন্তব্যগুলিতে প্রস্তাবিত হিসাবে ডিলিমিটার হিসাবে স্ল্যাশের পাশাপাশি কিছু ব্যবহার করে

!!:gs|\\|/|

তবে এটি কেবল কাজ করে বলে মনে হচ্ছে tcsh(আমি যেখানে থাকি শেলটি সাধারণত নির্ধারিত হয়), আমি কাজ করার জন্য কমান্ডটি পেতে পারি না bashবলে মনে হয় যে পলায়নের প্রথম যুক্তিতে কাজ করে না:s


আনন্দ নেই :( একই ত্রুটি i.imgur.com/QFQR0xF.png
ট্যানার ফকনার 21

1
শুধু একটি মন্তব্য: !!:gs|\\|/কিছুটা বেশি পঠনযোগ্য হতে পারে।
এমপি

1
বাশে কাজ করতে পারিনি। এর প্রথম আরোগুলি :sসত্যিকারের রেজিএক্স বলে মনে হচ্ছে না
সংক্রামিত

4

সংক্ষিপ্ত উত্তর: বাশ এর বিল্টিন fc(ফিক্স কমান্ড)

fcইতিহাসের কমান্ডগুলি সম্পাদনা ও পুনরায় সম্পাদন করতে তৈরি করা বাশ শেলের অন্তর্নির্মিত কমান্ড ।
এটি সাইগউইনেও উপস্থিত রয়েছে এবং এটি লিনাক্সের যে সমস্ত বিতরণে আমি পরীক্ষা করেছি তার উপর এটি কাজ করে:

fc  -s '\'='/' -1

কিছু ব্যাখ্যা

  • fcইতিহাসের তালিকা থেকে কমান্ডগুলি তালিকাবদ্ধ করতে বা সম্পাদনা করতে এবং পুনরায় সম্পাদন করতে বাশ অন্তর্নির্মিত কমান্ড
  • -1ইতিহাসের শেষ কমান্ড নেবে। নোট করুন যে এমনকি !!হিসাবে সংজ্ঞায়িত (থেকে পড়া man bash)

    !! Refer to the previous command. This is a synonym for! -1 '

  • -sঅন্য একটি সঙ্গে একটি প্যাটার্ন বিকল্প। এবার help fc(বিল্ট-ইন কমান্ড তাই help) থেকে:

    `Fc -s [pat = rep ...] [কমান্ড] 'বিন্যাসের সাথে, COMMAND ওল্ড = নতুন সঞ্চালনের পরে পুনরায় সম্পাদন করা হবে।

    ঠিক আছে এর pat=repপরিবর্তে তারা OLD=NEW...

  • নিদর্শনগুলি শেল দ্বারা পঠিত হবে তাই আমাদের উদ্ধৃতি সহ তাদের রক্ষা করতে হবে: '\'এবং '/'

আপনি কেন "প্রতিস্থাপন ব্যর্থ" হচ্ছেন সে সম্পর্কে আরও কিছু শব্দ

দেখে মনে হচ্ছে যে এই s সংশোধকটির জন্য ব্যাকস্ল্যাশ চরিত্রের বিকল্পটি এখনও প্রয়োগ করা হয়নি \, এটি হ'ল পালানো। নিশ্চিত হওয়ার জন্য আমাদের বাশ ইতিহাসের প্রসারণের gnu সংস্করণটির কোডটি দেখতে হবে (তবে আপনি যা করার চেষ্টা করছেন তা পাওয়ার জন্য উপরের আদেশটি ছিল ... তাই আমি এটিকে অলস মনে করি ....)।

কিছু নোট:

  1. আমরা চিন্তা করতে নেতৃত্ব দিচ্ছি যে এটি আমাদের সাথে কাজ করার মতো প্রতিটি রেজিএক্স কার্যকর করবে sed, তবে এটির নিশ্চয়তা নেই। ব্যাকস্ল্যাশ হ'ল বিস্তারের পালানোর চরিত্র এবং সমস্যাটি এখানে। তদুপরি সম্প্রসারণের আচরণটি shoptবিকল্পগুলির সাথে সম্পর্কিত , সুতরাং আমাদের কেস কেসে দেখা শুরু করা উচিত ...

  2. আপনি যখন cd C:\Foo\Barআপনার বাশ শেলের স্ট্রিংটি পেস্ট করবেন তখন এটি প্রসারিত হবে এবং এটি দোভাষী হিসাবে উপস্থিত হবে cd C:FooBar; এই ফর্মটিতে এটি $_অভ্যন্তরীণ ভেরিয়েবলেও সংরক্ষণ করা হবে।
    তাহলে আপনি যদি এর পরিবর্তে আটকানো cd "C:\Foo\Bar"বা cd 'C:\Foo\Bar'মধ্যে $_ পরিবর্তনশীল আপনাকে খুঁজে উচিত C:\Foo\Bar
    যেহেতু ইতিহাসের সম্প্রসারণ সম্পূর্ণ লাইনটি পড়ার সাথে সাথেই সম্পাদিত হয়, শেলটি শব্দগুলিতে বিভক্ত হওয়ার আগে, আপনি এটি কিছুটা বাশিজমে আরও কম-বেশি প্লেইন দিয়ে ব্যবহার করার জন্য প্রলুব্ধ হতে পারেন (যেমন যোগ হতে পারে :pবা :q, "", পার্সিং এবং আরও ...)

    !!:0 ${_//\\/\/}

    এই মুহুর্তটি মনে রাখতে হবে যে পথ এবং ফাইলের নামগুলি নিয়ে খেলা শুরু করা নিরাপদ নয় , বিশেষত যদি তারা উইন্ডোজ ক্লিপবোর্ড থেকে আসে (সাধারণভাবে পৃষ্ঠাটি কেন বিশ্লেষণ করেন না কেন ls? ) এটি মূলত ট্যাব ব্যবহারের সম্ভাবনার সাথে সম্পর্কিত, ফাইলের নাম এবং ডিরেক্টরিগুলির জন্য সঠিক অক্ষর হিসাবে স্পেস এবং নিউলাইনগুলি ...)।
    তদুপরি যখন আপনি মাউসের সাহায্যে নেওয়া কোনও পাঠ্য পেস্ট করবেন তখন আপনি একটি শীর্ষস্থানও আটকে দিতে পারেন। এটি এড়াতে পারে যে আপনার আদেশটি ইতিহাসে শেষ হবে (এটি শেল অপশন থেকে নির্ভর করে ...)। যদি তাই হয় তবে আপনার নিম্নলিখিতগুলি !!একটি নিয়ন্ত্রিত কমান্ড হবে ... ( অন্য উত্তরের উদাহরণ দেখুন )।এটি একটি অবিবাহিত বাস্তব ঝুঁকি

উপসংহার

ইতিহাস বিস্তৃতি ইতিহাস তালিকা থেকে শব্দগুলি ইনপুট প্রবাহে প্রবর্তন করে, কমান্ডগুলির পুনরাবৃত্তি করা সহজ করে তোলে, বর্তমান ইনপুট লাইনে কোনও পূর্ববর্তী কমান্ডে যুক্তি সন্নিবেশ করায় বা পূর্ববর্তী কমান্ডগুলিতে ত্রুটিগুলি দ্রুত সমাধান করে।

যদি এটি সহজ না হয় তবে আমি ভাবতে শুরু করি যে আমরা কিছু ভুল করছি ;-)


অ্যাড বমিঃ সামান্য পরীক্ষা

আমি histverifyতখন শেল সক্রিয় করেছি ...

shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A

তারপরে আমি টিপছি Enterএবং যাচাই করা প্রসারণ হিসাবে আমি খুঁজে পাই

echo D:\Foo\Bar {1,2}A

তারপর আমি Enterআবার টিপুন এবং এটি প্রতিধ্বনিত

D:FooBar 1A 2A

এটি ইঙ্গিত করে যে ব্রেস প্রসারণেরsubstitution failed আগে প্রক্রিয়াজাতকরণের ইতিহাসের প্রসারণে উত্পন্ন হয়েছিল , তাই প্রথমত , এবং এটি নিশ্চিত করে মনে হয় যে ইতিহাস সংশোধক ( চরিত্রের ) প্রতিস্থাপনকে সত্যিকারের রেজেক্স হিসাবে প্রক্রিয়া করেনি । ..s\


2

আপনি sedফলাফলটি প্রয়োগ এবং কার্যকর করতে ব্যবহার করতে পারেন ।

এই জাতীয় কমান্ডের জন্য বেশ কয়েকটি সম্ভাব্য রূপ রয়েছে তবে আমার ব্যাশে কেবলমাত্র এটিই কাজ করেছিল:

A=$(echo "!!\\" | sed 's,\\,/,g');eval $A

\\যোগ করা হয় থেকে !!গত কমান্ড একটি ব্যাকস্ল্যাশ সঙ্গে সমাপ্ত ক্ষেত্রে হয়। এটি ছাড়া শেলটি বিভ্রান্ত হয়ে পড়বে এবং লাইনের ধারাবাহিকতার জন্য জিজ্ঞাসা করবে।

আপনি এটিকে ফাইলটিতে ব্যাশ ফাংশন হিসাবে যুক্ত করতে পারেন ~/.bashrc:

function slash {
   A=$(history | tail -n 2 | head -n 1 | cut -c 8- | sed 's,\\,/,g')
   eval $A
}

উইন্ডোজে আমার ব্যাশে এটি কীভাবে কাজ করে তা এখানে:

সজোরে আঘাত

A=কমান্ড শেল ভেরিয়েবলের জন্য সঠিক মান নির্ধারণ করে তা ব্যাখ্যা করতে A:

  • tailকমান্ড ইতিহাস থেকে শেষ দুটি রেখা গ্রহণ করে, যা নিজে cd \mnt\cঅনুসরণ করে রেখা দেয় slash। অংশ history | tail -n 2হিসেবে লেখা যেতে পারে history 2
  • head যে প্রথম লাইন নিতে cd \mnt\c
  • cut সরবরাহ করা লাইন নম্বর কেটে দেয় history
  • sed সমস্ত অ্যান্টি-স্ল্যাশগুলি স্ল্যাশ দ্বারা প্রতিস্থাপন করে
  • eval ভেরিয়েবলের বিষয়বস্তু কার্যকর করে A

হাই হ্যারি আমার জিএনইউ বাশ সংস্করণ ৪.৩.১১ (১) A=$(echo "!!\\" | sed 's,\\,/,g');eval $Aএ কমান্ডটি ব্যাকস্ল্যাশ দিয়ে শেষ হয়ে গেলে কাজ করবে না বলে দুঃখিত । আপনি একটি স্থান যুক্ত করতে বাধ্য হয়েছেন, যেমন C:\Foo\Bar\ অন্যথায়, যেমন আপনি বলেছিলেন, শেলটি লাইনের ধারাবাহিকতার জন্য অপেক্ষা করবে। আপনি দুবার এন্টার টিপতে পারেন। প্রথম ক্ষেত্রে আপনি প্রাপ্ত C:/Foo/Bar /( /দ্বিতীয় স্থানটিতে এটি একটি ত্রুটি তৈরি করবে function ফাংশনটি
ঠিকঠাক

আমি এই ফাংশনটি লিখেছি কারণ (1) এটি ব্যবহার করা অনেক সহজ এবং (২) ওয়ান-লাইনারটিকে বাস্তবায়ন নির্ভর বলে মনে হয়েছিল।
harrymc

-1

আমি মনে করি না আপনি এটি করতে পারেন। আপনাকে আবার অনুলিপি / অতীত করা দরকার।

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

অতএব, আপনি বিকল্প কমান্ড কল করার সময়, ব্যাকস্ল্যাশ উত্স থেকে ইতিমধ্যে অদৃশ্য হয়ে গেছে। কমান্ডটি পুনরায় কল করার চেষ্টা করুন ( !!)। ঠিক একই কমান্ড সহ মুদ্রণের পরিবর্তে c:\fooএটি ইতিমধ্যে প্রক্রিয়াজাত ব্যাকস্ল্যাশগুলি কমান্ডটি কার্যকর করবে যার ফলস্বরূপ c:foo

এবং স্পষ্টতই আপনি হারিয়ে যাওয়া চরিত্রটি খুঁজে পেতে বা প্রতিস্থাপন করতে পারবেন না। এমনটি করার চেষ্টা করলে ত্রুটি ঘটবে।


1
আমরা হব. এটি শেষ পর্যন্ত ভুল যেহেতু এই পরীক্ষাটি আসলে কাজ করে: তার echo c:\Fooপরে !!:gs,F,\\f,। কিন্তু ব্যাকস্ল্যাশ পালানোর বিকল্পটি নিজেকে ব্যথা বলে মনে হচ্ছে।
এ। লুইসু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.