टर्मिनल लाइन फीड्स को मैसर्स निष्पादित करता है?


3

जब मैं आउटपुट docker execको किसी अन्य कमांड से पाइप करता हूं , तो यह मेरे टर्मिनल की लाइन एंडिंग को गड़बड़ाने के लिए प्रकट होता है।

उदाहरण के लिए:

$ docker exec -it foo sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
   "a": "b",
              "c": "d"
                      }
                       $

लेकिन अगर मैं तुरंत मेजबान पर, एक ही टर्मिनल में एक ही कमांड चलाता हूं:

$ sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
  "a": "b",
  "c": "d"
}

...जैसा सोचा था।

अगर मैं आउटपुट को पाइप करता हूं xxd, तो यह सीआर चरित्र के साथ-साथ LF (0d0a, 0a के बजाय) को पेश करता है; इससे आउटपुट भी गड़बड़ हो जाता है xxd:

$ docker exec -i -t foo sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | xxd
00000000: 7b22 6122 3a22 6222 2c22 6322 3a22 6422  {"a":"b","c":"d"
                                                                   00000010: 7d0d 0a  

अगर मैं \r\nखुद को छोड़ कर डॉक करने की कोशिश करता हूं, तो यह ठीक है:

$ printf "{\"a\":\"b\",\"c\":\"d\"}\r\n" | xxd
00000000: 7b22 6122 3a22 6222 2c22 6322 3a22 6422  {"a":"b","c":"d"
00000010: 7d0d 0a                                  }..
$

... जिसका अर्थ है कि यह docker exec

मेरे मेजबान और कंटेनर दोनों लिनक्स चला रहे हैं। docker infoरिपोर्ट Server Version: 18.03.1-cedocker -vरिपोर्ट Docker version 18.03.1-ce, build 9ee9f40

docker execमेरे टर्मिनल (अस्थायी रूप से) ने क्या किया , और मैं इसे कैसे ठीक करूं?


क्या ओएस आप इन आदेशों पर चल रहे हैं?
Attie

लिनक्स; प्रश्न को अद्यतन किया।
रोजर लिप्सकॉम्ब

धन्यवाद .. और एक अनुवर्ती: क्या आप कर रहे हैं कि छवि छवि है? क्या आप एक मूल ubuntu:latestया समान के साथ पुन: पेश कर सकते हैं ? (मैं नहीं कर सकता)
Attie

1
यह पाया: यह के कारण है -t; अगर कोई यह समझाते हुए उत्तर लिख सकता है कि, यह पर्याप्त होगा।
रोजर लिप्सकॉम्ब

जवाबों:


2

बहुत ही रोचक...

docker run -d ubuntu:latest sleep infinity
$ docker exec -i sharp_einstein sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
  "a": "b",
  "c": "d"
}
$ docker exec -it sharp_einstein sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
  "a": "b",
  "c": "d"
}
$ docker exec -i -t sharp_einstein sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
   "a": "b",
              "c": "d"
                      }

को अलग करना -iऔर -tमुद्दे को प्रकट करने की अनुमति देना ... (possbly a bug?)


इसके लिए मैन पेज देख रहे हैं docker exec:

  -t, --tty=true|false
      Allocate a pseudo-TTY. The default is false.

छद्म-TTYs (PTYs) सिस्टम को आपके (एक मानव) के साथ बातचीत करने की अनुमति देता है ... इसका परिणाम यह है कि docker ( execकंटेनर के अंदर) की अवधि के लिए एक नई PTY आवंटित करता है , और नई लाइन का उत्पादन करने के तरीके जैसी चीजें टर्मिनल की ऊँचाई और चौड़ाई खेलने में आती है - साथ में अन्य चीजों का भार भी।

मैं इसे पूरी तरह से समझा नहीं सकता, लेकिन यह वह नहीं है जो आप किसी ऐसी चीज से चाहते हैं जो एक पाइपलाइन में फीड हो रही है।


तुलना भी करें:

$ docker exec -i sharp_einstein sh -c 'stty'
stty: 'standard input': Inappropriate ioctl for device
$ docker exec -i -t sharp_einstein sh -c 'stty'
speed 38400 baud; line = 0;
-brkint -imaxbel
$ stty
speed 38400 baud; line = 0;
-brkint -imaxbel

sttyपीटीवाई की कैरिज रिटर्न और न्यूलाइन्स को नियंत्रित करने में सक्षम है, हालांकि इन विकल्पों का मेरे लिए यहां कोई प्रभाव नहीं पड़ा। मैन पेज से:

  * [-]ocrnl
          translate carriage return to newline

  * [-]onlcr
          translate newline to carriage return-newline

sst -tउदाहरण के साथ समान प्रेक्षण हैं : पीटी (ssh के माध्यम से) और पाइपिंग का उपयोग करते समय सीढ़ी-कदम


1
दिलचस्प। मेरी स्थापना पर -i -tऔर उसके बीच कोई अंतर नहीं है -it; वे दोनों टूट गए।
रोजर लिप्सकॉम्ब

इसके अलावा: मेरे टर्मिनल के ट्टी के व्यवहार को प्रभावित करने वाले छद्म टैटी का व्यवहार क्यों है? jqमेरी ट्टी में चलता है।
रोजर लिप्सकॉम्ब

दुर्भाग्य से जो मेरे " मैं इसे पूरी तरह से समझा नहीं सकता " में पड़ता है ... मैं dockerचीजों को अधिक " पारदर्शी " बनाने के लिए अपने स्थानीय PTY के साथ खेलने की एक परिकल्पना को सर्वश्रेष्ठ रूप से पेश कर सकता हूं ... मैं बाद में कुछ स्रोतों में खोद सकता हूं। ।
Attie

0

क्या आपने "इको - एन" पर " -n " की तरह प्रयास किया:

$ docker exec -it upbeat_mendeleev sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq .
{
   "a": "b",
              "c": "d"
                      }


$ docker exec -it upbeat_mendeleev sh -c 'echo -n {\"a\":\"b\",\"c\":\"d\"}' | jq .
{
  "a": "b",
  "c": "d"
}

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