একটি বাশ ওরফে তৈরি করুন যা পরামিতি নেয়?


1269

আমি CShell ব্যবহার করতাম (), যা আপনাকে এমন একটি উপাধি তৈরি করতে দেয় যা পরামিতি নেয়। স্বরলিপি কিছু ছিল

alias junk="mv \\!* ~/.Trash"

বাশে, এটি কাজ করবে বলে মনে হয় না। বাশের অনেকগুলি দরকারী বৈশিষ্ট্য রয়েছে তা দেওয়া, আমি ধরে নেব যে এটি কার্যকর করা হয়েছে তবে আমি কীভাবে তা ভাবছি।



2
নিশ্চিত হয়ে নিন যে আপনি "$1"
অর্গগুলির

এই প্রশ্নটি এসও-এর পক্ষে অফ-টপিক। এটি ইউনিক্স.এস.এস. তে জবাব দেওয়া হয়েছিল , এবং উত্তরটি হ'ল আপনাকে বিরক্ত করার দরকার নেই: "উদাহরণস্বরূপ, আপনি যদি উপনাম lsহন ls -laতবে টাইপিং সত্যিই কমান্ড লাইনে কার্যকর ls foo barহবে " exec ls -la foo bar
ড্যান ড্যাসক্লেস্কু

7
এটি কোনও স্ট্রিংয়ের মাঝামাঝি সময়ে কোনও ভেরিয়েবলকে বিভক্ত করতে সহায়তা করবে না
ফ্রান্সজ সিটাম্পালাম

1
এই লিল পরীক্ষা ওরফে আমি এই alias test_args="echo PREFIX --$1-- SUFFIX"test_args ABCDPREFIX ---- SUFFIX ABCD
ফাঁকটি

উত্তর:


2121

বাশ ওরফে সরাসরি পরামিতি গ্রহণ করে না। আপনাকে একটি ফাংশন তৈরি করতে হবে।

aliasপ্যারামিটারগুলি গ্রহণ করে না তবে একটি ফাংশনকে একটি উপামের মতো বলা যেতে পারে। উদাহরণ স্বরূপ:

myfunction() {
    #do things with parameters like $1 such as
    mv "$1" "$1.bak"
    cp "$2" "$1"
}


myfunction old.conf new.conf #calls `myfunction`

যাইহোক, আপনার .bashrcএবং অন্যান্য ফাইলগুলিতে সংজ্ঞায়িত বাশ ফাংশনগুলি আপনার শেলের মধ্যে কমান্ড হিসাবে উপলব্ধ। উদাহরণস্বরূপ আপনি আগের ফাংশনটি এভাবে কল করতে পারেন

$ myfunction original.conf my.conf

48
আমার উক্তিটি $1মুড়ে ফেলা উচিত?
জর্জেন পল

263
এমনকি আপনার উপনামটিও ঘোষণা করতে হবে না। শুধু ফাংশন সংজ্ঞায়িত করতে হবে।
ডিনিগো

206
যদি আপনি কোনও ফাংশনে কোনও উপাধি পরিবর্তন করে থাকেন sourceতবে আপনার .bashrc এঞ্জিং করলে ফাংশনটি যুক্ত হবে তবে এটি পুরানো উপনামটি আনালিয়াস করবে না। যেহেতু এলিয়াসগুলি ফাংশনগুলির চেয়ে উচ্চতর নজির, এটি উপনামটি ব্যবহার করার চেষ্টা করবে। আপনাকে হয় নিজের শেলটি বন্ধ করে আবার খুলতে হবে, না হলে কল করতে হবে unalias <name>। আমি সবে যে 5 মিনিট নষ্ট করেছি তা সম্ভবত আমি কাউকে বাঁচাব।
মার্টি নিল

55
@ মার্টিননিয়েল: আমি একটি সময় সাশ্রয় করার কৌশলটি সূর্যের সময়ে শিখেছি হ'ল এটি করা exec bash: এটি একটি নতুন শেল শুরু করবে, আপনাকে আপনার কনফিগারগুলি সম্পর্কে পরিষ্কার পাঠ দেবে, ঠিক যেমন আপনি বন্ধ এবং পুনরায় খোলা হয়েছে, তবে সেই অধিবেশনের পরিবেশ পরিবর্তনশীল সেটিংসকেও রাখছেন । এছাড়াও, bashএক্সেক ছাড়া কার্যকর করা কার্যকর হতে পারে যখন আপনি হ্যান্ডেল করতে চান স্ট্যাকের মতো চিন্তা করে।
ম্যাকনিল শোনলে

21
@ মিচ - হ্যাঁ, সর্বদা উদ্ধৃতিগুলিতে ব্যাশ ভেরিয়েবল রাখুন। যেমন mv "$1" "$1.bak"। উদ্ধৃতিবিহীন, যদি $ 1 "হ্যালো ওয়ার্ল্ড" হয়, আপনি তার mv hello world hello world.bakপরিবর্তে সম্পাদন করবেন mv "hello world" "hello world.bak"
ওরিওন এলিজিল

208

উপরের উত্তরটিকে পরিমার্জন করে, আপনি অন্যান্য লেখনীর জন্য 1 লাইনের সিনট্যাক্স পেতে পারেন যা শেল বা .bashrc ফাইলগুলিতে অ্যাড-হক সংজ্ঞাগুলির জন্য আরও সুবিধাজনক:

bash$ myfunction() { mv "$1" "$1.bak" && cp -i "$2" "$1"; }

bash$ myfunction original.conf my.conf

ডান-বন্ধনী বন্ধ করার আগে আধা-কোলনটি ভুলে যাবেন না। একইভাবে, আসল প্রশ্নের জন্য:

csh% alias junk="mv \\!* ~/.Trash"

bash$ junk() { mv "$@" ~/.Trash/; }

বা:

bash$ junk() { for item in "$@" ; do echo "Trashing: $item" ; mv "$item" ~/.Trash/; done; }

3
আমি এই উত্তরটিকে অগ্রাধিকার দিচ্ছি, কারণ এটি আসতে পারে এমন আর্গুমেন্টের অ্যারে দিয়ে পুনরাবৃত্তি দেখায় $ 1 এবং। 2 কেবলমাত্র বিশেষ কেস, যা এই উত্তরে চিত্রিতও হয়েছে।
ফিলো ভাইভারো

