2013-02-01 16 views
5

मुझे बैश स्क्रिप्ट में किसी निश्चित कमांड के निष्पादन से बचने के लिए है।
मैंने ऐसा करने के लिए एक preexec जाल का उपयोग करने के लिए सोचा था।क्या किसी निश्चित कमांड के निष्पादन से बचना संभव है?

मान लें कि मैं केवल अक्षरों के लिए 'स्रोत' कमांड से बचना चाहता हूं। क्या मैंने किया था मूल रूप से निम्नलिखित है:

#!/bin/bash 

function preexec() 
{ 
    if test $(echo "$BASH_COMMAND" | cut -d " " -f1) == "source" 
     then 
      echo ">>> do not execute this" 
     else 
      echo ">>> execute this" 

    fi 
} 
trap 'preexec' DEBUG 

echo "start" 
source "source.sh" 
echo "go on" 

exit 0 

विचार ठीक काम करता है, लेकिन इस बिंदु पर मैंने कहा कि आदेश के निष्पादन से बचने के लिए कैसे पता नहीं है।
कोई विचार यह कैसे हल करें?

+0

ध्यान रखें कि 'स्रोत' एक अन्य शेल के विपरीत, एक खोल बनाया गया है। फिर भी दिलचस्प सवाल है। –

+0

मेरी टिप्पणी शायद बेवकूफ है, लेकिन चूंकि आप स्क्रिप्ट बदल सकते हैं, क्यों न केवल उन आदेशों को टिप्पणी करें और सहेजें? या आदेश उपयोगकर्ता इनपुट से आते हैं? आप उन्हें रेगेक्स द्वारा देख सकते हैं। या मैं आपकी आवश्यकता को समझ नहीं पाया? – Kent

+0

@ केंट खान सिर्फ एक आसान उदाहरण है। मुझे जो कुछ भी हो सकता है, उसके तहत किसी निश्चित कमांड के निष्पादन को रोकने के लिए जो हो सकता है या नहीं। –

उत्तर

2

एक कामकाज उस आदेश के लिए उपनाम को परिभाषित करना होगा जो स्क्रिप्ट पूरा होने के बाद कुछ भी नहीं करता है और इसे परिभाषित नहीं करता है। उर्फ इस के लिए स्क्रिप्ट ही काम करने के लिए के भीतर घोषित किया जाना चाहिए:

alias source=: 
## The actual script source here... 
unalias source 
1

एक समारोह source कहा जाता है का उपयोग करके source आदेश को पुन: निर्धारित।

कार्यों को निर्यात किया जा सकता है।

source() { builtin source /dev/null; return 0; } 
source() { read < /dev/null; return 0; } 
source() { :; return 0; } 
export -f source 
+0

आपको किसी भी आदेश की आवश्यकता नहीं है, वापसी पर्याप्त है। 'स्रोत() {वापसी 1; } 'सबसे अच्छा हो सकता है, यह संकेत करने के लिए कि आदेश सफलतापूर्वक नहीं चलाया गया है। –