কেন [এজেড] ছোট ছোট অক্ষরে বাশে মিলছে?


42

সমস্ত শেলগুলিতে আমি সচেতন, rm [A-Z]*বড় হাতের অক্ষর দিয়ে শুরু হওয়া সমস্ত ফাইল সরিয়ে দেয়, তবে ব্যাশ দিয়ে এটি একটি অক্ষর দিয়ে শুরু হওয়া সমস্ত ফাইল সরিয়ে দেয়।

লিনাক্স এবং সোলারিসে ব্যাশ -৩ এবং ব্যাশ -4 সহ যেহেতু এই সমস্যাটি বিদ্যমান রয়েছে, এটি libc তে বগি প্যাটার্ন ম্যাচারের কারণে বা মিস-কনফিগার করা লোকেলের সংজ্ঞা দ্বারা সৃষ্ট ত্রুটি হতে পারে না।

এই অদ্ভুত এবং ঝুঁকিপূর্ণ আচরণটি কি উদ্দেশ্যযুক্ত বা এটি কেবল একটি বাগ যা বহু বছর থেকে অনুপস্থিত রয়েছে?


3
localeআউটপুট কি করে ? আমি এটি পুনরুত্পাদন করতে পারি না ( touch foo; echo [A-Z]*অন্যথায় ফাঁকা ডিরেক্টরিতে "foo" নয়, আক্ষরিক প্যাটার্নটি আউটপুট করে)।
চিপনার

4
কতজন লোক বলেছেন যে এটি তাদের জন্য কাজ করে, বা এলসি_সিএলএলটি এটি কীভাবে প্রভাবিত করে তার উদাহরণ দেখিয়েছে, সম্ভবত আপনি একটি প্রশ্নে একটি নমুনা বাশ সেশন যুক্ত করতে সম্পাদনা করতে পারেন যা আপনার সম্পর্কে ঠিক যে দৃশ্যের বিষয়ে জিজ্ঞাসা করছেন তা চিত্রিত করে। আপনি যে ব্যাশ সংস্করণটি ব্যবহার করছেন তা অন্তর্ভুক্ত করুন।
ক্যানস্টার

আপনি যদি এখানে সমস্ত পাঠ্য পড়েন তবে আপনি জানতে পারবেন যে আমি কোন বাশ সংস্করণটি ব্যবহার করছি এবং যেহেতু আমি ইতিমধ্যে আমার প্রশ্নের সমাধান পোস্ট করেছি। আমাকে সমাধানটি পুনরাবৃত্তি করতে দিন: ব্যাশ এটির নিজস্ব লোকাল পরিচালনা করে না যাতে LC_COLLATE সেট করা নতুন পরিবেশের সাথে আর কোনও বাশ প্রক্রিয়া শুরু না করা পর্যন্ত কোনও পরিবর্তন হয় না।
সহজেই 2:25

1
এছাড়াও দেখুন (LC_COLLATE) কি চরিত্রের ব্যাপ্তিকে প্রভাবিত করে? (তবে সেই প্রশ্নটি বিশেষত বাশ সম্পর্কে ছিল না)
গিলস 21

"LC_COLLATE সেট করা নতুন পরিবেশের সাথে আপনি আর একটি বাশ প্রক্রিয়া শুরু না করা পর্যন্ত কোনও কিছু পরিবর্তন করে না" " সোলারিসের সাথে আমি ব্যাশ -4 এর সাথে যে আচরণটি দেখছি তা মেলে না। এটি চলমান শেলের আচরণ পরিবর্তন করছে is # echo [A-Z]* ; export LC_COLLATE=C ; echo [A-Z]*এ বি বি জেড জ্যাবজেড
বোলফফ্রেড

উত্তর:


67

মনে রাখবেন যে [এজেড] এর মতো পরিসীমা এক্সপ্রেশন ব্যবহার করার সময়, LC_COLLATE এর সেটিংয়ের উপর নির্ভর করে অন্য ক্ষেত্রে বর্ণগুলি অন্তর্ভুক্ত থাকতে পারে।

