स्क्रिप्ट आउटपुट के स्व-पुनर्निर्देशन के बराबर डैश


9

बैश में आप वर्तमान में चल रहे स्क्रिप्ट के सभी भविष्य के आउटपुट को रीडायरेक्ट कर सकते हैं । इस लिपि के साथ उदाहरण के लिए,

exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3

यह syslog में समाप्त हो जाएगा:

Oct 26 01:03:16 mybox my-awesome-script[72754]: 1
Oct 26 01:03:16 mybox my-awesome-script[72754]: 2
Oct 26 01:03:16 mybox my-awesome-script[72754]: 3

लेकिन यह बैश-विशिष्ट है और डैश पर काम करने के लिए पुनर्निर्देशन के साथ नग्न निष्पादन नहीं लगता है।

Syntax error: redirection unexpected

मैं इसे डैश में या संभवतः दोनों गोले में कैसे काम कर सकता हूं?


क्या आप स्पष्ट कर सकते हैं कि आपको वास्तव में क्या चाहिए? आप >डैश में पुनर्निर्देशित कर सकते हैं । मुझे लगता है कि आप कुछ और मांग रहे हैं, लेकिन मैं यह नहीं बता सकता कि यह क्या है।
terdon

@terdon I ने स्पष्टीकरण का विस्तार किया है।
एलेक्स बी

जवाबों:


6

आप बस कर सकते हैं:

{ commands
....
} | logger -t my_awesome_script

आप किसी भी शेल के साथ ऐसा कर सकते हैं।

यदि आपको यह देखने का तरीका पसंद नहीं है, तो हो सकता है कि स्क्रिप्ट किसी फ़ंक्शन में ही हो।

#!/bin/sh
run() if     [ "$run" != "$$" ] || return
      then   sh -c 'run=$$ exec "$0" "$@"' "$0" "$@" |
             logger -t my-awesome-script
      fi
#script-body
run "$@" || do stuff

यह अंतिम पंक्ति होनी चाहिए run ${1+"$@"} || do stuffताकि तर्क बरकरार रहे।
एडम काट्ज

@AdamKatz - अच्छा बिंदु, निष्पादित ${1+"$@"}कुछ भी "$@" नहीं करता है । यह वैसे भी अन्य समस्याएं थीं।
23

"$@"""जब कोई तर्क नहीं होगा, तब पास होगा जब कोई तर्क नहीं ${1+"$@"}होगा। यह कई कार्यक्रमों के लिए बहुत मायने रखता है, क्योंकि वे ""एक खाली तर्क के रूप में पार्स करते हैं जबकि (अयोग्य) खाली स्ट्रिंग को एक तर्क के रूप में बिल्कुल भी व्याख्या नहीं किया जाएगा।
एडम काटज़

@AdamKatz - एक बहुत पुराना बॉर्न शेल (और मैं dashइस तरह की प्रणाली पर खोजने की उम्मीद कर सकता हूं ) , लेकिन अन्यथा "$@"यह अद्वितीय है कि शून्य-args का मामला POSIX गोले के लिए एक अशक्त तर्क का विकल्प नहीं है।
mikeserv

