পরবর্তী লাইনে মোড়ানোর জন্য আমি কীভাবে দীর্ঘ কমান্ড লাইন পেতে পারি?


108

উবুন্টুতে আমি দীর্ঘদিন যা লক্ষ্য করেছি তা হতাশ হয়ে উঠেছে আমি যখন কমান্ড লাইনে একটি কমান্ড টাইপ করি যা টার্মিনাল প্রস্থের চেয়ে দীর্ঘতর (প্রশস্ত) হয়, নতুন লাইনে মোড়কের পরিবর্তে এটি ফিরে যায় একই লাইনে কলাম 1 এবং আমার কমান্ড লাইনের শুরুতে ওভার-লিখন শুরু করে। (এটি আসলে আসল কমান্ডটি ওভাররাইট করে না, তবে দৃশ্যত, এটি প্রদর্শিত পাঠ্যটিকে ওভাররাইট করছে)।

এটি না দেখে ব্যাখ্যা করা শক্ত, তবে আসুন আমি বলতে পারি যে আমার টার্মিনালটি 20 টি অক্ষরের প্রশস্ত ছিল (খনিটি আরও 120 টি অক্ষরের মতো - তবে উদাহরণের জন্য), এবং আমি ইংরাজির বর্ণমালা প্রতিধ্বনি করতে চাই। আমি যা টাইপ করি তা হ'ল:

echo abcdefghijklmnopqrstuvwxyz

তবে কীটি চাপার আগে আমার টার্মিনালটি কেমন দেখাচ্ছে what

pqrstuvwxyzghijklmno

আমি প্রবেশ আঘাত যখন, এটি প্রতিধ্বনিত

abcdefghijklmnopqrstuvwxyz

সুতরাং আমি জানি আদেশটি সঠিকভাবে প্রাপ্ত হয়েছিল। এটি কেবল "টাইপিং" এর পরে আমার টাইপিংটি আবৃত করে একই লাইনে শুরু করেছে।

আমি কী ঘটতে প্রত্যাশা করব, যদি আমি এই কমান্ডটি টার্মিনালে টাইপ করি যা কেবলমাত্র 20 টি অক্ষর প্রস্থ ছিল this

echo abcdefghijklmno
pqrstuvwxyz

পটভূমি: আমি ব্যাশকে আমার শেল হিসাবে ব্যবহার করছি এবং আমার line / .Bashrc এ এই লাইনটি রয়েছে:

set -o vi

VI কমান্ড সহ কমান্ড লাইন নেভিগেট করতে সক্ষম হতে। আমি বর্তমানে উবুন্টু ১০.১০ সার্ভার ব্যবহার করছি এবং পুট্টির সাথে সার্ভারের সাথে সংযোগ করছি।

অন্য যে কোন পরিবেশে আমি কাজ করেছি, যদি আমি একটি দীর্ঘ কমান্ড লাইন টাইপ করি তবে এটি আমার লাইনটির নীচে একটি নতুন লাইন যুক্ত করবে যখন আমার কমান্ড টার্মিনাল প্রস্থের চেয়ে দীর্ঘ হবে এবং আমি টাইপ করতে থাকাকালীন আমি আমার কমান্ডটি দেখতে পাচ্ছি 2 বিভিন্ন লাইন। তবে যতক্ষণ না আমি উবুন্টু ব্যবহারের কথা মনে করতে পারি, আমার দীর্ঘ কমান্ডগুলি কেবল 1 লাইন দখল করে।

আমি যখন ইতিহাসের পূর্ববর্তী কমান্ডগুলিতে ফিরে যাচ্ছি তখনই এটি ঘটে (আমি Esc টিপুন, তারপরে পূর্ববর্তী কমান্ডগুলিতে ফিরে যেতে 'K') - যখন আমি পূর্ববর্তী কমান্ডটি টার্মিনাল প্রস্থের চেয়ে দীর্ঘ ছিলাম, কমান্ড লাইনটি পাওয়া যায় ম্যাংগলড এবং কমান্ডে আমি কোথায় আছি তা বলতে পারি না।

