শেবাং starting // `দিয়ে শুরু হচ্ছে?


60

আমি নিম্নলিখিত স্ক্রিপ্ট সম্পর্কে বিভ্রান্ত ( hello.go)।

//usr/bin/env go run $0 $@ ; exit

package main
import "fmt"
func main() {
    fmt.Printf("hello, world\n")
}

এটি কার্যকর করতে পারে। (MacOS X 10.9.5 এ)

$ chmod +x hello.go
$ ./hello.go
hello, world

আমি শেবাং দিয়ে শুরু করার কথা শুনিনি //। আমি যখন স্ক্রিপ্টের শীর্ষে একটি ফাঁকা রেখা প্রবেশ করি তখন এটি এখনও কাজ করে। এই স্ক্রিপ্টটি কেন কাজ করে?


//&>/dev/null;x="${0%.*}";[ ! "$x" -ot "$0" ]||(rm -f "$x";cc -o "$x" "$0")&&exec "$x" "$@" ...
মনিকা-জেরেমি ব্যাংকগুলি পুনরায় ইনস্টল করুন

2
নীচে @ জি-ম্যান এবং জর্গ মন্তব্যগুলি অনুসরণ করে এবং গিলস উত্তর অনুসারে ( unix.stackexchange.com/a/1919/27616 ), এই কৌশলটি সর্বাধিক সামঞ্জস্যপূর্ণ হওয়ার ///....পরিবর্তে ব্যবহার করা উচিত //...!
অলিভিয়ার ডুলাক

1
এটি আরও উদ্ধৃতিবিহীন ফাঁকা জায়গাগুলির সাথে যুক্তিগুলি (বা কোনও ডিরেক্টরিতে অবস্থান) সঠিকভাবে পরিচালনা করবে না:go run "$0" "$@"
চার্লস ডাফি

উত্তর:


71

এটি শেবাং নয়, এটি কেবল একটি স্ক্রিপ্ট যা ডিফল্ট শেল দ্বারা চালিত হয়। শেলটি প্রথম লাইনটি কার্যকর করে

//usr/bin/env go run $0 $@ ; exit 

যার ফলে goএই ফাইলটির নামের সাথে ডাকা হবে, সুতরাং ফলস্বরূপ এই ফাইলটি গো স্ক্রিপ্ট হিসাবে চালানো হয় এবং তারপরে শেলটি ফাইলটির বাকী ফাইলগুলি না দেখেই প্রস্থান করে।

তবে কেন //কেবল /বা সঠিক শেবাংয়ের পরিবর্তে শুরু করবেন #!?

এটি কারণ ফাইলটি একটি বৈধ গো স্ক্রিপ্ট হওয়া দরকার, বা যাও অভিযোগ করবে। যেতে যেতে, চরিত্রগুলি //একটি মন্তব্য বোঝায়, তাই যান প্রথম লাইনে একটি মন্তব্য হিসাবে দেখুন এবং এটি ব্যাখ্যা করার চেষ্টা করবেন না। চরিত্রটি #অবশ্য কোনও মন্তব্য বোঝায় না, সুতরাং ফাইলটি ব্যাখ্যা করার সময় একটি সাধারণ শেবাং একটি ত্রুটির কারণ হতে পারে।

সিনট্যাক্সের এই কারণটি কেবলমাত্র এমন একটি ফাইল তৈরি করা যা শেল স্ক্রিপ্ট এবং একটিতে অন্য পা না রেখেই স্ক্রিপ্ট উভয়।