16
পরিবর্তন mv "$1" "$1.bak"; cp "$2" "$1" মধ্যে mv "$1" "$1.bak" && cp "$2" "$1"আপনার ডেটা না হারান যখন mvকষ্ট রান (যেমন, ফাইল সিস্টেম সম্পূর্ণ)।
হেন্ক ল্যাঙ্গভেল্ড

3
"ডান-বন্ধনী বন্ধ করার আগে আধা-কোলনটি ভুলে যাবেন না।" অনেকবার এই! ধন্যবাদ :)
कौशल মোদী

এবং প্রথম বন্ধনীটির পরে এবং শেষ বন্ধনীটির আগে ফাঁকা স্থানগুলিও প্রয়োজনীয়।
ব্রায়ান চ্যাপেল

1
@ হেনকলেঙ্গেলভেল্ড আপনার মন্তব্য পুরোপুরি সঠিক হলেও এটি দেখায় যে আপনি কিছুক্ষণের জন্য রয়েছেন - আমি কখনই জানতে পারি না যখন আমি শেষবার "ডিভাইসে কোনও স্থান অবশিষ্ট রাখিনি" ত্রুটির মুখোমুখি হয়েছিল ;-)। (আমি এটি নিয়মিতভাবে ব্যবহার করি যদিও আমি যখন রান্নাঘরের কাউন্টারে আর কোনও জায়গা খুঁজে পাই না!) আজকাল খুব সম্ভবত এটি ঘটে না বলে মনে হয়।
পিটার -

124

প্রশ্নটি সহজভাবে ভুল জিজ্ঞাসা করা হয়। আপনি এমন একটি উপাধি তৈরি করেন না যা পরামিতি নেয় কারণ aliasইতিমধ্যে বিদ্যমান এমন কোনওটির জন্য কেবল একটি দ্বিতীয় নাম যুক্ত করে। ওপি যে কার্যকারিতা চায় তা হ'ল functionএকটি নতুন ফাংশন তৈরির আদেশ। ফাংশনটির ইতিমধ্যে একটি নাম রয়েছে বলে আপনাকে ফাংশনটি উপকরণের প্রয়োজন নেই।

আমি মনে করি আপনি এরকম কিছু চান:

function trash() { mv "$@" ~/.Trash; }

এটাই! আপনি para 1, $ 2, $ 3 ইত্যাদি প্যারামিটার ব্যবহার করতে পারেন বা কেবল সেগুলি stuff @ দিয়ে স্টাফ করতে পারেন


7
এই উত্তরটি সব বলে। আমি যদি এই পৃষ্ঠার নীচ থেকে পড়তে পারি তবে আমি কিছু সময় বাঁচাতে পারতাম।
জো

-1 একটি উপাধি এবং একটি ক্রিয়াকলাপ সমতুল্য নয় ...echo -e '#!/bin/bash\nshopt -s expand_aliases\nalias asrc='\''echo "${BASH_SOURCE[0]}"'\'' # note the '\''s\nfunction fsrc(){ echo "${BASH_SOURCE[0]}";}'>>file2&&echo -e '#!/bin/bash\n. file2\nalias rl='\''readlink -f'\''\nrl $(asrc)\nrl $(fsrc)'>>file1&&chmod +x file1&&./file1;rm -f file1 file2
ফাজি লজিক

$@স্পেস ইত্যাদির সাথে ফাইলের নামগুলি সমর্থন করার জন্য আপনার সত্যই উদ্ধৃতি দেওয়া উচিত
টম হেল

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

1
@ ফাজিলজিক - আমি আপনার মন্তব্যে কোডটি আনপ্যাক করতে কয়েক মিনিট সময় ব্যয় করেছি। এমন কোনও কোডকে এমন মন্তব্যে প্যাক করার প্রচুর (আকর্ষণীয়) প্রচেষ্টা যা আপনি এটিকে সঠিকভাবে ফর্ম্যাট করতে পারবেন না। এটি এখনও কী করে বা আরও গুরুত্বপূর্ণ এটি কেন আপনার (সঠিক) দৃ as় সমর্থনকে সমর্থন করে তা আমি এখনও খুঁজে পাইনি।
জো

110

টিএল; ডিআর: পরিবর্তে এটি করুন

কমান্ডের মাঝে আর্গুমেন্ট রাখার জন্য এটি একটি উলামের চেয়ে ফাংশন ব্যবহার করা অনেক সহজ এবং আরও পঠনযোগ্য।

$ wrap_args() { echo "before $@ after"; }
$ wrap_args 1 2 3
before 1 2 3 after

আপনি যদি এটি পড়েন তবে আপনি এমন জিনিস শিখবেন যা শেল আর্গুমেন্ট প্রক্রিয়াজাতকরণ সম্পর্কে আপনার জানা দরকার। জ্ঞান বিপদজনক। অন্ধকার পক্ষ চিরকাল আপনার ভাগ্য নিয়ন্ত্রণের আগে আপনি যা চান ফলাফলটি পান।

শোধন

bashalias লেখা না আর্গুমেন্ট গ্রহণ, কিন্তু শুধুমাত্র এ শেষ :

$ alias speak=echo
$ speak hello world
hello world

কমান্ডের মাঝখানে আর্গুমেন্ট স্থাপন করা aliasআসলেই সম্ভব তবে এটি কুৎসিত হয়।

বাড়িতে এ চেষ্টা করবেন না, বাচ্চাদের!

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

কাজটি হ'ল যুক্তিগুলি aliasকেবলমাত্র একটি মোড়কের শেষে গ্রহণ করে যেগুলি মাঝখানে সন্নিবেশ করিয়ে দেবে এবং তারপরে আপনার আদেশটি কার্যকর করবে।

সমাধান ঘ

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

$ alias wrap_args='f(){ echo before "$@" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

আপনি যদি প্রথম যুক্তি চান তবে আপনি এটি প্রতিস্থাপন $@করতে $1পারেন।

ব্যাখ্যা ঘ