LC_COLLATE এমন একটি পরিবর্তনশীল যা পথের নাম প্রসারণের ফলাফলগুলি বাছাই করার সময় ব্যবহৃত কোলেশন অর্ডার নির্ধারণ করে এবং পরিধি এক্সপ্রেশন, সমতুল্য শ্রেণি এবং পথের নাম এবং প্রকরণের মিলের মধ্যে কোলাটিং সিকোয়েন্সগুলির আচরণ নির্ধারণ করে।


নিম্নোক্ত বিবেচনা কর:

$ touch a A b B c C x X y Y z Z
$ ls
a  A  b  B  c  C  x  X  y  Y  z  Z
$ echo [a-z] # Note the missing uppercase "Z"
a A b B c C x X y Y z
$ echo [A-Z] # Note the missing lowercase "a"
A b B c C x X y Y z Z

লক্ষ্য করুন যখন কমান্ডটি কল echo [a-z]করা হবে, প্রত্যাশিত আউটপুটটি ছোট হাতের অক্ষরের সমস্ত ফাইল হবে। এছাড়াও, এর সাথে echo [A-Z], বড় হাতের অক্ষরযুক্ত ফাইলগুলি প্রত্যাশিত হবে।


স্থানীয় ক্রিয়াকলাপগুলির সাথে যেমন en_USনীচের ক্রম রয়েছে:

aAbBcC...xXyYzZ
  • এর মধ্যে aএবং z(মধ্যে [a-z]) হ'ল সমস্ত বড় হাতের অক্ষর Z
  • এর মধ্যে Aএবং Z(মধ্যে [A-Z]) হ'ল সমস্ত ছোট হাতের অক্ষর a

দেখা:

     aAbBcC[...]xXyYzZ
     |              |
from a      to      z

     aAbBcC[...]xXyYzZ
      |              |
from  A     to       Z

আপনি যদি LC_COLLATEভেরিয়েবলটিকে Cপ্রত্যাশার মতো পরিবর্তন করেন তবে :

$ export LC_COLLATE=C
$ echo [a-z]
a b c x y z
$ echo [A-Z]
A B C X Y Z

সুতরাং, এটি কোনও বাগ নয় , এটি একটি জোটের সমস্যা


পরিসীমা অভিব্যক্তির পরিবর্তে আপনি POSIX সংজ্ঞায়িত চরিত্রের ক্লাসগুলি ব্যবহার করতে পারেন , যেমন upperবা lower। তারা বিভিন্ন LC_COLLATEকনফিগারেশন এমনকি উচ্চারণযুক্ত অক্ষরগুলির সাথেও কাজ করে :

$ echo [[:lower:]]
a b c x y z à è é
$ echo [[:upper:]]
A B C X Y Z

এই আচরণটি যদি এলসি_ * এনভায়রনমেন্ট ভেরিয়েবল দ্বারা নিয়ন্ত্রণযোগ্য হয় তবে আমি জিজ্ঞাসা করি না। আমি পসিএক্স স্ট্যান্ডার্ড কমিটিতে কাজ করি এবং আমি সমস্যাগুলির সাথে জড়িত উদাহরণস্বরূপ জানি, trতাই এটিই আমি প্রথমে যাচাই করেছি।
ভালভাবে

@ খুব সহজেই আমি আপনার সমস্যা পুরাতন বাশ -3 বা ব্যাশ -4 এর সাথে পুনরুত্পাদন করতে পারি না; উভয়ই নিয়ন্ত্রণযোগ্য LC_COLLATEযার মাধ্যমে ম্যানুয়ালটিতে নথিভুক্তও হয়।
বিশৃঙ্খলা

দুঃখিত, আপনি যা বিশ্বাস করেন তা আমি পুনরুত্পাদন করতে পারি না, তবে আমার নিজের উত্তর দেখুন ... এই আলোচনার ধারণাগুলি থেকে আমি সমস্যার কারণটি আবিষ্কার করেছি।
সহজেই 2'15

25

