শেল ওরফে কমান্ড লাইন আর্গুমেন্ট কীভাবে পাস করবেন?


288

কমান্ড লাইন যুক্তিটি আমি কীভাবে একটি উপাধিতে পাস করব? এখানে একটি নমুনা দেওয়া হল:

ওরফে এমকেসিডি = 'এমকেডির $ 1; সিডি $ 1; '

তবে এক্ষেত্রে $ xx রান-টাইমে নয় বরং উলামে তৈরির সময় অনুবাদ করা হচ্ছে। আমি অবশ্য নীচের মত শেল ফাংশন (কিছুটা গুগল করার পরে) ব্যবহার করে একটি কার্যনির্বাহ তৈরি করেছি:

ফাংশন এমকেসিডি () {
  mkdir $ 1
  সিডি $ 1
}

কেবলমাত্র জানতে চেয়েছিলেন যে সিএল প্যারামিটারগুলি গ্রহণ করে এমন এলিয়াসগুলি তৈরি করার কোনও উপায় আছে কিনা।
বিটিডাব্লু - আমি আমার ডিফল্ট শেল হিসাবে 'ব্যাশ' ব্যবহার করি।



2
ও / টি তবে এমকেসিডি ফাংশন করার বিকল্প হিসাবে আপনি লিখতে পারেনmkdir mydirectoryname && cd $_
মোয়ালা

উত্তর:


174

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


.bashrcফাইলে এলিয়াস তৈরি করার সময় আপনার ফাংশনগুলির প্রয়োজন নেই । উদাহরণস্বরূপ # এমন একটি উপাধি তৈরি করুন যা ব্যবহারকারীর নাম দ্বারা সার্ভ = "পাইথন-এম সিম্পিটিএইচটিটিপিএস সার্ভার $ 1" দ্বারা পোর্ট-নম্বর নেয়, নিশ্চিত করুন যে আপনি নীচের কমান্ডটি প্রবেশ করেছেন। । $ উত্স .bashrc আপনি
এটির

8
@ Kaizer1v, CentOS7.3 বাশ সংস্করণ 4.2.46 এ আমার পর্যবেক্ষণ হ'ল আপনার পরামর্শটি যেমন মনে করেন তেমন কার্যকর হয় না। যেহেতু আপনি ডাবল কোট ব্যবহার করছেন an 1 আসলে একটি খালি স্ট্রিংয়ের জন্য মূল্যায়ন করা হচ্ছে এবং উলামের নামটি হ'ল ওরফে সার্ভ = "পাইথন-এম সিম্পিটিএইচটিপিএসবার" হিসাবে সমান এবং সুতরাং যে উপনামের পরে আপনি যা যা পাস তা হ'ল কমান্ড লাইনে পাস করা হয়। যদি আপনি এই সেটটি -x চেষ্টা করেন; ওরফে পরিবেশন = "অজগর-মি সিম্পলএইচটিটিপিএস সার্ভার $ 1 &" আপনি ত্রুটি / সমস্যা দেখতে পাবেন। আপনার আর্গুমেন্ট এবং ওরফে কমান্ড উভয়ই পৃথক কমান্ড হিসাবে চালিত হয়।
প্যাটস

279

শুধু পুনরাবৃত্তি করতে অন্য শেল জন্য পোস্ট করা হয়েছে, এর মধ্যে ব্যাশ নিম্নলিখিত কাজগুলো করেনঃ

alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'

নিম্নলিখিত চলমান:

blah one two

নীচে আউটপুট দেয়:

First: one
Second: two

4
দুর্দান্ত সমাধান। ব্যাশ আভিজাত্য থেকে কিছু প্রশ্ন: ফাংশনটির নামকরণ কি কোনও আন্ডারস্কোর (বা অন্যথায় আলাদাভাবে) করা উচিত বা এটি কেবল পাঠযোগ্যতার জন্য? "; _ব্লাহ" ফাংশনটি সংজ্ঞায়িত করার পিছনে উদ্দেশ্য কী? Single 1 এর আশেপাশে কোটের প্রয়োজন হয় না এমন এমন কিছু করার পরেও কেন একক উদ্ধৃতি ($ 1 এর সঠিক ব্যাখ্যা করা যায় না) এর জায়গায় ডাবল কোট ব্যবহার করার পরে কেন এটি কাজ করে না? উপদেশের জন্য অগ্রিম ধন্যবাদ. আমার একটি কার্যনির্বাহী সমাধান রয়েছে তবে এটি কেন কাজ করে তা সম্পর্কে সবসময় আরও বুঝতে চাই।
mynameispaulie