10
এটি শেল নয়, কার্নেল দ্বারা পরিচালিত হয়; কীভাবে লিনাক্স একাধিক পাথ বিভাজক (/ home //// ব্যবহারকারীর নাম /// ফাইল) পরিচালনা করে তার গিলসের উত্তর দেখুন ।
জি ম্যান

3
@ হারমানটর্জুসেন বৈশিষ্ট্য - পথের সিনাক্সটি বেশ ভালভাবে সংজ্ঞায়িত করা হয়েছে, প্রচুর দরকারী বৈকল্পিকের অনুমতি দেয় - এবং শক্তির সাথে জটিলতা আসে: /কারণ পথ প্রত্যয় হিসাবে সংজ্ঞায়িত হয় /.; যখন aএকটি সিমবলিক লিঙ্ক নয়, aহিসাবে একই a/যা একই হিসাবে a/.থিরা ক্ষেত্রে যেখানে একটি পাথ একটি অতিরিক্ত পেতে পারেন /অর্থ কোন পরিবর্তনের সঙ্গে। ক্যানোনিকাল পথটি অর্জন করার সময়, সেখানে একের পর এক স্ল্যাশ চুক্তি করার জন্য একটি নরমালাইজেশন পদক্ষেপ থাকে। মঞ্জুর, এটি যদিও আনুষ্ঠানিক বাক্য গঠনের পরিষ্কার অংশ নয়।
ভোলকার সিগেল

13
প্রকৃতপক্ষে, পসআইএক্স বলে যে একাধিক স্ল্যাশ একক স্ল্যাশের মতোই যখন পাথের একেবারে শুরুতে ঠিক দুটি স্ল্যাশ থাকে except যেমনটি এখানে রয়েছে। সেক্ষেত্রে, পথটির ব্যাখ্যাটি বাস্তবায়ন নির্ভর: দুটি শীর্ষস্থানীয় <স্ল্যাশ> অক্ষরকে একক <স্ল্যাশ> চরিত্র হিসাবে বিবেচনা করা হবে।
Jörg ডব্লু মিটাগ

11
সুতরাং, এটিকে পোর্টেবল করার জন্য পরিবর্তে লিখতে হবে ///usr/bin/env go run $0 $@ ; exit...
রুসলান

1
@ শিখুন শেলটি বের হয় তবে গো দোভাষীটি চালু করার আগে নয়। গো শেল নয়, হ্যালো ওয়ার্ল্ড প্রিন্ট করছে।
কেসি

8

এটি চলে কারণ ডিফল্টরূপে এক্সিকিউটেবল ফাইলটি / বিন / শ স্ক্রিপ্ট হিসাবে ধরে নেওয়া হয়। অর্থাৎ আপনি যদি কোনও নির্দিষ্ট শেল নির্দিষ্ট না করেন - এটি #! / বিন / শ

// টি কেবল পাথগুলিতে উপেক্ষা করা হয় - আপনি বিবেচনা করতে পারেন হিসাবে এটি '/' হিসাবে একা।

সুতরাং আপনি বিবেচনা করতে পারেন যে আপনার কাছে প্রথম লাইনের শেল স্ক্রিপ্ট রয়েছে:

/usr/bin/env go run $0 $@ ; exit

এই লাইনটি কি করে? এটি প্যারামেন্টারদের 'গো রান $ 0 $ @' দিয়ে 'এনভি' চালায়। সেখানে 'গো' কমান্ড রয়েছে এবং 'রান $ 0 $ @' টি আর্গগুলি রয়েছে এবং পরে স্ক্রিপ্টটি প্রস্থান করে। Script 0 এই স্ক্রিপ্টটির নাম। $ @ হ'ল মূল স্ক্রিপ্ট আর্গুমেন্ট। সুতরাং এই লাইন চলুন যা এই আর্গুমেন্ট দিয়ে এই স্ক্রিপ্ট চালায়

মন্তব্যে নির্দেশিত হিসাবে বেশ আকর্ষণীয় বিশদ রয়েছে, যে দুটি স্ল্যাশ বাস্তবায়ন-সংজ্ঞায়িত এবং এই স্ক্রিপ্টটি তিন বা ততোধিক স্ল্যাশ উল্লেখ করলে পসিক্স-সঠিক হয়ে উঠতে পারে। কীভাবে পাথগুলিতে স্ল্যাশ পরিচালনা করা উচিত সে সম্পর্কে বিশদ জানতে http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html দেখুন

এটিও নোট করুন যে স্ক্রিপ্টে $ @ পরিবর্তে "$ @" ব্যবহার করা সঠিক, কারণ অন্যথায় যদি কোনও প্যারামিটারে ফাঁক থাকে তবে এটি অনেকগুলি পরামিতিগুলিতে বিভক্ত হয়ে যায়। উদাহরণস্বরূপ আপনি "$ @" ব্যবহার না করে স্পেস দিয়ে ফাইলের নামটি পাস করতে পারবেন না

এই বিশেষ স্ক্রিপ্টটি অবশ্যই '//' এর সাথে '/' সমান ধারণাটি নির্ভর করে


9
"// পথগুলিতে কেবল উপেক্ষা করা হবে" - এটির গ্যারান্টিযুক্ত নেই: "যদি কোনও প্যাসনাম দুটি ক্রমান্বয়ে <স্ল্যাশ> অক্ষর দিয়ে শুরু হয় তবে নেতৃস্থানীয় <স্ল্যাশ> অক্ষরের অনুসরণকারী প্রথম উপাদানটি একটি প্রয়োগ-সংজ্ঞায়িত পদ্ধতিতে ব্যাখ্যা করা যেতে পারে" ( পাবস .opengroup.org / অনলাইনপাবস / 9699919799 / বেসডিফস /… )
ডব্লু মিট্টাগ

খুব আকর্ষণীয়, আপডেট উত্তর।
gena2x

1
... বিশেষত এএফএস // বিভিন্নভাবে প্রয়োগ করা হয়েছে, তবে এটি আর সাধারণ নয়।
চার্লস ডাফি

0

এটি সি ++ এর জন্য কাজ করবে (এবং সি যদি সেই মন্তব্যের জন্য // টি অনুমতি দেয়)

//usr/bin/env sh -c 'p=$(expr '"_$0"' : "_\(.*\)\.[^.]*"); make $p > /dev/null && $p'; exit

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