"#! / Bin / sh -a" এ-এ কেন সেডকে প্রভাবিত করে এবং "সেট-এ" দেয় না?


20

যদি আমি নিম্নলিখিত .sh ফাইলটি চালাই:

#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'

ফলাফলটি একটি ত্রুটি:

সেড: -e অভিব্যক্তি # 1, চর 18: অবৈধ পরিসীমা শেষ

তবে যদি আমি নিম্নলিখিত .sh ফাইলটি চালাই:

#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'

এটি ত্রুটি ছাড়াই চলে। দ্বিতীয় কোডটি কি প্রথমটির সমতুল্য হওয়ার কথা নয়? প্রথমটিতে ত্রুটি কেন?


সব এক shহয় না। না সমস্ত সেড সমতুল্য। আপনি কোনটি shব্যবহার করছেন? কোন ওএসে? এবং কোন সেড (সম্ভবত? sed --versionযদি এটি ব্যর্থ না হয়)?
ইসহাক

1
ইস্যুটি ঘিরে কাজ করার জন্য কলটির জন্য LC_COLLATE=C(বা POSIX) সেটিংসsed
জেফ শ্যাচলার

4
একটি তফাত আমি পেয়েছি: প্রথম লিপিটি POSIXLY_CORRECT=yপরিবেশের সাথে সেড (এবং সম্ভবত অন্য কোনও উপযোগিতা) ডাকে , দ্বিতীয়টি POSIXLY_CORRECTপরিবেশে নেই। আমি উভয় স্ক্রিপ্ট থেকে যে শেলটি চালু করছি POSIXLY_CORRECTতার পরিবেশে নেই have
মার্ক প্লটনিক

1
আহ, echo "a" | POSIXLY_CORRECT=y sed -e 's/[\d001-\d008]//g' আপনার সমস্যার পুনরুত্পাদন করুন
আইজাক

1
ওপেনা সেন্টোস x.x - জিএনইউ ব্যাশ, সংস্করণ ৪.২.৪6 (২) -রেলিজ (x86_64-redhat-linux-gnu) ও সেন্টোস লিনাক্স রিলিজ 7.5.1804 (কোর) তে ঠিক যেমনটি ওপি আমাকে দেখিয়েছে ঠিক তেমনটি আমার জন্য ব্যর্থ হয়েছে তা নিশ্চিত করে ।
slm

উত্তর:


31

বাশকে যখন নামের সাথে ডাকা হয় sh, এটি এটি করে :

if (shell_name[0] == 's' && shell_name[1] == 'h' && shell_name[2] == '\0')
    act_like_sh++;

এবং এরপরে শেল ভেরিয়েবলটি এতে সেট করেPOSIXLY_CORRECTy :

if (act_like_sh)
  {
    bind_variable ("POSIXLY_CORRECT", "y", 0);
    sv_strict_posix ("POSIXLY_CORRECT");
  }

bind_variableকলগুলি bind_variable_internal, যা, যদি সেই সময়ে শেল বৈশিষ্ট্যটি aচালু থাকে (এটি যদি আপনি শেলটি দিয়েছিলেন তবে এটিটি -a) রফতানি হিসাবে শেল পরিবর্তনশীল চিহ্নিত করে

সুতরাং আপনার প্রথম স্ক্রিপ্টে:

#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'

sedএটি POSIXLY_CORRECT=yএর পরিবেশে যুক্ত হয়, যা এটি সম্পর্কে অভিযোগ করবে [\d001-\d008]। (সেড --posixঅপশন দেওয়া থাকলে একই জিনিস ঘটে ))

গনুহ sed সালে চরিত্র যার সংখ্যাগত মান একটি পালাবার কোড 10-ভিত্তিক হয় NNN কিন্তু POSIX মোডে, এই একটি বন্ধনী অভিব্যক্তি ভিতরে অক্ষম করা হয়েছে তাই হয়, মানে আক্ষরিক অক্ষর, , ইত্যাদি পরিসীমা থেকে হচ্ছে to । অক্ষর কোডের ক্রম হিসাবে, এর আগে আসে (এবং পরিসীমা শূন্য ব্যতীত সমস্ত অঙ্ক সহ প্লাস সমস্ত বড় হাতের অক্ষর এবং কিছু বিশেষ অক্ষর অন্তর্ভুক্ত)। আপনি যে লোকেলটি ব্যবহার করছিলেন সেগুলিতে এর আগে বাছাই করুন , তাই এই সীমাটি অবৈধ।\dNNN[\d001-\d008]\d1\1\en_US.UTF-8\1

আপনার দ্বিতীয় স্ক্রিপ্টে:

#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'

POSIXLY_CORRECTশেলটিতে সেট করা সত্ত্বেও এটি রফতানি করা হয় না, সুতরাং POSIXLY_CORRECTপরিবেশে ছাড়াই সেড আহ্বান করা হয় , এবং সেড জিএনইউ এক্সটেনশনের সাহায্যে চালিত হয়।

যদি আপনি export POSIXLY_CORRECTআপনার দ্বিতীয় স্ক্রিপ্টের শীর্ষের নিকটে যোগ করেন তবে আপনি অভিযোগও দেখতে পাবেন।


6
আমার কাছে, এটি একটি বাগ।
স্টাফেন চেজেলাস

1
পবিত্র শেল হরর, ব্যাটম্যান! এটি একটি আকর্ষণীয় কৌতূহল (এবং /bin/shবাস্তবে বাশ হওয়া থেকে আসে এমন কোনও সমস্যা দেখার জন্য কিছুটা পরিবর্তন )। বাশ শুরুর POSIXLY_CORRECTআগে যদি পরিবেশে থাকে তবে একই ঘটনা ঘটে sh: এটি এটি হিসাবে চালিয়ে যাবে POSIXLY_CORRECT=y
ইলকচাচু

3
@StevenPenny কিন্তু POSIXLY_CORRECT নয় পরিবেশে যখন শেল হয়ে পড়েন এবং স্ক্রিপ্ট এটি সেট করা হয় না। শেলটি করে। এটি কোথাও থেকে পরিবেশের পরিবর্তনশীল তৈরি করে, এটি অতিরিক্ত খারাপ কারণ এটি এমন একটি মোডে করে যেখানে এটি হওয়ার কথা, এবং এটি মান-সম্মতিযুক্ত হওয়ার চেষ্টা করে।
ইলকচাচু

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

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