4
@mynameispaulie ফাংশনটির যে কোনও নাম রাখা যেতে পারে। নামের সংঘর্ষ রোধে সহায়তা করার জন্য এটি একটি সাধারণ কৌশল হিসাবে আমি একটি আন্ডারস্কোর উপসর্গ ব্যবহার করেছি (অর্থাত্ একই নামের সাথে অন্য একটি ফাংশন)
টমাস ব্র্যাট

6
@mynameispaulie ডাবল উদ্ধৃতিগুলি Bashপ্রতিস্থাপন করার অনুমতি দেয় $1এবং $2পরামিতিগুলি কার্যক্রমে প্রেরণ করা হয়। একক উদ্ধৃতি বাশকে এটি না করতে বলে।
থমাস ব্র্যাট

5
আমি এই উপনাম / ফাংশন কম্বো অনুলিপিটি / অনেকগুলি আটকানো দেখছি, তবে এটি কোনও কার্যকর উদ্দেশ্য হিসাবে উপস্থিত বলে মনে হচ্ছে না। স্ট্যান্ডার্ড পদ্ধতির হ'ল ফাংশনটি একবারে সংজ্ঞায়িত নাম দিয়ে সংজ্ঞায়িত করা হবে এবং তার কোনও নাম নেই।
ট্রিপলি

16
এটি কীভাবে বেশি পছন্দ করা হয় তা দেখতে আমি ব্যর্থ হয়েছিfunction blah(){ echo "First: $1"; echo "Second: $2"; }
রেনি নেইফেনিগার

57

আপনি ksh এ পারবেন না, তবে আপনি csh এ পারবেন।

alias mkcd 'mkdir \!^; cd \!^1'

Ksh এ, ফাংশনটি হ'ল উপায়। তবে আপনি যদি সত্যিই উপনামটি ব্যবহার করতে চান:

alias mkcd='_(){ mkdir $1; cd $1; }; _'

একটি আকর্ষণীয় পার্শ্ব নোট হিসাবে, আমি মনে করি যে প্রত্যেকে সম্প্রতি যে রিমোট কোড প্রয়োগের দুর্বলতার কথা বলছে তাতে প্রায় একই জিনিস করা জড়িত তবে একটি পরিবেশে পরিবর্তনশীল কাঁচা ব্যবহারকারী ইনপুট দ্বারা সেট করা থাকে। openwall.com/lists/oss-security/2014/09/24/11
ফ্ল্লোজিপোকি

@ ফ্লাইজিপোকি - কারণ এটি একটি উপাধিতে এবং কোনও এনভির ভারে নয়, এটির চেয়ে আলাদা। শেলশক ইস্যুগুলি হ'ল এনভ ভার্চ সেট হয়ে গেলে এটি চলে। একটি এনভির ভার সেট করা একটি নিরাপদ অপারেশন বলে মনে করা হচ্ছে। উপরের উপনামটি সেট করা থাকলে কোনও স্ক্রিপ্ট সঞ্চালিত হয় না, কেবল তখনই যখন নামটি চালানো হয়।
সানজায়া

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

17

বাশ ম্যান পৃষ্ঠাটি উদ্ধৃত করতে:

প্রতিস্থাপন পাঠ্যে আর্গুমেন্ট ব্যবহার করার কোনও ব্যবস্থা নেই। যদি আর্গুমেন্টগুলির প্রয়োজন হয়, একটি শেল ফাংশন ব্যবহার করা উচিত (নীচে FUNCTIONS দেখুন)।

সুতরাং দেখে মনে হচ্ছে আপনি নিজের প্রশ্নের উত্তর দিয়েছেন - একটি উপাধার পরিবর্তে কোনও ফাংশন ব্যবহার করুন



5

আমি দেখেছি যে ফাংশনগুলি ~/.cshrcফাইলে লেখা যায় না । এখানে ওরফে যা আর্গুমেন্ট গ্রহণ করে

