সময় একটি aliasওয়ান ওয়ে এটা করতে, এই করতে সঙ্গে সম্পন্ন করা evalপাশাপাশি - এটা শুধু যে আপনি এত চান না evalহিসাবে আপনি করতে চান কমান্ড সঞ্চালনের evalকমান্ড ঘোষণা ।
আমি aliasএস পছন্দ করি - আমি সর্বদা তাদের ব্যবহার করি তবে আমি ফাংশনগুলি আরও পছন্দ করি - বিশেষত পরামিতিগুলি হ্যান্ডেল করার দক্ষতা এবং এএসের জন্য প্রয়োজনীয় হিসাবে কমান্ড পজিশনে তাদের প্রসারিত করার প্রয়োজন নেই alias।
সুতরাং আমি ভেবেছিলাম সম্ভবত আপনিও এটি চেষ্টা করতে চান:
_time() if set -- "${IFS+IFS=\$2;}" "$IFS" "$@" && IFS='
'; then set -- "$1" "$2" "$*"; unset IFS
eval "$1 $TIME ${3#"$1"?"$2"?}"
fi
$IFSবিট প্রধানত সম্পর্কে $*। এটি গুরুত্বপূর্ণ যে ( subshell bit )হয় একটি শেল সম্প্রসারণের ফলাফলের তাই অর্ডার parsable স্ট্রিং আমি ব্যবহারের মধ্যে আর্গুমেন্ট প্রসারিত করার জন্য "$*" (না eval "$@", উপায় দ্বারা, যদি না আপনি args নির্মাণ করে চলেছি নির্দিষ্ট সব শূণ্যস্থান উপর যোগদান করা যাবে) । আরোগুলির মধ্যে বিভাজিত ডিলিমিটারটি "$*"প্রথম বাইট হয় $IFSএবং সুতরাং এর মান নির্দিষ্ট না করেই এগিয়ে যাওয়া বিপজ্জনক হতে পারে। সুতরাং ফাংশন সংরক্ষণ $IFS, একটি থেকে এটি সেট করে \nদীর্ঘ যথেষ্ট ewline set ... "$*"মধ্যে "$3", unsetএটি গুলি, তারপর এর মান রিসেট যদি এটা পূর্বে এক ছিল।
এখানে একটি ছোট ডেমো:
TIME='set -x; time'
_time \( 'echo "$(echo any number of subshells)"' \
'command -V time' \
'hash time' \
\) 'set +x'
আপনি দেখতে পাচ্ছেন যে আমি $TIMEসেখানে দুটি কমান্ড রেখেছি - যে কোনও সংখ্যা ভাল - এমনকি কোনওটিই নয় - তবে নিশ্চিত হয়ে নিন যে এটি পালিয়ে গেছে এবং যথাযথভাবে উদ্ধৃত হয়েছে - এবং যুক্তিগুলি একই রকম হয় _time()। মৃত্যুদন্ড কার্যকর করার সময় এগুলি সমস্তই একটি একক কমান্ড স্ট্রিংয়ে যুক্ত হবে - তবে প্রতিটি আর্গ নিজস্ব \nইওলাইন পায় এবং সেগুলি তুলনামূলকভাবে সহজেই ছড়িয়ে যায়। অন্যথায় আপনি যদি চান তবে এগুলিকে একটি করে \nলম্পট করতে পারেন এবং সেগুলি ইওলাইনস বা আধা-কোলনে বা আপনার কাছে কী আলাদা করতে পারেন। কেবলমাত্র নিশ্চিত হয়ে নিন যে কোনও একক যুক্তি একটি কমান্ডের প্রতিনিধিত্ব করে যা আপনি যখন কল করবেন তখন কোনও স্ক্রিপ্টে তার নিজস্ব লাইন লাগানো স্বাচ্ছন্দ্য বোধ করে। \(উদাহরণস্বরূপ, ঠিক আছে, যতক্ষণ এটি শেষ পর্যন্ত অনুসরণ করা হয় \)। মূলত সাধারণ জিনিস।
evalউপরের স্নিপেটটি কখন তা খাওয়ানো হবে তা দেখে মনে হচ্ছে:
+ eval 'IFS=$2;set -x; time (
echo "$(echo any number of subshells)"
command -V time
hash time
)
set +x'
এবং এর ফলাফলগুলি দেখতে দেখতে ...
আউটপুট
+++ echo any number of subshells
++ echo 'any number of subshells'
any number of subshells
++ command -V time
time is a shell keyword
++ hash time
bash: hash: time: not found
real 0m0.003s
user 0m0.000s
sys 0m0.000s
++ set +x
hashত্রুটি নির্দেশ করে যে আমি একজন না /usr/bin/timeইনস্টল (কারণ আমি না) এবং commandএর আমাদের জানান যা সময় চলমান যাক। ট্রেলিং set +xহ'ল একটি আদেশ যা পরে সম্পাদিত হয় time (যা সম্ভব) - evalকোনও কিছুর ইনগ্রে করার সময় ইনপুট কমান্ডগুলি সম্পর্কে সতর্কতা অবলম্বন করা জরুরী ।