পাইপ কমান্ড কেন “এল | গ্রেপ "1" "ভুল ফলাফল পাবেন?


13

ছবিটি যেমন চিত্রিত করেছে, আমি lবর্তমান ফোল্ডারে ফাইলটি পেতে ব্যবহার করি । এবং তারপরে আমি নাম্বার সহ ফাইলটি পেতে চাই 1, তাই আমি এটি pipeএবং এটি ব্যবহার করি grep

কিন্তু কেন 2এবং 22ফাইল খুঁজে দেখাবেন? এবং কি 1;34m?

$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22

হালনাগাদ

আমি lআমার zshrcফাইলটিতে কমান্ডটি ইতিমধ্যে রেখেছি ।

 alias lsp="ls"
 alias ll='ls -alF'
 alias la='ls -A'
 alias l='ls -CF'
 alias ls="ls -alh --color"

এবং এখানে typeআদেশের ফলাফল :

>$ type ls
ls is an alias for ls -alh --color

> $ type l
l is an alias for ls -CF

4
পাঠ্যের স্ক্রিনশট পোস্ট করবেন না দয়া করে। এখানে পাঠ্যটি অনুলিপি করুন এবং কোড বিন্যাস প্রয়োগ করুন।
মুরু

@ মুরু আমার কি মনে হয় আপনি পোস্ট আউটপুট জিজ্ঞাসা করেছেন type -a l?
WinEunuuchs2Unix

@ উইনউনুছুস ইউনিক্স আহ, হ্যাঁ।
মুরু

@ আমি আপনাকে type lsকমান্ড আউটপুট পোস্ট করতে জিজ্ঞাসা করতে পারেন দয়া করে? আপনি কি কোনওভাবেই lsওরফে পরিবর্তন করেছেন ?
সের্গেই কোলোডিয়াজনি

@ সার্গ ইতোমধ্যে আপডেট হয়েছে।
লি

উত্তর:


27

প্রথমত, আপনি যা করার চেষ্টা করছেন l| grep <filename>তা খারাপ। এটা করবেন না। কারণটা এখানে.

l কমান্ড সত্যিই একটি উপাধি ls -CF

