আমি কীভাবে শেল এলিয়াসগুলি "স্ট্যাক" করতে পারি?


12

আমার .profile( আমার কাছ থেকে shএমুলেশন মোডে উত্সাহিত .zshrc) আমার কাছে নিম্নলিখিত স্নিপেট রয়েছে:

if [ -f /usr/bin/pacmatic ]; then
    alias pacman=pacmatic
fi

# Colorized Pacman output
alias pacman="pacman --color auto"

তবে দ্বিতীয় উরফ সর্বদা প্রথমটিকে ওভাররাইড করে:

% type pacman
pacman is an alias for pacman --color auto

আমি কীভাবে এটি তৈরি করতে পারি যাতে দ্বিতীয় এলিফ অ্যাসাইনমেন্টটি প্রথম অ্যাসাইনমেন্টটি "উত্তরাধিকার সূত্রে" পায়, যাতে যদি এটি /usr/bin/pacmaticউপস্থিত থাকে তবে উপনামটি হয়ে যায় pacmatic --color auto?

আমি এলিয়াসের পরিবর্তে ফাংশনগুলি ব্যবহার করতে বিরত নই, তবে প্রতিবার যুক্তিটি চালিত না হলে যুক্তিটি সম্পাদন করা না হলে আমি এটিকে পছন্দ pacmanকরব ( pacmaticশেল স্টার্টআপে আমি একবার যাচাই করতে চাই , প্রতিবার pacmanচালানো হয় না)। আমি একটি shপোর্টেবল স্ক্রিপ্টটিও পছন্দ করতাম তবে এটি যদি সম্ভব না হয় তবে আপনি পূর্ণ zshবাক্য গঠন ব্যবহার করতে পারেন ।

(হ্যাঁ, আমি সচেতন যে ওরফে সংযুক্তি --color autoদিয়ে এটি সহজেই সমাধান করা যেতে পারে pacmaticBut তবে আমি এটি সঠিক উপায়ে করতে চাই ™)

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


আমি ভেবেছিলাম সঠিক পথটি হ'ল এলিয়াসগুলির পরিবর্তে ফাংশন ব্যবহার করা। আমি শুনেছি যে এনিয়াস (কমপক্ষে bash) এর চেয়ে তারা দ্রুত এবং তারা একে অপরকে সহজেই কল করতে পারে।
Wutaz

উত্তর:


5

একটি শেল একটি এর সাথে aliasবেশ অনুরূপ আচরণ করে #define, যেমন শেল ওরফে পুনরায় সংজ্ঞায়িত করা পূর্ববর্তীটিকে ওভাররাইড করে।

আমি নিশ্চিত নই যে সঠিক উপায় টিএম কী হবে , তবে একটি পদ্ধতির মধ্যে শেল ফাংশন ব্যবহার করা হবে যা পরামিতিগুলি গ্রহণ করে এবং এটি একটি উলাম তৈরি করতে ব্যবহার করবে। আপনার কোড স্নিপেট এই হিসাবে আবার লেখা যেতে পারে:

if [ -f /usr/bin/pacmatic ]; then
    pacman() { pacmatic "$@"; }
fi

# Colorized Pacman output
alias pacman="pacman --color auto"

 


তদুপরি, আপনি যদি আলাদা আলাদা এলিয়াস ব্যবহার করে থাকেন এবং অন্যটিকে সংজ্ঞায়িত করার জন্য একটি ব্যবহার করার চেষ্টা করছেন, এটি ডিফল্টরূপে অ-ইন্টারেক্টিভ মোডে এলিয়াসগুলি প্রসারিত না হওয়ায় এটি কাজ করবে না। আপনাকে সেটিংস করে এটি সক্ষম করতে হবে expand_aliases:

shopt -s expand_aliases

ম্যানুয়াল থেকে উদ্ধৃতি:

   Aliases are not expanded when the shell is not interactive, unless  the
   expand_aliases  shell option is set using shopt (see the description of
   shopt under SHELL BUILTIN COMMANDS below).

এটি আমি যা চাই তার নিকটতম হিসাবে প্রদর্শিত হয়, কিন্তু এটি কার্যকর হয় না। type pacmanআয় pacman is an alias for pacman --color auto, উভয় shএমুলেশন মোড এবং নেটিভ মধ্যে zshমোড। তবে, আপনি সদ্য সম্পাদনাটি সম্পাদন করা লাগে যা আমার প্রয়োজন।
strugee

