আমি কীভাবে একই যুক্তি ব্যবহার করে একাধিক কমান্ড কার্যকর করব?


16

আমি অবাক হয়েছি যে উবুন্টু টার্মিনালে যেমন চেইন অ্যাকশন করা সম্ভব:

action 1 on objectA . then action 2 on objectA 

অবজেক্টএ-এর নাম আর পুনরাবৃত্তি না করে।

উদাহরণ:

touch file.js && openEditor "$1" 

বা এই জাতীয় কিছু।


এটি করার প্রচুর উপায় রয়েছে তবে এটি আপনার প্রয়োজনের উপর নির্ভর করে। আসলে কি? একটি নথি ? আমরা কী কর্মের কথা বলছি?
সের্গেই কলডিয়াজন্য

ধন্যবাদ, সাধারণত একটি ফাইল কার্যকরভাবে, একটি
ফোল্ডারও

3
এখানে, &ব্যাকগ্রাউন্ডে "টাচ" কমান্ড প্রেরণ করবে। যদি আপনি "স্পর্শ সফল হন তবে সম্পাদকটি খুলুন" ইচ্ছে &&করে আপনি তার পরিবর্তে চান
গ্লেন জ্যাকম্যান

আপনি কেন এই পোস্টে ধাক্কা খাচ্ছেন? আপনি ইতিমধ্যে প্রচুর উত্তর পেয়েছেন এবং একটি গ্রহণও করেছেন।
মুরু

উত্তর:


27

বাশের ইতিহাস সম্প্রসারণের সাহায্যে আপনি বর্তমান কমান্ড লাইনের নবম শব্দটি !#:nউদাহরণ ব্যবহার করে উল্লেখ করতে পারেন

$ touch foobar && ls -l !#:1
touch foobar && ls -l foobar
-rw-rw---- 1 steeldriver steeldriver 0 Jun 20 14:54 foobar

$ touch foo bar && ls -l !#:2
touch foo bar && ls -l bar
-rw-rw-r-- 1 steeldriver steeldriver 12 Jun 20 14:58 bar

আমি জিজ্ঞাসা করতে পারি, আপনি কোন বাশ সংস্করণটি ব্যবহার করছেন?
সের্গেই কোলোডিয়াজনি

@ GNU bash, version 4.3.48(1)-release
সার্জিইক্লোডিয়াজনি

5
আপনি শব্দের একটি ব্যাপ্তিও নির্ধারণ করতে পারেন :touch foo bar && ls -l !#:1-2
গ্লেন জ্যাকম্যান

1
@ হাইকো_ !চরিত্রটি ইতিহাসের এক্সপ্রেশন এক্সপ্রেশনটি পরিচয় করে যখন আপনি একটি ইন্টারেক্টিভ শেলটিতে থাকেন - এটি টাইপ করার সাথে সাথে-অন-দ্য ফ্লাইট কমান্ড লাইন ম্যানিপুলেশনের জন্য, এবং অ-ইন্টারেক্টিভ স্ক্রিপ্টগুলির মধ্যে অক্ষম করা হয়েছে
স্টিল্ড্রাইভার

1
@ হোকো_ একটি স্ক্রিপ্টে আপনার জানা উচিত যে যুক্তিটি সময়ের আগে কী - তাই উদাহরণস্বরূপ আপনি কেবল করতে পারতেনarg1=file.js; touch "$arg1" && openEditor "$arg1"
স্টিল্ড্রাইভার

12

সাধারণ ব্যবহারের ক্ষেত্রে একটি সহজ শর্টকাট রয়েছে। আপনার উদাহরণে আপনি করছেন:

$ touch file.js
$ openEditor <alt>+<.>

দ্বিতীয় কমান্ডে, কৌশলটি হ'ল openEditor(তার পরে একটি স্থান সহ) লিখে Alt+ করা হবে .। এটি শেষ কমান্ডের সর্বশেষ যুক্তি সন্নিবেশ করবে যা এটি । (যদি এটি কোনও কারণে কাজ না করে তবে কাজ করা উচিত))file.jsAltEsc

যেহেতু প্রায়শই "অবজেক্ট" হ'ল পূর্ববর্তী কমান্ডের শেষ যুক্তি, তাই এটি ঘন ঘন ব্যবহার করা যায়। এটি মনে রাখা সহজ এবং আপনার স্বজ্ঞাতভাবে ব্যবহৃত শেল শর্টকাটগুলির সেটগুলিতে দ্রুত সংহত করবে।

এটির সাথে আপনি করতে পারেন এমন সামগ্রীর গুচ্ছ রয়েছে, সম্ভাব্যতা সম্পর্কে এখানে একটি গভীর নিবন্ধ রয়েছে: /programming/4009412/how-to-use-arguments-from-pre स्पष्ट- command

বোনাস হিসাবে এটি কেবল ব্যাশে নয়, সমস্ত প্রোগ্রামগুলিতে কাজ করবে যা কমান্ড লাইন ইনপুট প্রসেসিংয়ের জন্য লাইব্রেডলাইন ব্যবহার করে।


2
আপনি একটি সঙ্গে এই একত্রিত করতে পারেন অঙ্ক যুক্তি , যেমন দ্বিতীয় যুক্তি হোল্ড পেতে Altএবং প্রেস 2.(অথবা Esc, 2, Esc, .), গত যুক্তি প্রেস দ্বিতীয় পেতে Alt+ + -, টাইপ 2এবং প্রেস Alt+ + .(অথবা Esc, -2, Esc, .)।
মিষ্টান্ন