এটি একটি অস্থায়ী ফাংশন তৈরি করে f, যা আর্গুমেন্টগুলি পাস করে (নোটটি যে fএকেবারে শেষে বলা হয়)। unset -fসরিয়ে ফেলা হবে ওরফে যেমন ফাংশন সংজ্ঞা মৃত্যুদন্ড কার্যকর করা হয়, যাতে এটি প্রায় পরে স্তব্ধ করে না।

সমাধান 2

আপনি একটি সাব-শেলও ব্যবহার করতে পারেন:

$ alias wrap_args='sh -c '\''echo before "$@" after'\'' _'

ব্যাখ্যা ২

ওরফে একটি কমান্ড তৈরি করে:

sh -c 'echo before "$@" after' _

মন্তব্যসমূহ:

  • স্থানধারক _প্রয়োজনীয়, তবে এটি যে কোনও কিছু হতে পারে। এটা তোলে সেট পরার shএর $0, এবং তাই প্রয়োজন বোধ করা হয় ব্যবহারকারী প্রদত্ত আর্গুমেন্ট প্রথম খাওয়া হয় না। প্রদর্শন:

    sh -c 'echo Consumed: "$0" Printing: "$@"' alcohol drunken babble
    Consumed: alcohol Printing: drunken babble
    
  • একক-কোটের অভ্যন্তরে একক-কোট প্রয়োজন। ডাবল উদ্ধৃতি দিয়ে কাজ না করার একটি উদাহরণ এখানে:

    $ sh -c "echo Consumed: $0 Printing: $@" alcohol drunken babble
    Consumed: -bash Printing:
    

    এখানে ইন্টারেক্টিভ শেল এর মান $0এবং $@ডবল উদ্ধৃত মধ্যে প্রতিস্থাপিত হয় আগে এটি পাস করা হয়েছে sh। এখানে প্রমাণ:

    echo "Consumed: $0 Printing: $@"
    Consumed: -bash Printing:
    

    একক উদ্ধৃতি নিশ্চিত করে যে এই পরিবর্তনকগুলি ইন্টারেক্টিভ শেল দ্বারা ব্যাখ্যা করা যায় না এবং আক্ষরিক অর্থে পাস করা হয় sh -c

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


2
সমাধান 1, নিশ্চিত করুন আপনি $ প্রায় একক উদ্ধৃতি ব্যবহার করুন, এবং এড়ানোর \ "একটি খুব দরকারী কৌশল যদি আপনি এটি প্রয়োজন TY করা
sgtz

সলিউশন 1 আমার জন্য প্রতিটি সার্ভারের যুক্তির সাথে rdesktop-vrdp মোড়ানো কাজ করে।
হাসেদার

শেষে আর্গুমেন্ট গ্রহণ করা হ'ল আমাকে "গিট চেকআউট {ব্র্যাঙ্কনাম}" একটি সরল "গিসি name ব্র্যাঙ্কনাম}" এর সাথে প্রতিস্থাপন করার দরকার ছিল। .বাশ_প্রফাইলে আমাকে কেবল যুক্ত করতে হয়েছিলalias gc='git checkout'
অ্যাবস্ট্রাকভয়েড

@ sgtz আপনি চারপাশে উদ্ধৃতিগুলি কেন সরাতে চান $@? এগুলি প্রয়োজনীয় যদি আপনার কাছে যেমন ফাঁকা স্থান রয়েছে এমন ফাইল থাকে।
টম হেল

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

39

একটি বিকল্প সমাধান হ'ল মার্কার ব্যবহার করা , এটি একটি সরঞ্জাম যা আমি সম্প্রতি তৈরি করেছি যা আপনাকে কমান্ড টেমপ্লেটগুলিকে "বুকমার্ক" করতে এবং সহজেই কমান্ড স্থানধারকগুলিতে কার্সার স্থাপন করতে দেয়:

কমান্ডলাইন চিহ্নিতকারী

আমি দেখতে পেলাম যে বেশিরভাগ সময় আমি শেল ফাংশন ব্যবহার করি তাই কমান্ড-লাইনে আমাকে বারবার ব্যবহৃত কমান্ড লিখতে হবে না। এই ব্যবহারের ক্ষেত্রে ফাংশনগুলি ব্যবহার করার বিষয়টিটি আমার কমান্ড ভোকাবুলারিতে নতুন পদ যুক্ত করছে এবং রিয়েল-কমান্ডে কোন ফাংশনগুলির পরামিতিগুলি উল্লেখ করেছে তা মনে রাখতে হবে। চিহ্নিতকারী লক্ষ্য সেই মানসিক বোঝা দূর করা eliminate


14

আপনাকে যা করতে হবে তা হ'ল একটি ওরফে একটি ফাংশন করা:

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

আপনাকে অবশ্যই "$ 1" এর ডাবল কোট লাগাতে হবে কারণ একক উদ্ধৃতি কার্যকর হবে না।


5
এটি চতুর, তবে এই প্রশ্নটি ছাড়াও যে কোনও প্রশ্ন একটি উপনাম তৈরি করার বিষয়টি উল্লেখ করেছে, কেবলমাত্র প্রাথমিকভাবে ওরফে হিসাবে একই নামটি দিয়ে ফাংশনটি না করার কোনও কারণ আছে কি?
xaxxon

1
@ এক্স্যাক্সনসন আসলেই নয়, তবে এটি একটি ফাংশন নয়, বরং একটি উলাম ব্যবহার করা আমার পক্ষে সহজতম উপায়।
কেন ট্রান

1
এটা কাজ করে না. উবুন্টু 18 এ, আমি ত্রুটি পাচ্ছি bash: syntax error near unexpected token '{mkdir'
শীতল শাহ

;ফাংশনের অভ্যন্তরে একটি অনুপস্থিত অনুপস্থিত _mkcdসম্ভবত ত্রুটিটি সেখান থেকে।
জেচিসেল

আগে ও পরে স্থান ত্যাগ {এবং}
hesham_EE

10

আমার ~/.bashrcযে ফাংশনগুলি রয়েছে তার তিনটি উদাহরণ এখানে দেওয়া হল যেগুলি মূলত পরামিতিগুলি গ্রহণ করে এমন উপাধিগুলি হয়:

#Utility required by all below functions.
#/programming/369758/how-to-trim-whitespace-from-bash-variable#comment21953456_3232433
alias trim="sed -e 's/^[[:space:]]*//g' -e 's/[[:space:]]*\$//g'"