পুরো লম্বা কমান্ডটি কেবলমাত্র "Esc-V" হিট করার জন্য আমি কেবলমাত্র কাজটির সন্ধান পেয়েছি, যা একটি ষষ্ঠ সম্পাদকের বর্তমান কমান্ডটি খোলে।

আমি মনে করি না আমার .bashrc ফাইলে আমার কিছু বিজোড় আছে। আমি "সেট-ভি ভি" লাইনটি মন্তব্য করেছি এবং আমার এখনও সমস্যা ছিল।

আমি পুট্টির একটি নতুন কপি ডাউনলোড করেছি এবং কনফিগারেশনে কোনও পরিবর্তন করি নি - সংযোগের জন্য আমি কেবল আমার হোস্টের নামটি টাইপ করেছি, এবং আমার এখনও সমস্যা আছে, তাই আমি পুট্টির সাথে কিছুই মনে করি না (যদি না আমার দরকার হয়) কিছু কনফিগার পরিবর্তন করুন)

অন্য কারও কি এই সমস্যা আছে, এবং কেউ কীভাবে এটি ঠিক করবেন তা ভাবতে পারেন?

সম্পাদন করা

এটি আমার .bashrc ফাইল ছিল। আমি একই প্রোফাইলটি মেশিন থেকে মেশিনে অনুলিপি করেছি এবং আমি আমার $ PS1 এ বিশেষ অক্ষর ব্যবহার করেছি যা এটি কোনওভাবে বন্ধ করে দিচ্ছে। আমি এখন আমার $ PS1 এর জন্য স্ট্যান্ডার্ড বাশ ভেরিয়েবলের সাথে স্টিক করছি।

.Bashrc এ টিপস দেওয়ার জন্য @ ændrük কে ধন্যবাদ!

... সম্পাদনা শেষ করুন ...


1
সমস্যাটি আপনার .bashrc ফাইলের কারণে না ঘটে তা নিশ্চিত হওয়ার জন্য, আমি এটির একটি অনুলিপি দ্বারা সাময়িকভাবে প্রতিস্থাপনের পরামর্শ দেব /etc/skel/.bashrc। মনে রাখবেন যে পরিবর্তনগুলি কার্যকর হওয়ার জন্য আপনাকে পুনরায় সংযোগ করতে হবে এবং আপনার নিজের .bashrc এর ব্যাকআপ রাখতে ভুলবেন না।
ündrük

1
আপনি কোন টার্মিনাল অ্যাপ্লিকেশন ব্যবহার করছেন? আপনি যে আচরণটি বর্ণনা করছেন তা স্বাভাবিক নয়, অবশ্যই কোনও ডিফল্ট নয়।
জোও পিন্টো 21

আমি যে শেলগুলিতে কাজ করেছি (এবং সিসকো সিএলআই তে) আপনি টাইপ করা লাইনটি পুনরায় প্রদর্শন করতে Ctrl-L টাইপ করতে পারেন এমনকি এটি অফস্ক্রিন হলেও। আপনার পরিস্থিতিতে, এটি এখনও আপনি যে ভাঙা আউটপুটটির কথা বলছেন তা উত্পাদন করতে পারে তবে আমি আগ্রহী।
belacqua

3
সমাধানের ব্যাখ্যা দিয়ে একটি "উত্তর" তৈরি করতে নির্দ্বিধায় এটিকে গ্রহণযোগ্য হিসাবে চিহ্নিত করুন। এটি কিছুটা নির্বোধ বলে মনে হতে পারে তবে সঠিক উত্তর দেওয়া সাইটটিকে সংগঠিত রাখতে সহায়তা করে এবং ভবিষ্যতে একইরকম সমস্যা থাকা অন্যদের আরও কার্যকরভাবে গাইড করতে পারে।
ündrük

