সংখ্যার ফাংশন নাম কেন অনুমোদিত নয়?


10

নিম্নোক্ত বিবেচনা কর:

$ ksh -c '1(){ echo hi;};1'
ksh: 1: invalid function name
$ dash -c '1(){ echo hi;};1'
dash: 1: Syntax error: Bad function name
$ bash -c '1(){ echo hi;};1'
bash: `1': not a valid identifier
bash: 1: command not found
$ mksh -c '1(){ echo hi;};1'
hi

মূলত, আমি ফাংশনগুলি ঘোষণা করার চেষ্টা করছিলাম 1এবং 0এটি সংক্ষিপ্ততর হবে trueএবং falseআপনি দেখতে পাচ্ছেন যে আমি ফাংশনে সংখ্যার নাম ব্যবহার করে সমস্যায় পড়েছি। উপন্যাস এবং দুই-অঙ্কের নামগুলির সাথে একই আচরণ ঘটে।

প্রশ্ন "কেন"? এটি পসিক্স দ্বারা বাধ্যতামূলক? বা বোর্ন-এর মতো শাঁসগুলি কি কেবল?

এটির সাথে সম্পর্কিত প্রশ্নও দেখুন ।


1
যে জিনিসগুলি পিক্সিকের দ্বারা বাধ্যতামূলক করা হয় তা বেশিরভাগ সময় বোর্ন-এর মতো শেলগুলির মধ্যে থাকে। : পি
মুড়ু

আমি আপনি কি কি আছে দেখতে . । । > :) লোল
সের্গেই কলডিয়াজনি

4
@fkraiem দয়া করে meta.askubuntu.com/q/13807/295286 দেখুন শেল / শেল স্ক্রিপ্টিং জিজ্ঞাসা উবুন্টু বিষয়ে সর্বদা বিষয় ছিল :) যে কোনও উবুন্টু সিস্টেমের সঠিক ব্যবস্থাপনার জন্য এটি প্রয়োজনীয় বিষয়
সের্গি কোলোডিয়াজনি

4
এটি শেল স্ক্রিপ্টিং-এ রয়েছে এবং এটি (সত্যই যে কোনও শূন্য-শূন্য হিসাবে মিথ্যা হিসাবে বিবেচিত হয়) 0তা লক্ষণীয় , যদি কেউ এগুলি পড়েন তবে এটি অজানা থাকে। এটি অন্যান্য বেশিরভাগ প্রোগ্রামিং ভাষা থেকে পিছনে। true1false
ইথান কামিনস্কি

2
@ ইথানকামিনস্কি হ্যাঁ, যতক্ষণ না কমান্ডের প্রস্থান স্থিতি , এটি একেবারেই সত্য। 0 এর রিটার্ন মান trueশেল। তবে গাণিতিক প্রসারণে $((...))রিটার্নের স্ট্যাটাসগুলি উল্টানো হয় - 1 টি trueএবং 0 falseসি-ভাষার বাক্য গঠনগুলির সাথে সামঞ্জস্যের জন্য। উদাহরণস্বরূপ চেষ্টা করুন bash -c 'echo $((1==1));echo $((1==2))' আমি এই প্রশ্নের বাইরে যা করার চেষ্টা করছিলাম তা আসলে আচরণ "বিপরীত" " আমি ঠিক কী করার চেষ্টা করছিলাম তা দেখতে এখানে আমার উত্তরের শেষ উদাহরণটি দেখুন । নির্বোধ ধারণা, তবে তবুও কাজ করে
সের্গি কলডিয়াজহনি

উত্তর:


14

পসিক্স বলেছেন:

2.9.5 ফাংশন সংজ্ঞা কমান্ড

একটি ফাংশন একটি ব্যবহারকারী-সংজ্ঞায়িত নাম যা নতুন অবস্থানগত পরামিতিগুলির সাথে যৌগিক কমান্ড কল করতে একটি সাধারণ কমান্ড হিসাবে ব্যবহৃত হয়। একটি ফাংশন একটি "ফাংশন সংজ্ঞা কমান্ড" দিয়ে সংজ্ঞায়িত করা হয়।

ফাংশন সংজ্ঞা কমান্ডের বিন্যাসটি নিম্নরূপ:

 fname ( ) compound-command [io-redirect ...]

ফাংশনটির নাম রাখা হয়েছে নাম ; অ্যাপ্লিকেশনটি নিশ্চিত করবে যে এটি একটি নাম (এক্সবিডি নাম দেখুন ) এবং এটি কোনও বিশেষ অন্তর্নির্মিত ইউটিলিটির নাম নয়। একটি বাস্তবায়ন এক্সটেনশন হিসাবে কোনও ফাংশন নামের অন্যান্য অক্ষরকে মঞ্জুরি দিতে পারে। প্রয়োগটি ফাংশন এবং ভেরিয়েবলের জন্য পৃথক নামের স্থান বজায় রাখে।

এবং:

3.235 নাম

শেল কমান্ড ভাষায়, পোর্টেবল অক্ষর সেট থেকে এককভাবে আন্ডারস্কোর, অঙ্ক এবং বর্ণমালা সমন্বিত একটি শব্দ। নামের প্রথম অক্ষরটি কোনও অঙ্ক নয়।

দ্রষ্টব্য: পোর্টেবল ক্যারেক্টার সেটটি পোর্টেবল ক্যারেক্টার সেটে বিশদভাবে সংজ্ঞায়িত করা হয়েছে।

সুতরাং একটি অঙ্ক দিয়ে শুরু একটি শব্দ একটি ফাংশন নাম হতে পারে না।


এখনও পসিক্স কেন পুরোপুরি বলেন না, তবে আমি এটি "কারণ মান" উত্তর হিসাবে নেব। ধন্যবাদ
সের্গেই কলডিয়াজহনি

4
@ সার্জিইক্লোডিয়াজনি আমি বলতে চাই এটি একটি উত্তরাধিকারসূত্রে প্রাপ্ত জিনিস। নামের জন্য এই স্ট্যান্ডার্ডটি অন্যান্য জিনিসগুলিতেও মোটামুটি সাধারণ (আইআইআরসি সি নামগুলিও একই মান অনুসরণ করে), তাই সম্ভবত এটি ইউনিক্সের জিনিস। এছাড়াও, সি-তে, এটি পার্স করা আরও সহজ করে
মুরু

3
@ মুরু সি-তে অনুমতি দেওয়া থাকলে এটি কিছুটা অস্পষ্টতা আনবে। যেমন 1Lমানে কি? একটি ফাংশন নাম? নাকি long intআক্ষরিক?
Ruslan

2
উপরে যুক্ত করে, এটি লক্ষণীয় যে সিতে একটি খালি ফাংশন নাম সেই ফাংশনের পয়েন্টার হিসাবে কাজ করতে পারে। এটি আপনাকে কোনও ফাংশনে প্যারামিটার হিসাবে ফাংশনগুলি পাস করার অনুমতি দেয়, ভেরিয়েবলগুলিতে রেফারেন্সগুলি সংরক্ষণ করে etc. ইত্যাদি প্রায়শই কলব্যাকের জন্য ব্যবহৃত হয়। এটি ফাংশনের নামের সাথে বিপরীতভাবে ()সম্ভবত অভ্যন্তরীণ যুক্তিগুলির সাথে, যা প্রশ্নে ফাংশনটিতে একটি কলকে বোঝায় (এবং যে ফাংশনটি ডেকে ডেকে ফিরে আসে সেটিকে গ্রহণ করে)। সুতরাং আপনার যদি int f() { return 42; }সি-তে কোনও ফাংশন থাকে তবে এটি fকোনও পয়েন্টার প্রসঙ্গে f()বৈধ এবং কোনও পয়েন্টার, পূর্ণসংখ্যার প্রসঙ্গে বৈধ।
একটি সিভিএন

13

গাণিতিক ক্রিয়াকলাপ এবং ভেরিয়েবল বা ফাংশন বা পদ্ধতিগুলির মধ্যে বিভ্রান্তি রোধ করতে এটি অনেক ভাষায় একটি স্ট্যান্ডার্ড।

বিবেচনা:

var 1 = 100

print 1*10 //should return 10 but would instead return 1000

var x = 5
x += 1
print x //returns 105, not 6    

def 100(num)
  return num * 1000
end

var y = 10 + 100(10)
print y // returns 100010 instead of 1010

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

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


আমি মন্তব্য করতে যাচ্ছিলাম "তবে শেলের মধ্যে পরিবর্তনশীলগুলি $প্রসারিত হওয়ার জন্য প্রম্পেন্ড করা দরকার " তবে আবার যদি শেলটি অন্য ভাষা দ্বারা অনুপ্রাণিত হয় তবে এটি ঠিক আমার ধারণা, প্লাস গণিতের প্রসারিত ((ভেরিয়েবলগুলির নেতৃত্বের প্রয়োজন নেই $। ঠিক আছে, আমি এটি বুঝতে পারি
সের্গেই কলডিয়াজহনি

3
হ্যাঁ, এটি একটি সম্মেলন কারণ এটি প্রায় প্রতিটি ভাষায় অপ্রত্যাশিত ফলাফল তৈরি করবে, তবে এমনকি এমন পরিস্থিতিতে যেখানে এটি কাজ করবে, আপনার পরে আপনার কোডটিতে কাজ করতে হবে এমন কাউকে বোঝার জন্য কোডটি খুব কঠিন করে তুলতে পারে।
জোশ

2
@ সের্গি কলোডিএজনি গ্রীকগণিত প্রসার ছাড়াই পরিবর্তনশীল নাম উল্লেখ করতে দেয় $, তাই আছে। তবে এটি সম্ভবত "সাধারণ সম্মেলনের অনুসরণের" কারণগুলির দ্বিতীয় কারণ হতে পারে
হাবস

@hobbs হাঁ, একেবারে যে তার সাথে একমত
Sergiy Kolodyazhnyy

1
এই "বেশিরভাগ ভাষাগুলি" ব্যাখ্যা শাঁসের জন্য খুব কমই বোঝায়। সকল বোর্ন ধাঁচের শাঁস পরামিতি যার নাম আছে মত চেহারা সাংখ্যিক লিটারেল বা অপারেটরদের: 0শেল বা স্ক্রিপ্ট নামের জন্য, 1, 2, ..., অবস্থানগত পরামিতি জন্য, *তাদের জন্য যোগ দেন -সক্রিয় বিকল্পের জন্য, ?গত প্রস্থান অবস্থা, এবং !জন্য অতি সাম্প্রতিক অ্যাসিক্রোনাস কাজের পিআইডি। (সুতরাং, এমনকি $(( )), $প্রায়ই প্রয়োজন হয়।) এখানে দেখানো প্রস্তাব যুক্তিপূর্ণ প্রকট কোড কোন বোর্ন ধাঁচের শেল জন্য একটি স্ক্রিপ্ট নয়, এটা যে ভাবে প্রকট কোন উপায় যেহেতু, যেমন এটা প্রযোজ্য নয় থেকে তাদের।
এলিয়াহ কাগান

10

সি-তে, এর মতো একটি অভিব্যক্তি বিবেচনা করুন:

1000l + 2.0f;

কি 1000lএকটি পরিবর্তনশীল বা একটি ধ্রুবক? কারণ পরিবর্তনশীল নামগুলি একটি অঙ্ক দিয়ে শুরু করতে পারে না, এটি একটি ধ্রুবক হতে হবে। এটি পার্সিংকে সহজ এবং কঠোর করে তোলে (টাইপসগুলি 1000kসহজেই ধরা যায়)। ভেরিয়েবল এবং ফাংশন নামের জন্য একটি নিয়ম থাকাও সহজ, যেহেতু ফাংশনগুলিও ভেরিয়েবল হিসাবে বিবেচনা করতে পারে। এখন অবশ্যই পার্সারগুলি আরও জটিল এবং শক্তিশালী এবং সি ++ তে আমাদের কাছে কাস্টম লেটারেলের মতো জিনিস রয়েছে। তবে প্রাগৈতিহাসিক সেই প্রাচীন দিনগুলিতে, কিছুটা অপ্রয়োজনীয় নমনীয়তা উত্সর্গ করা আপনার সংকলনটি (বা ব্যাখ্যা) কয়েকগুণ কমিয়ে আনতে পারে (এবং লোকেরা এখনও সি ++ সংকলনের সময় সম্পর্কে অভিযোগ করে)।

এবং আপনি শেল ভাষার জুড়ে একটি সি এর প্রভাবগুলি দেখতে পাচ্ছেন, তাই অবাক হওয়ার মতো বিষয় নয় যে বোর্ন শেল (বা সি শেল) এবং সুতরাং, পসিক্স, অনুমোদিত নামের শ্রেণিটিকে সি এর মতোই সীমাবদ্ধ করেছে surpris


2
ব্যাখ্যা যেমন যায়, এটি সঠিক। এটি একই নয় যে সমস্ত ভাষাগুলির ক্ষেত্রে একই বিবেচনা প্রযোজ্য বা বোর্ন-স্টাইলের শাঁসের সি এর মতো একটি বাক্য গঠন রয়েছে, তবে সি এর সাথে সম্পর্কিত সংস্কৃতি শক্ত ছিল এবং শেল ডিজাইনারদের শনাক্তকারীদের কী হবে সে সম্পর্কে কিছু গ্যারান্টি নিয়ে আসতে হয়েছিল। অনুমোদিত। আমি মনে করি এটি "শেল ভাষা জুড়ে আপনি একটি সি প্রভাবের প্রভাব দেখতে পাচ্ছেন" এর উদাহরণগুলি ব্যবহার করতে পারে, কারণ তাদের মধ্যে মিলগুলি আসলেই পার্থক্যকে ছাড়িয়ে যায় না ( উদাহরণস্বরূপ কোন সংখ্যাটি সত্য বলে বিবেচিত হবে তা ভাবেন )। যাইহোক, এই উত্তরটি সঠিক।
এলিয়াহ

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