একটি উপাধিতে পরামিতি কীভাবে পাস করবেন?


64

বাশ স্ক্রিপ্টের জন্য, আমি "$@"আর্গুমেন্ট অ্যাক্সেস করতে ব্যবহার করতে পারি । আমি যখন কোনও নাম ব্যবহার করি তখন এর সমতুল্য কী?

উত্তর:


50

উপাধি হ'ল কমান্ডের মতো যা তাদের কাছে সমস্ত আর্গুমেন্ট তারা যে প্রোগ্রামটির উপাধি দেয় সেটিকে যুক্তি হিসাবে পাস করা হয়। উদাহরণস্বরূপ, আপনি যদি উপনাম 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 "$@"
}

3
opengroup.org/onlinepubs/009695399/utilities/… এর কার্যকারিতা shসংজ্ঞায়িত করা হয় my_program_wrapper() { ...; }। বাশ কীওয়ার্ডটি পরিচালনা করে functionতবে আরও বহনযোগ্য কীসের সাথে যান না?
প্রথম

2
@Phemient খুব সত্য আমার অর্থ এই যে, সকলেই জিএনইউ ব্যাশ ব্যবহার করে, নগ্নপণিগুলি পসিক্স শেলটি নয়।
অ্যাম্ফটামাচাইন

21

এলিয়াস সমাধান

আপনি যদি সত্যিই প্রতি সেফ কোনও ফাংশন ব্যবহারের বিপক্ষে হন তবে আপনি ব্যবহার করতে পারেন:

$ 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সরিয়ে ফেলা হবে ওরফে যেমন ফাংশন সংজ্ঞা কার্যকর তাই এটি পরে ঘোরাঘুরি করে না।


Humm? wrap_args x y zআমাকে দেয়: বাশ: অপ্রত্যাশিত টোকেনের কাছে সিনট্যাক্স ত্রুটি '('
উপবৃত্তাকার দর্শন

@ এলিপিক্যালভিউ হুঁ, কপি পেস্ট ইস্যু? 4.4.12 বাশ-এ কাজ করার বিষয়টি নিশ্চিত করেছেন।
টম হেল

1
আমি fএলিয়াস দিয়েছি । একবার যদি আমি ইলিয়ালিস্ট fনা করে থাকি তবে এটি ঠিকঠাক হয়ে যায়। পুরানো নামের সংঘর্ষের জিনিস।
উপবৃত্তাকার দর্শন

command type f:)
টম হেল

1
মহান! এটাই সবচেয়ে অলস রূপ!
সার্জিয়াস

19

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

alias lsswp="ls -l | grep swp"

( এই প্রশ্নের দ্বারা অনুপ্রাণিত একটি উদাহরণ ) এটি সর্বদা বর্তমান ডিরেক্টরিতে ls -lসম্পাদিত আউটপুটটি ব্যবহার করবে এবং তার উপর একটি গ্রেপ করবে - তাই ব্যবহার করে

lsswp / tmp /

সমান হবে ls -l | grep swp /tmp/ এবং না ls -l /tmp/ | grep swp

সমস্ত উদ্দেশ্যে যেখানে আর্গুমেন্টগুলি মাঝখানে কোথাও ব্যবহার করা উচিত, functionতার পরিবর্তে একটি ব্যবহার করা প্রয়োজন alias


15

আসলে আপনাকে কিছু করতে হবে না; উপাধিগুলি স্বয়ংক্রিয়ভাবে এটি করে। এই ক্ষেত্রে:

$ alias less="less -eirqM"
$ less foo.txt

আপনি foo.txt এর প্রথম পৃষ্ঠাটি দেখতে পাবেন এবং lessEOF (-e) এ প্রস্থান করবেন, অনুসন্ধানগুলি কেস-সংবেদনশীল (-i) ইত্যাদি হবে etc.


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

1
@ জেজেডি যিনি আপনার প্রশ্নের উত্তর দিয়েছেন তিনি সঠিক: আপনি একটি উচ্ছল নয়, সেক্ষেত্রে একটি ফাংশন চান। যেহেতু এই প্রশ্নের গৃহীত উত্তরটি মূলত একই, তাই আপনার প্রশ্নটি যথাযথভাবে বন্ধ ছিল।
ওয়ারেন ইয়ং

1

আমি সিএসএসের জবাব দিচ্ছি:

হ্যাঁ, আপনি এলিয়াসগুলিতে প্যারামিটারগুলি ব্যবহার করতে পারেন এবং - উপরে যা বলা হয়েছে তার পার্থক্য হিসাবে - আপনি কেবলমাত্র তার শেষের দিকেই নয় - উপন্যাসের সংজ্ঞায় যে কোনও জায়গায় উল্লেখ করতে পারেন।

টার-জিজেড-উইংয়ের জন্য উদাহরণ:

$ 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

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