কমান্ড লাইনের যুক্তিগুলিতে কোন অক্ষরগুলি রক্ষা পাওয়ার প্রয়োজন?


14

বাশ-এ, কমান্ডের সাথে কমান্ড লাইন আর্গুমেন্ট নির্দিষ্ট করার সময়, কোন অক্ষরগুলি এড়ানোর প্রয়োজন হয়?

তারা ব্যাশ এর metacharacters সীমাবদ্ধ: স্থান, ট্যাব, |, &, ;, (, ), <, এবং >?


(এবং সম্ভাব্য) ফাইলের নামটি * এবং দিয়ে গ্লোবাল করবেন না?
জেফ শ্যাচলার

ধন্যবাদ। আপনি কি সিএমডি লাইন আর্গগুলিতে যে ধরণের অক্ষরগুলি রক্ষা করতে হবে সেগুলি সম্পূর্ণরূপে তালিকাবদ্ধ করতে পারেন?
টিম

তালিকাটি থাকা ভাল তবে উদ্ধৃতি সম্পর্কে বোঝার জন্য সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হ'ল: একক উদ্ধৃতিগুলির মধ্যে থাকা সমস্ত কিছুই অক্ষরে অক্ষরে এবং শব্দ বিভাজন ছাড়াই পাস করা হয়। কোন আশা নাই. (এর অর্থ একক উদ্ধৃতিগুলির মধ্যে একক উদ্ধৃতি এম্বেড করার কোনও উপায় নেই, যাইহোক, তবে এটি কাজ করা সহজ ))
ওয়াইল্ডকার্ড

উত্তর:


22

নিম্নলিখিত বর্ণগুলি কয়েকটি প্রসঙ্গে শেল নিজেই বিশেষ অর্থ রয়েছে এবং যুক্তিতে এড়াতে হতে পারে:

এই লিখিত চরিত্রগুলির মধ্যে কয়েকটি আমি যুক্ত লিঙ্কটির চেয়ে বেশি জিনিস এবং আরও বেশি জায়গায় ব্যবহার করা হয়।


কয়েকটি কর্নার কেস রয়েছে যা সুস্পষ্টভাবে 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...) উদ্ধৃত করা যাতে তারা যেমন স্বীকৃত করছি না হবে ...
Stéphane Chazelas

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

2
বিল্টিন, ড্যাশ বা% এর উদ্ধৃতি দিয়ে কিছু করা যায় না।
মাইকেল হোমার

3

জিএনইউ সমান্তরালে এটি পরীক্ষা করা হয় এবং ব্যাপকভাবে ব্যবহৃত হয়:

$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

এর আগে আমি কীভাবে সমান্তরাল সম্পর্কে শুনিনি ...
টম এইচ

@ টমহ আমরা কীভাবে আপনার কাছে পৌঁছতে পারব এই ভেবে আপনি যদি 5 মিনিট সময় ব্যয় করতে পারেন তবে এটি প্রশংসা হবে।
ওলে টেঞ্জ

আমি মনে করি এটি একটি অগ্রগতির সমস্যা। বেশিরভাগ লোকেরা কিছু জটিল পর্যায়ে অগ্রসর না হওয়া পর্যন্ত সমান্তরাল প্রয়োজন বা বোঝেন না। কোন সময়ের মধ্যে তারা xargs, nohup এবং এর মতো স্টাফগুলি জুড়ে এসেছিল। এছাড়াও আমি অনেক লোককে স্ট্যাক এক্সচেঞ্জের সমস্যা সমাধানের জন্য সমান্তরাল ব্যবহার করতে দেখি বা বাশ সমস্যার সমাধানের জন্য গুগল করি না
টম এইচ

1

পার্লের হালকা ওজনের পাল্টানোর সমাধানের জন্য, আমি একক উদ্ধৃতিগুলির নীতি অনুসরণ করছি। একক উদ্ধৃতিতে একটি ব্যাশ-স্ট্রিংয়ের কোনও অক্ষর থাকতে পারে, একক উদ্ধৃতি নিজেই।

আমার কোড:

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

হ্যাঁ, বৈধ পয়েন্ট। আমার দৃষ্টিভঙ্গি হ'ল বেশিরভাগ লোকেরা এই পৃষ্ঠায় অবতরণ করবে কারণ তাদের সমাধান করতে সমস্যা রয়েছে। কারণ এটি একটি আকর্ষণীয় একাডেমিক বিতর্ক করে। এজন্য আমি সামান্য অফ-টপিক থাকা সত্ত্বেও সমাধানগুলি সরবরাহ করতে এবং সেগুলির গুণাবলী নিয়ে আলোচনা করতে চাই।
জারি টার্কিয়া

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