कैट कमांड के बाद नई लाइन पर बश पुट कैसे बनाया जाए?


17

जो मैं समझता हूं:

host:~ user$ cat example.txt
some texthost:~ stas$

मैं क्या प्राप्त करना चाहता हूं:

host:~ user$ cat example.txt
some text
host:~ stas$

क्या ऐसा कोई तरीका है जिससे मैं catइस तरह का व्यवहार कर सकूं?

मैं मैक ओएस एक्स पर बैश का उपयोग कर रहा हूं।

जवाबों:


15

अधिकांश यूनिक्स उपकरण पाठ फ़ाइलों के साथ अच्छी तरह से काम करने के लिए डिज़ाइन किए गए हैं। एक पाठ फ़ाइल में लाइनों का एक क्रम होता है। एक पंक्ति में मुद्रण योग्य वर्णों का एक अनुक्रम होता है जो एक नई पंक्ति वर्ण के साथ समाप्त होता है। विशेष रूप से, एक गैर-रिक्त पाठ फ़ाइल का अंतिम वर्ण हमेशा एक नया वर्ण होता है। जाहिर है, example.txtइसमें केवल some textअंतिम अंतिम पंक्ति नहीं होती है, इसलिए यह एक पाठ फ़ाइल नहीं है।

catएक साधारण काम करता है; पाठ फ़ाइलों में मनमानी फ़ाइलों को चालू करना उस नौकरी का हिस्सा नहीं है। कुछ अन्य उपकरण हमेशा अपने इनपुट को पाठ फ़ाइलों में बदलते हैं; यदि आप सुनिश्चित नहीं हैं कि आप जिस फ़ाइल को प्रदर्शित कर रहे हैं वह एक नई पंक्ति के साथ समाप्त होती है, awk 1इसके बजाय चलाने का प्रयास करें cat

यदि पिछली कमांड कर्सर को अंतिम मार्जिन के अलावा कहीं और छोड़ती है तो आप बैश को अगली लाइन पर दिखा सकते हैं। इसे अपने में रखें .bashrc( डेनिस विलियमसन द्वारा एक प्रस्ताव के GetFree द्वारा भिन्नता ):

shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1

एक काम के समाधान और संक्षिप्त विवरण के लिए बहुत बहुत धन्यवाद! मैं समझता हूं कि यह थोड़ा गरीबों के लिए है cat, इसलिए मैं इसे अंतिम उपाय के रूप में उस समय के लिए रखूंगा जब यह मुद्दा मुझे फिर से परेशान करने लगेगा।
स्टेनिस्लाव शबलिन

चूंकि यह बैश वरीयता है, क्या यह पाइपिंग कमांड को तोड़ सकता है?
स्टेनिस्लाव शबलिन 22

1
@StanislavShabalin यह पाइपिंग को प्रभावित नहीं करता है, केवल संकेत देता है।
गाइल्स का SO- बुराई पर रोक '22

मुझे सही ढंग से काम करने के लिए "COLUMNS" के बाद "-1" को हटाने की आवश्यकता है।
रफक

