ডাবল হাইফেন (-) দিয়ে শুরু হওয়া এই শেবাং কীভাবে কাজ করবে?


14

আমি রোসটাটা কোড পৃষ্ঠাতে নিম্নলিখিত ধরণের শেবাং পেয়েছি:

--() { :; }; exec db2 -txf "$0"

এটি ডিবি 2 এর জন্য কাজ করে এবং পোস্টগ্রিসের জন্য একই জাতীয় জিনিস। তবে আমি পুরো লাইনটি বুঝতে পারি না।

আমি জানি যে ডাবল ড্যাশ এসকিউএল-তে একটি মন্তব্য এবং এর পরে এটি কিছু পরামিতি ফাইলকে ফাইল হিসাবে পাস করার সাথে সাথে ডিবি 2 এক্সিকিউটেবল বলে। তবে প্রথম বন্ধনী, কোঁকড়ানো ব্রাকেট, কোলন এবং আধা-কোলন সম্পর্কে কী এবং কীভাবে আসল শেবাং প্রতিস্থাপন করা যায় #! ?

https://rosettacode.org/wiki/Multiline_shebang#PostgreSQL

উত্তর:


18

সম্পর্কিত: কোন শেল ইন্টারপ্রেটার কোনও শেবাং ছাড়াই স্ক্রিপ্ট চালায়?

স্ক্রিপ্টটিতে শেবাং / হ্যাশবাং / #!লাইন নেই, কেবলমাত্র ডাবল ড্যাশ না থাকার কারণে #!

তবে স্ক্রিপ্টটি শেল দ্বারা চালিত হবে (উপরের লিঙ্কিত প্রশ্নোত্তর দেখুন) এবং সেই শেলের মধ্যে যদি -কোনও ফাংশনের নামে বৈধ অক্ষর হয় তবে লাইনটি শেল ফাংশন ঘোষণা --করে যা কিছুই করে না (ভাল, এটি চলমান :, যা কিছুই করে না ) এবং যা কখনও বলা হয় না।

আরও সাধারণ বহু-রেখাঙ্কিত স্বরলিপিতে এই ফাংশনটি (এটির মতো দেখতে এটির আরও স্পষ্ট করে তুলতে, কারণ এর বিজোড় নাম কিন্ডাটি সত্য যে এটি একটি ফাংশনকে স্পষ্ট করে তোলে):

-- () {
  :
}

ফাংশন সংজ্ঞাটির একমাত্র উদ্দেশ্য হ'ল একটি লাইন যা শেল স্ক্রিপ্টে বৈধ এবং একই সাথে একটি কার্যকর এসকিউএল কমান্ড (একটি মন্তব্য)। এই ধরণের কোডকে বহুভক্ত বলা হয় ।

বগাস শেল ফাংশনটি ঘোষণার পরে, স্ক্রিপ্টটি যখন শেল স্ক্রিপ্ট ইন্টারপ্রেটার দ্বারা সম্পাদন করা হয় তখন execচলমান শেলটি প্রক্রিয়াটির সাথে বর্তমান শেলটি প্রতিস্থাপন করতে ব্যবহার করে db2 -txf "$0", যা db2 -txfকমান্ড লাইন থেকে স্ক্রিপ্টের পথের নাম ব্যবহার করার মতোই হবে ।

এই কৌশলটি সম্ভবত এমন সিস্টেমে নির্ভরযোগ্যভাবে কাজ করবে না যেখানে dashবা অন্যান্য ashভিত্তিক শেলগুলি, yashবোর্ন শেল, ksh88বা ksh93হিসাবে ব্যবহৃত হয় /bin/sh, কারণ এই শেলটি যার নাম ড্যাশযুক্ত ফাংশন গ্রহণ করে না।

সম্পর্কিত:


আমি মনে করি যে নিম্নলিখিতগুলিও কাজ করবে (সত্যিই পরীক্ষিত নয়):

--() { exec db2 -txf "$0"; }; --

@ ইল্কাচ্চু এখন আরও ভাল?
কুসালানন্দ

1
হ্যাঁ! এবং এই ধরণের জিনিসটি কী বলা হয় তা স্মরণ করিয়ে দেওয়ার জন্য ধন্যবাদ। :)
ilkkachu

6