:<<COMMENT
    Alias function for recursive deletion, with are-you-sure prompt.

    Example:
        srf /home/myusername/django_files/rest_tutorial/rest_venv/

    Parameter is required, and must be at least one non-whitespace character.

    Short description: Stored in SRF_DESC

    With the following setting, this is *not* added to the history:
        export HISTIGNORE="*rm -r*:srf *"
    - https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash

    See:
    - y/n prompt: https://stackoverflow.com/a/3232082/2736496
    - Alias w/param: https://stackoverflow.com/a/7131683/2736496
COMMENT
#SRF_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
SRF_DESC="srf [path]: Recursive deletion, with y/n prompt\n"
srf()  {
    #Exit if no parameter is provided (if it's the empty string)
        param=$(echo "$1" | trim)
        echo "$param"
        if [ -z "$param" ]  #http://tldp.org/LDP/abs/html/comparison-ops.html
        then
          echo "Required parameter missing. Cancelled"; return
        fi

    #Actual line-breaks required in order to expand the variable.
    #- https://stackoverflow.com/a/4296147/2736496
    read -r -p "About to
    sudo rm -rf \"$param\"
Are you sure? [y/N] " response
    response=${response,,}    # tolower
    if [[ $response =~ ^(yes|y)$ ]]
    then
        sudo rm -rf "$param"
    else
        echo "Cancelled."
    fi
}

:<<COMMENT
    Delete item from history based on its line number. No prompt.

    Short description: Stored in HX_DESC

    Examples
        hx 112
        hx 3

    See:
    - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#HX_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
HX_DESC="hx [linenum]: Delete history item at line number\n"
hx()  {
    history -d "$1"
}

:<<COMMENT
    Deletes all lines from the history that match a search string, with a
    prompt. The history file is then reloaded into memory.

    Short description: Stored in HXF_DESC

    Examples
        hxf "rm -rf"
        hxf ^source

    Parameter is required, and must be at least one non-whitespace character.

    With the following setting, this is *not* added to the history:
        export HISTIGNORE="*hxf *"
    - https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash

    See:
    - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#HXF_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
HXF_DESC="hxf [searchterm]: Delete all history items matching search term, with y/n prompt\n"
hxf()  {
    #Exit if no parameter is provided (if it's the empty string)
        param=$(echo "$1" | trim)
        echo "$param"
        if [ -z "$param" ]  #http://tldp.org/LDP/abs/html/comparison-ops.html
        then
          echo "Required parameter missing. Cancelled"; return
        fi

    read -r -p "About to delete all items from history that match \"$param\". Are you sure? [y/N] " response
    response=${response,,}    # tolower
    if [[ $response =~ ^(yes|y)$ ]]
    then
        #Delete all matched items from the file, and duplicate it to a temp
        #location.
        grep -v "$param" "$HISTFILE" > /tmp/history

        #Clear all items in the current sessions history (in memory). This
        #empties out $HISTFILE.
        history -c

        #Overwrite the actual history file with the temp one.
        mv /tmp/history "$HISTFILE"

        #Now reload it.
        history -r "$HISTFILE"     #Alternative: exec bash
    else
        echo "Cancelled."
    fi
}

তথ্যসূত্র:


তাই না? এটি একটি ফাংশন, একটি উপনাম নয়। এবং আপনার উল্লেখগুলির মধ্যে একটি হ'ল এটি খুব প্রশ্ন।
ট্রিপলি

2
না, এটি ঠিক কোনও ফাংশনের মতো কাজ করে। এখানে বর্ণিত বেশ কয়েকটি জবাবের মতো আপনিও এমন একটি উপাধি তৈরি করতে পারবেন না যা পরামিতি নেয়। আপনি যা করতে পারেন তা হ'ল একটি ফাংশন লিখুন যা আপনি করেছেন।
ট্রিপলি

1
@ ট্রিপলি আমার বাশ নবীন দৃষ্টিকোণ থেকে আপনার মন্তব্য পড়ার আগে, আমি ভেবেছিলাম এটি একটি উপনাম (এটি তৈরির বিকল্প উপায়)। এটি ঠিক একটার মতোই কাজ করে, যতদূর আমি বলতে পারি। এটি মূলত একটি উপনাম যা পরামিতি গ্রহণ করে, এমনকি যদি আমি পরিভাষা বন্ধ করে থাকি। সমস্যা দেখছি না। আমি এই সমস্যার অন্য উত্তরের লিঙ্কটি স্পষ্ট করে দিয়েছি। এটি আমাকে এটি তৈরি করতে সহায়তা করেছিল।
এলিটালালমাইন্ড

1
সম্ভবত এটি "বাশ ওরফে যে একটি প্যারামিটার গ্রহণ করে" এর প্রশ্নের সুনির্দিষ্ট উত্তর দেয় না কারণ আমি এখন বুঝতে পেরেছি যে এটি সম্ভব নয়, তবে অবশ্যই এটি কার্যকরভাবে উত্তর দিয়েছে। আমি এখানে কি মিস করছি?
aliteralmind

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

8

বাশ ওরফে একেবারে পরামিতি গ্রহণ করে। আমি একটি নতুন প্রতিক্রিয়া অ্যাপ্লিকেশন তৈরি করতে সবেমাত্র একটি উলাম যুক্ত করেছি যা অ্যাপ্লিকেশনটির নামটিকে প্যারামিটার হিসাবে গ্রহণ করে। আমার প্রক্রিয়াটি এখানে:

ন্যানোতে সম্পাদনা করার জন্য বাশ_ প্রোফাইলটি খুলুন

nano /.bash_profile

প্রতিটি প্রতি লাইনে একটি করে আপনার ডাকনাম যুক্ত করুন:

alias gita='git add .'
alias gitc='git commit -m "$@"'
alias gitpom='git push origin master'
alias creact='npx create-react-app "$@"'

দ্রষ্টব্য: "$ @" "ক্র্যাকট মাই-নতুন-অ্যাপ" এর মতো পাসওয়ার্ডগুলি গ্রহণ করে

ন্যানো সম্পাদক সংরক্ষণ করুন এবং প্রস্থান করুন

লিখতে ctrl + o (এন্টার চাপুন); প্রস্থান করতে ctrl + x