1
@AdamKatz - यह वास्तव में पुराने बीएचएस में भी एक बग था और कभी भी इस तरह काम नहीं करना चाहिए था। यह अंततः तय हो गया था, लेकिन मैं उदाहरण के लिए, सोलारिस 10 में अभी भी आवश्यक होना चाहिए या नहीं इसकी जानकारी नहीं है। Youre $ $ के बारे में सही - - यह expabsion के समान स्वच्छ गुणों को प्रदर्शित नहीं करता है - इसकी विशिष्टता इसके विस्तार की चर सामग्री से संबंधित है, हालांकि यह हमेशा कुछ होगा "${@+is especially cool $@}" । मेरी राय, लेकिन व्यावहारिक रूप से ${1+”$@"}सभी के बाद पुराने वर्कअराउंड की तुलना में बहुत अलग नहीं है । यदि आपके पास ksh93 है:"${1+quoted" not quoted "quoted again}"
mikeserv

5

नाम प्रतिस्थापन पाइप के साथ प्रक्रिया प्रतिस्थापन आसानी से सिम्युलेटेड है।

mkfifo logger_input
logger -t my_awesome_script < logger_input &
exec > logger_input
echo 1
echo 2
echo 3

वास्तव में, नामित पाइप तंत्र में से एक है (दूसरे जा रहा है /dev/fd) जिसके साथ प्रक्रिया प्रतिस्थापन को लागू किया जा सकता है bash


मेरी राय में सबसे बहुमुखी: मैं कई धाराओं को मूल रूप से पुनर्निर्देशित करने के लिए टी का उपयोग कर सकता था। बस एक चीज: किसी स्क्रिप्ट के अंत में बनाए गए logger_input को हटाना न भूलें।
लुहब

2

मुझे नहीं लगता कि यह संभव है dash। जहां तक ​​मैं इसके manपृष्ठ से बता सकता हूं , इसमें प्रक्रिया प्रतिस्थापन के लिए कोई समर्थन नहीं है।

वर्कअराउंड के रूप में, आप कोशिश कर सकते हैं कि मिकसेर्व ने क्या सुझाव दिया है , या आप एक फ़ाइल में सब कुछ रीडायरेक्ट कर सकते हैं, और फिर आपकी स्क्रिप्ट समाप्त होने के बाद (संभवतः यह एक स्क्रिप्ट में है), उस फ़ाइल की सामग्री को लकड़हारा में जोड़ें:

$ exec > ~/foo/foo.txt
$ ls
$ echo something
$ cat foo/foo.txt | sudo logger -t my-awesome-script

वास्तव में, प्रक्रिया प्रतिस्थापन - या अन्य गोले किस प्रक्रिया को प्रतिस्थापन कहते हैं - dashतब अन्य गोले आसान होते हैं। प्रक्रिया प्रतिस्थापन केवल एक तर्क के /dev/fd/[num]लिए एक अनाम पाइप के लिंक की ओर इशारा करती है। dashयहाँ अन्य-शैल के रूप में अस्थायी फ़ाइलों को जीनिंग करने के बजाय अनाम पाइपों के साथ दस्तावेज़ हैं। तो cat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\nन केवल कार्यात्मक रूप से समतुल्य है, आप अपने आप को fd नाम भी दे सकते हैं। फिर भी, आपकी बात दूसरे तरीके से जाने के बारे में अच्छी तरह से बनी हुई है - आपको एक नई एफडी खोलने की जरूरत है execऔर एक प्रक्रिया को पृष्ठभूमि में रखना चाहिए जो इसे पढ़ती है।
15

2
@ माइकर्स: किस अर्थ में cat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n"आसान" से अधिक है cat <(get output)?
बरखा

@ माइकर्स: इसमें याद रखने के लिए बहुत सारे नियम शामिल हैं; शायद आप बस बड़े हो गए हैं, ताकि आप उन पर ध्यान न दें।
रुख करें

@ruakh - ठीक है, निश्चित। < >शेल पुनर्निर्देशन। मूल रूप से यदि आप उनमें से दो करते हैं तो आप निम्नलिखित पंक्तियों पर भी ढेर कर सकते हैं। लेकिन हाँ, आपके पास एक बिंदु है - मुझे यहां डॉक्स पसंद हैं। फिर भी, जितनी चीजों को याद रखने की आवश्यकता हो सकती है, यह आसान है जब वे सार्वभौमिक रूप से मेरे विचार से काम करते हैं। तब फिर से बहुत से लोगों के पास अन्य गोले के लिए बहुत अधिक उपयोग नहीं होता है और इसलिए इससे उन्हें कोई फर्क नहीं पड़ता है। मैं उनमें से नहीं हूं।
दोपहर

1
@mikeserv: न केवल heredocs, लेकिन यह भी /dev/fd/3(सटीक रूप में), और व्हाट्सएप का क्या होता है, इसका विवरण। । । और उस मामले के लिए, यह तथ्य कि यह संपूर्ण दृष्टिकोण डैश में काम करता है, जब यह अन्य शेल में काम नहीं करता है जिसमें सभी घटक होते हैं, तो इसका मतलब है कि समग्र दृष्टिकोण को याद रखने के लिए एक विशेष नियम है। (यह मैं कम शब्दावली के साथ एक सरल अंग्रेजी बनाने के लिए प्रयास की याद दिलाता है, वे बाहर काट शब्द पसंद जारी रहती है , लेकिन किसी तरह बस के रूप में मुश्किल मुहावरों की अनदेखी पर रखें ।)
ruakh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.