কীভাবে ক্যাট কমান্ডের পরে নতুন লাইনে বাশ পুট প্রম্পট তৈরি করবেন?


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( ডেনিস উইলিয়ামসনের একটি প্রস্তাবের গেটফ্রি অনুসারে )

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

একটি কার্যকর সমাধান এবং সংক্ষিপ্ত বিবরণের জন্য আপনাকে অনেক ধন্যবাদ! আমি বুঝতে পেরেছি এটি দরিদ্রদের জন্য কিছুটা cat, সুতরাং যখন এই সমস্যাটি আমাকে আবার বিরক্ত করতে শুরু করবে তখন আমি এটিকে সর্বশেষ সমাধান হিসাবে রাখব।
স্ট্যানিস্লাভ শাবালিন

যেহেতু এটি বাশ অগ্রাধিকার, তাই এটি পাইপিং কমান্ডগুলি ভেঙে দিতে পারে?
স্ট্যানিস্লাভ শাবালিন

1
@ স্ট্যানিস্লাভশাবলিন এটি কেবলমাত্র প্রম্পটে পাইপিংকে প্রভাবিত করে না।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

এটি সঠিকভাবে কাজ করার জন্য আমাকে "COLUMNS" এর পরে "-1" মুছে ফেলতে হবে।
রাফাক

টার্মিনাল উইন্ডোটিকে পুনরায় আকার দেওয়া হলে এই সমাধানটি প্রম্পটটিকে সরিয়ে দেয়। আমি খুঁজে পেয়েছি যে এই কাজটি নির্ভরযোগ্য করে তুলতে আমাকে বর্তমান কলামটি পেতে হয়েছিল PROMPT_COMMANDএবং যদি এটি 0 না \nহয় তবে এর প্রথম চরিত্র হিসাবে একটি নতুন লাইন ( ) ব্যবহার করুন PS1
ব্রায়ান

10

আমি নিম্নলিখিত পদ্ধতিটি পছন্দ করি ...

cat example.txt ; echo

এটি লিখিত সামগ্রীগুলির মূল্যায়ন করে না example.txt বা মাঝে মাঝে একটি নতুন লাইন যুক্ত করে না। এটি একবার বিড়ালটি সম্পন্ন হওয়ার পরে, একটি নতুন লাইনের প্রতিধ্বনিত হয় সহজেই মনে রাখা যায় এবং তারা শক্তিশালী বা দুর্বল উদ্ধৃতি সঠিকভাবে ব্যবহার করছে কিনা তা নিয়ে কেউ ভাবছেন না।

প্রকৃতপক্ষে একমাত্র নেতিবাচকতা হ'ল যদি ফাইলটির নিজস্ব ট্রেইলিং নিউলাইন থাকে তবে আপনি একটি অতিরিক্ত নতুন লাইন পাবেন।


7

আমি @ গিলসের উত্তরটি ব্যবহার করতে শুরু করেছিলাম, তবে দেখেছি যে টার্মিনালটি কলামগুলির সংখ্যা পরিবর্তন করলে প্রম্পটটি প্রত্যাশার মতো কোনও লাইনের শুরুতে আর থাকবে না। এটি বিভিন্ন কারণে ঘটতে পারে, যার মধ্যে tmux / স্ক্রিন বিভাজন, একটি GUI ধারকটির ম্যানুয়াল পুনরায় আকার দেওয়া, ফন্ট পরিবর্তন ইত্যাদি etc.

আমি সত্যিই যা চেয়েছিলাম এমন কিছু ছিল যা টার্মিনালটি প্রথম কলাম ব্যতীত অন্য কিছুতে প্রম্পটটি মুদ্রণ শুরু করবে if এটি করার জন্য আমার বর্তমান কলামটি কীভাবে পাবেন তা অনুধাবন করা দরকার, যা আমি এই উত্তরটি ব্যবহার করার জন্য ব্যবহার করেছি । চূড়ান্ত কার্যকারী প্রম্পট কনফিগারেশন নীচে:

###
# 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"

আমি এই সমাধানটি ব্যবহার করি, তবে যখন আমি আমার শেলটিতে মাল্টি-লাইন কমান্ডগুলি আটকানোর চেষ্টা করি, মনে হয় প্রথমটি আটকানোর পরে অংশ / সমস্ত লাইন খাওয়া শেষ হবে। এই কোনো সমাধান আছে?
একমাত্র

@ কেবলমাত্র আপনার কমান্ডগুলি পৃথকভাবে এবং সময়ের জন্য ফ্লাশ হয় না __get_terminal_column?
এন্ড্রোবিন

পরিবর্তে PS1="\n"আমার ঠিক আছে echoএবং সংশোধন করার প্রয়োজন নেই PS1
এন্ড্রোবিন

4

এটির সাথে সমস্যাটি হতে পারে যে আপনার উদাহরণ.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

ঐটা সত্য. তবে এটি সহজ এবং এটি যদি আপনাকে একটি অতিরিক্ত লাইন রাখার ঝামেলা না করে ...
ক্লাউস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.