উদাহরণস্বরূপ, আর্গুমেন্টগুলি 'ফাইন্ড' কমান্ডে প্রেরণ করা হয়েছে

alias fl "find . -name '\!:1'"     
Ex: >fl abc

যেখানে abc আর্গুমেন্ট হিসাবে পাস হয়!: 1


4
এটি ওপির পক্ষে কার্যকর নয়, যার ডিফল্ট শেল বাশ ash এবং সানজায়া আর এর উত্তরটিতে 4 বছর আগে csh এলিয়াসের উল্লেখ করা হয়েছিল।
কিথ থম্পসন

1
সানজায়া আর এর উত্তরটি !:1বোঝাতে পারেনি । আমাকে এখানে নীচে স্ক্রোল করতে হয়েছিল যে এটি ছিল তর্ক। একটি ভাল উত্তর আরও প্রশ্ন ছেড়ে যায় না, এমনকি যদি এটি ওপিএস শেল ধরণের নাও হয়।
searchengine27

4

সবচেয়ে সহজ উপায়, ফাংশনটি ওরফে নয় ব্যবহার করা। আপনি এখনও ক্লায়েন্ট থেকে যে কোনও সময় কল করতে পারেন। ব্যাশে, আপনি কেবল ফাংশন নাম () {কমান্ড add যুক্ত করতে পারেন এটি একটি উপামের মতোই লোড করে।

function mkcd() { mkdir $1; cd $1 ;}

অন্যান্য শেল সম্পর্কে নিশ্চিত নয়


2

বাইশ অ্যালিয়াসের সাথে আপনি যা চান তা আসলে করতে পারবেন না, যেহেতু এলিয়াস স্থির থাকে। পরিবর্তে, আপনি তৈরি করা ফাংশনটি ব্যবহার করুন।

আরও তথ্যের জন্য এখানে দেখুন: http://www.mactips.org/archives/2008/01/01/increase-productivity-with-bash-aliases-and-funitions/ । (হ্যাঁ আমি জানি এটি mactips.org, তবে এটি বাশ সম্পর্কে, তাই চিন্তা করবেন না))


1

এটি ksh এ কাজ করে:

$ alias -x mkcd="mkdir \$dirname; cd \$dirname;"
$ alias mkcd
mkcd='mkdir $dirname; cd $dirname;'
$ dirname=aaa 
$ pwd
/tmp   
$ mkcd
$ pwd
/tmp/aaa

"-X" বিকল্পটি উপনামটিকে "রফতানি" করে - উপন্যাসটি সাবশেলগুলিতে দৃশ্যমান।

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



-2

পাইথন ব্যবহার করে এখানে একটি সাধারণ উদাহরণ ফাংশন। আপনি ~ / .bashrc এ আটকে থাকতে পারেন
আপনার প্রথম বাম কোঁকড়ানো বন্ধনীটির পরে স্থান
থাকতে হবে ভেরিয়েবল প্রতিস্থাপনের জন্য পাইথন কমান্ডের ডাবল কোট থাকতে হবে
শেষে সেমিকোলনটি ভুলে যাবেন না

ফাংশন গণনা () x পাইথন-সি "এক্সরেঞ্জে নম্বরের জন্য ($ 1): প্রিন্ট নাম্বার";}

$ count 6
0
1
2
3
4
5
$

-4

একটি খালি ওরফে তার আরগগুলি কার্যকর করবে:

alias DEBUG=

12
আমি আপনার প্রতিনিধি দ্বারা দেখছি যে আপনি এসও (স্ট্যাক ওভারফ্লো) এ নতুন। আপনার উত্তর নিচে ভোট দিয়ে হতাশ করবেন না দয়া করে। এটিকে ভোট দেওয়া হয়েছে কারণ এটি ওপি (অরিজিনাল পোস্টার) যে প্রশ্নের উত্তর দিতে বলেছে তা সত্যই উত্তর দেয় না। তাদের সাথে থাকুন এবং চেষ্টা চালিয়ে যান। উত্তর দেওয়ার সময়, আপনার উত্তর কীভাবে কাজ করে তার একটি সাধারণ উদাহরণ অন্তর্ভুক্ত করার চেষ্টা করুন এবং আউটপুটটি দেখান। এটি আপনার উত্তর কীভাবে কাজ করে তা অন্যদের দেখতে সহায়তা করবে।
প্যাটস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.