मैं वर्तमान में सब कुछ है कि टर्मिनल के लिए चला जाता है पर कब्जा औरबैश टी निकालने रंग
exec 4<&1 5<&2 1>&2>&>(tee -a $LOG_FILE)
लेकिन एक लॉग फ़ाइल में फेंक करने के लिए निम्न का उपयोग कर रहा हूँ, मैं नहीं चाहता कि रंग मुक्ति कोड/अव्यवस्था में जा चाहते हैं लॉग फ़ाइल। तो मैं कुछ इस तरह कि sorta
exec 4<&1 5<&2 1>&2>&>(
while read -u 0; do
#to terminal
echo "$REPLY"
#to log file (color removed)
echo "$REPLY" | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' >> $LOG_FILE
done
unset REPLY #tidy
)
काम करता है जो स्क्रिप्ट के कुछ भागों (जैसे echo -n "..."
या printf
\n
के बिना) के लिए आदर्श नहीं है गाड़ी वापसी के लिए read
प्रतीक्षा करता है को छोड़कर है।
जोनाथन Leffler की जवाब देने के लिए का पालन-अप:
उदाहरण स्क्रिप्ट test.sh
को देखते हुए:
#!/bin/bash
LOG_FILE="./test.log"
echo -n >$LOG_FILE
exec 4<&1 5<&2 1>&2>&>(tee -a >(sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > $LOG_FILE))
##### ##### #####
# Main
echo "starting execution"
printf "\n\n"
echo "color test:"
echo -e "\033[0;31mhello \033[0;32mworld\033[0m!"
printf "\n\n"
echo -e "\033[0;36mEnvironment:\033[0m\n foo: cat\n bar: dog\n your wife: hot\n fix: A/C"
echo -n "Before we get started. Is the above information correct? "
read YES
echo -e "\n[READ] $YES" >> $LOG_FILE
YES=$(echo "$YES" | sed 's/^\s*//;s/\s*$//')
test ! "$(echo "$YES" | grep -iE '^y(es)?$')" && echo -e "\nExiting... :(" && exit
printf "\n\n"
#...some hundreds of lines of code later...
echo "Done!"
##### ##### #####
# End
exec 1<&4 4>&- 2<&5 5>&-
echo "Log File: $LOG_FILE"
टर्मिनल के लिए उत्पादन की उम्मीद के रूप में किया जाता है और वहाँ कोई रंग मुक्ति कोड है वांछित के रूप में लॉग फ़ाइल में अव्यवस्था। हालांकि
test.log
की जांच करने पर, मुझे[READ] ...
नहीं दिखाई देता है (test.sh
की लाइन 21 देखें)।लॉग फ़ाइल [मेरी वास्तविक बैश स्क्रिप्ट के] में 4 और 5 एफडीएस बंद करने के बाद भी इसके अंत में
Log File: ...
लाइन है। मैं दूसरेexec
से पहलेsleep 1
डालकर इस मुद्दे को हल करने में सक्षम था - मुझे लगता है कि इसके लिए एक रेस हालत या एफडी शेंगेनिन्स दोष है। दुर्भाग्य से आप लोगों के लिए, मैं इस समस्या कोtest.sh
के साथ पुन: उत्पन्न करने में सक्षम नहीं हूं लेकिन मुझे किसी भी अटकलें में दिलचस्पी होगी।
ध्यान दें कि \ e [... एम कोड VT100/VT200/आदि के लिए विशिष्ट हैं। और वास्तव में प्रोग्राम द्वारा एक अलग प्रकार के $ TERM पर आउटपुट नहीं किया जा सकता है। –