@ ডিজিটার আমি যদি চালাতে চাই তবে একের বেশি যুক্তি চাই? উদাহরণস্বরূপ আমি চালাতে echo 1 2 3 4চাই 2এবং 3পরবর্তী কমান্ডের জন্য
wjandrea

@ ডেজার্ট এটি নিজেই খুঁজে পেয়েছি! জায়গাগুলির মতো আপনাকে কেবল তাদের মধ্যে কিছু অন্য টাইপ করতে হবে। এগুলিকে যুক্ত করে তুলতে, সবচেয়ে সহজ উপায় হল স্পেস টাইপ করা তারপরে ব্যাকস্পেস।
wjandrea

1
@wjandrea হোল্ড Altলিখুন 2., spacebar টিপুন, হোল্ড Altলিখুন 3.- আপনি একটি সীমার চান, ব্যবহার ইতিহাস সম্প্রসারণ: !!:2-3
মিষ্টি

9

ডিফল্ট ইন্টারেক্টিভ শেল bashএবং স্ক্রিপ্টিং শেল যতদূর dashযায়, আপনি শেষ কমান্ডের সর্বশেষ যুক্তিটি$_ পুনরুদ্ধার করতে ব্যবহার করতে পারেন ।

$ echo "Hello World"; echo same "$_"
Hello World
same Hello World

csh এবং tcsh এর ইতিহাস উল্লেখ রয়েছে, বিশেষত কমান্ডের শেষ শব্দটির জন্য, আপনি ব্যবহার করতে পারেন !$এবং পৃথক যুক্তিগুলির জন্য - !:<index>:

~% echo foo bar
foo bar
~% echo !$
echo bar
bar

% echo bar baz
bar baz
% echo !:1
echo bar
bar

সাধারণভাবে, objectAভেরিয়েবলের যা কিছু থাকে তা নির্ধারণ করা এবং এটি একাধিক কমান্ড, লুপ ইত্যাদিতে ব্যবহার করা বিকল্প হিসাবে, কোনও ফাংশন একটি পছন্দ হতে পারে:

$ foo(){ echo "$@"; stat --print="%F\n" "$@";}
$ foo testdir
testdir
directory

1
আমি ঠিক উল্লেখ করতে চাই যে ইতিহাসে কমান্ডটি সংরক্ষণের আগে উত্তর প্রসারিত হওয়ার $_চেয়ে কিছুটা আলাদাভাবে কাজ করে !#:n। সুতরাং ইতিহাসে ফিরে যাওয়ার পরেও কমান্ডটি প্রদর্শিত হবে $_যখন !#:nএর আসল মানটির সাথে প্রতিস্থাপন করা হত। উভয়েরই তাদের পক্ষে মতামত রয়েছে cons
ড্যান

3
এছাড়াও, যথারীতি, $_উদ্ধৃত করা উচিত, অন্যথায় এটি বিভক্ত হয়ে যায় এবং অন্যান্য কিছুর মতো গ্লোবড হয়। (আমরা কেবল এটি এখানে দেখতে পাচ্ছি না কারণ echoএটির যুক্তিগুলি একটি একক স্থানের সাথে যোগ দেয়)) তবে উদাহরণস্বরূপ touch "hello there"; ls -l $_ কাজ করবে না।
ইলক্কাচু

1
@ ড্যান আমি মনে করি যে এর মধ্যে সবচেয়ে বড় সমর্থক $_হ'ল এটি পোর্টেবল। সর্বোপরি, !#:nবাশ-নির্দিষ্ট।
সের্গেই কোলোডিয়াজনি

3

আমি স্টিলড্রাইভারের উত্তরে প্রদত্ত ইতিহাস পদ্ধতির বিরুদ্ধে সুপারিশ করব । এটি বিশ্বব্যাপী রাষ্ট্রের উপর নির্ভর করে, যা সর্বদা ভঙ্গুর।

যথাযথ ভেরিয়েব ব্যবহার করে সমস্ত প্রয়োজনীয় কমান্ডের উপর লুপকে সামনে আনা আরও ভাল:

$ for c in touch gedit; do $c foo.txt; done

সাধারণভাবে যে সমস্যাটি হ'ল তা হ'ল বাশ কোনও ব্যর্থতা দেখা দেয় না, অর্থাত্ এটি touch foo.txt; gedit foo.txtশৃঙ্খলার পরিবর্তে এর মতো আচরণ করে &&। সুতরাং, নিরাপদ থাকতে আপনি একটি যুক্ত করতে পারেন break:

$ for c in touch gedit; do $c foo.txt || break; done

1

ওয়ান-লাইনার রান্না করার সময় আমি কখনও কখনও আমার পুনরাবৃত্ত জিনিসটি শেল ভেরিয়েবলের সাথে অর্পণ করি যা আমি কমান্ডে একাধিকবার ব্যবহার করি। কার্সারটির কাছাকাছি পেতে আপ-তীর, নিয়ন্ত্রণ + ক, নিয়ন্ত্রণ + ডান-তীর সহ একটি পৃথক আরগ ব্যবহার করতে আমি এটি পুনরায় স্মরণ করতে এবং সম্পাদনা করতে পারি t=

t=testloop; asm-link -d "$t.asm" && perf stat -r2 ./"$t"

নোট করুন যে এটি কোনও এক্সটেনশান, বা নামের ক্ষেত্রে কোনও প্রকরণকে মোকাবেলা করা সহজ করে তোলে।

আরও মনে রাখবেন যে ;ভেরিয়েবল অ্যাসাইনমেন্টের পরে আমার একটি দরকার , কারণ var=value cmdএই কমান্ডের জন্য কেবল পরিবেশের পরিবর্তনশীল হিসাবে সেট করে, এবং শেল প্রসঙ্গে প্রভাবিত করে না।

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