শেলের একক-উদ্ধৃতি থেকে বাঁচার উপায় কি আছে?


11

E. g। আমি বলতে চাই

perl -e 'print '"'"'Hello, world!'"'"', "\n";'

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

হ্যাঁ, আমি জানি যে আমি লিখতে পারি

perl -e 'print q[Hello, world!], "\n"'
perl -e 'print "Hello, world!\n"'

তবে এই প্রশ্নটি শেলটি উদ্ধৃত করার বিষয়ে, পার্লের মধ্যে নয়।

আমি কিভাবে এটা করতে আগ্রহী bashএবং cshপ্রথম স্থানে।

উত্তর:


9

ডেনিস তার উত্তরে স্বাভাবিক বিকল্পগুলি নির্দেশ করে (একক-ইন-ডাবল, ডাবল-ইন-সিঙ্গল, একক উদ্ধৃত স্ট্রিংগুলি পলাতকৃত একক উদ্ধৃতিতে একত্রিত; আপনি ইতিমধ্যে পার্লের কাস্টমাইজযোগ্য উদ্ধৃতি অপারেটরগুলির উল্লেখ করেছেন), তবে সম্ভবত এটিই সরাসরি উত্তর যা আপনি খুঁজছিলেন জন্য।

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

আমি সিএস-টাইপ শেলগুলি সম্পর্কে চিন্তা করতেও অস্বীকার করি যেহেতু সেগুলি অন্যান্য ক্ষেত্রে সম্পূর্ণরূপে নষ্ট হয়ে গেছে (দেখুন সিএস প্রোগ্রামিংকে ক্ষতিকারক হিসাবে বিবেচনা করা হয় )।


ধন্যবাদ. "এটি অসম্ভব" - এটি আমার প্রত্যাশিত উত্তরটি :) যদিও আমি সবসময় আশা করি যে এটি এখানে নথি যা এই ভূমিকা পালন করতে উত্সর্গীকৃত।
কোডহলিক

পার্লের মতো নয়, বোর্নের মতো শেল এখানে ডকুমেন্টগুলি কেবল স্টিডিনের মাধ্যমে ইনপুট সরবরাহের জন্য সরাসরি কার্যকর। আপনি অবশ্যই এগুলিতে একক উদ্ধৃতি রাখতে পারেন। শব্দটি উদ্ধৃত করে আপনি এখানে একটি নথির "আক্ষরিক মোড" সক্ষম করতে পারেন: (উদাঃ) blah <<\EOF … EOF। এছাড়াও আপনি ব্যবহার করতে পারেন <<'EOF'এবং <<"EOF। এগুলি সমস্তই এখানে আক্ষরিক দলিলগুলির অর্থ (পার্লের বিপরীতে)। আপনি যদি সত্যিই blah "$(cat<<\EOF … EOF )" other argsদৃ determined ়সংকল্পবদ্ধ হয়ে থাকেন তবে আপনি করতে পারেন (কমান্ড সাবস্টিটিউশনটিতে আমি যেখানে নতুন জায়গাগুলি লিখে স্পেস লিখেছি তা ব্যবহার করে; ksh এবং zsh বিড়াল ছাড়া করতে পারে , অন্যদের এটি প্রয়োজন) need তবে সত্যিই কি এর মূল্য হবে?
ক্রিস জনসেন

শুধু খেয়াল করতে চাই যে zsh একক উদ্ধৃতিগুলি বেশ আক্ষরিক নয়। Zsh একটি একক-উদ্ধৃত স্ট্রিংয়ের যে কোনও জায়গায় অক্ষর কোড হিসাবে উদাহরণস্বরূপ echo '\U0000068\U000069''হাই' প্রতিধ্বনি করার চেষ্টা করবে eg নিশ্চিত না কেন এটি শেলের মধ্যে একটি বাগ না থাকলেও।
ম্যাথু

1
@ ম্যাথিউ: এই \Uক্ষেত্রে ব্যাখ্যার বিষয়টি বিল্ট ইন ইকো কমান্ড দ্বারা করা হচ্ছে (এই আচরণটি -EBSD_ECHO বিকল্প দ্বারা এবং নিয়ন্ত্রণ করা যেতে পারে -e)। আপনি দেখতে পাচ্ছেন যে আক্ষরিক স্ট্রিংটি অন্যান্য কমান্ডে পাস হয়েছে (এবং অন্যথায় ব্যাখ্যা করা হয়নি); যেমন printf %s\\n '\U0000068\U000069'
ক্রিস জনসেন