অনুযায়ী serverfault উপর এই উত্তরটি ব্যবহারtput smam
Samveen

উত্তর:


136

আপনার PS1 এ থাকা সমস্ত অন-প্রিন্টযোগ্য বাইটগুলি অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন \[ \]। অন্যথায়, বাশ তাদের প্রম্পটের দৈর্ঘ্যে গণনা করবে। কখন লাইনটি মোড়ানো হবে তা নির্ধারণ করতে এটি প্রম্পটের দৈর্ঘ্য ব্যবহার করে।

উদাহরণস্বরূপ, এখানে বাশ প্রম্পটটি 19 টি কলাম প্রশস্ত হিসাবে গণনা করেছে, যখন টার্মিনাল দ্বারা প্রদর্শিত প্রম্পটটি কেবলমাত্র 10 টি কলাম প্রশস্ত ( My promptসায়ানে >লিখিত এবং ডিফল্ট রঙে লেখা) রয়েছে:

PS1='\e[36mMy prompt\e[0m>'         # bash count: 19, actual: 10

যদিও এখানে এটি প্রম্পটটিকে 10 টি কলাম প্রশস্ত হিসাবে গণনা করেছে কারণ এটি বিশেষ \[এবং \]অব্যাহতিপ্রাপ্তদের মধ্যে বাইটগুলি উপেক্ষা করে :

PS1='\[\e[36m\]My prompt\[\e[0m\]>' # bash count: 10, actual: 10

যদিও ভাল অনুশীলনের জন্য, tputটার্মিনালটি হার্ড কোডিংয়ের চেয়ে পলায়নের জন্য ব্যবহার করুন:

cyan=$(tput setaf 6) # \e[36m
reset=$(tput sgr0)   # \e[0m
PS1='\[$cyan\]My prompt\[$reset\]>'

আরও জানতে http://mywiki.wooledge.org/BashFAQ/053 , এবং এছাড়াও http://wiki.bash-hackers.org/scriptting/terminalcodes দেখুন tput


3
এটি যে সমস্যার স্বীকৃত উত্তরটি সরবরাহ করে না তার একটি দুর্দান্ত ব্যাখ্যা
জ্যামি কুক

কোডের শেষ লাইনে PS1='...': একক উদ্ধৃতি কেন প্রতিস্থাপন $cyanএবং $resetপ্রতিস্থাপন থেকে বাধা দেয় না ?
andrybak

2
@ অ্যান্ড্রাইবাক, তারা প্রতিস্থাপন $cyanএবং $resetপ্রতিস্থাপিত হতে বাধা দেয় না , তবে PS1প্রতিবার প্রম্পটটি মুদ্রিত হওয়ার পরে মূল্যায়ন করা হয়। আপনি এটি চেষ্টা করে দেখতে পারেন PS1='$var> 'এবং তারপরে varবিভিন্ন মান প্রদান করতে পারেন এবং কীভাবে প্রম্পট পরিবর্তন হয় তা দেখতে পারেন। তারপরে চেষ্টা করুন PS1="$var> " এবং লক্ষ্য করুন যে প্রম্পট স্থির রয়েছে; $varঅ্যাসাইনমেন্টের সময় প্রসারিত হয়েছিল, প্রতিটি সময় PS1মূল্যায়ন করা হয় না।
গিরিহা

1
এটা চমৎকার. এই পোস্ট করার জন্য আপনাকে অনেক ধন্যবাদ! এটি স্কোয়ার ব্র্যাকেটগুলি পালিয়ে যাওয়া অনেক সহজ এবং আরও পাঠযোগ্য।
ফায়াত

আমি এই কাজটি কীভাবে করি PS1=${PS1}"\e]2;$@\a"। আমি চেষ্টা করেছিPS1=${PS1}"\[\e]2;\]$@\[\a\]"
রমনা রেড্ডি

