@ কুসালানন্দের সূক্ষ্ম উত্তরের উপরে মাত্র একটি অতিরিক্ত নোট ।
echo run after_bundle
ঠিক আছে কারণ 3 টি আর্গুমেন্টের echo
কোনও অক্ষরই শেলটির জন্য বিশেষ এমন অক্ষর ধারণ করে নি।
এবং (অতিরিক্ত পয়েন্টটি আমি এখানে তৈরি করতে চাই) এমন কোনও সিস্টেম লোকেল নেই যেখানে সেই বাইটগুলি শেলের জন্য বিশেষত অক্ষরে অনুবাদ করতে পারে।
এই সমস্ত অক্ষরই পসিক্সের পোর্টেবল অক্ষর সেট হিসাবে রয়েছে । এই অক্ষরগুলি উপস্থিত থাকতে হবে এবং একটি পসিক্স সিস্টেমে সমস্ত অক্ষর সেটগুলিতে একই এনকোড করা উচিত ²
সুতরাং সেই কমান্ড লাইনটি স্থানীয়ভাবে নির্বিশেষে একইভাবে ব্যাখ্যা করা হবে।
এখন, আমরা যদি সেই পোর্টেবল অক্ষর সেটের বাইরে অক্ষরগুলি ব্যবহার শুরু করি, তবে শেলটির জন্য বিশেষ না হলেও তাদের উদ্ধৃতি দেওয়া ভাল ধারণা, কারণ অন্য কোনও লোকেলগুলিতে, তাদের দ্বারা গঠিত বাইটগুলি বিভিন্ন অক্ষর হিসাবে ব্যাখ্যা করা যেতে পারে যা হয়ে উঠতে পারে শেল বিশেষ। মনে রাখবেন যে আপনি ব্যবহার করছেন echo
বা অন্য কোনও কমান্ড, সমস্যাটি echo
শেল কীভাবে তার কোডটিকে বিশ্লেষণ করে তা নয়।
উদাহরণস্বরূপ একটি ইউটিএফ -8 এ:
echo voilà | iconv -f UTF-8 -t //TRANSLIT
এটি à
0xc3 0xa0 হিসাবে এনকোড হয়েছে। এখন, যদি আপনার কাছে শেল স্ক্রিপ্টে কোডটির লাইন থাকে এবং শেল স্ক্রিপ্টটি এমন কোনও ব্যবহারকারী দ্বারা ব্যবহৃত হয় যা লোকেল ব্যবহার করে যার চরসেটটি ইউটিএফ -8 নয়, এই দুটি বাইট খুব আলাদা অক্ষর তৈরি করতে পারে।
উদাহরণস্বরূপ, fr_FR.ISO8859-15
লোকালে, একটি আদর্শ ফরাসি লোকাল যা স্ট্যান্ডার্ড সিঙ্গল-বাইট চারসেট ব্যবহার করে যা ফ্রেঞ্চ ভাষা (ইংরেজি সহ বেশিরভাগ পশ্চিমা ইউরোপীয় ভাষার জন্য একই ব্যবহৃত) ব্যবহার করে, যে 0xc3 বাইট Ã
অক্ষর হিসাবে এবং 0xa0 অ অ- হিসাবে ব্যাখ্যা করা হয় ব্রেকিং স্পেস ক্যারেক্টার।
এবং নেটবিএসডি'র মতো কয়েকটি সিস্টেমে, অবিচ্ছেদী স্থানকে একটি ফাঁকা চরিত্র হিসাবে বিবেচনা করা হয় ( isblank()
এটির সাথে সত্যটি ফিরে আসে, এটি মিলে যায় [[:blank:]]
) এবং সেগুলির মতো শাঁসগুলি bash
তাদের সিনট্যাক্সে এটি টোকেন ডিলিমিটার হিসাবে বিবেচনা করে।
যে চলমান পরিবর্তে এর মানে হল যে echo
সঙ্গে $'voil\xc3\xa0'
আর্গুমেন্ট হিসাবে, তারা সঙ্গে এটি চালানোর $'voil\xc3'
যুক্তি, এটা মুদ্রণ করা হবে না যার মানে যেমন voilà
সঠিকভাবে।
এটা তোলে BIG5, BIG5-HKSCS, GB18030, GBK মত চীনা অক্ষর সেট যা অনেক অক্ষর যার এনকোডিং হিসাবে একই এনকোডিং রয়েছে সঙ্গে অনেক খারাপ পায় |
, `
, \
(এছাড়াও যে হাস্যকর SJIS (খারাপ নাম), মাইক্রোসফট কাঞ্জি ওরফে ছাড়া এটি এর ¥
পরিবর্তে \
, তবে \
এটি 0x5c হিসাবে এনকোড করা অবস্থায় এখনও বেশিরভাগ সরঞ্জাম হিসাবে বিবেচিত হয়)।
উদাহরণস্বরূপ, যদি zh_CN.gb18030
চাইনিজ লোকালে থাকে তবে আপনি স্ক্রিপ্ট লিখুন:
echo 詜 reboot
এই স্ক্রিপ্টটি 詜 reboot
জিবি 18030 বা জিবি কে ব্যবহার করে লোকালয়ে, বিআইজি 5 বা বিআইজি 5-এইচকেএসসিএস ব্যবহার করে কোনও লোকালে আউটপুট 唰 reboot
আসবে, তবে সিএস লোকলে ASCII ব্যবহার করবে বা আইএসও 8859-15 বা ইউটিএফ -8 ব্যবহার করে লোকালে reboot
চালিত হবে কারণ জিবি 18030 এনকোডিং এর 詜
0xd4 0x7c এবং 0x7c হ'ল |
ASCII এর এনকোডিং তাই আমরা চলতে শেষ করি:
echo �| reboot
(যে প্রতিনিধিত্ব করে তবে 0xd4 বাইট লোকালে রেন্ডার করা হয়েছে)। uname
পরিবর্তে কম ক্ষতিকারক ব্যবহার করে উদাহরণ reboot
:
$ echo $'echo \u8a5c uname' | iconv -t gb18030 > myscript
$ LC_ALL=zh_CN.gb18030 bash ./myscript | sed -n l
\324| uname$
$ LC_ALL=C bash ./myscript | sed -n l
Linux$
( uname
চালানো হয়েছিল)
সুতরাং আমার পরামর্শটি হবে পোর্টেবল অক্ষর সেটের বাইরে থাকা সমস্ত স্ট্রিংয়ের উদ্ধৃতি দেওয়া ote
তবে মনে রাখবেন যে যেহেতু এর এনকোডিং \
এবং `
যারা অক্ষর কিছু এনকোডিং পাওয়া যায়, এটা ভাল না ব্যবহার করবেন তা \
বা "..."
বা $'...'
(অভ্যন্তরীণ যা `
এবং / অথবা \
এখনও বিশেষ), কিন্তু '...'
পরিবর্তে পোর্টেবল অক্ষর সেট বাহিরে অক্ষর উদ্ধৃত করা।
আমি এমন কোনও সিস্টেমের বিষয়ে অবগত নই যেখানে লোকেল রয়েছে যেখানে চরসেটের কোনও অক্ষর রয়েছে ( '
অবশ্যই নিজেরাই ব্যতীত ) যার এনকোডিংটিতে এনকোডিং রয়েছে '
, সুতরাং '...'
অবশ্যই সেগুলি নিরাপদ হওয়া উচিত।
নোট করুন যে কয়েকটি শেল $'\uXXXX'
তাদের ইউনিকোড কোড পয়েন্টের উপর ভিত্তি করে অক্ষর প্রকাশ করতে একটি স্বরলিপি সমর্থন করে। zsh
এবং এর মতো শেলগুলিতে bash
, অক্ষরটি লোকেলের চরসেটে এনকোড করা থাকে (যদিও সেই অক্ষরে অক্ষরে অক্ষর না থাকলে অপ্রত্যাশিত আচরণের কারণ হতে পারে)। এটি আপনাকে আপনার শেল কোডে নন-এএসসিআইআই অক্ষর সন্নিবেশ করা এড়াতে দেয়।
সুতরাং উপরে:
echo 'voilà' | iconv -f UTF-8 -t //TRANSLIT
echo '詜 reboot'
বা:
echo $'voil\u00e0'
echo $'\u8a5c reboot'
(সতর্কতার সাথে এটি স্ক্রিপ্টটি ভেঙে দিতে পারে যখন লোকেলগুলিতে চালিত হয় যেখানে এই অক্ষর নেই)।
বা আরও ভাল, যেহেতু \
এটিও বিশেষ echo
(বা কমপক্ষে কিছু echo
বাস্তবায়ন, কমপক্ষে ইউনিক্স অনুগত):
printf '%s\n' 'voilà' | iconv -f UTF-8 -t //TRANSLIT
printf '%s\n' '詜 reboot'
(মনে রাখবেন যে \
এটি প্রথম যুক্তিতেও বিশেষ printf
, তাই নন-এএসসিআইআই অক্ষরগুলিতে এনকোডিং থাকতে পারে সেখানে সেগুলি আরও ভালভাবে এড়ানো যায় \
)।
আপনি যেটি করতে পারেন তা নোট করুন:
'echo' 'voilà' | 'iconv' '-f' 'UTF-8' '-t' '//TRANSLIT'
(এটি অত্যধিক দক্ষ হবে তবে আপনি যদি কিছু নিশ্চিত না হন যে অক্ষরগুলি বহনযোগ্য চরিত্রের সেটে রয়েছে) তবে আপনাকে কিছুটা মনের শান্তি দিতে পারে)
এছাড়াও নিশ্চিত করুন যে `...`
কমান্ড প্রতিস্থাপনের প্রাচীন ফর্মটি (যা ব্যাকস্ল্যাশ প্রক্রিয়াজাতকরণের আরও একটি স্তরকে প্রবর্তন করে) কখনও ব্যবহার $(...)
না করে , পরিবর্তে ব্যবহার করুন।
¹ টেকনিক্যালি, echo
এছাড়াও আর্গুমেন্ট হিসাবে পাস করা হয়েছে echo
ইউটিলিটি (এটা বলতে কিভাবে এটি চালানো হয়েছিল), এটা argv[0]
এবং argc
, যদিও অধিকাংশ শাঁস ইদানিং 3 echo
builtin হয়, তাই যে exec()
একটি এর /bin/echo
3 আর্গুমেন্ট একটি তালিকা সঙ্গে ফাইল দ্বারা কৃত্রিম হয় শেল। দ্বিতীয়টি ( argv[1]
থেকে argv[argc - 1]
) দিয়ে শুরু হওয়ার সাথে যুক্তিগুলির তালিকাটি বিবেচনা করাও সাধারণ কারণ কমান্ডগুলি মূলত তার উপর নির্ভর করে।
Free যে ja_JP.SJIS
ফ্রিবিএসডি সিস্টেমগুলির চরসেটের কোনও চরিত্র \
বা ~
বৈশিষ্ট্য নেই তার হাস্যকর লোকাল হিসাবে এটি একটি উল্লেখযোগ্য ব্যতিক্রম !
³ মনে রাখবেন যে অনেকগুলি সিস্টেম (ফ্রিবিএসডি, সোলারিস, যদিও জিএনইউ নয়) [[:blank:]]
ইউটিএফ -8 লোকেলগুলিতে ইউ + 00A0 কে একটি হিসাবে বিবেচনা করে, এই জাতীয় সমস্যা এড়াতে সম্ভবত আইএসও 8859-15 ব্যবহারকারীদের মতো অন্যান্য লোকেলগুলিতে কয়েকজনই করেন।