এমন কি কোনও sh কোড আছে যা সিনট্যাক্টিক্যালি বৈধ বাশ কোড নয়?


31

এমন কোনও shকোড রয়েছে যা সিনট্যাক্টিকভাবে বৈধ বাশ কোড নয় (সিনট্যাক্সে বার্ফ দেবে না)?

আমি নির্দিষ্ট কমান্ডের জন্য ওভাররাইট shকরার কথা ভাবছি bash


1
আমি বৈধ দ্বারা অনুমান করি আমার অর্থ সিনথেটিকভাবে বৈধ, সুতরাং এটি সিনট্যাক্সে বাধা পাবে না
আলেকজান্ডার মিলস

2
বিভিন্ন টোকেনাইজিং? যেমন মনে ((আসে।
ccorn

1
কিছু ডিস্ট্রোসের /usr/bin/shজন্য কেবল একটি সিম-লিঙ্ক /usr/bin/bash(আমি CentOS 7.3 ব্যবহার করছি এবং এটি হ'ল)। shসত্যিই bashআপনার ডিসট্রোর জন্য কিনা তা দেখতে আপনার পরীক্ষা করা উচিত ।
সেন্টটিমান

1
কয়েক বছর আগে, আমার পুরো প্রকল্পটি ভেঙে যায় যখন বাশে কোনও কিছু "আপগ্রেড" করা হয়েছিল। আমাকে আমার সমস্ত শেবাং লাইন পরিবর্তন #!/bin/shকরতে হয়েছিল #!/bin/bash। তারপরে সবকিছু আবার কাজ করেছে, তাই আপনাকে অবশ্যই যত্নবান হতে হবে। তারা যখন sh এর জন্য ব্যাশের পরিবর্তে ড্যাশ ব্যবহার শুরু করেছিল তখনই এটি ঘটতে পারে।
জো

1
@ জো, এটি ওপি যা জিজ্ঞাসা করছে তার বিপরীত - আপনার কাছে বাশ কোড ছিল যা এসএস কোড হিসাবে ভুল বানানযুক্ত ছিল তবে তা ছিল না। ওপি জিজ্ঞাসা করছে যে তারা (প্রকৃত, বিভ্রান্তিকর নয়) কোড থাকতে পারে যখন এটি ব্যাশের সাথে চলাকালীন ভেঙে যায়, না যদি তারা শ-এর সাথে চলতে থাকে তখন ভেঙে থাকা বাশ কোড থাকতে পারে (যা সুস্পষ্ট - বাশ এক্সটেনশানগুলি না হলে উপলভ্য ভাষার বৈশিষ্ট্যগুলিতে কোনও প্রভাব ফেলবে, সেগুলি এক্সটেনশন হবে না)।
চার্লস ডাফি 20 '

উত্তর:


49

এখানে এমন কিছু কোড রয়েছে যা পসিক্স শ ও ব্যাশে কিছু আলাদা করে :

hello &> world

এটি আপনার পক্ষে "অবৈধ" কিনা তা আমি জানি না।

ব্যাশ, এটা উভয় মান আউটপুট এবং মান ত্রুটি পুননির্দেশনা থেকে helloফাইলে world। পসিক্সে sh, এটি helloব্যাকগ্রাউন্ডে চলে এবং তারপরে worldএটি খালি করে পুনরায় নির্দেশিকা তৈরি করে (যেমন এটি হিসাবে বিবেচিত হয় & >)।

প্রচুর পরিমাণে অন্যান্য ক্ষেত্রে রয়েছে যেখানে বাশ এক্সটেনশানগুলি তাদের কাজটি করবে যখন এটি পরিচালিত bashহবে এবং খাঁটি পসিক্সে এর বিভিন্ন প্রভাব পড়বে sh। উদাহরণস্বরূপ, ব্রেস প্রসারণ আরেকটি এবং এটি খুব বাশের পসিক্স মোডের আওতায় পরিচালনা করে এবং না।


স্ট্যাটিক সিনট্যাক্স ত্রুটি যতদূর যায়, বাশের উভয় সংরক্ষিত শব্দ রয়েছে (যেমন [[এবং time) POSIX দ্বারা নির্দিষ্ট করা হয়নি, যেমন [[ xবৈধ POSIX শেল কোড তবে একটি বাশ সিনট্যাক্স ত্রুটি, এবং বিভিন্ন POSIX অসঙ্গতি বাগের ইতিহাস যা সিনট্যাক্স ত্রুটির ফলস্বরূপ হতে পারে, যেমন এই প্রশ্ন থেকে একটি :

x=$(cat <<'EOF'
`
EOF
)
bash: line 2: unexpected EOF while looking for matching ``'
bash: line 5: syntax error: unexpected end of file

সিনট্যাক্স-ত্রুটি-কেবল যে কোনও ক্ষেত্রেই এটি গুরুত্বপূর্ণ বিষয়গুলির জন্য "অবৈধ" এর একটি অত্যন্ত বিপজ্জনক সংজ্ঞা, তবে এটি রয়েছে।


3
নোট করুন যে ব্রেস প্রসারণ বর্তমানে বশকে (এবং zsh, pdksh, ksh93) অ-সঙ্গতিপূর্ণ করে তুলছে, পসিক্স ব্রেস সম্প্রসারণ (এবং {fd}>fileঅনুরূপ ইস্যু) অনুমোদনের জন্য নির্দিষ্টকরণে বিধান যুক্ত করার জন্য কাজ করছে , যাতে বাশটি আবার উপযুক্ত হতে পারে (ব্রেস সম্প্রসারণ) অনির্দিষ্ট থাকবে, তবে আনুগত্যযোগ্য স্ক্রিপ্টগুলি করতে হবে echo "{a,b}"তারা {a,b}আউটপুট হতে চায় )। এটি শুরু হওয়া আলোচনাটি
স্টাফেন চেজেলাস

2
এই প্রশ্নোত্তর সম্পর্কিত এছাড়াও প্রাসঙ্গিক: austingroupbugs.net/view.php?id=1191#c3983
স্টাফেন

2
কেউ পসিক্স-এ স্ক্রিপ্ট লিখতে চাইলে কি কখনও এরকম একটি আদেশ লিখতে পারে? ওপি শি থেকে বাশ যাচ্ছে এবং আমার বোঝা থেকে মনে হচ্ছে এটি অন্য দিকে যেতে সমস্যা হতে পারে?
ধনী

1
রিচ: অবশ্যই /bin/shবাশ যেখানে রয়েছে সেখানে আমি কোনও সিস্টেম ব্যবহার করি না , সুতরাং যদি আমি এই বাশিজম সম্পর্কে সক্রিয়ভাবে অবহিত না হতাম তবে একটি কমান্ড লাইন লিখে এটি সহজেই ঘটতে পারে। উত্তরের ব্যবধান এটিকে অসম্ভব বলে মনে hello&>worldহচ্ছে তবে কম দূরত্বে নিয়ে আসে না।
আর ..

2
আমি ঠিক গত মাসে পার্থক্যের কারণে&> একটি বাগ দেখলাম !
গর্ডন ডেভিসন

16

একটি সংক্ষিপ্ত উদাহরণ:

time()(:)

timeইন বাশ একটি সংরক্ষিত শব্দ, এবং timeপ্রোগ্রাম থেকে আলাদা আচরণ করে । সম্ভবত আপনি timeব্যাশ ব্যবহার করে ফলাফলটি বিশ্লেষণের চেষ্টা করে কিছু ব্যবহারিক স্ক্রিপ্টগুলি ভঙ্গ করবেন quite তবে প্রযুক্তিগতভাবে এটি সিনট্যাক্স ত্রুটি নয়। timeএকটি ফাংশন হিসাবে পুনরায় সংজ্ঞায়িত বিরল হবে তবে এই প্রশ্নটি উল্লেখ করে একটি বাক্য গঠন ত্রুটির কারণ ঘটায়।

একটি সংক্ষিপ্ত উদাহরণ:

a():

বৈধ ইন dash, তবে পসিক্স অনুগত নয়।


3
আরও সাধারণভাবে, কোনও শব্দ যা নন স্ট্যান্ডার্ড কীওয়ার্ড বা বাশ-এ বিল্টিন কমান্ড একই প্রভাব তৈরি করে। ছাড়াও time, সেখানে কাপড় মত declare, function, select, এবং coproc। যদিও এর মধ্যে কিছু স্ট্যান্ডার্ড ( কীওয়ার্ডস এবং বিল্টিনস / ইউটিলিটিস ) এ স্পষ্টভাবে চিহ্নিত করা হয়েছে তবে আমি উদাহরণস্বরূপ timeবা coprocতালিকায় দেখতে পাচ্ছি না । এবং ব্যবহার --posixকরা সাহায্য বলে মনে হচ্ছে না।
ইলকচাচু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.