[A-Z]মধ্যে bashম্যাচ সব উপাদান ক্রমানুসারে সাজানো (অক্ষর কিন্তু কল হতে মত অক্ষরের ক্রম Dszহাঙ্গেরীয় লোকেলে) যে সাজানোর পর Aএবং সাজানোর আগে Z। আপনার লোকালে cসম্ভবত বি এবং সি এর মধ্যে বাছাই করা থাকে probably

$ printf '%s\n' A a á b B c C Ç z Z  | sort
a
A
á
b
B
c
C
Ç
z
Z

সুতরাং cবা এর সাথে zমিলবে [A-Z], তবে বা নয় a

$ printf '%s\n' A a á b B c C Ç z Z  |
pipe>  bash -c 'while IFS= read -r x; do case $x in [A-Z]) echo "$x"; esac; done'
A
á
b
B
c
C
Ç
z
Z

সি লোকালে, অর্ডারটি হবে:

$ printf '%s\n' A a á b B c C Ç z Z  | LC_COLLATE=C sort
A
B
C
Z
a
b
c
z
Ç
á

সুতরাং [A-Z]মেলে দিবে A, B, C, Z, কিন্তু না Çএবং এখনও না

যদি আপনি বড় হাতের অক্ষরে (যে কোনও স্ক্রিপ্টে) মিল করতে চান তবে আপনি [[:upper:]]পরিবর্তে ব্যবহার করতে পারেন । লাতিন স্ক্রিপ্টে bashকেবলমাত্র বড় হাতের অক্ষরের সাথে মিলানোর কোনও অন্তর্নির্মিত উপায় নেই (স্বতন্ত্রভাবে সেগুলি বাদ দিয়ে)।

আপনি মেলে চান Aকরতে Z ইংরেজি ডায়াক্রিটিক ছাড়া অক্ষর, আপনি হয় ব্যবহার করতে পারেন [A-Z]বা [[:upper:]]কিন্তু Cলোকেল (ডেটা অভিমানী BIG5 বা GB18030 যা কয়েক অক্ষর যার এনকোডিং রয়েছে মত চরিত্র সেটে এনকোড করা হয় না ধারণ করে অথবা তালিকার সেই চিঠির এনকোডিং) তাদের পৃথকভাবে ( [ABCDEFGHIJKLMNOPQRSTUVWXYZ])।

খেয়াল করুন যে শাঁসের মধ্যে কিছু পার্থক্য রয়েছে।

এর জন্য zsh, bash -O globasciiranges(বাশ -৩.৩ এ আশ্চর্যজনকভাবে নামযুক্ত বিকল্পটি চালু করা হয়েছে), schily-shএবং yash, [A-Z]এমন অক্ষরের সাথে মেলে যাঁর কোড পয়েন্টটি এর Aএবং এর মধ্যকার হয় Z, তাই bashসি লোকেলের আচরণের সমতুল্য হবে ।

ছাই, মাক্স এবং প্রাচীন শাঁসের জন্য zshউপরের মতো তবে একক বাইট অক্ষরেখার মধ্যে সীমাবদ্ধ। উদাহরণস্বরূপ, কোনও ইউটিএফ -8 লোকালে এটি মিলবে [É-Ź]না Ó, তবে যেহেতু [<c3><89>-<c5><b9>], এটি বাইট মান 0x89 থেকে 0xc5 তে মিলবে!

ksh93এগুলি bashব্যতীত এমন আচরণ করে যে এটি বিশেষ ক্ষেত্রে সীমা হিসাবে বিবেচনা করে যার শেষ উভয়টি ছোট হাতের অক্ষর বা বড় হাতের অক্ষর দিয়ে শুরু হয়। সেক্ষেত্রে এটি কেবল মিলিত উপাদানগুলির সাথে মেলে যা এই প্রান্তগুলির মধ্যে বাছাই করে তবে এটি (বা তাদের বহু চরিত্রের সহযোগী উপাদানগুলির জন্য প্রথম চরিত্র) এছাড়াও ছোট হাতের অক্ষর (বা বড় আকারে যথাক্রমে) থাকে। সুতরাং [A-Z]সেখানে মেলে দিবে É, কিন্তু না eযেমন eমধ্যে সাজানোর করে Aএবং Zকিন্তু মত বড় হাতের অক্ষরে নয় Aএবং Z