जब टर्मिनल विंडो का आकार बदल जाता है, तो यह समाधान गति करने का कारण बनता है। मैंने पाया कि इस कार्य को मज़बूती से करने के लिए मुझे वर्तमान कॉलम को प्राप्त करना था ( PROMPT_COMMANDऔर, यदि यह 0 नहीं है, तो \nपहली पंक्ति के रूप में एक नई पंक्ति ( ) का उपयोग करें PS1
ब्रायन डोनोवन

10

मैं निम्नलिखित विधि पसंद करता हूँ ...

cat example.txt ; echo

यह सामग्री का मूल्यांकन नहीं करता है example.txtया कभी-कभी एक नई पंक्ति जोड़ता है। एक बार बिल्ली को पूरा करने के बाद यह एक नई रेखा बनाता है, यह याद रखना आसान है, और कोई भी इस बारे में नहीं सोच रहा है कि वे सही तरीके से मजबूत या कमजोर उद्धरण का उपयोग कर रहे हैं या नहीं।

केवल नकारात्मक, वास्तव में यह है कि यदि फ़ाइल की अपनी नई रूपरेखा है, तो आपको एक अतिरिक्त न्यूलाइन मिल जाएगी।


7

मैंने @ गाइल्स के उत्तर का उपयोग करना शुरू कर दिया, लेकिन पाया कि यदि टर्मिनल ने कॉलम की संख्या बदल दी है तो प्रॉम्प्ट एक पंक्ति के शुरू में अपेक्षा के अनुरूप नहीं होगा। यह कई कारणों से हो सकता है, जिसमें tmux / screen विभाजन, GUI कंटेनर का मैन्युअल आकार बदलना, फ़ॉन्ट परिवर्तन आदि शामिल हैं।

जो मैं वास्तव में चाहता था वह कुछ था जो एक नई पंक्ति जोड़ देगा यदि टर्मिनल पहले कॉलम के अलावा किसी अन्य चीज पर अपना संकेत छापना शुरू कर देगा। ऐसा करने के लिए मुझे यह जानने की जरूरत है कि वर्तमान कॉलम को कैसे प्राप्त किया जाए, जिसे पाने के लिए मैंने इस उत्तर का उपयोग किया । अंतिम वर्किंग प्रॉम्प्ट कॉन्फ़िगरेशन निम्न है:

###
# Configure PS1 by using the old value but ensuring it starts on a new line.
###
__configure_prompt() {
  PS1=""

  if [ "$(__get_terminal_column)" != 0 ]; then
    PS1="\n"
  fi

  PS1+="$PS1_WITHOUT_PREPENDED_NEWLINE"
}

###
# Get the current terminal column value.
#
# From /programming//a/2575525/549363.
###
__get_terminal_column() {
  exec < /dev/tty
  local oldstty=$(stty -g)
  stty raw -echo min 0
  echo -en "\033[6n" > /dev/tty
  local pos
  IFS=';' read -r -d R -a pos
  stty $oldstty
  echo "$((${pos[1]} - 1))"
}

# Save the current PS1 for later.
PS1_WITHOUT_PREPENDED_NEWLINE="$PS1"

# Use our prompt configuration function, preserving whatever existing
# PROMPT_COMMAND might be configured.
PROMPT_COMMAND="__configure_prompt;$PROMPT_COMMAND"

मैं इस समाधान का उपयोग करता हूं, लेकिन जब मैं अपने शेल में मल्टी-लाइन कमांड को चिपकाने की कोशिश करता हूं, तो यह पहले वाले पेस्ट के बाद भाग / सभी लाइनों को खाने का अंत लगता है। इस के लिए कोई भी समाधान है?
19

@onlynone संभवत: आपके आदेश व्यक्तिगत रूप से और समय के लिए फ्लश नहीं किए जाते हैं __get_terminal_column?
एंड्रोबिन

इसके बजाय PS1="\n"मुझे बस echoऔर संशोधित करने की आवश्यकता नहीं है PS1
एंड्रोबिन

4

इसके साथ समस्या यह हो सकती है कि आपकी example.txt में आपकी फ़ाइल के अंत में एक नई पंक्ति नहीं है।


2
बात यह है कि मुझे परवाह नहीं है अगर फ़ाइल के अंत में एक नई रेखा है या नहीं। मैं बिल्ली के उत्पादन को अधिक स्पष्ट और इस विघटनकारी नहीं देख पा रहा हूं :-) और मैं समझता हूं कि यह catकाम नहीं है, इसलिए शायद मैं कुछ समाधान तलाश रहा हूं।
स्टेनिस्लाव शबलिन

1
यह ऐसा गैर जवाब example.txtहै जिसमें फ़ाइल के अंत में एक नई लाइन नहीं है, यह प्रश्न का पूरा बिंदु है।
विलेम डी'हैसेलेर

2

यदि आप उपयोग करने पर जोर देते हैं cat, तो यह अंत में एक नई रेखा के साथ और बिना दोनों प्रकार की फाइलों के लिए काम करता है:

echo "`cat example.txt`"

आप इसे अपनी पसंद के नाम के साथ एक फ़ंक्शन में बदल सकते हैं (यहां तक ​​कि cat) अपने में .bashrc:

cat1(){ echo "`/bin/cat $@`";}

1
अब यह बहुत अधिक है, भले ही यह काम करता है ;-) धन्यवाद!
स्टेनिस्लाव शबलिन

0

आप .bashrc में भी जोड़ सकते हैं

PROMPT_COMMAND="printf '\n';$PROMPT_COMMAND"

मेरे लिये कार्य करता है।


1
यह टर्मिनल में एक अतिरिक्त रिक्त लाइन भी जोड़ देगा जब भी एक उपयोगिता एक ऐसी चीज का उत्पादन करती है जिसे एक नई पंक्ति द्वारा ठीक से समाप्त किया जाता है।
Kusalananda

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