FWIW, zsh সমতূল্য setopt aliases
strugee

ওপি ব্যবহার করছে zsh। এবং শেলটি যাইহোক ইন্টারেক্টিভ বলে মনে হচ্ছে।
মাইকেল

6

ইন্টারেক্টিভ উত্স থেকে লাইনগুলি পড়ার সময় কেবলমাত্র এলিয়াস প্রতিস্থাপন সম্পাদন করা হয়। সুতরাং দ্বিতীয় উপনামটি প্রথম দ্বারা প্রভাবিত হয় না, সুতরাং আক্ষরিক প্রতিস্থাপন।

সম্ভবত কিছু অনুরূপ:

PACMAN=pacman
if [ -f /usr/bin/pacmatic ]; then
    PACMAN=pacmatic
fi

# Colorized Pacman output
alias pacman="${PACMAN} --color auto"

এটি 'প্যাকম্যান' কে যথাযথ মান হিসাবে সেট করবে, প্যাকম্যান এনএভিভি ভেরিয়েবলটি রফতানি করা হবে না, সুতরাং স্ক্রিপ্ট শেষ হওয়ার পরে এটি চলে যাবে এবং "ডাবল কোটস" ব্যবহার করে নিশ্চিত হবে যে ভেরিয়েবল প্রতিস্থাপনটি উলামের ঘোষণায় ঘটেছিল, প্রতিটি প্রার্থনার জন্য নয়।

আমি একই পদ্ধতি ব্যবহার করি:

PACMAN=pacman
which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN} --color auto"

মূলত, env var PACMAN সেট করুন, প্যাসেমেটিক ইন পাথের জন্য পরীক্ষা করুন, যদি পাওয়া যায়, PACMAN সেট করুন, তারপরে তার নাম নির্ধারণ করুন।

হুম, আপনি আরও কিছুটা অনুকূল করতে পারেন ...

which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN:-pacman} --color auto"

তাআ দা! 'প্যাকম্যান' এ সেট করুন যদি প্যাকম্যান মান সেট না করা হয় বা নাল হয়, অন্যথায়, প্যাকম্যানের মান সেট করা হয়, 'কোনটি' লাইন দ্বারা প্যাকমেটিকতে সেট করা হবে।


এলিয়াসগুলি কেবল "ইন্টারেক্টিভ উত্স" এর জন্য কেন কাজ করবে?
মাইকেল

আপনি ঠিক বলেছেন যে ডিফল্টরূপে, bashঅ-ইন্টারেক্টিভ মোডে এলিয়াসগুলি প্রসারিত হয় না, তবে কীভাবে এটি "ইন্টারেক্টিভ উত্স" এর সমান?
মাইকেল

2

Zsh এ, আপনি সহজেই সাহসী aliasesঅ্যারে ব্যবহার করে একটি উপাধিতে সংযোজন করতে পারেন :

alias pacman="${aliases[pacman]-pacman} --color auto"

অন্যান্য শেলগুলিতে, আপনাকে aliasবিদ্যমান এলিয়াসগুলি জানতে কমান্ডের আউটপুট ব্যবহার করতে হবে।

current_pacman_alias=$(alias pacman 2>/dev/null)
alias pacman="${current_pacman_alias:-pacman} --color auto"

আমি এটি একটি সম্ভাবনা হিসাবে দিচ্ছি, আমি ইতিমধ্যে অন্যান্য উত্তর দ্বারা প্রস্তাবিত হিসাবে একটি ভেরিয়েবল ব্যবহার সঙ্গে যেতে হবে। এটি পরিষ্কার, এবং আপনি কোনটির ব্যবহার pacmaticবা pacmanব্যবহারের ভিত্তিতে কিছু জিনিস আলাদাভাবে কনফিগার করতে চান তবে আপনি ভেরিয়েবলের মানকে বৈষম্য করতে পারেন।

pacman==pacmatic 2>/dev/null || pacman=pacman
alias pacman='$pacman --color auto'


0
pacman() ( def_args="--color auto" bin=
    [ -x ${bin:=/usr/bin/pacmatic} ] || bin=
    [ -x ${bin:=/usr/bin/pacman} ] || bin= 
    ${bin:?WHERE THE HELL IS PACMAN????} \
        $def_args "$@"
)

এলিয়াস পাখিদের জন্য।

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