জন্য fnmatch()ধরন (হিসেবে find -name '[A-Z]') অথবা সিস্টেম রেগুলার এক্সপ্রেশনের (হিসাবে grep '[A-Z]'), এটা সিস্টেম এবং লোকেল উপর নির্ভর করে। উদাহরণস্বরূপ, একজন গনুহ সিস্টেম এখানে উপর, [A-Z]উপর মিলছে না xen_GB.UTF-8লোকেল, কিন্তু এটা মধ্যে আছে th_TH.UTF-8এক। এটি নির্ধারণ করতে এটি কোন তথ্য ব্যবহার করে তা আমার কাছে অস্পষ্ট, তবে এটি দৃশ্যত LC_COLLATE লোকাল ডেটা থেকে প্রাপ্ত লুকিং টেবিলের উপর ভিত্তি করে )।

পসিক্সের দ্বারা সমস্ত আচরণের অনুমতি দেওয়া হয়েছে কারণ পসিক্স সি লোকেল ব্যতীত অন্য লোকেলগুলিতে নির্ধারিত রেঞ্জের আচরণ ছেড়ে দেয়। এখন আমরা প্রতিটি পদ্ধতির সুবিধা নিয়ে তর্ক করতে পারি।

bashএর পদ্ধতির সাথে অনেকটা ধারণা তৈরি হয় [C-G], আমরা এর মধ্যে Cএবং অক্ষরগুলি চাই G। এবং এর মধ্যে যা আছে তা নির্ধারণ করে এর জন্য ব্যবহারকারীর সাজানোর ক্রমটি ব্যবহার করা সর্বাধিক যৌক্তিক পদ্ধতি।

এখন, সমস্যাটি হ'ল এটি প্রচুর মানুষের প্রত্যাশা ভঙ্গ করে, বিশেষত people লোকেরা প্রাক-ইউনিকোড এমনকি প্রাক-আন্তর্জাতিকীকরণের দিনগুলির প্রচলিত আচরণে অভ্যস্ত ছিল। যদিও একজন সাধারণ ব্যবহারকারী থেকে মে এই অর্থে যে তোলে [C-I]অন্তর্ভুক্ত hহিসাবে hচিঠি মধ্যে Cএবং Iএবং যে [A-g]অন্তর্ভুক্ত নয় Z, লোকেরা শুধু কয়েক দশক ধরে হওয়া ASCII মোকাবেলা থাকার জন্য একটি ভিন্ন ব্যাপার।

যে bashআচরণ থেকে এছাড়াও ভিন্ন [A-Z](হিসাবে গনুহ রেগুলার এক্সপ্রেশনের মধ্যে মত অন্যান্য গনুহ সরঞ্জাম পরিসীমা ম্যাচিং grep/ sed...) অথবা fnmatch()হিসাবে find -name

এর অর্থ হ'ল কী [A-Z]মেলে তা পরিবেশের সাথে ওএস এবং ওএসের সংস্করণের সাথে পরিবর্তিত হয়। সত্য যে [A-Z]একটি ম্যাচ কিন্তু Z এছাড়াও দরুণ পর্যাপ্ত নয়।

জন্য zsh/ yash, আমরা একটি ভিন্ন সাজানোর ক্রম ব্যবহার করুন। চরিত্র ক্রমের ব্যবহারকারীর ধারণার উপর নির্ভর করার পরিবর্তে আমরা অক্ষর বিন্যাস কোড মানগুলি ব্যবহার করি। এটি সহজেই বোঝার সুবিধা রয়েছে তবে এএসসিআইআই এর বাইরে কয়েকজনের ব্যবহারিক দিক থেকে এটি খুব বেশি কার্যকর নয়। [A-Z]26 ইউএস-ইংলিশ উচ্চ-অক্ষরের অক্ষরের সাথে [0-9]মেলে, দশমিক অঙ্কের সাথে মেলে। ইউনিকোডে কোড পয়েন্ট রয়েছে যা কিছু বর্ণমালার ক্রম অনুসরণ করে তবে এটি সাধারণীকরণ হয় না এবং সাধারণকরণ করা যায় না কারণ যেভাবে একই স্ক্রিপ্ট ব্যবহার করা বিভিন্ন ব্যক্তি অবশ্যই অক্ষরের ক্রমের সাথে একমত হন না।

