কীভাবে বাশ উপন্যাস প্রসারিত করা যায়


11

বাশে একই নামের আরেকটি উপন্যাসটি প্রকৃতপক্ষে প্রসারিত এমন একটি উপকরণ কীভাবে তৈরি করবেন?

কেন:

আমি আছে ব্যবহৃত GREP_OPTIONSসেট .bashrcভালো কিছু করার জন্য:

GREP_OPTIONS="-I --exclude=\*~"

আমার একটি স্ক্রিপ্টও ছিল (আসুন আমরা বলতে পারি setup-java.sh) যা জাভা কিছু প্রকল্পে কাজ করার আগে আমি কল করব। এটিতে লাইন থাকবে:

GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=classes"

যদি আমি সাসও ব্যবহার করি তবে আমি কল করব setup-sass.shযার মধ্যে লাইন রয়েছে:

GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=\*/.sass-cache"

তবে GREP_OPTIONSঅবহেলা করা হয়েছিল এবং দৃশ্যত স্ট্যান্ডার্ড সমাধানটি হয় একটি নাম বা কোনও স্ক্রিপ্ট তৈরি করা ...


বাশ ফাংশন সম্পর্কে কি?
জাকুজে

2
আমি বেশ একমত - একটি ফাংশন ব্যবহার করা একটি উপনামের চেয়ে অনেক ভাল বিকল্প।
চার্লস ডাফি

উত্তর:


13

বাশ নামের একটি অ্যারেতে BASH_ALIASES এলিয়াসগুলির মান সংরক্ষণ করে :

$ alias foo=bar
$ echo ${BASH_ALIASES[foo]}
bar

সঙ্গে প্যারামিটার সম্প্রসারণ আমরা হয় গত সেট ওরফে পেতে পারেন (যদি উপস্থিত থাকে) অথবা ডিফল্ট মান:

alias grep="${BASH_ALIASES[grep]:-grep} -I --exclude=\*~"

এখন এটি করা setup-java.sh:

alias grep="${BASH_ALIASES[grep]:-grep} -I --exclude=\*~  --exclude-dir=classes"

... এবং অবশেষে setup-sass.sh:

alias grep="${BASH_ALIASES[grep]:-grep} -I --exclude=\*~ --exclude-dir=\*/.sass-cache"

যদি তিনটি লাইন বলা হয়, আমরা যা চাই তা পাই:

$ echo ${BASH_ALIASES[grep]:-grep}
grep -I --exclude=\*~ -I --exclude=\*~ --exclude-dir=classes -I --exclude=\*~ --exclude-dir=\*/.sass-cache

13

aliases আপনি যদি ফাঁকা জায়গা দিয়ে তাদের শেষ করেন তবে চেইন করুন।

alias print='printf %s\\n ' hey='"hello, fine fellow" '
print hey

hello, fine fellow

আপনি যথেষ্ট পাগল হলে আপনি সেভাবে পুরো স্ক্রিপ্টগুলি লিখতে পারেন। যাইহোক, আপনি যদি কোনও উপনাম প্রসারিত করতে চান, তবে কেবলমাত্র আপনার যে উপন্যাসটি একটি স্থানের প্রান্তে প্রসারিত করতে চান তা নিশ্চিত করুন এবং অন্যটিকে টেক করুন।

alias grep='printf "%s " -I --exclude=\*~ '    \
      exdir=' --exclude-dir=classes '          \
      exsass='--exclude-dir=\*/.sass-cache '
grep exdir exsass exdir exsass

-I --exclude=*~ --exclude-dir=classes --exclude-dir=*/.sass-cache --exclude-dir=classes --exclude-dir=*/.sass-cache

7
এটি ভয়ানক সুন্দর।
ব্যবহারকারী 1717828

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

2
@Wildcard: fnmatch(){ alias fnmatch='case $1 in '; while "${1:+:}" 2>&-; do eval 'fnmatch pattern list ;; esac'; shift; done; unalias fnmatch; }; alias pattern='${1:+*}) ' list=': do stuff '; fnmatch "$@"। এটি দিয়ে aliasesআপনি নিদর্শনগুলির প্রসারকে আরও সরাসরি এবং আরও নিরাপদে ব্যবহার করতে পারবেন allows আপনি একটি দ্বিতীয় প্রসঙ্গ W / প্রয়োজন evalযখন একটি ফাংশন মধ্যে থেকে বলা হয়, কিন্তু এটা না মজ্জাগতভাবে যতদিন অনিরাপদ এর patternএবং listনাম যা আপনি দ্বারা নিয়ন্ত্রিত হয়। তারা কেবল বেশিরভাগ ক্ষেত্রেই ভেঙে ফেলতে পারে এমনকি যদি না কিছু আক্রমণকারী জেনেশুনে সঠিকভাবে আপনার সমাপ্ত না করে case
মাইকজার্ভ

1
আমি এটি ব্যবহার প্যাটার্ন আমার মধ্যে .bashrc: alias sudo='sudo ', এই আমাকে একটা পরে আমার সব বেনামে কমান্ড কল করতে দেয় sudo। স্থান ছাড়া এটি কাজ করবে না
অ্যারাইনোন

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

2

এখানে একটি প্রসারণযোগ্য ওরফে অপেক্ষা একটি ফাংশন একটি ভাল বিকল্প।

grep_options=( )
grep() {
  exec /usr/bin/grep "${grep_options[@]}" ${GREP_OPTIONS} "$@"
}

এইভাবে, আপনার কাছে পরিবেশে বিকল্পগুলি যুক্ত করার জন্য দুটি বিকল্প রয়েছে:

  • grep_optionsঅ্যারে সংশোধন ; এটি স্পেস, আক্ষরিক গ্লোব অক্ষর এবং অন্যান্য কোণার কেসগুলির সাথে বিকল্পগুলি সমর্থন করে:

    grep_options+=( --exclude-dir=classes --exclude-dir='*/.sass-cache' )
  • প্রচলিত ত্রুটিGREP_OPTIONS থাকা সত্ত্বেও গতানুগতিক স্কেলার ভেরিয়েবলটি ব্যবহার করুন (এর কয়েকটি বোঝার জন্য বাশফ্যাঙ্ক # 50 দেখুন ):

    GREP_OPTIONS+=' --exclude-dir=classes '

এটি বলেছে, আপনি যদি grepশেলগুলির বাইরে চালিত দৃষ্টান্তগুলির মাধ্যমে আপনার বিকল্পগুলি প্রতিফলিত করতে চান তবে কোনও উপাধি বা কোনও কার্য করবে না। পরিবর্তে, আপনি আসল grepকমান্ডের তুলনায় আপনার রাস্তায় র্যাপার স্ক্রিপ্ট চাইবেন want এই ক্ষেত্রে:

# in ~/.bash_profile
[[ -e ~/bin ]] && PATH=$HOME/bin:$PATH

... এবং, এতে ~/bin/grep:

#!/bin/bash

# load overrides to grep_options on GREP_OPTIONS from local dotfiles
source ~/.bash_profile
source ~/.bashrc

# ...and use them:
exec /usr/bin/grep "${grep_options[@]}" ${GREP_OPTIONS} "$@"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.