हालांकि alias
यह करने का एक तरीका है, यह भी किया जा सकता है eval
- यह सिर्फ इतना है कि आप eval
कमांड के निष्पादन के लिए इतना नहीं चाहते हैं जितना आप eval
कमांड की घोषणा करना चाहते हैं ।
मुझे alias
तों पसंद है - मैं हर समय उनका उपयोग करता हूं, लेकिन मुझे फ़ंक्शन बेहतर हैं - विशेष रूप से मापदंडों को संभालने की उनकी क्षमता और उन्हें कमांड स्थिति में विस्तारित करने की आवश्यकता नहीं है जैसा कि alias
es के लिए आवश्यक है ।
तो मैंने सोचा कि शायद आप भी यही कोशिश करना चाहेंगे:
_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
"$@"
, वैसे, जब तक आप आर्ग की कर रहे हैं निश्चित सभी रिक्त स्थान पर शामिल हो सकते हैं) । आर्गन्स के बीच विभाजन परिसीमन "$*"
पहले बाइट में है $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
समाहित हो जाएंगे - लेकिन प्रत्येक arg की अपनी स्वयं की ईलाइन होती है और इसलिए वे अपेक्षाकृत आसानी से फैल सकते हैं। या फिर आप उन सभी को एक में \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
कुछ भी होने पर इनपुट कमांड के साथ सावधान रहना महत्वपूर्ण है ।