59

আমার ধারণা আপনি PS1রঙগুলি দিয়ে কনফিগার করেছেন, তাই না?

আপনার রঙ সেট আগে পূর্ববর্তী আপনার উদ্ধৃতি \[ভিতরে আছে তা নিশ্চিত করুনPS1

উদাহরণ স্বরূপ:

PS1='\[\e[0;32m\u@\w/:\[\e[m '

আমার পিএস 1 ছিল export PS1='^[[96m'$(hostname)'<^[[92m${PWD}^[[96m>^[[97m '- আমি দীর্ঘদিন ধরে এটি ব্যবহার করছি - এটি কেএসএইচ সামঞ্জস্যপূর্ণ ...
ব্রায়ানএইচ

2
কি দারুন. আমি চিরকাল থেকেই টার্মিনাল প্রম্পটগুলি ব্যবহার করে আসছি এবং আগে কখনও এই সমস্যা ছিল না। কখনই বুঝতে পারত না ধন্যবাদ।
bchurchill

3
\ [সাধারণ উদ্ধৃতি ব্যবহার করার সময় একটি অনিচ্ছাকৃত স্ল্যাশ দেয়। সর্বোত্তম ভোটের উত্তরে উল্লিখিত হিসাবে
igorsantos07

2
-1 কাজ করে না। আপনার প্রিন্টিং অধ্যায়টি শুরুতে এবং শেষে মোড়ানো দরকার to \[\]
wjandrea

@ igorsantos07 ডাবল-ব্যাকস্ল্যাশ \\[একটি সম্পাদনার কারণে টাইপো ছিল o আমি এটা ঠিক করেছি।
wjandrea

11

আমার একটি অনুরূপ সমস্যা ছিল এবং অবশেষে একটি সহজ সমাধান খুঁজে পেয়েছি।

আপনার .bashrcফাইলে নিম্নলিখিত লাইন যুক্ত করুন:

COLUMNS=250

তারপরে source ~/.bashrcপছন্দসই প্রভাব পেতে টাইপ করুন ।


কিছু ক্ষেত্রে যেমন সংকীর্ণ টার্মিনেটর মহকুমা, সমস্যাটি প্রম্পট বর্ণ বর্ণগুলিতে নয় কেবল একটি ভুল COLUMNS মানে। এই উত্তরটি আমাকে খুব বিরক্তিকর গর্ত থেকে বাইরে নিয়ে গেল!
কার্লস সালা

1
লগ অফ বন্ধ অপ্রয়োজনীয়। কি source .bashrc। আপনার প্রম্পটটি তাত্ক্ষণিকভাবে আপডেট হবে
সের্গি কলডিয়াজহনি

1
আমি দেখতে পেয়েছি যেহেতু আমার বাশেরsetwinsize জন্য আমার কাছে শপ সেট নেই, তাই এটি COLUMNS ডানদিকে আপডেট করে না, unix.stackexchange.com/a/167911/8337 দেখুন
রজারডপ্যাক

1
আমি export COLUMNS=250অনুসরণ করে export TERM=xtermএবং এটি খুশি।
ফিলিপ কেয়ার্নস

5

আমি কাস্টম রঙিন প্রম্প্টের সাথে একই সমস্যাটি পেয়েছি, যদিও আমার মধ্যে রঙিন কোড \[এবং \]ডিলিমিটার রয়েছে। এটি দেখা যাচ্ছে যে কোনও ফাংশনের অভ্যন্তর থেকে বাশকে প্রতিধ্বনিত করতে সমস্যা রয়েছে । আমি আমার প্রম্পটের জন্য কেবল ভেরিয়েবলগুলি ব্যবহার করে শেষ করেছি, এবং যদিও আমার .বাশার্কটি কিছুটা কম মার্জিত, তবুও সবকিছু এখন সুন্দরভাবে কাজ করে।


যদি এখনও কেউ এটি পড়তে থাকে তবে কোনও ফাংশনে রঙ থেকে বাঁচা সম্ভব। লিঙ্কিত প্রশ্নের এই উত্তরটি দেখুন ।
wjandrea

3

একটি সহজ কাজ PS1 সেট করার আগে নিম্নলিখিত লাইন যুক্ত করা হবে:

stty columns 1000

উদাহরণ স্বরূপ,

stty columns 1000
PS1='\[\e[0;32m\u@\w/:[\e[m '

তবে এটি অন্যান্য ইউনিক্স কমান্ড যেমন এলএস এবং ম্যানকে প্রভাবিত করে।


1
ওএসএক্সে এটি কাজ করে।
রাশখাদফি

4
এটি ভিমেও খারাপভাবে প্রভাবিত করে। দয়া করে এটি ব্যবহার করবেন না।
জাস্টহেল্ফ

0

Tmux এ সংযুক্ত থাকাকালীন আমার এই সমস্যা হয়েছিল। সমস্যাটি হ'ল আমার ipythonপটভূমিতে একটি অধিবেশন ছিল ( ctrl + z) এবং এটি কোনওভাবে লাইন মোড়কে ভেঙে দেয়। আমি এটি ( fg, ctrl+d+d) বন্ধ করার সাথে সাথে আমার টার্মিনালটি সঠিকভাবে কাজ করা শুরু করে

সুতরাং যেকোন বন্ধ হওয়া ইন্টারেক্টিভ প্রম্প্টগুলির জন্য পরীক্ষা করুন।


0

সুতরাং আমি এটির উপর সামান্য মোচড় দিয়ে একই সমস্যাটি পেয়েছি এবং আমি ভেবেছিলাম যে আমি আমার সমাধানটিও ভাগ করে নেব, কেবল আমার সামান্য অবহেলা যুক্ত করার জন্য: ডি

আমার প্রাথমিক পিএস 1 ছিল

PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$"

আমার যে সমস্যাটি হয়েছিল তা হ'ল আমি আমার টার্মিনাল শিরোনামের পাশাপাশি কমান্ড প্রম্পটটিও পরিবর্তন করার চেষ্টা করছিলাম । আমি এটা করেছে যোগ করে ছিল \[\033]0;\]Title\aথেকে PS1 পরিবর্তনশীল।

সুতরাং এখন আমার PS1 ছিল:

PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$\[\033]0;\]Title\a"

এটি আমার জন্য লাইন মোড়ক বিশৃঙ্খল। অবশেষে আমি বুঝতে পেরেছি যে ব্যাশটি \aশেষের দিকে রাখা পছন্দ করে না । এটির প্রতিরোধ করার জন্য, আমি শিরোনামটি একটি ভেরিয়েবলের মধ্যে রেখেছিলাম, যা দেখে মনে হয় এটি ঠিক হয়ে গেছে।

TITLE="\033]0;Title\a"
PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$\[$TITLE\]"

0

\[এবং \]আমার জন্য কাজ করে না। আমি অনুমান করি যে আমি কীভাবে প্রম্পটটি তৈরি করছি (একটি বাহ্যিক প্রোগ্রাম থেকে) বা আমার প্রম্পটটি "গতিশীল" ছিল সে সম্পর্কে কিছু আলাদা ছিল।

পরে এই পড়া আমি দেখেছি যে আপনি আসলে সঙ্গে কালার কোড বাঁচা যায় 0x01এবং 0x02বাইট।

উদাহরণস্বরূপ, আমি চকের একটি বিশেষ সংস্করণ ব্যবহার করছি এবং আমি এটি ব্যবহার করে রঙগুলি মুড়ে রাখছি:

const Chalk = require('@nasc/chalk');

const chalk = new Chalk.constructor({
  wrapper: {
    pre: '\1',
    post: '\2',
  }
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.