উত্তর:
উপাধি হ'ল কমান্ডের মতো যা তাদের কাছে সমস্ত আর্গুমেন্ট তারা যে প্রোগ্রামটির উপাধি দেয় সেটিকে যুক্তি হিসাবে পাস করা হয়। উদাহরণস্বরূপ, আপনি যদি উপনাম ls
হন ls -la
, তবে টাইপিং সত্যিই কমান্ড লাইনে কার্যকর ls foo bar
হবে ।ls -la foo bar
আপনি যদি আর্গুমেন্টগুলি ব্যাখ্যা করা হয় তার উপরে যদি আপনি সত্যিকারের নিয়ন্ত্রণ রাখতে চান তবে আপনি এর মতো একটি ফাংশন লিখতে পারেন:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "$@"
}
এলিয়াস সমাধান
আপনি যদি সত্যিই প্রতি সেফ কোনও ফাংশন ব্যবহারের বিপক্ষে হন তবে আপনি ব্যবহার করতে পারেন:
$ alias wrap_args='f(){ echo before "$@" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
আপনি যদি প্রথম যুক্তি চান তবে আপনি এটি প্রতিস্থাপন $@
করতে $1
পারেন।
ব্যাখ্যা
এটি একটি অস্থায়ী ফাংশন তৈরি করে f
, যা আর্গুমেন্টগুলি পাস করে।
এলিয়াস যুক্তিগুলি কেবল শেষে পাস করা হয়। নোট যেটি f
ওরফে একেবারে শেষে বলা হয় is
unset -f
সরিয়ে ফেলা হবে ওরফে যেমন ফাংশন সংজ্ঞা কার্যকর তাই এটি পরে ঘোরাঘুরি করে না।
wrap_args x y z
আমাকে দেয়: বাশ: অপ্রত্যাশিত টোকেনের কাছে সিনট্যাক্স ত্রুটি '('
f
এলিয়াস দিয়েছি । একবার যদি আমি ইলিয়ালিস্ট f
না করে থাকি তবে এটি ঠিকঠাক হয়ে যায়। পুরানো নামের সংঘর্ষের জিনিস।
command type f
:)
বর্তমান উত্তরের সাথে যুক্ত করে, এলিয়াসগুলি কীভাবে কাজ করে তা উপলব্ধি করার একটি গুরুত্বপূর্ণ বিষয় হ'ল যে কোনও এলিয়াসেট কমান্ডের পরে আপনি যে সমস্ত প্যারামিটারগুলি টাইপ করেন সেগুলি শেষ পর্যন্ত অক্ষরে অক্ষরে ব্যবহৃত হবে। সুতরাং দুটি কমান্ডের (পাইপযুক্ত বা না) জন্য উলাম ব্যবহার করার কোনও উপায় নেই, যার মধ্যে প্রথমটি পরামিতিগুলি ব্যাখ্যা করতে হবে। এটি পরিষ্কার করার জন্য, এখানে এমন একটি উদাহরণ যা প্রত্যাশা অনুযায়ী কাজ করবে না:
alias lsswp="ls -l | grep swp"
( এই প্রশ্নের দ্বারা অনুপ্রাণিত একটি উদাহরণ ) এটি সর্বদা বর্তমান ডিরেক্টরিতে ls -l
সম্পাদিত আউটপুটটি ব্যবহার করবে এবং তার উপর একটি গ্রেপ করবে - তাই ব্যবহার করে
lsswp / tmp /
সমান হবে ls -l | grep swp /tmp/
এবং না ls -l /tmp/ | grep swp
।
সমস্ত উদ্দেশ্যে যেখানে আর্গুমেন্টগুলি মাঝখানে কোথাও ব্যবহার করা উচিত, function
তার পরিবর্তে একটি ব্যবহার করা প্রয়োজন alias
।
আসলে আপনাকে কিছু করতে হবে না; উপাধিগুলি স্বয়ংক্রিয়ভাবে এটি করে। এই ক্ষেত্রে:
$ alias less="less -eirqM"
$ less foo.txt
আপনি foo.txt এর প্রথম পৃষ্ঠাটি দেখতে পাবেন এবং less
EOF (-e) এ প্রস্থান করবেন, অনুসন্ধানগুলি কেস-সংবেদনশীল (-i) ইত্যাদি হবে etc.
আমি সিএসএসের জবাব দিচ্ছি:
হ্যাঁ, আপনি এলিয়াসগুলিতে প্যারামিটারগুলি ব্যবহার করতে পারেন এবং - উপরে যা বলা হয়েছে তার পার্থক্য হিসাবে - আপনি কেবলমাত্র তার শেষের দিকেই নয় - উপন্যাসের সংজ্ঞায় যে কোনও জায়গায় উল্লেখ করতে পারেন।
টার-জিজেড-উইংয়ের জন্য উদাহরণ:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
, যেখানে !:1
এবং !:2
আপনার উপনামটি কল করার সময় আপনি যে পরামিতিগুলি সরবরাহ করবেন।
ব্যবহারের উদাহরণ:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
যার কার্যকরভাবে অর্থ হ'ল আপনি দুটি পরামিতি ব্যবহার করেছেন যা আপনি টার কমান্ডের স্বেচ্ছাসেবী জায়গায় সন্নিবেশ করিয়েছিলেন এবং এগুলি সমস্তকে একটি উপাধি বানিয়েছেন tgz
sh
সংজ্ঞায়িত করা হয়my_program_wrapper() { ...; }
। বাশ কীওয়ার্ডটি পরিচালনা করেfunction
তবে আরও বহনযোগ্য কীসের সাথে যান না?