টার্মিনাল কে .বাশ_প্রফাইলে নতুন উপকরণ ব্যবহার করতে বলুন

source /.bash_profile

এটাই! আপনি এখন আপনার নতুন উপকরণ ব্যবহার করতে পারেন


6

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

.................................................. .................................................. ............................................

আমি এর আগেও উত্তর দিয়েছি, অতীতে এটি সবসময় এরকম ছিল:

alias foo='__foo() { unset -f $0; echo "arg1 for foo=$1"; }; __foo()'

যা ভাল এবং ভাল, যদি না আপনি সমস্ত একসাথে ফাংশনগুলির ব্যবহার এড়ানো হয়। এই ক্ষেত্রে আপনি পাঠের পুনঃনির্দেশের বাশের বিশাল ক্ষমতাটির সুবিধা নিতে পারেন:

alias bar='cat <<< '\''echo arg1 for bar=$1'\'' | source /dev/stdin'

তারা উভয় একই অক্ষর দিতে বা কয়েক অক্ষর নিতে হয়।

বাস্তব পদাঘাতকারী সময় পার্থক্য নেই, শীর্ষ 'ফাংশনটি পদ্ধতি' এবং নীচে 'পুনর্নির্দেশ সোর্স' পদ্ধতি হচ্ছে হচ্ছে। এই তত্ত্বটি প্রমাণ করার জন্য, সময়টি নিজের পক্ষে কথা বলে:

arg1 for foo=FOOVALUE
 real 0m0.011s user 0m0.004s sys 0m0.008s  # <--time spent in foo
 real 0m0.000s user 0m0.000s sys 0m0.000s  # <--time spent in bar
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.010s user 0m0.004s sys 0m0.004s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.011s user 0m0.000s sys 0m0.012s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.012s user 0m0.004s sys 0m0.004s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.010s user 0m0.008s sys 0m0.004s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE

এটি প্রায় 200 টি ফলাফলের নীচের অংশ, এলোমেলো বিরতিতে সম্পন্ন করা হয়। মনে হচ্ছে ফাংশন তৈরি / ধ্বংস পুনঃনির্দেশের চেয়ে বেশি সময় নেয়। আশা করি এটি ভবিষ্যতের দর্শকদের এই প্রশ্নে সহায়তা করবে (এটি আমার কাছে রাখতে চান না)।


2
একটি উপাধি রয়েছে যা একটি ফাংশন সংজ্ঞায়িত করে, তবে সেই ফাংশনটি কেবল নির্বোধ চালান। শুধু একটি ফাংশন লিখুন। প্রায় প্রতিটি কাজের জন্য, এলিয়াসগুলি শেল ফাংশন দ্বারা ত্যাগ করা হয়।
গিরিহা

আপনি যদি পুরো জিনিসটি পড়েন নি, যা আপনি চেষ্টা করতে পারেন, তবে আমি ব্যাখ্যা করছিলাম কেন ফাংশন পদ্ধতিটি প্রথম স্থানে ব্যবহার করা ভাল ছিল না, এবং তদুপরি, এটি মোটেও মূর্খ নয়। পোস্ট করা এবং ডাউনভোটিং বন্ধ করুন কারণ আপনি ব্যক্তিগতভাবে এটি পছন্দ করেন নি ... বা কমপক্ষে একটি বৈধ ব্যাখ্যা দিন।
নামকরণ হ'ল

1
দ্বিতীয়টি (বারের ওরফে) এর বেশ কয়েকটি পার্শ্ব প্রতিক্রিয়া রয়েছে। প্রথমত কমান্ড স্ট্ডিন ব্যবহার করতে পারে না। দ্বিতীয়ত, যদি ওরফেটির পরে কোনও যুক্তি সরবরাহ না করা হয় তবে শেলটি যা ঘটে তা তার পরিবর্তে পাস হয়ে যায়। একটি ফাংশন ব্যবহার এই সমস্ত পার্শ্ব প্রতিক্রিয়া এড়ানো হয়। (বিড়ালের অকেজো ব্যবহার)।
গিরিহা

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

1
যেহেতু বারের সময়সীমা সব 0 এর, তাই আমি সন্দেহ করব যে শেলটি এটি সঠিকভাবে সময় করছে না। লক্ষ্য করুন যে কমান্ড চালানোর আগে টাইম বার্তাটি মুদ্রিত হয়? তবুও, এটি কোনও কিছুর দ্বিগুণ নয় এবং তারপরে বার সম্পাদন করে, তাই আপনি বারটি মাপছেন না। আরও জটিল কিছু করুন, বা বারে একটি বড় লুপ করুন যাতে আপনি আরও স্পষ্ট করে তুলতে পারেন যে আপনি কিছুই ঠিক করছেন না
ইভান ল্যাংলোইস

6

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

#!/usr/bin/env bash

# you would want to `source` this file, maybe in your .bash_profile?
function runjar_fn(){
    java -jar myjar.jar "$@";
}

alias runjar=runjar_fn;

সুতরাং উপরের উদাহরণে, আমি যখন runjarওরফে চলে যাই তখন থেকে আমি সমস্ত পরামিতিগুলি পাস করি ।

উদাহরণস্বরূপ, আমি যদি runjar hi thereএটি করি তবে এটি আসলে চলমান java -jar myjar.jar hi there। আমি যদি runjar one two threeএটি চালাত java -jar myjar.jar one two three

আমি $@এটি ভিত্তিক সমাধানটি পছন্দ করি কারণ এটি যে কোনও সংখ্যক প্যারামের সাথে কাজ করে।


4
কেন runjarকোনও ক্রিয়াকলাপটিকে কোনও ক্রিয়াকলাপের উপাধি দেওয়ার পরিবর্তে কেবল নামকরণ করবেন না ? অযথা জটিল মনে হচ্ছে!
ইভান ল্যাংলোইস

@ ইভানল্যাংলোইস ফাংশনগুলি বাশ ফাইলগুলিতে স্বয়ংক্রিয়ভাবে সংযুক্ত হয় alias(বা জিনিসগুলির বৈশিষ্ট্যগুলি অর্পণ করা হয় alias)? যদি হ্যাঁ, তবে এটি কেবল আমার জানা ছিল না
মাইকা

