कैसे "\ r" से छुटकारा पाने के लिए लाइन का अंत बैश में पाइप लाइन से आता है


0
#!/bin/bash
sourcenode=$1
destnode=$2
path1=/root/test
ssh root@"${sourcenode}" -t "echo "${path1}" | xargs -IDIR find DIR " |
while read line
do
        ssh root@"${sourcenode}" -t "stat -c "%a" $line | xargs -IDIR ssh root@"${destnode}" chmod DIR $line"
done

यह स्क्रिप्ट केवल दो दूरस्थ मशीनों: स्रोत और गंतव्य के बीच अनुमतियों को कॉपी करने वाली है। स्रोत और गंतव्य मशीनों पर /root/test/कुछ फ़ाइलों के साथ एक फ़ोल्डर ( ) है। पहली पंक्ति में किसी कारण के लिए इसे इसके \rअंत में जोड़ता है। मैंने इससे छुटकारा पाने के लिए कुछ चीजों की कोशिश की, लेकिन कोई फायदा नहीं हुआ।

मुझे यह त्रुटि मिली।

Pseudo-terminal will not be allocated because stdin is not a terminal.
stat: cannot stat `/root/test\r': No such file or directory

1
क्या आप उन हिस्सों को छोड़कर स्क्रिप्ट को सरल बनाने की कोशिश कर सकते हैं जो समस्या को प्रभावित नहीं करते हैं? स्थानीय और दूरस्थ नोड्स पर कौन से ऑपरेटिंग सिस्टम शामिल हैं?
वोल्कर साइगेल

क्या आप खिड़की आधारित पाठ संपादक का उपयोग करने का एक मौका है? या कॉपी / पेस्ट? यदि हाँ, अपनी स्क्रिप्ट पर dos2unix का प्रयास करें। या यूनिक्स प्रारूप में समाप्त होने वाली रेखा के साथ सहेजें।
आर्चेमार

मैं vim का उपयोग करके linux मशीन पर स्क्रिप्ट बना रहा था। समस्या यह है कि मैं इस लाइन: ssh रूट @ "$ {sourcenode}" -t "echo" $ {path1} "; xargs -IDIR खोज DIR" बिना किसी समस्या के फ़ोल्डर के अंदर फ़ाइलों को सूचीबद्ध कर रहा है। लेकिन जब मैं कोड के भाग को लूप के साथ जोड़ देता हूं, तो किसी कारण से मैं पहली पंक्ति के अंत में '\ r' जोड़ सकता हूं। तो इस लाइन के बजाय ऐसा लग रहा है: / root / test ऐसा लग रहा है कि: / root / test \ r मैं इससे छुटकारा नहीं पा सकता।
फजी 186

क्या आपने हटाने की कोशिश की है -tऔर आप इसका इस्तेमाल क्यों कर रहे हैं?
ओरियन

जवाबों:


4

हे प्रिय, एक पाश और बेकार xargs के साथ ट्रिपल एसएच पाइपलाइन, आपको ऐसा करने का सबसे खराब तरीका मिला।

\rआप देख रहे हैं न्यू लाइन है कि पाइप लाइन के पार हो रही है की एक बचे हुए प्रतीत होता है। आपको -tविकल्प को हटा देना चाहिए , यह आपकी समस्याओं का कारण हो सकता है। वर्चुअल टर्मिनलों में प्रदर्शित होने वाला आउटपुट सामान्य स्ट्रीम से अलग है।

इसके अलावा, echo ${path1} | xargsपूरी तरह से शानदार है, बस चलाएं find ${path1}, आपके पास xargsवैसे भी केवल एक इनपुट लाइन है । वही दूसरे के लिए चला जाता है xargs। बेशक, आप सब कुछ अंदर रख सकते हैं find। प्रयत्न, कोशिश:

ssh root@"${sourcenode}" "find ${path1} -printf 'chmod %m \"f\"\n'"

और पाइप यह अगले आदेश में ( नहीं लेकिन एक स्थानीय पार्टी पाश में सीधे फ़ीड destnode को ssh में)।


वास्तव में, स्फूर्त -tस्प्यूरियस सीआर का कारण है।
गाइल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.