@ কুসালানন্দ যেমন ইতিমধ্যে বলে গেছেন, সেই কৌশলটি ভেঙে গেছে এবং এটি সমস্ত শেলগুলিতে কাজ করবে না।

এখানে বহনযোগ্যভাবে এটি করা আমার গ্রহণযোগ্যতা:

--/.. 2>/dev/null; exec db2 -txf "$0"

--বর্তমান ডিরেক্টরিটিতে একটি ফাইল / ডিরেক্টরি নামের একটি ডিরেক্টরি উপস্থিত থাকলেও কোনও কমান্ড ত্রুটিযুক্ত হওয়া উচিত 2>/dev/null; শেলটি পরে দ্বিতীয় কমান্ড exec,।


এটি এখনও সত্যই বহনযোগ্য নয়। এটি কোনও বৈধ স্ক্রিপ্ট নয় এবং আপনি এখনও কলিং শেলের উপর নির্ভর করছেন এই সত্যটি ঘিরে কাজ করার জন্য যে কার্নেল স্ক্রিপ্টটি চালাতে অস্বীকার করবে এবং ENOEXECযদি আপনি চেষ্টা করেন তবে ফিরে আসবে। straceআমার অর্থ কী তা বোঝার জন্য স্ক্রিপ্টটি চালানোর চেষ্টা করুন ।
ক্যাস্পারড

@ ক্যাস্পার্ড, এটি এখনও পোর্টেবল হওয়া উচিত, শেলটি যদি exec()কাজ না করে তবে শেল স্ক্রিপ্ট হিসাবে স্ক্রিপ্টটি চালানোর কথা । "যদি [ENOEXEC] ত্রুটির সমতূল্য ত্রুটির কারণে এক্সিকিউটাল () ফাংশন ব্যর্থ হয় তবে শেলটি প্রথম অপারেন্ড হিসাবে শেলটি কমান্ডের নামের সাথে সমাহার করার সমান একটি কমান্ড কার্যকর করবে ..." (দেখুন pubs.opengroup .org / অনলাইনপবস / 9699919799.2018 সংস্থান / ইউটিলিটিস /… )
ইলক্কাচু

@ilkkachu তবে স্ক্রিপ্টগুলি সর্বদা শেল থেকে কার্যকর হয় না। যদি আপনি অন্য কোনও প্রসঙ্গে স্ক্রিপ্টটি ব্যবহার করার চেষ্টা করেন যেখানে এক্সিকিউটেবল কাজ করে তবে এটি ব্যর্থ হতে চলেছে। তাছাড়া শেলগুলি কোন দোভাষী ব্যবহার করতে হবে তা নিয়ে একমত নয়। সুতরাং এখন আপনার লিপিটি আলাদাভাবে আচরণ করবে বা কোন প্রসঙ্গে বলা হবে তার উপর নির্ভর করে পুরোপুরি ব্যর্থ হবে।
কাস্পারড

@ ক্যাস্পার্ড, ভাল, নিশ্চিত, আপনি যদি exec()শেল ছাড়া অন্য কোনও জিনিস থেকে এটি সরাসরি ব্যবহার করেন তবে এটি কাজ করবে না । তবে সে ক্ষেত্রে কী হবে? আপনি স্ক্রিপ্টটি এ জাতীয় থেকে চালাতে চাইতে পারেন cron, তবে আমি মনে করি এটি যাইহোক যাইহোক শেলের মাধ্যমে সমস্ত কিছু চালিত করে, এবং তা না হলেও, সেক্ষেত্রে কেবল বানানটি সহজ db2 -txf /path/to/script, কারণ আপনার কেবল একবার এটি করা দরকার do শর্টহ্যান্ডের কাজটি বেশিরভাগ ইন্টারেক্টিভ শেলের জন্য কার্যকর। তবে নিশ্চিত, একটি পৃথক মোড়ক স্ক্রিপ্ট আরও শক্তিশালী হতে পারে।
ilkkachu

1
@ ক্যাস্পার্ড আমি ডক্স এবং মানক নিয়ে আপনাকে বিরক্ত করব না; এটা চেষ্টা করুন! echo 'int main(int c,char**a){execvp(a[1],a+1);}' | cc -include unistd.h -xc -; echo echo yeah > a.sh; chmod 755 a.sh; ./a.out ./a.sh; PATH=`pwd` ./a.out a.sh
চাচা বিলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.