B #! / Usr / bin / env কমান্ড --argument` সহ শেবাং লাইন লিনাক্সে ব্যর্থ


53

আমি একটি সহজ স্ক্রিপ্ট পেয়েছি:

#!/usr/bin/env ruby --verbose
# script.rb
puts "hi"

আমার ওএসএক্স বাক্সে, এটি দুর্দান্ত চলছে:

osx% ./script.rb
hi

যাইহোক, আমার লিনাক্স বাক্সে এটি একটি ত্রুটি ছুড়ে ফেলে

linux% ./script.rb
/usr/bin/env: ruby --verbose: No such file or directory

আমি যদি শিবাং লাইনটি ম্যানুয়ালি চালিত করি তবে এটি ঠিক আছে

linux% /usr/bin/env ruby --verbose ./script.rb
hi

তবে আমি ত্রুটিটির প্রতিলিপি করতে পারি যদি আমি ruby --verboseএকটি যুক্তিতে প্যাক করে থাকিenv

linux% /usr/bin/env "ruby --verbose" ./script.rb
/usr/bin/env: ruby --verbose: No such file or directory

সুতরাং আমি মনে করি যে এটি কীভাবে envশেবাং লাইনের পুনরায় সেটাকে ব্যাখ্যা করে with আমি জিএনইউ কোর্টিল 8.4 ব্যবহার করছি env:

linux% /usr/bin/env --version
env (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Richard Mlynarik and David MacKenzie.

এটি সত্যিই অদ্ভুত বলে মনে হচ্ছে। এই সংস্করণটির সাথে এটি কি সাধারণ সমস্যা env, বা এখানে অন্য কিছু চলছে যা আমি জানি না?



কোরিউটিলস 8.17 সঙ্গে এখানে একই। রহস্যময়। ফেডোরাকে রিপোর্ট করা, কারণ এটি ম্যানুয়ালটি যা বলে তার বিপরীতে।
ভনব্র্যান্ড

@ ভনব্র্যান্ড ফেডোরা কী বলেছেন? "আমাদের কিছু যায় আসে না।"
বিড়াল

উত্তর:


44

দেখে মনে হচ্ছে কারণ লিনাক্স (বিএসডি থেকে পৃথক) কেবল শেবাং কমান্ডের কাছে একটি যুক্তিই পাস করে (এই ক্ষেত্রে এনভিও)।

স্ট্যাকওভারফ্লোতে এটি নিয়ে ব্যাপক আলোচনা করা হয়েছে


3
বিভিন্ন ইউনিয়নে আচরণের পর্যালোচনা করার জন্য এই পৃষ্ঠাটিও দেখুন ।
স্টাফেন চেজেলাস

4
স্পেসিফিকেশন ব্যর্থ। আমার দেবতা।
কনরাড রুডল্ফ

3
যদি "স্পেসিফিকেশন ব্যর্থ" হয়ে থাকে তার অর্থ যদি আপনার ইউনিক্স সিস্টেমের 1 টিরও বেশি যুক্তি গ্রহণ করা উচিত তবে আমি 100% আপনার সাথে একমত আছি :)
আলেকজান্ডার মিলস

জিএনইউয়ের মতো এত বেশি 'লিনাক্স' নয়।
হবে

5

এটি @ আরম্পিয়ান মন্তব্যের মাধ্যমে এটি পাওয়া গেছে:

যা ঘটেছিল তা হল # কার্নেল ফাইলটির জন্য প্রথম দুটি অক্ষর প্রক্রিয়াকরণ করে # !. যদি এটির সন্ধান হয় তবে এটি স্থান ছাড়াই অক্ষরগুলির সন্ধানকারী সমস্ত স্থানের অক্ষরগুলি এড়িয়ে যায় এবং ইন্টারপ্রেটারের পথটি বের করে যা অবশ্যই বাস্তব নির্বাহযোগ্য এবং অন্য কোনও স্ক্রিপ্ট নয়, যদিও লিনাক্স এটি পুনরায় পুনর্বিবেচনাকারী স্ক্রিপ্ট প্রক্রিয়াকরণের অনুমতি দেয় to এটি সন্ধান করার পরে এটি প্রথম অ-স্পেস অক্ষরে চলে যায় যেখানে এটি সেখান থেকে পরের নিউলাইন চরিত্রে নিয়ে যায় এবং কমান্ডের একক যুক্তি হিসাবে এটি পাস করে। উদ্ধৃতি বা অন্যান্য মেটা অক্ষরের কোনও 'শেল' প্রসেসিং নেই। এটি সব খুব সহজ এবং নিষ্ঠুর শক্তি। সুতরাং আপনি সেখানে বিকল্পের সাথে অভিনব পেতে পারেন না। আপনি ঠিক একটি যুক্তি সাদা স্থান অন্তর্ভুক্ত পেতে পারেন এবং 'পার্ল-ডাব্লু' হ'ল কার্নেলটি এখানে দেখেছে এবং এগিয়ে চলেছে।

সূত্র: http://lists.gnu.org/archive/html/bug-sh-utils/2002-04/msg00020.html

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