আপনি কী বোঝাতে চেয়েছেন তা বুঝতে পারছেন না। একটি উপনামের অন্য নাম, এটি কোনও ব্যক্তি বা কোনও ফাংশনই হোক। সুতরাং, আপনি একটি ফাংশন তৈরি করেছেন, তারপরে আপনি ফাংশনের জন্য একটি দ্বিতীয় নাম করেছেন। ওরফে সম্পর্কে বিশেষ কিছু নেই, এটির কেবল দ্বিতীয় নাম এবং প্রয়োজনীয় নয়। কমান্ড লাইনে আপনি যা টাইপ করেন তা অভ্যন্তরীণ বা বহিরাগত ফাংশন হতে পারে, সুতরাং "ফাংশন" একটি নতুন কমান্ড তৈরি করে, উপনামটি নয়।
ইভান ল্যাংলোইস

4
এটি অর্থহীন। এটা যেমন হয় alias runjar='java -jar myjar.jar'। উপনামগুলি যুক্তিগুলি গ্রহণ করে তবে শেষ পর্যন্ত।
টম হেল

6

শ্রদ্ধার সাথে যারা বলছেন আপনি একটি উলামের মাঝামাঝি একটি প্যারামিটার sertোকাতে পারবেন না আমি এটি পরীক্ষা করে দেখেছি এটি কার্যকর হয়েছে।

ওরফে মাইকম্যান্ড = "পাইথন 3" $ 1 "স্ক্রিপ্ট.পি - ফোল্ডারআউটপুট ফলাফল /"

আমি তখন মাইকম্যান্ড ফুবার চালিয়েছিলাম ঠিক তখনই এটি ঠিক কাজ করেছিল যেন আমি কমান্ডটি লংহ্যান্ডের বাইরে টাইপ করেছি।


অবশ্যই, ওরফে প্যারামিটারগুলি পেতে পারে, আমি বয়সের সাথে এটি ব্যবহার করছি উদাহরণস্বরূপ: ওরফে কমিট = "গিট কমিট -m $ 1"
আগাপিটোক্যান্ডেমোর

আমার জন্য কাজ করে না: আমাকে alias myalias="echo 1 "$1" 3"; myalias 2দেয়:1 3 2
দিরদী

4

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

সম্প্রতি আমাকে এর সমাধানের চেষ্টা করতে বাধ্য করে তা হ'ল আমি ভেরিয়েবল এবং ফাংশনগুলির সংজ্ঞা মুদ্রণের জন্য কিছু সংক্ষেপিত কমান্ড তৈরি করতে চেয়েছিলাম। তাই আমি এই উদ্দেশ্যে কিছু ফাংশন লিখেছি। যাইহোক, কিছু ভেরিয়েবল রয়েছে যা একটি ফাংশন কল দ্বারা নিজেই পরিবর্তিত (বা হতে পারে)। এর মধ্যে হ'ল:

FUNCNAME BASH_SOURCE BASH_LINENO BASH_ARGC BASH_ARGV

ভেরিয়েবল ডিফেন্সগুলি মুদ্রণের জন্য আমি যে বেসিক কমান্ডটি ব্যবহার করেছি (একটি ফাংশনে)। সেট কমান্ড দ্বারা ফর্ম আউটপুট ছিল:

sv () { set | grep --color=never -- "^$1=.*"; }

উদাহরণ:

> V=voodoo
sv V
V=voodoo

সমস্যা: এটি উপরে উল্লিখিত ভেরিয়েবলগুলির সংজ্ঞাটি বর্তমান প্রসঙ্গে যেমন মুদ্রণ করবে না , উদাহরণস্বরূপ, যদি ইন্টারেক্টিভ শেল প্রম্পটে (বা কোনও ফাংশন কলগুলিতে নয়), FUNCNAME সংজ্ঞায়িত হয়নি। তবে আমার ফাংশন আমাকে ভুল তথ্য বলে:

> sv FUNCNAME
FUNCNAME=([0]="sv")

আমি যে সমাধানটি নিয়ে এসেছি সে সম্পর্কে অন্যরা এই বিষয়ে অন্যান্য পোস্টে উল্লেখ করেছেন। এই নির্দিষ্ট কমান্ডটির জন্য ভেরিয়েবল Defns। মুদ্রণ করতে এবং যার জন্য কেবল একটি যুক্তি প্রয়োজন, আমি এটি করেছি:

alias asv='(grep -- "^$(cat -)=.*" <(set)) <<<'

যা সঠিক আউটপুট দেয় (কিছুই নয়) এবং ফলাফলের স্থিতি (মিথ্যা):

> asv FUNCNAME
> echo $?
1

যাইহোক, আমি এখনও একটি সমাধান খুঁজে বের করতে বাধ্য হয়েছি যা নির্বিচারে সংখ্যক যুক্তিগুলির জন্য কাজ করে।

বাশ অ্যালিয়াসেড কমান্ডে স্বেচ্ছাচারী তর্কগুলি পাস করার একটি সাধারণ সমাধান:

# (I put this code in a file "alias-arg.sh"):

# cmd [arg1 ...] – an experimental command that optionally takes args,
# which are printed as "cmd(arg1 ...)"
#
# Also sets global variable "CMD_DONE" to "true".
#
cmd () { echo "cmd($@)"; declare -g CMD_DONE=true; }

# Now set up an alias "ac2" that passes to cmd two arguments placed
# after the alias, but passes them to cmd with their order reversed:
#
# ac2 cmd_arg2 cmd_arg1 – calls "cmd" as: "cmd cmd_arg1 cmd_arg2"
#
alias ac2='
    # Set up cmd to be execed after f() finishes:
    #
    trap '\''cmd "${CMD_ARGV[1]}" "${CMD_ARGV[0]}"'\'' SIGUSR1;
    #        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    #       (^This is the actually execed command^)
    #
    # f [arg0 arg1 ...] – acquires args and sets up trap to run cmd:
    f () {
        declare -ag CMD_ARGV=("$@");  # array to give args to cmd
        kill -SIGUSR1 $$;             # this causes cmd to be run
        trap SIGUSR1;                 # unset the trap for SIGUSR1
        unset CMD_ARGV;               # clean up env...
        unset f;                      # incl. this function!
    };
    f'  # Finally, exec f, which will receive the args following "ac2".