Traditionalতিহ্যবাহী শাঁস এবং ম্যাক্স, ড্যাশগুলির জন্য, এটি ভেঙে গেছে (এখন বেশিরভাগ লোকেরা মাল্টি-বাইট অক্ষর ব্যবহার করে) তবে মূলত কারণ তাদের এখনও মাল্টি-বাইট সমর্থন নেই। শেলগুলিতে মাল্টি-বাইট সমর্থন যুক্ত করা bashএবং zshএটি একটি বিশাল প্রচেষ্টা এবং এখনও অব্যাহত রয়েছে। yash(একটি জাপানিজ শেল) প্রথম থেকেই বহু-বাইট সমর্থন দিয়ে ডিজাইন করা হয়েছিল।

সিস্টেমের নিয়মিত এক্সপ্রেশন বা fnmatch () (বা কমপক্ষে GNU সিস্টেমে কমপক্ষে প্রদর্শিত হবে) এর সাথে সামঞ্জস্য হওয়ার জন্য ksh93 এর পদ্ধতির সুবিধা রয়েছে। সেখানে, এটি কিছু লোকের প্রত্যাশা ভঙ্গ [A-Z]করে না কারণ এর মধ্যে ছোট ছোট অক্ষর [A-Z]অন্তর্ভুক্ত নেই É(এবং Á, তবে not নয়)। এটি সামঞ্জস্যপূর্ণ নয় sortবা সাধারণত strcoll()অর্ডার করে।


1
আপনি যদি সঠিক থাকেন তবে এটি LC_ * ভেরিয়েবলের মাধ্যমে নিয়ন্ত্রণ করা যেতে পারে। মনে হয় এর অন্য কোনও কারণ রয়েছে।
সহজেই 2'15

1
@ কুওগলম, আরও বেশি পছন্দ mksh(উভয়ই পিডিক্স থেকে প্রাপ্ত)। posh -c $'case Ó in [É-Ź]) echo yes; esac'কিছুই না।
স্টাফেন চেজেলাস

2
@ শাইলি, আমি উল্লেখ করেছি sortকারণ গ্লোবগুলি bashঅক্ষর বাছাই আদেশের উপর ভিত্তি করে। আমার বর্তমানে এর মতো পুরানো সংস্করণে অ্যাক্সেস নেই bashতবে আমি পরে এটি পরীক্ষা করতে পারি। তখন কি আলাদা ছিল?
স্টাফেন চেজেলাস

1
আমাকে আবার উল্লেখ করতে দাও: zsh, POSIX-ksh88, ksh93t + বোর্ন শেল, সমস্তই আমার প্রত্যাশা অনুযায়ী একই আচরণ করে। বাশ হ'ল একমাত্র শেল যা ভিন্ন আচরণ করে এবং ব্যাশ এই ক্ষেত্রে লোকালের মাধ্যমে নিয়ন্ত্রণযোগ্য নয়।
দ্রুত

2
@schily, নোট যে \xFFআছে বাইট 0xFF না চরিত্র U + এ 00FF ( ÿনিজেই 0xC3 0xBF যেমন এনকোড)। \xFFএকা বৈধ চরিত্র গঠন করে না তাই কেন এটির সাথে মিলে যাওয়া উচিত তা আমি দেখতে পাচ্ছি না [É-Ź]
স্টাফেন চেজেলাস

9

এটি bashনথিবদ্ধকরণ, প্যাটার্ন ম্যাচিং বিভাগে উদ্দেশ্যযুক্ত এবং নথিভুক্ত । পরিসীমা এক্সপ্রেশনটি বর্তমান লোকেলের কোলটিং সিকোয়েন্স এবং চরিত্রের সেট এর [X-Y]মধ্যে Xএবং Yব্যবহার করে যে কোনও অক্ষর অন্তর্ভুক্ত করা হবে :