$ type -a l
l is aliased to `ls -CF'

উবুন্টু এর ডিফল্টরূপে bash, lsএকটি ওরফে হয় ls --color=auto। স্ট্যান্ড্রাইভার হিসাবে মন্তব্যগুলিতে নির্দেশিত হিসাবে --color=autoরঙিনকরণ বন্ধ করার কথা রয়েছে। আপনার নির্দিষ্ট ক্ষেত্রে, আপনার আছে alias ls="ls -alh --color"এবং alias l="ls -CF", যা মূলত সত্তা শেষ হয় ls -alh --color -CF। স্যুইচগুলির এই বিশেষ সংমিশ্রণটি এখনও পাইপের উপরে রঙিন আউটপুট প্রেরণ করে। উদাহরণ স্বরূপ:

$ ls -alh --color -CF ~/TESTDIR | cat -A                                                                                 
^[[0m^[[01;34m.^[[0m/  ^[[01;34m..^[[0m/  1.txt  2.txt  3.txt  out.txt$

লক্ষ্য করুন যে ডিরেক্টরিগুলি .এবং ..ডিরেক্টরিগুলির মধ্যে কীভাবে একই অব্যাহতি রয়েছে।

এই সব এর অর্থ কি

এর অর্থ lফাইলের ধরণ অনুসারে ফাইলগুলির বর্ণযুক্ত তালিকা আউটপুট আসবে। সমস্যাটি হ'ল পালাবারের ক্রমগুলি ব্যবহার করে রঙিনতা ঘটে । এটি হ'ল 1:34mজিনিসগুলি - তারা নির্দিষ্ট রঙের জন্য ক্রমগুলি পালাচ্ছে।

মূল সমস্যাটি হ'ল পার্সিং করা lsপ্রায়শই ভুল আউটপুট এবং স্ক্রিপ্টগুলিতে বিপর্যয়ের দিকে পরিচালিত করে, কেবলমাত্র এ কারণেই lsপূর্ববর্তী এবং অন্যান্য বিশেষ অক্ষরের বর্ণনার মতো পালানোর ক্রমগুলির অনুমতি দেয়। আরও তথ্যের জন্য এই নিবন্ধটি দেখুন: http://mywiki.wooledge.org/ পার্সিংএল

আপনার কী করা উচিত:

findকমান্ড ব্যবহার করুন :

bash-4.3$ ls
1.txt  2.txt  3.txt  out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt

আপনি শেল গ্লোব এবং আধুনিক পরীক্ষা [[কমান্ড দিয়ে এরকম কিছু করতে পারেন :

bash-4.3$ for file in * ;do if [[ "$file" =~ "1"  ]] ;then echo "$file" ;fi ; done
1.txt

অথবা অজগর ব্যবহার করতে পারেন, যার bashএকার চেয়ে অনেক বেশি ভাল ফাইল নাম পরিচালনা করার ক্ষমতা রয়েছে

bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']

যদি আউটপুট প্রক্রিয়াজাতকরণের প্রয়োজন না হয় তবে lsসাধারণ গ্লোব্বিং এর সাহায্যে কাজও করা lsযায়। (মনে রাখবেন, এটি কেবল ফাইলগুলির তালিকা দেখার জন্য, আউটপুট পাঠ্যের সাথে মোকাবেলা করার জন্য এটি অন্য প্রোগ্রামে পাস করার জন্য নয়)

bash-4.3$ ls *1*
1.txt

2
আমি মনে করি আউটপুটটি কেবলমাত্র পাইপে বর্ণযুক্ত হবে যদি --color=alwaysএটি নির্দিষ্ট করা হয় - হয় হয় উপনামের অংশ হিসাবে lবা lsনিজের জন্য পূর্ববর্তী একটি উলেফ (ডিফল্ট প্রতিস্থাপন alias ls='ls --color=auto')।
স্টিল্ড্রাইভার

@ স্টিল্ড্রাইভার ভাল পয়েন্ট, তবে এটি কি lsডিফল্টরূপে ব্যাশে নেই? type lsআমাকে দেয় যে এটির জন্য একটি নামls --color=auto
সের্গি কলডিয়াজহনি

1
হ্যাঁ এটি ডিফল্ট - তবে autoএকটি পাইপে রঙ বন্ধ করে দেয় আফাইক। ANSI রঙ ক্রম এইজন্য হওয়ার উদ্দেশ্যে এটি পরিবর্তন করা হয়েছে আবশ্যক --color=alwaysপারেন এ, lsওরফে বা lওরফে
steeldriver

ওহ, আমি আপনাকে বলতে চাইছি কি। এটা খুব বিজোড়।
সের্গেই কোলোডিয়াজনি

@ স্টিলড্রাইভার তাই আমি ওপি-কে তার উপস্ব পোস্ট করার অনুরোধ জানিয়েছিলাম এবং স্পষ্টতই তাদের যা আছে ls --colorতা রঙিনকরণ রোধ করে না (এটি পরীক্ষা করে নেওয়া হয়েছে যে আমি নিজেও)। সেই অনুসারে আমার উত্তর আপডেট করেছেন
সের্গি কলডিয়াজহনি

6

আপনার lএবং lsআদেশগুলি উপস্ব হিসাবে সেটআপ করা হয়েছে।

যখন আপনি তাদের মাধ্যমে আউটপুট বংশীধ্বনিতুল্য চালানো grep "1"(ব্যবহার |) প্রতিটি স্ক্রীনে লাইন যেখানে 1প্রদর্শিত হয় প্রদর্শিত হয়, সঙ্গে 1রঙ্গিন লাল।

কারণ ফাইলের নাম ., .., 2এবং 22একই পর্দায় লাইনে প্রদর্শিত তারা দ্বারা আউটপুট হয় grepপাশাপাশি কিন্তু লাল যা শো উপস্থিত হয় না grepম্যাচ।

এটি :34mএমন কোনও রঙের জন্য একটি পালানোর ক্রম যা সঠিকভাবে আঁকেনি paint আউটপুট সহ আপনার সংশোধিত প্রশ্নের ভিত্তিতে type -a lএবং type -aএটি আমার সিস্টেমে পুনরুত্পাদন করা যেতে পারে। দয়া করে মনে রাখবেন আপনার কাছ থেকে আপনার ওরফে পরিবর্তন করা উচিত --colorকরতে --color=auto:

রঙিন আউটপুট

রঙ এলএস


1:34mজিনিষ, দুর্নীতি নয় তারা পালাবার লেখার colorization জন্য ব্যবহৃত সিকোয়েন্স। সেই অংশে আমার উত্তর দেখুন;)
সের্গেই কলডিয়াজহনি

@ সার্জ আপনাকে ধন্যবাদ আমি এলিয়াস সহ ওপি সংশোধিত প্রশ্নের ভিত্তিতে সংশোধন করেছি।
WinEunuuchs2Unix

1

আপনার পরীক্ষায়, আপনি আপনার lsএলিফকে কল করে যাচ্ছিলেন, এইভাবে 1;34mএবং একই ধরণের শব্দ যা রঙ থেকে আসে এবং পাইপ যেহেতু |একই লাইনে এই সমস্ত গ্রহণ করে, সেই লাইনটি থেকে grepফাইলটির সাথে মেলে 1এবং ফলস্বরূপ এই লাইনটি মুদ্রণ করে। আপনি পর্দায় এটি দেখতে।

আপনি যখন এই জাতীয় জিনিসগুলি করছেন তখন সর্বদা লাইন প্রতি 1 ফলাফল সহ সিস্টেম কমান্ডে ফিরে যাওয়া ভাল।

উপকরণগুলি থেকে মুক্তি পেতে কেবল টাইপ করুন \lsএবং -1লাইন ফিড দ্বারা পৃথক করা ফলাফলগুলি মুদ্রণের বিকল্পটি ব্যবহার করুন ।

$ \ls -1 | grep "1"
1
11

দ্রষ্টব্য: ব্যাকস্ল্যাশ পদ্ধতিটি প্রতিটি কমান্ডের সাথে কাজ করে, \commandকেবল অব্যবহৃত সিস্টেম কমান্ডকে কল করে।

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