আমি কি কোনও উলামের আদেশে যুক্তিগুলি পাস করতে পারি?


19

আমি জানতে চাই যে আমি কোনও ওরফে কমান্ড দিয়ে কোনও যুক্তিটি পাস করতে পারি কিনা।

উদাহরণ স্বরূপ:

alias d="dmesg|grep -iw usb|tail -5" 

এখন dশেষ 5 টি লাইন মুদ্রণ করবে। আমি যদি বিভিন্ন সংখ্যক লাইন মুদ্রণের জন্য ডি ব্যবহার করতে চাই, তবে আমাকে dআবার উলামের কমান্ড ঘোষণায় পরিবর্তন করতে হবে ।

আমি কোনও উপাধার ঘোষণাকে সংশোধন করতে পারি এমন কোনও উপায় আছে যাতে লাইনের সংখ্যা পরিবর্তন করতে আমাকে ঘোষণাপত্রটি টাইপ করতে না হয়। যুক্তি হিসাবে লাইন সংখ্যা পাস করার সাথে যুক্ত করার জন্য উপন্যাস ঘোষণার মতো d? নাকি এর সমাধানের জন্য আরও কিছু পদ্ধতি আছে?


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

উত্তর:


20

উপনামগুলি যুক্তি গ্রহণ করে না। উপনাম মতো alias foo='bar $1', $1শেল প্রথম যুক্তি শেল (যা সম্ভবত কিছুই নয়) যখন ওরফে চালানো হয় দ্বারা সম্প্রসারিত হবে।

সুতরাং: পরিবর্তে ফাংশন ব্যবহার করুন

d () {
  num=${1:-5}
  dmesg |grep -iw usb|tail -$num
}

num=${1:-5} এটি প্রদান না করা হলে 5 এর একটি ডিফল্ট মান সহ প্রথম যুক্তি ব্যবহার করে।

তারপরে আপনি এটি করতে পারেন:

$ d
# prints 5 lines
$ d 10
# prints 10 lines

অথবা, আপনি যদি কিছুটা বিকল্প ব্যবহার করেন তবে:

alias d="dmesg|grep -iw usb|tail -n 5"

তারপরে আপনি অতিরিক্ত -nবিকল্পগুলি পাস করতে পারেন :

$ d
# prints 5 lines
$ d -n 10
# prints 10 lines

যদি একাধিক -nবিকল্পের জন্য নির্দিষ্ট করা থাকে তবে tailকেবল সর্বশেষটি ব্যবহৃত হয়।


বৈশিষ্ট্যগুলি নিজেকে ভালো চ্যালেঞ্জ জন্য :) এটা কোথায় ফাংশন ... অর্থাত লাগাতে সংক্ষিপ্তভাবে অবস্থায় সহায়ক হতে পারে ~/.bashrcবা rc.localবা যেখানেই?
WinEunuuchs2Unix

@ WinEunuuchs2 ইউনিক্স যেখানেই উপনামটি রাখা হত।
মুরু

5

এসও এবং এখানে বর্ণিত হিসাবে এটির জন্য আপনার একটি ফাংশন থাকা দরকার । নিম্নলিখিত চেষ্টা করুন:

foo() { /path/to/command "$@" ;}

এবং এর fooসাথে কল করুন :

foo arg1 arg2 arg3

4

গ্রুপ কমান্ড এবং এখানে-স্ট্রিংয়ের সাথে ওরফে সীমাবদ্ধতার চারপাশে কাজ করা

উপাধিগুলি যুক্তি নিতে পারে না, তবে আমরা এটি "অনুকরণ" করতে পারি। এই প্রশ্নের আমার উত্তর উদাহরণস্বরূপ নিন ।

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'

মূল পয়েন্টগুলি যা এখানে ঘটছে:

  • readএকটি ভেরিয়েবলের স্ট্রিং পড়তে আমরা অন্তর্নির্মিত ব্যবহার করি d। যেহেতু আমরা ফাঁকা অক্ষর (নিউলাইন, ট্যাব, স্পেস) সহ একটি সম্পূর্ণ স্ট্রিং পড়তে চাই, তাই আমরা IFS=ব্যাকস্ল্যাশ পলায়নগুলি ব্যবহার করি এবং অক্ষম করি -r
  • <<<যা এখানে স্ট্রিং অপারেটর আমাদের উপন্যাসের পক্ষে যুক্তি হিসাবে যে কোনও স্ট্রিং সরবরাহ করে তা পুনর্নির্দেশের অনুমতি দেয় mkcd; ব্যবহার হিসাবে হবেmkcd "some directory"
  • ওরফে মধ্যে একাধিক কমান্ড মিলিত এবং ব্যবহার বর্তমান শেল মধ্যে মৃত্যুদন্ড কার্যকর করা হয় { list; }কাঠামো (যা হিসাবে পরিচিত হয় group commandbashম্যানুয়াল)। নোট করুন যে নেতৃত্বের পরে স্থান {এবং ;পৃথক কমান্ডের তালিকা প্রয়োজন।

আপনার নির্দিষ্ট উদাহরণে আমরা এটি করতে পারি:

alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'

স্পেস-বিভাজিত যুক্তিগুলি সঞ্চয় করতে আমরা শব্দ বিভাজন ব্যবহার করতে পারি:

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "arg1 arg2"
arg1
arg2

অথবা আমরা একাধিক যুক্তি সরবরাহ করতে অ্যারে ব্যবহার করতে পারি:

bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";}  <<< "arg1 arg2"
arg2
arg1

কিন্তু এই ভাল পদ্ধতির হয়?

অগত্যা। এই জাতীয় পদ্ধতির সমস্যাটি এটি খুব নির্দিষ্ট - আর্গুমেন্টগুলি সহজেই উদ্ধৃত করা যায় না যার অর্থ আমরা কেবল কোনও স্থান ছাড়াই আর্গুমেন্ট রাখতে পারি have

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "'arg1 with space' arg2"
'arg1
with space' arg2

এটি অবশ্যই এমন কিছু নয় যা বহুল ব্যবহৃত হবে, কেবল কারণ সত্যিকারের বিশ্বে আমাদের জটিল যুক্তিগুলি মোকাবেলা করতে হবে, সুতরাং এই পদ্ধতিটি বেশ ব্যবহারিক নয়। ফাংশনগুলি অনেক বেশি নমনীয়। আরগস স্ট্রিংয়ের উদ্ধৃতি দেওয়ার প্রয়োজনটি দ্রুত বিরক্তিকর হয়ে ওঠে।

সীমাবদ্ধতা থাকা সত্ত্বেও, এটি সরল স্ট্রিংগুলির সাথে আর্গুমেন্ট হিসাবে কাজ করে যেখানে আমরা শব্দ বিভাজনকে বহন করতে পারি, এভাবে আংশিকভাবে আমাদের উপাধিতে আর্গুমেন্ট দেওয়ার অনুমতি দেয়।

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