শেল বৈধ ফাংশন নামের অক্ষর


13

বর্ধিত ইউনিকোড অক্ষর ব্যবহার (কোনও সন্দেহ নেই) অনেক ব্যবহারকারীর জন্য দরকারী।

সহজ শেল (অ্যাশ (ব্যস্তবক্স), ড্যাশ) এবং ksh এর সাথে ব্যর্থ হয়:

tést() { echo 34; }

tést

তবে , , , এবং এটিকে অনুমতি দেয় বলে মনে হচ্ছে।

আমি সচেতন যে POSIX am বৈধ ফাংশন নাম এই সংজ্ঞা ব্যবহার নাম । তার মানে এই রেজেক্স:

[a-zA-Z_][a-zA-Z0-9_]*

তবে প্রথম লিঙ্কে এটিও বলা হয়েছে:

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

প্রশ্নগুলি হ'ল:

  • এটি কি স্বীকৃত এবং নথিভুক্ত?
  • কোথায়?
  • কোন শাঁসের জন্য (যদি থাকে)?

সম্পর্কিত প্রশ্ন:
এটি সম্ভব শেল ফাংশন নামে বিশেষ অক্ষর ব্যবহার?
আমি ফাংশন নামগুলিতে মেটা-অক্ষর (>) ব্যবহার করতে আগ্রহী নই।

“-” সম্বলিত আপস্টার্ট এবং ব্যাশ ফাংশন নামগুলি
আমি বিশ্বাস করি না যে কোনও অপারেটর (বিয়োগ "-") নামের একটি অংশ হওয়া উচিত।


আপনি aliasএকটি শিশুর আরও নিখুঁত হতে পারে। এবং তাই আপনি কিছু সঠিক, বোতামযুক্ত ডাউন নাম দিয়ে ফাংশনটি লিখতে পারেন এবং তারপরে ফাংশনটি কল করার জন্য কেবল আরও স্টাইলিশভাবে নামযুক্ত একটি উপনাম সংজ্ঞায়িত করতে পারেন। মধ্যে dashরয়েছে কিছু উপাদান আপনি করতে পারেন $PATHএবং %func
মাইক্রজারভ

উত্তর:


16

যেহেতু পসিক্স ডকুমেন্টেশন এটিকে এক্সটেনশান হিসাবে অনুমতি দেয়, তাই আচরণ থেকে বাস্তবায়ন রোধ করার কিছুই নেই।

একটি সাধারণ চেক (দৌড়ে zsh):

$ for shell in /bin/*sh 'busybox sh'; do
    printf '[%s]\n' $shell
    $=shell -c 'á() { :; }'
  done
[/bin/ash]
/bin/ash: 1: Syntax error: Bad function name
[/bin/bash]
[/bin/dash]
/bin/dash: 1: Syntax error: Bad function name
[/bin/ksh]
[/bin/lksh]
[/bin/mksh]
[/bin/pdksh]
[/bin/posh]
/bin/posh: á: invalid function name
[/bin/yash]
[/bin/zsh]
[busybox sh]
sh: syntax error: bad function name

দেখায় যে bash, zsh, yash, ksh93(যা kshআমার সিস্টেমের মধ্যে লিঙ্ক), pdkshএবং তার শিক্ষাদীক্ষা ফাংশন নামের বহু-বাইট অক্ষর অনুমতি দেয়।

yash শুরু থেকেই মাল্টিবাইট চরিত্রগুলিকে সমর্থন করার জন্য ডিজাইন করা হয়েছে , সুতরাং এটির কোনও আশ্চর্যের কিছু নেই।

অন্যান্য ডকুমেন্টেশনগুলি আপনি উল্লেখ করতে পারেন ksh93:

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

সুতরাং Cলোকালে সেট করা হচ্ছে :

$ export LC_ALL=C
$ á() { echo 1; }
ksh: á: invalid function name

এটি ব্যর্থ করুন।


poshযেমন একটি তালিকাতে তালিকাভুক্ত করা মূল্য নয়। এটি লিনাক্স নির্দিষ্ট বাগগুলিতে নির্ভর করে libcএবং অন্যান্য প্ল্যাটফর্মগুলিতে কাজ করবে না।
সুন্দরভাবে

আমি ksh93আসল উত্স থেকে স্বল্প সংকলিত ksh93 ব্যবহার সম্পর্কে আপনার দাবির পুনরাবৃত্তি করতে পারি না । যদিও ksh88ফাংশন নাম জন্য অ 7-বিট-হওয়া ASCII অক্ষর গ্রহণ করতে মনে হয়, শুধুমাত্র ksh93উবুন্টু থেকে বাইনারি তাদের গ্রহণ বলে মনে হয়।
সুন্দরভাবে

@ পরীক্ষামূলকভাবে ksh আমি এই পরীক্ষায় ব্যবহৃত হ'ল ডেবিয়ান বাইনারি (তাই এটি উবুন্টুর সাথে একইরকম হতে পারে)
কিউংলম

9

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

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

zshএবং rcতাদের ফাংশন নামের জন্য কিছু সহ /খালি স্ট্রিং সহ কিছুকে অনুমতি দিন । zshএমনকি NUL বাইট অনুমতি দেয়।

$ zsh
$ $'\0'() echo nul
$ ^@
nul
$ ""() uname
$ ''
Linux
$ /bin/ls() echo test
$ /bin/ls
test

শেলের একটি সাধারণ কমান্ড হ'ল আর্গুমেন্টগুলির একটি তালিকা এবং প্রথম আর্গুমেন্টটি কার্যকর করতে কমান্ডটি প্রাপ্ত করতে ব্যবহৃত হয়। সুতরাং, এটি কেবল যুক্তিসঙ্গত যে এই আর্গুমেন্ট এবং ফাংশন নামগুলি একই সম্ভাব্য মানগুলি ভাগ করে zshদেয় এবং বিল্টইনস এবং ফাংশনগুলিতে যুক্তিগুলিতে যে কোনও বাইট ক্রম হতে পারে।

আপনি (স্ক্রিপ্ট লেখক) যে ফাংশনগুলি সংজ্ঞায়িত করছেন সেগুলি হ'ল আপনি যে অনুরোধ করছেন সেটি এখানে সুরক্ষার সমস্যা নেই ।

যেখানে নিরাপত্তা সংক্রান্ত সমস্যা থাকতে পারে যখন পার্সিংটি পরিবেশ দ্বারা প্রভাবিত হয়, উদাহরণস্বরূপ শাঁসের সাথে যেখানে ফাংশনগুলির জন্য বৈধ নামগুলি লোকেল দ্বারা প্রভাবিত হয়।


এক ব্যাশ গেম খুব পালন করতে পারে, দিয়ে শুরু function /bin/sh { echo "$0: $FUNCNAME: Permission denied"; return 126; }দরকারী জিনিস খুব নামে ফাংশন সঙ্গে, এবং সম্ভাব্য --, //, @বা %ইত্যাদি
mr.spuratic

তবে কোনও শেল যখন /কোনও নামে পাওয়া যায় তখন হ্যাশ-টেবিলের অনুসন্ধানকে বাইপাস করে না ? এবং একটি ফাংশন কেবল একটি কার্যকরযোগ্য নাম নয় - এর কোড। আমি মনে করি যে কোনও সাধারণ প্রয়োগ যদি এর সঞ্চিত ফাংশন নামগুলিতে মেটাচার্যাক্টর অন্তর্ভুক্ত করে তবে প্রচুর পার্স সমস্যা হতে পারে।
মাইকসার্ভ

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