बैश: एक चर में एक उपनाम का उपयोग करें


9

मैं एक बैश स्क्रिप्ट लिख रहा हूं जो इसके प्रत्येक तर्क को एक कमांड के रूप में चलाती है। यह मेरे लिए आदेशों के लिए काम करता है PATH, लेकिन उपनाम के लिए नहीं। मैं सीधे स्क्रिप्ट में एक उपनाम कह सकता हूं, लेकिन मैं एक उपनाम के रूप में कॉल नहीं कर सकता जिसे एक तर्क के रूप में पारित किया गया है।

समस्या (मुझे लगता है) यह है कि चर से पहले उपनाम का विस्तार किया जाता है। वहाँ एक चर से उपनाम चलाने का एक तरीका है?

नमूना स्क्रिप्ट:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

while (( "$#" )); do
    $1
    shift
done

runall "echo test"काम करता है, लेकिन runall "myalias"देता हैrunall: line 8: myalias: command not found

जवाबों:


9

कुछ परीक्षण के बाद, मैंने निम्नलिखित निष्कर्ष निकाला है:

  • उपनाम केवल संवादात्मक मोड में काम करते हैं ( -iशेबंग में जोड़ें )।
  • जब वे एक व्याख्यात्मक स्रोत (इस मामले में, चर) से आते हैं, तो उपनामों का मूल्यांकन नहीं किया जाता है।
  • आप उर्फ ​​का उपयोग करने के लिए बैश प्राप्त कर सकते हैं eval $1। ध्यान दें कि evalएक चर के साथ निर्मित कुछ भी खतरनाक है, लेकिन चूंकि स्क्रिप्ट के पूरे बिंदु को मनमाने ढंग से निष्पादन की आवश्यकता होती है, मैं इससे बहुत बड़ा सौदा नहीं करूंगा।

बैश मैन पेज से:

जब शेल इंटरएक्टिव नहीं होता है, तब तक एलियासेस का विस्तार नहीं किया जाता है, जब तक कि एक्सप्लोसिअलीस शेल विकल्प शॉप्ट का उपयोग करके सेट नहीं किया जाता है (नीचे शेल बिल्डिन के तहत शॉप का वर्णन देखें)।

इसलिए आप shopt -s expand_aliasesइसके बजाय जोड़ सकते हैं -i

इसके अलावा,

उपनाम का विस्तार तब किया जाता है जब एक कमांड पढ़ा जाता है, न कि जब इसे निष्पादित किया जाता है।

चूँकि कमांड पढ़े जाने से पहले वेरिएबल्स का विस्तार नहीं किया जाता है, इसलिए उन्हें उपनाम का उपयोग करके आगे नहीं बढ़ाया जाएगा।


1
जानकर अच्छा लगा। जिज्ञासा से बाहर: यह evalचर के लिए खतरनाक क्यों है ?

1
@ हेस ने विचार किया eval "echo $1"। कहो तो बुला लूं ./script.sh "hello;rm -rf ~। किस पर अमल होता है? echo hello, उसके बाद rm -rf ~। जाहिर है कि यह एक वंचित उदाहरण है, लेकिन सिद्धांत रखता है।
केविन

काम के evalसामने जोड़ना $1, क्योंकि मेरे पास पहले से ही था shopt -s expand_aliases। धन्यवाद!
जैसन

1

मुझे इसी तरह की समस्या थी और इस साइट पर वर्णित के रूप में अपने उपनामों को कार्यों में बदलकर मेरे मुद्दे को हल करने में कामयाब रहा , जो मेरे लिए काम करता था।

जैसे

alias lsd="ls -lash"

सेवा

function lsd() { ls -lash; }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.