@ ক্রিস জোহেনসেন ধন্যবাদ, আমি জেডএসে নতুন এবং এটি উপলব্ধি করতে পারি নি তবে আপনি ঠিক বলেছেন। ম্যান পেজটি আমাকে বলেছে - তিনি ডিফল্ট তবে zsh অবশ্যই এটিকে ওভাররাইড করে।
ম্যাথু

5

আমার জন্য, আপনার সমস্ত উদাহরণ উত্পাদন করে:

ওহে বিশ্ব!

এবং তাই এটি:

perl -e 'print "Hello, world!", "\n";'

এবং এই:

perl -e 'print '\''Hello, world!'\'', "\n";'

আপনি যা করার চেষ্টা করছেন তা কি আপনি পরিষ্কার করতে পারেন?

শেলের মধ্যে যেমন বাশ, আপনি যদি স্ট্রিংয়ের অংশ হিসাবে উদ্ধৃতি চিহ্নগুলি মুদ্রণ করতে চান তবে এক ধরণের উদ্ধৃতি অন্যটির সাথে পালিয়ে যায়।

$ echo '"Hello, world!"'
"Hello, world!"
$ echo "'Hello, world!'"
'Hello, world!'

সম্পাদনা:

এখানে অন্য উপায়:

$ perl -e 'print "\047Hello, world!\047", "\n";'
'Hello, world!'
$ echo -e "\047Hello, world! \047"
'Hello, world! '

বিস্ময়কর বিন্দুর পরে স্থানটি ইতিহাসের সম্প্রসারণ ত্রুটি এড়িয়ে চলে। আমি set +Hপরিবর্তে করতে পারে ।


1

পূর্ববর্তী উত্তরে আমার সম্পাদনাটি প্রদর্শিত হবে কিনা তা নিশ্চিত নন:

একটি নতুন উত্তর হিসাবে একই আটকানো:

বিকল্প পদ্ধতি:

আমি যখন আপনার সমাধানটি চেষ্টা করেছি তখনও আমি 'মুদ্রিত পেতে পারি না।

তবে আমি আপনার সমাধান থেকে ইঙ্গিত নিলাম এবং নিম্নলিখিত চেষ্টা:

$ perl -e '$foo = chr(39); print "${foo}Hello, world ${foo}", "\n";'
'Hello, world '

এর ASCII মান 39 হয়।

আগ্রহের জায়গায় 'যুক্ত করার জন্য গুচ্ছ ফাইলগুলিতে একটি ইনলাইন সম্পাদনা করার জন্য আমার এটি দরকার ছিল।


1

এখানে নথিটি পালানোর বিষয়ে যত্ন না নেওয়ার সেরা উপায়:

$ cat <<EOF
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

আপনি এখানে উদ্ধৃত ডকুমেন্টটি ব্যবহার করে সমস্ত বিস্তৃতি সম্পূর্ণরূপে ইনবাইট করতে পারেন:

$ cat <<'EOF'
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

আপনি যদি ইনপুটটির পরিবর্তে এটি আর্গুমেন্ট হিসাবে পাস করতে চান তবে আপনি xargs ব্যবহার করতে পারেন:

$ xargs -0 <<'EOF' perl -e
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

0

আমি জানি না বাশে এটি করার কোনও বিকল্প আছে কিনা, তবে zsh দিয়ে আপনি বিকল্পটি ''চালু করার পরে ব্যবহার করতে পারেন RC_QUOTES। (আমি zsh চেষ্টা করার পরামর্শ দিচ্ছি; এটি বেশিরভাগ ক্ষেত্রে ব্যাশ সামঞ্জস্যপূর্ণ এবং আরও বেশি সামঞ্জস্যের জন্য ব্যাশ অনুকরণ করতে পারে))

বাশ সহ (এবং এখনও zsh সহ বেশিরভাগ সময়), আমি কেবল ব্যবহার করি '\''কারণ এটি পড়ার চেয়ে সহজ '"'"'

এটি সিএসএসে কীভাবে করবেন তা সম্পর্কে আমার কোনও ধারণা নেই।


-1

পার্ল স্ক্রিপ্টের অংশ হিসাবে অভ্যন্তরীণভাবে ব্যবহৃত হলে পার্লের সাথে উদ্ধৃতিগুলি রক্ষা করতে আপনি \ 'এবং। "ব্যবহার করতে পারেন the কমান্ড লাইন তা স্বীকার করবে কিনা তা আমি নিশ্চিত নই You আপনি এটি চেষ্টা করে দেখতে পারেন এবং এটি কাজ করে কিনা।


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