উদাহরণ:

> . alias-arg.sh
> ac2 one two
cmd(two one)
>
> # Check to see that command run via trap affects this environment:
> asv CMD_DONE
CMD_DONE=true

এই সমাধানটির একটি দুর্দান্ত বিষয় হ'ল আটকে থাকা কমান্ডটি রচনা করার সময় পজিশনাল প্যারামিটারগুলি (আর্গুমেন্টগুলি) কমান্ডগুলিতে হ্যান্ডেল করার জন্য ব্যবহৃত সমস্ত বিশেষ ট্রিক্স কাজ করবে। পার্থক্যটি হ'ল অ্যারে সিনট্যাক্সটি অবশ্যই ব্যবহার করা উচিত।

যেমন,

আপনি যদি "$ @" চান তবে "$ {সিএমডি_আরজিভি [@]।" ব্যবহার করুন।

আপনি যদি "$ #" চান তবে "$ {# সিএমডি_আরজিভি [@]।" ব্যবহার করুন।

প্রভৃতি


3

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

alias cp="~/SCR/spiner cp"

এবং এটি স্পিনার স্ক্রিপ্ট

#!/bin/bash

#Set timer
T=$(date +%s)

#Add some color
. ~/SCR/color

#Animation sprites
sprite=( "(* )  ( *)" " (* )( *) " " ( *)(* ) " "( *)  (* )" "(* )  ( *)" )

#Print empty line and hide cursor
printf "\n${COF}"

#Exit function
function bye { printf "${CON}"; [ -e /proc/$pid ] && kill -9 $pid; exit; }; trap bye INT

#Run our command and get its pid
"$@" & pid=$!

