2016-04-24 4 views
5

के रूप में पाइप देख मैं एक बैश लिपि मेंबैश जाल डीबग एक आदेश

trap 'echo -e "\e[92m$ $BASH_COMMAND\e[0m"' DEBUG 

उपयोग कर रहा हूँ हर आदेश निष्पादित किया जाता है मुद्रित करने के लिए।

यह ठीक काम करता है, को छोड़कर यह दो आदेशों प्रिंट कि जब मैं पाइप उन्हें एक साथ:

bzip2 -dc < dump.sql.bz2 | mysql test 

प्रिंटों:

$ bzip2 -dc < dump.sql.bz2 
$ mysql test 

मैं trap या करने के लिए किसी भी परिवर्तन कर सकते हैं पाइप के साथ लाइन ताकि लाइन एक के रूप में मुद्रित किया जाएगा?

उत्तर

2

करने के लिए अपने आदेश को बदलें: का उपयोग करते हुए एक पाइप लाइन के बजाय एक process substitution आदेश एक सरल बैश के नजरिए, जो विवरण के किसी स्तर है से आदेश बनाता

mysql test < <(bzip2 -dc < dump.sql.bz2) 

जिस पर DEBUG जाल और अंतर्निहित $BASH_COMMAND परिवर्तनीय संचालन में।

पृष्ठभूमि:

DEBUG (छद्म) संकेत डिजाइन द्वारा, सरल आदेशों के स्तर पर चल रही है $BASH_COMMAND करता है।

bzip2 -dc < dump.sql.bz2 | mysql test एक पाइप लाइन कई सरल आदेशों की रचना की।

इसलिए, trap कथन पाइपलाइन के साथ जो भी आप चाहते हैं वह नहीं कर सकता है।

तुम क्या चाहते हो रही एक यौगिक कमांड के साथ (के निकटतम बात जैसे, एक while पाश या कमांड समूह ({ ...; ...; }) या कमांड सूची (सरल कमांड या पाइपलाइनों ऑपरेटरों ; && || & साथ शामिल हो गए) का उपयोग करने के लिए है set -v, जो stderr करने के लिए पूरे आदेश गूँज से पहले ही मार डाला जाता है, लेकिन मैं कैसे इस उत्पादन की स्वरूपण नियंत्रित करने के लिए पता नहीं

+0

बैश * पाइप लाइन के बारे में पता करने के लिए * है करता है? क्या मैं किसी प्रकार के टूल पर पाइपिंग का प्रतिनिधि नहीं लगा सकता हूं ताकि बैश के दृष्टिकोण से यह एक ही कमांड हो? – AndreKR

+0

आप पाइपलाइन को _function_ के अंदर रख सकते हैं, और फिर उस फ़ंक्शन का आमंत्रण बैश के परिप्रेक्ष्य से _simple_ कमांड होगा - लेकिन इससे आपके द्वारा वास्तविक पाइपलाइन भी छिप जाएगी। – mklement0

+0

यह फ़ाइल नाम स्वीकार नहीं करता है, लेकिन 'mysql test <<(bzip2 -dc AndreKR

1

एक कच्चे वैकल्पिक हल एक समारोह का उपयोग कर, इस तरह होगा:।

run() { eval $1; } 
trap 'echo -e "\e[92m$ $BASH_COMMAND\e[0m"' DEBUG 
run "bzip2 -dc < dump.sql.bz2 | mysql test" 

आउटपुट:

$ run "bzip2 -dc < dump.sql.bz2 | mysql test" 
+0

++; बहुत चालाक - और सुरक्षित, जब तक आप कमांड स्ट्रिंग को पूरी तरह से नियंत्रित करते हैं। – mklement0

+1

'$ 1' * फ़ंक्शन * का पैरामीटर है, इसलिए मुझे लगता है कि यह हमेशा मूल कमांड के रूप में सुरक्षित होगा, जिसे अब फ़ंक्शन के पैरामीटर के रूप में खिलाया जाता है। – AndreKR

+0

पूरी तरह से सहमत - मैं सिर्फ 'eval' के उपयोग के कारण भविष्य के पाठकों के पास होने वाली किसी भी चिंताओं को पूरा करना चाहता था, जो आम तौर पर लाल झंडे उठाता है (और, आपने इसे बेहतर वाक्यांश दिया)। – mklement0

संबंधित मुद्दे