LC_ALL=en_US.utf8 bash -c 'case b in [A-Z]) echo yes; esac' 
yes

আপনি দেখতে পাচ্ছেন, লোকেলের bমধ্যে Aএবং এর Zমধ্যে বাছাই করেছেন en_US.utf8

এই আচরণটি রোধ করার জন্য আপনার কিছু পছন্দ আছে:

# Setting LC_ALL or LC_COLLATE to C
LC_ALL=C bash -c 'echo [A-Z]*'

# Or using POSIX character class
LC_ALL=C bash -c 'echo [[:upper:]]*'

বা সক্ষম globasciiranges(বাশ 4.3 এবং উপরের সাথে):

bash -O globasciiranges -c 'echo [A-Z]*'

6

আমি একটি নতুন আমাজন ইসি 2 উদাহরণে এই আচরণটি পর্যবেক্ষণ করেছি। যেহেতু ওপিতে এমসভিই অফার করা হয়নি , তাই আমি এটি পোস্ট করব:

$ cd $(mktemp -d)
$ touch foo
$ echo [A-Z]*     # prepare for a surprise!
foo

$ echo $BASH_VERSION
4.1.2(1)-release
$ uname -a
Linux spinup-tmp12 3.14.27-25.47.amzn1.x86_64 #1 SMP Wed Dec 17 18:36:15 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

$ env | grep LC_  # no locale, let's set one
$ LC_ALL=C
$ echo [A-Z]*
[A-Z]*

$ unset LC_ALL    # ok, good. what if we go back to no locale?
$ echo [A-Z]*
foo

সুতরাং, আমার LC_*সেট না থাকায় বাশ 4.1.2 (1) বাড়ে - লিনাক্সে আপাতদৃষ্টিতে বিজোড় আচরণ তৈরি করতে দয়া করে। আমি সম্পর্কিত লোকেলের ভেরিয়েবলগুলি সেট করে ও সেট না করে নির্ভরযোগ্যতার সাথে বিজোড় আচরণটি টগল করতে পারি। অবাক হওয়ার মতো বিষয় নয়, এই আচরণটি রফতানির মাধ্যমে সামঞ্জস্যপূর্ণ প্রদর্শিত হয়:

$ export LC_ALL=C
$ bash
$ echo [A-Z]*
[A-Z]*
$ exit
$ echo $SHLVL
1
$ unset LC_ALL
$ bash
$ echo [A-Z]*
foo

আমি যখন স্টাফেন "শেলশক" চ্যাজেলাসের উত্তর হিসাবে বাশের আচরণ দেখছিলাম তখন আমার মনে হয় প্যাটার্ন ম্যাচিংয়ের ক্ষেত্রে ব্যাশ ডকুমেন্টেশনগুলি বগি:

উদাহরণস্বরূপ, মধ্যে ডিফল্ট সি লোকেল , '[একটি-DX-z- র] সমতূল্য' [abcdxyz]

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

$ echo [A-E]*
[A-E]*
$ echo [A-F]*
foo
$ touch "évocateur"
$ echo [A-F]*
foo évocateur

আমি মনে করি বাশের পক্ষে ডকুমেন্টটি দেওয়া ভাল হবে যখন LC_*(বিশেষত LC_CTYPEএবং LC_COLLATE) অপরিবর্তিত থাকলে এটি কীভাবে আচরণ করবে । তবে মাঝামাঝি সময়ে, আমি কিছু জ্ঞান ভাগ করে নেব :

... আপনাকে [চরিত্রের ব্যাপ্তিগুলি] সম্পর্কে খুব সাবধানতা অবলম্বন করতে হবে কারণ তারা সঠিকভাবে কনফিগার না করা হলে তারা প্রত্যাশিত ফলাফল আনবে না। আপাতত, আপনার সেগুলি ব্যবহার এড়ানো উচিত এবং পরিবর্তে চরিত্রের ক্লাসগুলি ব্যবহার করা উচিত।

এবং

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


@ জি-ম্যান মন্তব্যের উপর ভিত্তি করে আপডেট করুন, আসুন কী ঘটছে তার আরও গভীরভাবে দেখি:

