বাশ-এ, কমান্ডের সাথে কমান্ড লাইন আর্গুমেন্ট নির্দিষ্ট করার সময়, কোন অক্ষরগুলি এড়ানোর প্রয়োজন হয়?
তারা ব্যাশ এর metacharacters সীমাবদ্ধ: স্থান, ট্যাব,
|
, &
, ;
, (
, )
, <
, এবং >
?
বাশ-এ, কমান্ডের সাথে কমান্ড লাইন আর্গুমেন্ট নির্দিষ্ট করার সময়, কোন অক্ষরগুলি এড়ানোর প্রয়োজন হয়?
তারা ব্যাশ এর metacharacters সীমাবদ্ধ: স্থান, ট্যাব,
|
, &
, ;
, (
, )
, <
, এবং >
?
উত্তর:
নিম্নলিখিত বর্ণগুলি কয়েকটি প্রসঙ্গে শেল নিজেই বিশেষ অর্থ রয়েছে এবং যুক্তিতে এড়াতে হতে পারে:
`
ব্যাকটিক (U + 0060 গ্রেভ অ্যাকসেন্ট)~
টিলডে (U + 007E)!
বিস্ময়কর চিহ্ন (U + 0021)#
হ্যাশ (ইউ + 0023 নম্বর সাইন)$
ডলার সাইন (U + 0024)&
এম্পারস্যান্ড (U + 0026)*
তারকাচিহ্ন (U + 002A)(
বাম পের্থেসিস (U + 0028))
ডান বন্ধনী (U + 0029)
( ⇥
) ট্যাব (ইউ + 0009){
বাম বন্ধনী (U + 007B বাম কোঁকড়া বন্ধনী)[
বাম বর্গাকার বন্ধনী (U + 005B)|
উল্লম্ব বার (U + 007C উল্লম্ব লাইন)\
ব্যাকস্ল্যাশ (ইউ + 005 সি বিপরীত সলিডাস);
সেমিকোলন (U + 003B)'
একক উদ্ধৃতি / অ্যাপোসট্রোফ (ইউ + 0027)"
ডাবল উদ্ধৃতি (U + 0022)↩
নতুন লাইন (U + 000A)<
(U + 003C) এর চেয়ে কম>
(U + 003E) এর চেয়ে বড়?
প্রশ্ন চিহ্ন (U + 003F)
স্পেস (U + 0020) 1এই লিখিত চরিত্রগুলির মধ্যে কয়েকটি আমি যুক্ত লিঙ্কটির চেয়ে বেশি জিনিস এবং আরও বেশি জায়গায় ব্যবহার করা হয়।
কয়েকটি কর্নার কেস রয়েছে যা সুস্পষ্টভাবে alচ্ছিক:
!
set +H
অ-ইন্টারেক্টিভ শেলগুলির মধ্যে এটি ডিফল্ট যা দিয়ে অক্ষম করা যায়।{
সঙ্গে অক্ষম করা যেতে পারে set +B
।*
এবং ?
এর সঙ্গে যোগাযোগ নিষ্ক্রিয় করা যেতে পারে set -f
বাset -o noglob
।=
সমতুল্য চিহ্ন (U + 003D) এ সক্ষম set -k
বাset -o keyword
সক্ষম থাকলেও পালানো দরকার ।একটি নতুন লাইন ছেড়ে যাওয়ার জন্য উদ্ধৃতি প্রয়োজন - ব্যাকস্ল্যাশগুলি কাজটি করবে না। আইএফএস-এ তালিকাভুক্ত অন্য যে কোনও অক্ষরের জন্য অনুরূপ হ্যান্ডলিং প্রয়োজন। আপনি অব্যাহতি প্রয়োজন হবে না ]
বা }
, কিন্তু আপনি কি পালিয়ে যেতে প্রয়োজন )
কারণ এটি একটি অপারেটর।
এই চরিত্রগুলির মধ্যে কয়েকটিগুলির যখন অন্যদের তুলনায় সত্যিকার অর্থে পালানোর দরকার হয় তখন তার আরও কঠোর সীমা থাকে। উদাহরণস্বরূপ, a#b
ঠিক আছে, তবে a #b
এটি একটি মন্তব্য, যখন >
উভয় প্রসঙ্গে পালাতে হবে। যাইহোক যাইহোক রক্ষণশীলভাবে এগুলি থেকে পালাতে কোনও ক্ষতি হয় না এবং সূক্ষ্ম তাত্পর্যগুলি মনে রাখার চেয়ে সহজ।
আপনার আদেশ নাম নিজেই একটি শেল শব্দ হয় ( if
, for
, do
) তারপর আপনি অব্যাহতি বা এটা খুব উদ্ধৃত করতে হবে। এর মধ্যে কেবল একটি আকর্ষণীয় হ'ল in
কারণ এটি সর্বদা একটি কীওয়ার্ড obvious আপনি না তাদের মধ্যে একজন পরে কমান্ড নামে শুধুমাত্র (বোকার মত!) যখন আপনি করেছি করতে যে আর্গুমেন্ট ব্যবহার করা কীওয়ার্ড জন্য প্রয়োজন। শেল অপারেটর ( (
, &
ইত্যাদি) সর্বদা তারা যেখানেই থাকুক না কেন উদ্ধৃতি প্রয়োজন।
1 স্টাফেন উল্লেখ করেছে যে আপনার লোকাল থেকে অন্য কোনও একক-বাইট ফাঁকা চরিত্রেরও পালানো দরকার। সর্বাধিক সাধারণ, বোধগম্য লোকেলগুলিতে, কমপক্ষে সি বা ইউটিএফ -8 এর উপর ভিত্তি করে, এটি কেবল উপরের সাদা অংশের অক্ষর। কয়েকটি আইএসও -8859-1 লোকেলগুলিতে সোলারিস, বিএসডি এবং ওএস এক্স সহ আমি ইউ + 00A0 নন-ব্রেক স্পেসকে ফাঁকা বলে মনে করা হয় (আমি ভুল মনে করি)। যদি আপনি একটি নির্বিচারে অজানা লোকেলের সাথে লেনদেন করেন তবে এতে অক্ষরগুলি সহ মোটামুটি কিছু অন্তর্ভুক্ত থাকতে পারে, তাই শুভকামনা।
সম্ভবত, ফাঁকা হিসাবে বিবেচিত একটি একক বাইট ফাঁকা নয় এমন একাধিক-বাইট চরিত্রের মধ্যে উপস্থিত হতে পারে এবং পুরো জিনিসটি উদ্ধৃতিতে রেখে দেওয়া ছাড়া আপনার এড়ানোর কোনও উপায় নেই। এটি তাত্ত্বিক উদ্বেগ নয়: উপরের কোনও আইএসও -8859-1 লোকালে, যে A0
বাইটটি ফাঁকা বলে মনে করা হয় এটি ইউটিএফ -8 এনকোডেড "à" ( C3 A0
) এর মতো মাল্টিবাইট অক্ষরের মধ্যে উপস্থিত হতে পারে । এই অক্ষরগুলি নিরাপদে পরিচালনা করতে আপনার সেগুলি উদ্ধৃত করা দরকার "à"
। এই আচরণটি স্ক্রিপ্টটি পরিচালনা করে এমন পরিবেশের লোকাল কনফিগারেশনের উপর নির্ভর করে, যেখানে আপনি এটি লিখেছেন not
আমি মনে করি এই আচরণটি একাধিক উপায়ে ভেঙে গেছে, তবে আমাদের যে হাতটি মোকাবেলা করা হয়েছে তা খেলতে হবে। আপনি যদি কোনও অ-স্ব-সিঙ্ক্রোনাইজ মাল্টবাইট চরিত্র সেট নিয়ে কাজ করছেন, তবে সবচেয়ে নিরাপদ বিষয় হ'ল সমস্ত কিছু উদ্ধৃত করা। আপনি যদি ইউটিএফ -8 বা সি তে থাকেন তবে আপনি নিরাপদে (মুহূর্তের জন্য)।
!
তখনই পালাতে হবে যখন সিএসএস ইতিহাসের প্রসারণ সক্ষম হয়ে থাকে, সাধারণত স্ক্রিপ্টগুলিতে নয়। [ ! -f a ]
বা find . ! -name...
ঠিক আছে। এটি আপনার কঠোর সীমা বিভাগ দ্বারা আচ্ছাদিত কিন্তু সম্ভবত স্পষ্টভাবে উল্লেখযোগ্য।
hash[foo"]"]=
, ${var-foo"}"}
, [[ "!" = b ]]
, [[ a = "]]" ]]
, জন্য regexp অপারেটার [[ x =~ ".+[" ]]
। অন্য কিওয়ার্ড {
( if
, while
, for
...) উদ্ধৃত করা যাতে তারা যেমন স্বীকৃত করছি না হবে ...
]
), সুতরাং আমি সেগুলি তালিকাভুক্ত করছি না। আমি মনে করি না কোনও কীওয়ার্ডের পক্ষে যুক্তি পজিশনে উদ্ধৃতি দেওয়া দরকার।
জিএনইউ সমান্তরালে এটি পরীক্ষা করা হয় এবং ব্যাপকভাবে ব্যবহৃত হয়:
$a =~ s/[\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\<\=\>\~\|\; \"\!\$\&\'\202-\377]/\\$&/go;
# quote newline as '\n'
$a =~ s/[\n]/'\n'/go;
এটা পরীক্ষা করা হয় bash
, dash
, ash
, ksh
, zsh
, এবং fish
। কয়েকটি শেলের শেলগুলির কয়েকটি (সংস্করণ) উদ্ধৃতি দেওয়ার প্রয়োজন হয় না, তবে উপরের সমস্ত পরীক্ষিত শেলগুলিতে কাজ করে।
যদি আপনি কেবল উদ্ধৃত একটি স্ট্রিং চান তবে আপনি এটিতে পাইপ করতে পারেন parallel --shellquote
:
printf "&*\t*!" | parallel --shellquote
পার্লের হালকা ওজনের পাল্টানোর সমাধানের জন্য, আমি একক উদ্ধৃতিগুলির নীতি অনুসরণ করছি। একক উদ্ধৃতিতে একটি ব্যাশ-স্ট্রিংয়ের কোনও অক্ষর থাকতে পারে, একক উদ্ধৃতি নিজেই।
আমার কোড:
my $bash_reserved_characters_re = qr([ !"#$&'()*;<>?\[\\`{|~\t\n]);
while(<>) {
if (/$bash_reserved_characters_re/) {
my $quoted = s/'/'"'"'/gr;
print "'$quoted'";
} else {
print $_;
}
}
উদাহরণ রান 1:
$ echo -n "abc" | perl escape_bash_special_chars.pl
abc
রান 2 উদাহরণ:
echo "abc" | perl escape_bash_special_chars.pl
'abc
'
রান 3 উদাহরণ:
echo -n 'ab^c' | perl escape_bash_special_chars.pl
ab^c
রান 4 উদাহরণ:
echo -n 'ab~c' | perl escape_bash_special_chars.pl
'ab~c'
রান রান 5 উদাহরণ:
echo -n "ab'c" | perl escape_bash_special_chars.pl
'ab'"'"'c'
echo 'ab'"'"'c'
ab'c