#Waiting animation
i=0; while [ -e /proc/$pid ]; do sleep 0.1

    printf "\r${GRN}Please wait... ${YLW}${sprite[$i]}${DEF}"
    ((i++)); [[ $i = ${#sprite[@]} ]] && i=0

done

#Print time and exit
T=$(($(date +%s)-$T))
printf "\n\nTime taken: $(date -u -d @${T} +'%T')\n"

bye

দেখতে দেখতে এ রকম

এখানে চিত্র বর্ণনা লিখুন

চক্রযুক্ত অ্যানিমেশন)

এখানে চিত্র বর্ণনা লিখুন


2

প্যারামিটার নেওয়ার জন্য, আপনার ফাংশন ব্যবহার করা উচিত!

তবে alias @ উপন্যাসটি কার্যকর করার সময় পরিবর্তে এবং উপন্যাসের পরিবর্তে উপন্যাস তৈরি করার সময় ব্যাখ্যা করা উচিত either এটি কোনও কাজ করে না। আমি কীভাবে এই সমস্যার সমাধান করব?

এই সমস্যা থেকে মুক্তি পেতে আপনার একটি উলের পরিবর্তে শেল ফাংশন ব্যবহার করা দরকার। আপনি নিম্নরূপে foo সংজ্ঞায়িত করতে পারেন:

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

অথবা

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

অবশেষে, নিম্নলিখিত সিনট্যাক্স ব্যবহার করে আপনার foo () কে কল করুন:

foo arg1 arg2 argN

নিশ্চিত হয়ে নিন যে আপনি নিজের ফু () ~/.bash_profileবা ~/.zshrcফাইলটিতে যুক্ত করেছেন।

আপনার ক্ষেত্রে, এটি কাজ করবে

function trash() { mv $@ ~/.Trash; }

আমি আপনার ধারণা বুঝতে পারি না। আমি মনে করি যখন যুক্তিগুলি ব্যাখ্যা করা হয় তখন এটি গুরুত্বপূর্ণ নয়। আলিয়াজ শেষে যতটা প্যারামিটার আপনি চান তা গ্রহণ করুন।
টিমো

তবে ফাংশনগুলি দিয়ে এটি করা ভাল। উপনামগুলি এর জন্য বোঝানো হয় না।
আহমদ আওইস

1

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

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

alias ssh_disc='ssh -O stop'

আমাকে স্মেথের মতো টাইপ করতে দেয় ssh_disc myhostযা প্রত্যাশার মতো প্রসারিত হয়:ssh -O stop myhost

জটিল আর্গুমেন্ট গ্রহণকারী কমান্ডগুলির জন্য এটি কার্যকর হতে পারে (আমার স্মৃতিটি আর এটি ব্যবহার করে না ...)


1

অন্যদের এখানে যেমন দেখানো হয়েছে তেমন ফাংশন এবং উপাধি উভয়ই প্যারামিটার ব্যবহার করতে পারে। অতিরিক্তভাবে, আমি অন্যান্য কয়েকটি দিকও উল্লেখ করতে চাই:

1. ফাংশনটি তার নিজস্ব স্কোপে চলে, ওরফে শেয়ারের সুযোগ shares

আপনার কিছু লুকানোর বা প্রকাশ করার ক্ষেত্রে যে পার্থক্য রয়েছে তা এই পার্থক্যটি জানার জন্য দরকারী। এটিও প্রস্তাব দেয় যে কোনও ফাংশন হ'ল এনক্যাপসুলেশনের জন্য সেরা পছন্দ।

function tfunc(){
    GlobalFromFunc="Global From Func" # Function set global variable by default
    local FromFunc="onetwothree from func" # Set a local variable

}

alias talias='local LocalFromAlias="Local from Alias";  GlobalFromAlias="Global From Alias" # Cant hide a variable with local here '
# Test variables set by tfunc
tfunc # call tfunc
echo $GlobalFromFunc # This is visible
echo $LocalFromFunc # This is not visible
# Test variables set by talias
# call talias
talias
echo $GlobalFromAlias # This is invisible
echo $LocalFromAlias # This variable is unset and unusable 

আউটপুট:

bash-3.2$     # Test variables set by tfunc
bash-3.2$     tfunc # call tfunc
bash-3.2$     echo $GlobalFromFunc # This is visible
Global From Func
bash-3.2$     echo $LocalFromFunc # This is not visible

bash-3.2$     # Test variables set by talias
bash-3.2$     # call talias
bash-3.2$     talias
bash: local: can only be used in a function
bash-3.2$     echo $GlobalFromAlias # This is invisible
Global From Alias
bash-3.2$ echo $LocalFromAlias # This variable is unset and unusable

2. মোড়ক স্ক্রিপ্ট একটি ভাল পছন্দ

আমার সাথে এটি বেশ কয়েকবার হয়েছে যে ব্যবহারকারীর নাম বা মাল্টি-ব্যবহারকারী পরিবেশে স্যুইচিংয়ের মাধ্যমে লগ ইনssh বা জড়িত থাকার সময় একটি উলাম বা ফাংশন খুঁজে পাওয়া যায় না । সোর্সিং ডট ফাইলগুলির সাথে টিপস এবং কৌশল রয়েছে বা এটির সাথে এটি একটি আকর্ষণীয়: alias sd='sudo 'এটি পরবর্তী উলফকে alias install='sd apt-get install'প্রত্যাশা হিসাবে কাজ করতে দেয় (অতিরিক্ত স্থানটি লক্ষ্য করুন sd='sudo ')। যাইহোক, একটি মোড়ক স্ক্রিপ্ট এই জাতীয় ক্ষেত্রে একটি ফাংশন বা ওরফে চেয়ে ভাল কাজ করে। একটি মোড়কের স্ক্রিপ্টের প্রধান সুবিধাটি হ'ল এটি লক্ষ্যযুক্ত পথের (যেমন / usr / লোকা / বিন /) জন্য দৃশ্যমান / সম্পাদনযোগ্য যেখানে ফাংশন / ওরফে এটি ব্যবহারের পূর্বে উত্সাহিত করা দরকার। উদাহরণস্বরূপ, আপনি একটি function / .Bash_profile বা ~ / .bashrc এর জন্য একটি ফাংশন রেখেছিলেন bashতবে পরে অন্য শেলটিতে স্যুইচ করুন (যেমনzsh) তাহলে ফাংশনটি আর দৃশ্যমান নয়। সুতরাং, আপনি যখন সন্দেহ করছেন তখন একটি মোড়ক স্ক্রিপ্ট সর্বদা সবচেয়ে নির্ভরযোগ্য এবং বহনযোগ্য সমাধান।


1
আপনি কেন ভাবেন যে ফাংশন সংস্করণটি কাজ করে না?
ট্রিপলি

@tripleee। পোস্টটি আরও পঠনযোগ্য করার জন্য আমি সম্পাদনা করেছি। "1. ওরফে ওয়ার্কস, ফাংশন ..." শিরোনামের অধীনে আমি চিত্রিত করেছি যে কোনও ফাংশন সংস্করণ কেন কাজ করে না। এবং সরাসরি প্রশ্নের উত্তর দেওয়ার জন্য, ফাংশন একটি নতুন সুযোগ প্রবর্তন করে যেখানে ওরফে নেই।
বায়োসাইবারম্যান

আপনি বলছেন এটি কাজ করে না তবে আমি আপনাকে বিশ্বাস করি না। sourceএকটি ফাংশন ঠিক কাজ করে।
ট্রিপলি

1
f () { source /tmp/nst; }আমি প্রত্যাশা ঠিক কি করে। হতে পারে আপনার PATHভুল তাই এটি ভুল activateবা কিছু চালায় ; তবে sourceএকটি ফাংশন থেকে দৌড়ানো ঠিক কাজ করে।
ট্রিপলি

1
বিটিডাব্লু, পুনরায়: functionআপনার সংজ্ঞায় কীওয়ার্ডটি ব্যবহার করে উইকি.বাশ-hackers.org/scriptting/obsolete দেখুন - function funcname {প্রাচীন ksh সিনট্যাক্স ব্যাশ প্রাক-পসিক্স শেলগুলির সাথে পিছনের সামঞ্জস্যের জন্য সমর্থন করে, যেখানে funcname() {অফিসিয়াল পসিক্স-স্ট্যান্ডার্ডাইজড সিনট্যাক্স রয়েছে। function funcname() {দু'জনের একটি বিভ্রান্তি যা প্রাচীন ksh এর সাথে সামঞ্জস্যপূর্ণ নয় বা POSIX sh এর সাথে সামঞ্জস্যপূর্ণ নয় এবং যা সর্বোপরি এড়ানো যায়।
চার্লস ডাফি

1

উদাহরণটি এখানে:

alias gcommit='function _f() { git add -A; git commit -m "$1"; } ; _f'

অনেক গুরুত্বপূর্ণ:

  1. এর {আগে ও আগে একটা জায়গা আছে }
  2. একটা হল ;ক্রম প্রতিটি কমান্ড পরে। শেষ কমান্ডের পরে যদি আপনি এটি ভুলে যান তবে আপনি >পরিবর্তে প্রম্পট দেখতে পাবেন !
  3. আর্গুমেন্ট হিসাবে উদ্ধৃতিতে আবদ্ধ হয় "$1"

2
কোনও ক্রিয়াকলাপের জন্য কোনও উপনাম তৈরি করার দরকার নেই, কেবল সরাসরি ফাংশনটি ব্যবহার করুন।
ব্যবহারকারী 3439894

1

যেমন ইতিমধ্যে অন্যদের দ্বারা চিহ্নিত করা হয়েছে, একটি ফাংশন ব্যবহার করা সর্বোত্তম অনুশীলন হিসাবে বিবেচনা করা উচিত।

যাইহোক, এখানে আরও একটি পদ্ধতির, লাভবান xargs:

alias junk="xargs -I "{}" -- mv "{}" "~/.Trash" <<< "

নোট করুন যে স্ট্রিমের পুনঃনির্দেশের ক্ষেত্রে এর পার্শ্ব প্রতিক্রিয়া রয়েছে।


0

আপনাকে কিছু করতে হবে না, ওরফে স্বয়ংক্রিয়ভাবে এটি করে।

উদাহরণস্বরূপ, আমি যদি গিট পুলের মূল উত্সকে প্যারামিটারাইজ করতে চাই, তবে আমি কেবল নীচের মতো একটি উপকরণ তৈরি করতে পারি:

alias gpull = 'git pull origin '

এবং প্রকৃতপক্ষে এটি কল করার সময় আপনি 'মাস্টার' (শাখার নাম )টিকে এই জাতীয় প্যারামিটার হিসাবে পাস করতে পারেন:

gpull master
//or any other branch
gpull mybranch

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