$ env | grep LANG
LANG=en_US.UTF-8

আহ, হা! এটি আগে দেখা মিলন ব্যাখ্যা করে। আসুন সমস্ত স্থানীয় ভেরিয়েবলগুলি মুছে ফেলা যাক:

$ unset LANG LANGUAGE LC_ALL
$ env | grep 'LC_|LANG'
$ echo [A-Z]*
[A-Z]*

আমরা শুরু করছি. এখন বাশ এই লিনাক্স সিস্টেমে ডকুমেন্টেশনের ক্ষেত্রে ধারাবাহিকভাবে কাজ করে। লোকেল ভেরিয়েবল কোনো সেট ইন করেন ( LANGUAGE, LANG, LC_COLLATE, LC_CTYPE, LC_ALL, ইত্যাদি) তারপর ব্যাশ তার ম্যানুয়াল অনুযায়ী ঐ ব্যবহার করে। অন্যথায়, বাশ আবার সিতে পড়ে falls

Wooledge ব্যাশ প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী এই বলে জানিয়েছে:

সাম্প্রতিক জিএনইউ সিস্টেমে ভেরিয়েবলগুলি এই ক্রমে ব্যবহৃত হয়। যদি ভাষাটি সেট করা থাকে, তবে এটি ব্যবহার করুন, যদি না ল্যাং সি তে সেট করা থাকে, তবে এই ক্ষেত্রে ভাষাটি উপেক্ষা করা হবে। এছাড়াও, কিছু প্রোগ্রাম সহজেই ভাষা ব্যবহার করে না। অন্যথায়, যদি এলসি_এল সেট করা থাকে তবে এটি ব্যবহার করুন। অন্যথায়, যদি এই ব্যবহারটি অন্তর্ভুক্ত করে নির্দিষ্ট এলসি_ * ভেরিয়েবল সেট করা থাকে তবে এটি ব্যবহার করুন। (উদাহরণস্বরূপ, LC_MESSAGES ত্রুটি বার্তাগুলি কভার করে)) অন্যথায়, LANG ব্যবহার করুন।

সুতরাং অপারেশন এবং ডকুমেন্টেশন উভয় ক্ষেত্রে আপাত সমস্যাটি সমস্ত লোকাল ড্রাইভিং ভেরিয়েবলের মোট যোগফলটি ব্যাখ্যা করে ব্যাখ্যা করা যেতে পারে।


যদি কোনও এলসি_ভেরিয়েবল উপস্থিত না থাকে এবং ব্যাশ Cলোকালের জন্য নথি হিসাবে আচরণ না করে তবে এটি একটি বাগ।
স্কিচিলি

1
@ বিশপ: (১) টাইপো: এমভিসিই এমসিভিই হওয়া উচিত। (2) আপনি আপনার উদাহরণ সম্পূর্ণ হবে চান, আপনি যোগ করা উচিত env | grep LANGবা echo "$LANG"
জি-ম্যান

@ সুচিলি আরও তদন্ত আমাকে নিশ্চিত করেছে যে এই লিনাক্স সিস্টেমে ডকুমেন্টেশন বা অপারেশনটিতে কোনও ত্রুটি নেই।
বিশপ

@ জি-ম্যান ধন্যবাদ! আমি ভুলে গিয়েছিলাম LANG। যে ইঙ্গিত দিয়ে, সমস্ত ব্যাখ্যা করা হয়।
বিশপ

প্রথম স্থানীয়করণের প্রচেষ্টার জন্য সান 1988 সালের দিকে ল্যাং চালু করেছিল, তারা আবিষ্কার করেছিল যে একক ভেরিয়েবল যথেষ্ট নয়। আজ এটি ফ্যালব্যাক হিসাবে ব্যবহৃত হয় এবং এলসি_এলএলকে জোর করে ওভাররাইট হিসাবে ব্যবহার করা হয়।
সহজেই

3

স্থানীয় অক্ষরগুলির সাথে কী মিলছে তা পরিবর্তন করতে পারে [A-Z]। ব্যবহার

(LC_ALL=C; rm [A-Z]*)

