मैं फिश शेल में वॉच कमांड का उपयोग करने की कोशिश कर रहा हूं।

sudo watch -d "lsof -a -p (pidof myprogram)"

जैसा कि आप मछली के लिए यह मान्य कमांड प्रतिस्थापन सिंटैक्स देख सकते हैं। हालांकि जब मैं इसे चलाता हूं तो मुझे watch में निम्न त्रुटि मिलती है।

sh: -c: line 0: syntax error near unexpected token '('
sh: -c: line 0: `lsof -a -p (pidof myprogram)'

अगर मैं कमांड को sh संगत सिंटैक्स में बदलता हूं

sudo watch -d "lsof -a -p $(pidof myprogram)"

मुझे निम्नलिखित त्रुटि मिलती है।

$(...) is not supported. In fish, please use '(pidof)'.                                                                                                                        
fish: sudo watch -d "lsof -a -p $(pidof myprogram)"

क्या इसके चारों ओर एक रास्ता है?

0
ZNackasha 8 अगस्त 2019, 19:36

2 जवाब

सबसे बढ़िया उत्तर

संक्षेप में:

sudo watch -d "lsof -a -p "(pidof myprogram)

अर्थात। उद्धरणों से बाहर निकलें और कमांड प्रतिस्थापन करें (बीच में एक स्थान के बिना, इसलिए इसे सीधे संलग्न किया जाएगा)।

इसमें थोड़ा अंतर है कि आप चाहते हैं कि कमांड का आउटपुट बिल्कुल भी विभाजित न हो - यहां यह इसे न्यूलाइन पर विभाजित करेगा, और "lsof -a -p "line1 "lsof -a -p"line2 जैसे कई टोकन बना देगा। इस मामले में यह कोई समस्या नहीं होनी चाहिए, लेकिन यदि आप इसे चाहते हैं, तो आपको string split0 लाइक . का उपयोग करना चाहिए

 sudo watch -d "lsof -a -p "(pidof myprogram | string split0)

जो केवल NULL-बाइट्स पर विभाजित होगा, जिसे कमांडलाइन तर्कों में अनुमति नहीं है (यह एक सामान्य यूनिक्स चीज है - क्योंकि main के तर्क लंबाई के किसी अन्य संकेत के बिना NULL-सीमांकित स्ट्रिंग्स के रूप में पारित किए जाते हैं, यदि वे होते हैं एनयूएलएल उन्हें छोटा कर दिया जाएगा)।

4
faho 8 अगस्त 2019, 21:11

watch शेल कमांड को निष्पादित करने के लिए sh का उपयोग करेगा। fish को किसी भिन्न शेल के लिए इच्छित डेटा से घबराने से रोकने के लिए आप स्ट्रिंग को सिंगल-कोट कर सकते हैं।

sudo watch -d 'lsof -a -p $(pidof myprogram)'
2
chepner 8 अगस्त 2019, 21:27