मछली में संयोजन कार्य


3

मछली के खोल में मेरे दो कार्य हैं:

function be
  bundle exec $argv
end

function rdbm
  rake db:migrate
end

मैं आमतौर पर उन्हें एक साथ उपयोग करता हूं, अर्थात bundle exec rake db:migrate लेकिन हमेशा नहीं, इसलिए मैं उन्हें अलग रखना चाहूंगा।

समस्या यह है कि मैं वर्तमान में परिभाषित उपनामों के साथ ऐसा नहीं कर सकता:

कहना be rdbm पहले कार्य का विस्तार be ) लेकिन गुजरता है rdbm शाब्दिक स्ट्रिंग के रूप में (गैर-विस्तारित)।

मैंने भी कोशिश की है abbr:

abbr be 'bundle exec'
abbr rdbm 'rake db:migrate'

लेकिन केवल पहला विस्तार।

मुझे पता चला है कि अन्य कार्यों से कॉल करना संभव है:

function be_rdbm
  echo (be rake db:migrate)
end

लेकिन यह दो कार्यों को कम नहीं करता है, क्योंकि दूसरे का उपयोग नहीं किया जा रहा है।

वैसे, मैं जानना चाहता हूं कि क्या अंतिम उदाहरण में सुधार किया जा सकता है। मैं नहीं देखता कि क्यों echo आवश्यक होना चाहिए (या क्या विकल्प हैं), लेकिन मैं फ़ंक्शन की संपूर्ण सामग्री के रूप में कोष्ठक नहीं डाल सकता।

जवाबों:


2

व्यक्तिगत रूप से मैं संयुक्त मामले के लिए एक और संक्षिप्त नाम को परिभाषित करूंगा। हालाँकि, आप अपने को परिभाषित कर सकते हैं rdbms फ़ंक्शन निम्नानुसार है कि आप इसे अपने फ़ंक्शन के साथ संयोजित करने की अनुमति दें be (rdbm):

function rdbm
    if status --is-command-substitution
        echo rake db:migrate
    else
        rake db:migrate
    end
end

आप अपना संशोधन भी कर सकते हैं be कार्य करें ताकि आप केवल टाइप कर सकें be rdbm पिछले परिवर्तन के साथ उपयोग किए जाने पर:

function be
    if test "$argv" = "rdbm"
        bundle exec (rdbm)
    else
        bundle exec $argv
    end
end

यह शांत और धन्यवाद है। लेकिन इसकी आज्ञाओं का सही पालन नहीं। यह जरूरी नहीं कि गूंज के माध्यम से दूसरा परिणाम पारित करने के लिए पर्याप्त हो। क्या होगा अगर इसकी एक इंटरैक्टिव स्क्रिप्ट उदाहरण के लिए।
max pleaner

आपके द्वारा पोस्ट की गई ट्रिक का उपयोग किए बिना किसी भी शेल में आप जिस तरीके से सुझाव दे रहे हैं, उसे कमांड को जोड़ना असंभव है
Kurtis Rader

ओह यह तो बहुत बुरा है। मैं बस यही सोच रहा था
max pleaner

सच कहूं तो मुझे वास्तव में उम्मीद थी कि यह संभव होगा। इस समय के बाद के सभी टर्मिनलों में अभी भी इस कार्यक्षमता का अभाव है। क्या इसका कोई कारण नहीं है?
max pleaner

"टर्मिनल" द्वारा मैं मानता हूं कि आपके शेल का मतलब है क्योंकि आपके टर्मिनल का इससे कोई लेना-देना नहीं है। जैसा कि ग्लेन जैकमैन ने अपने उत्तर में बताया कि यदि आप इसकी "वैश्विक उपनाम" सुविधा को सक्षम करते हैं, तो यह अनुमति देता है। लेकिन वह व्यवहार खतरनाक है इसलिए मछली के पास एक समान नहीं है। ध्यान दें कि ज़िश अलियास मछली को किस नाम से पुकारती है। मछली के संक्षिप्तीकरण में केवल कमांड स्थिति में विस्तार किया जाता है (जो डिफ़ॉल्ट zsh व्यवहार है)।
Kurtis Rader

1

zsh में एक "वैश्विक उपनाम" सुविधा है, जहां पंक्ति में कहीं भी अन्य नाम दिया गया है। लेकिन मछली केवल कमांड लाइन में पहले शब्द को प्रतिस्थापित करती है।

आप ऐसा कर सकते हैं:

function rdbm
  if [ (count $argv) = 1 ]; and [ $argv[1] = "-n" ]
    echo "rake db:migrate"
  else
    rake db:migrate
  end
end

फिर आपको टाइप करना होगा

be (rdbm -n)

बहुत बहुत धन्यवाद। लेकिन दूसरे जवाब की तरह, यह isn सच आज्ञाओं के अनुरूप है। क्या होगा अगर दूसरी कमांड एक इंटरैक्टिव स्क्रिप्ट है? फिर गूंज उठी काम
max pleaner
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.