Vari PATH এনভায়রনমেন্ট ভেরিয়েবলের শতাংশ


16

আমার $ PATH দেখতে এমন দেখাচ্ছে:

/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux:/home/torbjorr/deployed/typewriter/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mustudio/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mathext/x86_64-GNU%2fLinux:/home/torbjorr/deployed/doxymax/x86_64-GNU%2fLinux:/home/torbjorr/deployed/c2tex/x86_64-GNU%2fLinux:/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand:/home/torbjorr/deployed/x86_64-GNU%2fLinux/spellesc:/home/torbjorr/deployed/x86_64-GNU%2fLinux/projinit:/home/torbjorr/deployed/x86_64-GNU%2fLinux/herbs:/home/torbjorr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

ব্যাশে, আমি সমস্যা ছাড়াই এটিতে অবস্থিত ভ্যান্ডটি ডাকতে পারি

/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand

মত

$ wand
(i) Mål från "main.cpp" har registrerats
(i) Skapar katalog "__wand_targets_dbg"
(i) Kör g++ "main.cpp" -fpic -L"/home/torbjorr/deployed"  -g -Wall -std=c++11 -I"/home/torbjorr/deployed" -o "__wand_targets_dbg/cb-template

তবে বোর্ন শেল সামঞ্জস্যতা মোডে, লাঠিটি পাওয়া যাবে না:

$ wand
sh: 2: wand: not found

দেখে মনে হচ্ছে সমস্যাটি এই পথগুলিতে% চিহ্ন রয়েছে। এই চিহ্নটি ইউআরএল এনকোডিংয়ের মাধ্যমে যুক্ত করা হয়েছে যাতে বৈধ ফাইল নাম না হলেও "জিএনইউ / লিনাক্স" নামটি ডিরেক্টরি নামে ব্যবহার করা যেতে পারে। Sh এ নামটি কীভাবে কাজ করা সম্ভব, বা sh কমান্ডকে বাশ হিসাবে কাজ করা সম্ভব? এটি হ'ল, বাশ একইরকম আচরণ করুন যদিও এটি / bin / sh কমান্ডের সাহায্যে আহ্বান করা হয়েছিল, যা যেভাবেই বাশ করতে পারে।


দুর্দান্ত প্রশ্ন। দেখে মনে হচ্ছে যে '%' অক্ষরটি from PATH থেকে সঠিকভাবে কাজ করছে না sh(এটি ঠিক আছে bashএবং zshযদিও)। সরাসরি এক্সিকিউটেবল কাজগুলিতে কল করা sh; খুব আশ্চর্যজনক.
রোমানো

আপনি যদি 2 %% ব্যবহার করেন তবে কী হবে?
মাইকসার্ভ

নাকি পালাতে পারবেন%?
এমডিপিসি

উত্তর:


15

এটি বোর্ন শেল নয়, বা বোর্ন শেলটি bashঅনুকরণকারী, এটি আলকুইস্ট শেল, আপনার ক্ষেত্রে সম্ভবত দেবিয়ান অ্যালকুইস্ট শেল (বিএসডিদের ডিবিয়ান দ্বারা লিনাক্সের কাঁটা নিজেই মূল অ্যালকুইস্ট শেলের উপর ভিত্তি করে)।

অ্যালকুইস্ট শেলের মধ্যে (মূল এক এবং আধুনিক সংস্করণ) নির্দিষ্ট করে অতিরিক্ত বৈশিষ্ট্যগুলির জন্য %ব্যবহৃত PATHহয় ash। ডকুমেন্টেশন থেকে উদ্ধৃতি:

পাথ অনুসন্ধান

কমান্ডটি সনাক্ত করার সময় শেলটি প্রথমে এটির নামে শেল ফাংশন রয়েছে কিনা তা দেখতে সক্ষম হয়। তারপরে, যদি PATH এর জন্য কোনও প্রবেশাধিকার না থাকে %builtin, তবে এটি নামের দ্বারা একটি বিল্টিন কমান্ড সন্ধান করে। অবশেষে, এটি কমান্ডের পরিবর্তে PATH- এ প্রতিটি প্রবেশ সন্ধান করে।

PATH ভেরিয়েবলের মান কোলন দ্বারা পৃথক পৃথক এন্ট্রিগুলির একটি সিরিজ হওয়া উচিত। প্রতিটি এন্ট্রিটিতে একটি ডিরেক্টরি নাম বা একটি ডিরেক্টরি নাম থাকে যা একটি পতাকা চিহ্নের পরে শতকরা চিহ্ন সহ শুরু হয়। বর্তমান ডিরেক্টরিটি একটি খালি ডিরেক্টরি নাম দ্বারা নির্দেশিত হওয়া উচিত। যদি কোনও শতাংশ চিহ্ন উপস্থিত না থাকে তবে প্রবেশের ফলে শেলটি নির্দিষ্ট ডিরেক্টরিতে কমান্ড সন্ধান করতে পারে। পতাকাটি যদি থাকে %builtin তবে শেল বিল্টিন কমান্ডগুলির তালিকা অনুসন্ধান করা হবে। পতাকাটি যদি থাকে %func তবে ডিরেক্টরিটি এমন কোনও ফাইলের জন্য অনুসন্ধান করা হয় যা শেলের ইনপুট হিসাবে পড়ে। এই ফাইলটি এমন একটি ফাংশন সংজ্ঞায়িত করা উচিত যার নাম অনুসন্ধান করা আদেশের নাম name