প্রভাব দূর করতে। (পরিবর্তনটি স্থানীয়করণের জন্য আমি সাবসেল ব্যবহার করেছি)।


এটি কাজ করে না, এটি এখনও সমস্ত অক্ষরের সাথে মেলে
ভালভাবে

7
এটি কাজ করবে না কারণ আরএম এক্সিকিউট হওয়ার আগে গ্লোব করা হয়েছিল। export LC_ALL=Cপ্রথমে চেষ্টা করুন ।
cuonglm

দুঃখিত, আপনি যে প্রশ্নটি বাশের সাথে সম্পর্কিত এবং আরএম-এর সাথে সম্পর্কিত নয় তা ভুল করেছেন।
সহজেই 2'15

@ শাইলি: হ্যাঁ, আমি ভুল ছিলাম, আপনাকে বিবৃতি আলাদা করতে হবে। আপডেটটি দেখুন।
চোরোবা

2

যেমন ইতিমধ্যে বলা হয়েছে, এটি একটি "সহযোগী আদেশ" ইস্যু।

পরিসীমা এজেজে কিছু লোকালে বড় হাতের অক্ষর থাকতে পারে:

     aAbBcC[...]xXyYzZ
     |              |
from a      to      z

বাশ ৪.৩ থেকে সঠিক সমাধানটি বিকল্প সেট করা globasciiranges:

shopt -s globasciiranges

বাশ আইনটি এমনভাবে LC_COLLATE=Cকরা যাতে গ্লোব আইএনগ রেঞ্জ সেট করা থাকে ।


-6

দেখে মনে হচ্ছে আমি আমার নিজের প্রশ্নের সঠিক উত্তর পেয়েছি:

এটি নিজের লোকাল পরিচালনা করে না বলে বাশ বগি। সুতরাং ব্যাশ প্রক্রিয়াতে এলসি_ * সেট করা শেল প্রক্রিয়াটিতে কার্যকর হয় না।

আপনি যদি LC_COLLATE = C সেট করেন এবং তারপরে অন্য একটি ব্যাশ শুরু করেন, নতুন ব্যাশ প্রক্রিয়াতে প্রত্যাশার মতো গ্লোববিং কাজ করে।


2
আমার কোনও বেসে নেই।
বিশৃঙ্খলা

2
আমি আমার মেশিনে ব্যাশের কোনও সংস্করণে এটি তিরস্কার করি না, মনে হচ্ছে আপনি exportএটি সঠিকভাবে করেন নি।
ক্রিস ডাউন

সুতরাং আপনি বিশ্বাস করেন যে এমন কিছু যা সঠিকভাবে রফতানি করা হয়, যাতে এটি কোনও নতুন ব্যাশ প্রক্রিয়াটিকে সঠিকভাবে রফতানি করে না?
সুস্পষ্টভাবে 2'15

4
সোলারিসের পরিবেশের পরিচালনা কুখ্যাতভাবে ঘাটতি, সুতরাং বাশ-এ থাকা "বাগ" যদি সোলারিস-নির্দিষ্ট কাজের ভিত্তির অভাব হত তবে আমি অবাক হব না।
হাবস

1
@ শচিলি: শেলের মধ্যে এলসি_ * ভেরিয়েবলগুলি পরিবর্তন করার জন্য এটির নিজস্ব লোকেল অবস্থা আপডেট করার প্রয়োজন আছে, এর জন্য আপনার কি একটি প্রশংসা আছে? আমি ঠিক বিপরীত মনে হবে। বিশেষত একটি স্ক্রিপ্ট সম্পাদনকারী শেলটির জন্য, স্ক্রিপ্টটির পার্সিং / এক্সিকিউশনিংয়ের মাধ্যমে লোকাল মিড-ওয়ে পরিবর্তন করা এমনকি সঠিকভাবে সংজ্ঞায়িত আচরণও করতে পারে না, কারণ স্ক্রিপ্টটি একটি পাঠ্য ফাইল এবং "পাঠ্য ফাইল" কেবল একটি প্রসঙ্গে প্রাসঙ্গিকভাবে অর্থবহ একক অক্ষর এনকোডিং।
আর ..
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.