উপরের কোনও অনুসন্ধান না করে স্ল্যাশযুক্ত কমান্ডের নামগুলি কেবল কার্যকর করা হয়।

অন্যান্য শেলগুলি ফাংশন প্রক্রিয়াটির মতো kshবা অটোলয়েডিংয়ের মতো বা zshএকই রকম থাকে তবে তারা একটি পৃথক ভেরিয়েবল ( $FPATH) ব্যবহার করে তবে আপনি কোনটি ফাংশন বা এক্সিকিউটেবলের অগ্রাধিকার গ্রহণ করেন তা নির্ধারণ করতে পারবেন না।

আপনার ক্ষেত্রে, পতাকা সহ ডিরেক্টরি /home/torbjorr/deployed/vector/x86_64-GNU%2fLinuxহিসাবে ব্যাখ্যা করা হয় । অজানা হিসাবে এটি পতাকা অগ্রাহ্য করা হয়।/home/torbjorr/deployed/vector/x86_64-GNU2fLinux

যে প্রায় কোনো উপায় নেই। এমনকি যদি ছাই যে এই তাই এড়িয়ে যাওয়ার জন্য একটি প্রক্রিয়া ছিল %বিশেষভাবে তারপর অন্যান্য শাঁস বা অন্যান্য বিষয় আছে যা খোঁজা কাজ নাও চিকিত্সা করা না হয়, তাহলে হবে $PATHমত execvp()

আপনার %থেকে অক্ষরগুলি সরিয়ে ফেলতে হবে $PATH, সুতরাং আপনার ডিরেক্টরিটির নাম পরিবর্তন করুন বা একটি সিমিলিংক যুক্ত করুন।

বা আপনার ashজন্য ব্যবহার করবেন না /bin/sh। অন্যান্য হালকা POSIX শেল বাস্তবায়ন যা এর অন্তর্ভুক্ত করে না yashএবং mksh


যদিও এই উত্তরটি একটি ব্যাখ্যা দেয়, এটি কোনও সমাধান দেয় না। % রাখার সুসংগত উপায় আছে কি?
ব্যবহারকারীর 877329

@ user877329, এখানে কোন বাস্তব সমাধান নেই। আমার সম্পাদনা দেখুন।
স্টাফেন চেজেলাস

3
অন্য কথায়, shদেবিয়ান POSIX মান লঙ্ঘন করে। পৃথক থাকার বিন্দুটি shহ'ল এই যে আপনি কিছুটা বেমানান শেল এক্সটেনশান ধরে ভ্রমণ করবেন না বলে নিশ্চিত হওয়া উচিত (আমার ধারণা /bin/shess দিনগুলিতে কেউই লগইন শেল হিসাবে ব্যবহার করে না ), আমি এটি একটি বাগ বিবেচনা করব।
celtschk

1
@celtschk, যদিও ash/ বিন / sh এর জন্য ব্যবহারের পারফরম্যান্স পেনাল্টি এড়ানোর জন্য পয়েন্টটি আরও বেশি bash, তবে ব্যবহার করা yashবা mksh(বা poshআপনি যদি সমস্ত এক্সটেনশন বাদ দিতে চান) ব্যবহার করার চেয়ে আরও ভাল বিকল্প হিসাবে সম্মত হন তবে bash। এছাড়াও, কেউ এটিকে কর্নারের ক্ষেত্রে বিবেচনা করতে পারে। কারও কাছে সাধারণত %কোনও পথ উপাদান থাকে না। বেশিরভাগ শেলের কোণার কেস থাকে যেখানে তারা পসিক্স অনুগত নয়।
স্টাফেন শেজেলাস

1
@ এমটিমিলার, এটি আমি পোর্টেবল ফাইলনাম অক্ষর সেট (পিএফসিএস) এর অর্থ কীভাবে পড়ি তা নয় । পসআইএক্স প্রোগ্রামিং এপিআইগুলি নির্দিষ্ট করে তবে ফাইল সিস্টেমের প্রয়োগগুলি নয়। পিএফসিএস হ'ল ন্যূনতম পসিক্স গ্যারান্টিগুলি ফাইল সিস্টেমটি যাইহোক কাজ করবে, বর্তমান স্থানীয় যাই হোক না কেন তবে ফাইল-সিস্টেমের দ্বারা সমর্থিত এবং বর্তমান লোকালে বৈধ হলে কোনও সরঞ্জাম কোনও ফাইলনেমে অক্ষর গ্রহণ না করার জন্য কোনও অজুহাত নয়। নোট করুন যে উদাহরণস্বরূপ POSIX এর জন্য একটি [কমান্ড থাকা দরকার যদিও সেই অক্ষরটি পিএফসিএসে নেই।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.