আমি আমার প্রতীকী লিঙ্কটি কীভাবে 'রিয়েলপথ' পাব?


13

আমি bashআমার শেল হিসাবে ম্যাকোএসএক্স এ আছি । আমার প্রতীকী লিঙ্ক আছে, এটি তৈরি করা হয়েছে:

ln -s /usr/bin/python python2 

আমার কাছে একটি প্যাকেজ রয়েছে যা পাইথন 2 ব্যবহার করে এবং আমি আমার বর্তমান ওয়ার্কিং ডিরেক্টরিতে একটি প্রতীক লিঙ্ক তৈরি করতে চাই /usr/bin/pythonযার সাথে আসলে পাইথন 2। আমি যখন python2কমান্ড লাইন থেকে একটি করি তখন আমি এই ত্রুটিটি পাই:

python2: realpath couldn't resolve "/usr/bin/python2"

তবে এটির মতো অনুরোধ করা ./python2পথটিকে সঠিকভাবে সমাধান করে। আমার PATHহয়েছে .তাতে। বাস্তবে আমি এটি পরিবর্তন করেছি, পরীক্ষার জন্য, কেবল .এটির জন্য।

আমি কীভাবে এটি সমাধান করব? ধন্যবাদ!


প্রসঙ্গ

নীচে প্রস্তাবিত বেশ কয়েকটি সমাধান আমার পক্ষে কাজ করবে না। আমি আমার প্রশ্নটি যতটা সম্ভব কেন্দ্রীভূত এবং সংক্ষিপ্ত করে দেওয়ার চেষ্টা করেছি যাতে লোকেরা পাঠ্যের সমুদ্রে ডুবে না যায়, তবে স্পষ্টতই আমার আরও পটভূমি সরবরাহ করা প্রয়োজন।

আমি এমন একটি প্যাকেজ বিকাশের চেষ্টা করছি যা আমি গিট থেকে ক্লোন করেছি। মূল প্যাকেজটি, git-multimailলিনাক্সের কিছু বৈকল্পিক / এ বিকাশ করা হয়েছিল (আমি উবুন্টু অনুমান করছি)। আমি এটি এবং ম্যাকোএসএক্সে এর টেস্ট স্যুটটি যতটা সম্ভব সংশোধন করে ব্যবহার করতে সক্ষম হতে এটি পরিবর্তন করার চেষ্টা করছি been প্রস্তাবিত সমাধানগুলির কিছু কেন আদর্শ নয় তা এখানে রয়েছে:

  1. রুট হিসাবে, python2/ usr / bin / এ একটি সিমিলিংক তৈরি করুন । আমি এমন একটি সমাধান খুঁজছি যা এর প্রয়োজন হবে না। এটি শুরুতে একটি সুস্পষ্ট বিকল্প ছিল, তবে আমি এমন একটি সমাধান চাই যা হোস্ট সিস্টেমটিকে যতটা সম্ভব সংশোধন করবে। এই কারণেই আমি বর্তমান চলমান ডিরেক্টরি ডিরেক্টরিতে একটি অস্থায়ী সিমিলিংক তৈরি করতে চেয়েছিলাম, .আমার পথে সিডাব্লুডি (ie ) যুক্ত করতে এবং তারপরে এটি শেষ করে (অর্থাত্ সিমলিংক)।

  2. বিদ্যমান পাইথন দিয়ে পাইথন স্ক্রিপ্ট কল করতে একটি মোড়ক স্ক্রিপ্ট তৈরি করুন। এটির সাথে সমস্যাটি হ'ল পরীক্ষার স্যুটের বেশিরভাগ আসল স্ক্রিপ্ট_ফায়ালগুলি এক্সিকিউটেবল হিসাবে ব্যবহার করে, সঠিক প্রয়োগের পরিবেশটি খুঁজে পেতে শেবাংয়ের উপর নির্ভর করে। এর অর্থ পরীক্ষার স্যুটটি যথেষ্ট সম্পাদনা করা। এই প্রসঙ্গে, (পরীক্ষার কাঠামোর স্নিপেটের জন্য নীচে দেখুন), আমাকে প্রতিটি .pyফাইলের জন্য একটি মোড়ক যুক্ত করতে হবে; আরও ব্যবহারকারী / বিকাশকারীরা কোন সিস্টেমে রয়েছে তার উপর নির্ভর করে প্যাকেজটি ব্যবহার করার জন্য বিভিন্ন বিধি সম্পর্কে সচেতন হতে হবে (অর্থাত ম্যাকোএসএক্স-এ নিশ্চিত করুন যে আপনি পাইথন ফাইলগুলি মোড়কের মাধ্যমে অনুরোধ না করে বা স্পষ্টভাবে কল না করে ব্যবহার করছেন না /usr/bin/python file.py)।

    #! /bin/sh
    
    D=$(cd $(dirname "$0") && pwd)
    MULTIMAIL="$D/../git-multimail/git_multimail.py"
    POST_RECEIVE="$D/../git-multimail/post-receive"
    
    TESTREPO=$("$D/create-test-repo")
    
    HOME="$D"
    XDG_CONFIG_HOME="$D"
    GIT_CONFIG_NOSYSTEM=1
    export HOME XDG_CONFIG_HOME GIT_CONFIG_NOSYSTEM
    
    cd $TESTREPO
    
    test_email() {
        REFNAME="$1"
        OLDREV="$2"
        NEWREV="$3"
        echo "$OLDREV" "$NEWREV" "$REFNAME" | USER=pushuser "$MULTIMAIL"
    
    } 
  3. সমস্ত python2রেফারেন্সে পরিবর্তন করা হচ্ছে pythonREADME এটিকে পরামর্শ দেয় তবে এটি কার্যকরভাবে সংস্করণ নিয়ন্ত্রণকে অকেজো করে তোলে কারণ সিস্টেমটি পরিবর্তনটিকে নতুন সংস্করণ হিসাবে দেখায়, যখন বাস্তবে এটি (শব্দার্থগতভাবে) হয় না।

আমি ব্যবহার করছি (3) তবে আমি আরও ভাল সমাধানের সন্ধান করার চেষ্টা করছি। আমি মেনে নিতে চাই যে এই জিনিসগুলি ঠিক এইভাবে (যেমন 'পাইথন 2' নির্দেশ করার উপযুক্ত উপায় নেই /usr/bin/pythonযা পরীক্ষার স্যুট এবং প্রকৃত কাঠামোর অনেকগুলি পরিবর্তন ছাড়াই বহনযোগ্য এবং আপত্তিজনক নয়) to


1
হে! ঠিকln -s /usr/bin/python /usr/bin/python2
এএনডিল

আসলে আমি লিনাক্সে গিট-মাল্টিমেল বিকাশ করি। তবে আমি এটি প্যাচগুলি এবং পরীক্ষকদের স্বাগত জানাব যাতে এটি ওএস এক্সে কাজ করতে পারে B
ম্যাথিউ ময়

প্রসারিত প্রশ্নটি এখনও একটি গুরুত্বপূর্ণ বিবরণ অনুপস্থিত: এক্সিকিউটেবল স্ক্রিপ্টগুলিতে শেবাং লাইনটি দেখতে কেমন? জন্য git-multimail.pyএটা #!/usr/bin/env python2, তাই একটি (অপেক্ষাকৃত) সহজবোধ্য উপায় এই কাজ করতে হবে।
Alexis

@ এনেদিলের মন্তব্যটি কার্যকর হয়নি, তবে ln -s /usr/bin/python2.7 /usr/local/bin/python2করেছে
ফিলিইডা

উত্তর:


3

আপনার যদি একটি সিমিলিংকের সমাধান (বা তদন্ত) করতে হয় তবে আপনি প্ল্যাটফর্মটি স্বাধীন বাশ লাইব্রেরি 'রিয়েলপথ-লিব' ব্যবহার করতে পারেন। ডিফল্টরূপে এটি পঠন লিঙ্ক অনুকরণ করে এবং ম্যাক বা ইউনিক্সে কাজ করবে। এটা তোলে পাওয়া যাবে গিটহাব বা Bitbucket এবং এটা বিনামূল্যে।

তবে মনে হচ্ছে আপনি নিজের স্থানীয় (কর্মক্ষম) ডিরেক্টরি থেকে পাইথন 2 (./python2 এর চেয়ে) করতে চান। আপনার .Bashrc- এ কোনও উপাধ দিয়ে এটি করা সম্ভব হতে পারে অথবা অন্যথায় আপনাকে আপনার PATH এনভায়রনমেন্ট ভেরিয়েবলের সাথে ওয়ার্কিং ডিরেক্টরি (এটিতে আপনার syMLink রয়েছে) যুক্ত করতে হবে। এটি কেবল বর্তমান সেশনের জন্য বা ভবিষ্যতের সেশনের জন্য .bashrc ফাইলের মধ্যেও করা যেতে পারে। এটি কেবলমাত্র নির্দিষ্ট ব্যবহারকারীর জন্যই সমাধান হতে পারে।

অন্য ব্যবহারকারী যা সকল ব্যবহারকারীর পক্ষে কাজ করে তা হ'ল পথে / অন্য / ডিরেক্টরিতে / usr / bin / পাইথন-তে পাইথন 2 সিমিলিংক তৈরি / usr / স্থানীয় / বিনে say সম্ভবত এর মতো কিছু:

sudo ln -s /usr/bin/python /usr/local/bin/python2

তারপরে যে কোনও ব্যবহারকারীর বা স্ক্রিপ্টের অজগর বা পাইথন 2 কমান্ড সন্ধান করা উচিত। অবশ্যই এই বিকল্পটি ইনস্টল করার জন্য অ্যাডমিন (রুট) সুবিধার প্রয়োজন।


শেষ পর্যন্ত আমি হাল ছেড়ে দিয়েছি। অনেকগুলি জায়গা রয়েছে যা কোডগুলিতে 'পাইথন 2' ধরে নেয় এবং প্রতিটি স্থানীয় সমাধান সমস্ত সম্ভাবনা কভার করে না। এটি এই পেরেকের জন্য সবচেয়ে উপযুক্ত স্লেজহ্যামার।
অ্যাভেরি চ্যান

@ সমস্ত, আপনি কি আমার সমাধান চেষ্টা করে? কোন সমস্যা ছিল? এটিতে আপনাকে যুক্ত python2করার দরকার /usr/binপড়েনি (যদিও আমি এটিকে যুক্ত হিসাবে উন্নত হিসাবে দেখছি, সত্যবাদী হতে)।
অ্যালেক্সিস

কোনও উপাধি (...) দিয়ে এটি করা সম্ভব হতে পারে কারণ এটি কেবলমাত্র কমান্ড লাইনকে প্রভাব দেয় কারণ স্ক্রিপ্টগুলি নয় alias ডেবিয়ান 7.5 তে পাইথনের ডিফল্ট সংস্করণটি কীভাবে পরিবর্তন করবেন
পাইওটর ডব্রোগস্ট

এটি সঠিক উত্তর নয়, অন্ততপক্ষে পোস্টারকে প্রশ্ন জিজ্ঞাসা করার প্রবণতার বিষয়টি সমাধান করে না।
স্মুডেট

16

আমি বিশ্বাস করি আপনি একই প্রোগ্রামের একাধিক সংস্করণ পরিচালনা ও স্যুইচিংয়ের জন্য অ্যাপল এর সিস্টেমের অনেকগুলি চালাচ্ছেন। আপনি যা চান তা পূরণ করতে পারেন, কম মার্জিতভাবে কিন্তু সমস্যা ছাড়াই, নীচের স্ক্রিপ্টটির নাম সহ python2:

#!/bin/bash
exec /usr/bin/python "$@"

এটি সম্পাদনযোগ্য ( chmod +x python2) করুন এবং আপনি ব্যবসায়ে রয়েছেন।

সমস্যার ব্যাখ্যা:

আপনি যখন চালান /usr/bin/python, এটি python2.7 একই ডিরেক্টরিতে এটি আবিষ্কার করে এবং কার্যকর করে আপনার প্রতীকী লিঙ্কটি ব্যর্থ হয়েছে কারণ সিস্টেমটি সিমলিংকে অনুসরণ করে /usr/bin, তারপরে অনুসন্ধান করে python2 সেখানে খুঁজে পাওয়া যায় না। প্রতীকী লিঙ্কের পরিবর্তে "হার্ড লিঙ্ক" ব্যবহার করে আপনি আরও একধাপ এগিয়ে পেতে পারেন:

rm python2
ln /usr/bin/python python2

এখন অনুসরণ করার মতো কোনও প্রতীকী লিঙ্ক নেই, একই ফাইলের জন্য কেবল দুটি ফাইলের নাম (ইনোড)। তবে এখন আমি নিম্নলিখিত বার্তায় ব্যর্থ:

python2: posix_spawn: /Users/alexis/.../python22.7: No such file or directory

লক্ষ্য করুন python22.7: ফ্রেমওয়ার্কটি 2.7আপনার তৈরি নামটি যুক্ত করছে! এটি উন্মোচন করার চেষ্টা করার পরিবর্তে এবং এর প্রত্যাশাগুলির সাথে মেলে এমন লিঙ্কগুলির একটি বন স্থাপন করার পরিবর্তে, আমি আপনাকে সংস্করণ পরিচালনার কাঠামোর পথ থেকে দূরে থাকার এবং উপরে বর্ণিত সমাধানটি ব্যবহার করার পরামর্শ দিচ্ছি ।

পুনশ্চ. এর থেকে আরও ভাল সমাধান হতে পারে: আপনি যদি শুরুর জন্য আপনার কী করা দরকার তা ব্যাখ্যা করে থাকেন (কেন আপনার python2একটি উপাধিকার হিসাবে কেন সরবরাহ করা প্রয়োজন python), কেউ সম্ভবত আপনাকে এটি অন্যরকমভাবে করতে সহায়তা করতে পারে। এটি স্ট্যাকেক্সচেঞ্জ লিঙ্গোতে "এক্সওয়াই সমস্যা" হিসাবে পরিচিত ...


আপনি যখন চালান /usr/bin/python, এটি একই ডিরেক্টরিতে পাইথন 2.7 খুঁজে এবং কার্যকর করে। এটি খুব বিভ্রান্তিকর বক্তব্য। যদি আপনি /usr/bin/pythonকেসটি যেখানে একটি সিমিলিংক বর্ণনা করেন তবে দয়া করে আরও সুনির্দিষ্ট হন।
পাইওটার ডব্রোগোস্ট

এটি কেবল আশ্চর্যজনকভাবে খারাপ ..
নিকোলাস

আশ্চর্যজনক খারাপ কি?
অ্যালেক্সিস

হ্যাঁ এখানে যা স্পষ্টভাবে উল্লেখ করা হয়নি তা হ'ল আমি মনে করি / usr / bin / python আসলে পাইথন নয়, এটি কেবল MacOS ইনস্টলড পাইথন (পাইথন 2.7 যা ফ্রেমওয়ার্কগুলির ফোল্ডারের সাথে সিমিলিংযুক্ত) সন্ধান করে। আমি সন্দেহ করি @ ননকোলাস বলছে যে জাল অজগর সংস্করণটি আশ্চর্যজনক খারাপ - এটি বেশ হ্যাক এবং আমি আশা করি অ্যাপল এটি না করত। ... এমন অনেকগুলি জিনিস রয়েছে যা আমি আশা করি অ্যাপল এমনটি না করায় যা কেবল তাদের অন্যথায় সূক্ষ্ম ইউনিক্স সিস্টেমের মতো করে তোলে।
স্মুডেট


1

আপনি readlinkএকটি লিঙ্কের শারীরিক পথ খুঁজে পেতে ইউনিক্স কমান্ডটি ব্যবহার করতে পারেন ।

উদাহরণ

বলুন আমার নীচের লিঙ্ক আছে:

$ ls -l /usr/bin/etags
lrwxrwxrwx. 1 root root 29 Dec 10 22:56 /usr/bin/etags -> /etc/alternatives/emacs.etags

$ ls -l /etc/alternatives/emacs.etags
lrwxrwxrwx. 1 root root 20 Dec 10 22:56 /etc/alternatives/emacs.etags -> /usr/bin/etags.ctags

$ ls -l /usr/bin/etags.ctags
lrwxrwxrwx. 1 root root 5 Dec 10 22:56 /usr/bin/etags.ctags -> ctags

  1. মানটি সন্ধান করতে প্রতীকী লিঙ্কটি নির্দেশ করে

    $ readlink /usr/bin/etags
    /etc/alternatives/emacs.etags

    দ্রষ্টব্য: উপরের ফলাফলটি অন্য লিঙ্ক হতে পারে। এটি সমাধানের জন্য নীচে # 2 দেখুন।

  2. মানটির নিখুঁত পথটি খুঁজে পেতে একটি প্রতীকী লিঙ্কটি নির্দেশ করে

    $ readlink -f /usr/bin/etags
    /usr/bin/ctags

0

আমি বুঝতে পারি না - আপনি কীভাবে বিশ্বাস করেন যে একটি মোড়কের লিঙ্কটি ঠিক আছে, তবে একটি মোড়ক লিপি নয় ? হয় একটি নিছক ইন্ডিয়ারেশন স্তর। এবং আপনি কি এখনও আপনার ব্যবহারকারীদের কেবল কোনও নির্দিষ্ট ডিরেক্টরি থেকে কল করতে নির্দেশ দিতে হবে না?

যাই হোক না কেন, আপনি $PATHঅবশ্যই বর্তমান কার্যকারী ডিরেক্টরিটি পেতে পারেন :

 echo "echo \"Hi! I'm python\"" >|./python 
 chmod +x ./python 
 PATH="${PWD}:${PATH}" 
 python

 #OUTPUT#
 Hi! I'm python

 rm python 
 python -V 
 ln -s /usr/bin/python2 ./python 
 python -V

 #OUTPUT#
 Python 3.4.0
 Python 2.7.6

 PATH="${PATH#"${PWD}:"}" 
 python -V

 #OUTPUT#
 Python 3.4.0

দয়া করে, পেতে আপনার থেকে বের $PATH। এটি একটি ভয়ঙ্কর ধারণা


.আমার AT PATH এ কেন একটি খারাপ ধারণা? যদি আমি শেষে লাগাতে, তারপর গত স্থান, যা লাগছিল হবে আমার সাম্প্রতিক কাজ করা (অর্থাত `পাথ =" $ {পাথ}: $ {গণপূর্ত} "হয়। একজন স্ক্রিপ্ট মোড়কের মানে যে পাইথন ফাইলের জন্য আমি করব যে একটি অতিরিক্ত ফাইল তৈরি করতে হবে। আবরণ লিঙ্ক আমাকে কি করতে জন্য পাইথন এক্সিকিউটেবল করতে শুধু একটা জিনিস তৈরি করে।
Avery, চ্যান

পছন্দ করুন একটি মোড়ক স্ক্রিপ্ট এক্সিকিউটিয়েবলের একই নাম সহ একটি শেল ফাংশন বা উপন্যাস উত্স করতে পারে। এটি প্রয়োজনীয় হিসাবে --bind mountবর্তমান ডিরেক্টরি বা (কেবলমাত্র লিনাক্স, আমি অনুমান করি) চালানো যেতে পারে chroot। কিন্তু। মধ্যে $PATHজন্য কাজ কোনো ডিরেক্টরি ও নির্দিষ্ট নয়। এটি আপনার ব্যবহারকারীদের জন্য বিপজ্জনক। যাইহোক, উপরে এটি কীভাবে করা যায় আমি খুব স্পষ্টভাবে প্রদর্শন করেছি। এটি আপনার প্রয়োজনীয়তা পূরণ করে না?
মাইক্রজারভ

0

পুনরায় @alexis উত্তর, পাইথন সংস্করণটি /usr/binবাস্তব পাইথন নয়।

এটি তিনটি উপায়ে স্পষ্ট হওয়া উচিত:

  1. আমরা ত্রুটিটি পাই যা পাইথনটি সাধারণত তৈরি করে না typically অজগরটির আচরণ অন্য পাইথনের সন্ধান নয় এটি পাইথন স্ক্রিপ্টগুলি চালিত করে।

  2. যদি আপনি /usr/bin/pythonচালিত অজগর 2.7 এর শসুম এবং প্রকৃত পাইথন 2.7 গণনা করেন :

shasum /usr/bin/python
3782d9ab14b35037c9c7fb665439a5fa695c54a6  /usr/bin/python
shasum /usr/bin/python2.7
476fa96c80ac26a85b2d3b01ddfd19e513660c2c  /usr/bin/python2.7

এগুলি সম্পূর্ণ আলাদা। অতিরিক্ত হিসাবে, ফাইলের আকারগুলি 20k বাইট দ্বারা পৃথক হয়:

ll /usr/bin/python
-rwxr-xr-x  1 root  wheel  66880 May 17  2019 /usr/bin/python

বনাম

ll /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
-rwxr-xr-x  1 root  wheel  43104 May 17  2019 /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
  1. অবশেষে, আপনি পাইথন 2.7 এবং পাইথনটি ছিন্ন করতে এবং প্রতীকগুলি তদন্ত করতে পারেন। এটি কেবল 'কীভাবে অক্সে পাইথন 2.7 কে পাইথন 2-তে সিএমলিংক করতে পারি' এর সুযোগের বাইরে কিছুটা হলেও।

সুতরাং (ত্রুটিটি ইঙ্গিত হিসাবে) /usr/bin/pythonঘুরে ফিরে অনুসন্ধান করে /usr/bin/python2.7:

ll /usr/bin/python2.7
lrwxr-xr-x  1 root  wheel  75 Jul  1  2019 /usr/bin/python2.7 -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7

যে কারণে নিম্নলিখিত কাজগুলি (সৌজন্য @ লিয়াংমিন-লি এর উত্তর):

    ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /usr/local/bin/python2

সাইটে স্বাগতম। আপনি কীভাবে আপনার নমুনা lsআউটপুট থেকে /usr/bin/python"সত্যিকারের পাইথন নয়" তা দেখতে কীভাবে কিছু ব্যাখ্যা যুক্ত করতে পারেন ।
অ্যাডমিনবি

এটি কিছুটা স্পষ্টভাবে স্পষ্ট হয় তবে আমি কীভাবে এটি নির্ধারণ করতে পারি তা আপডেট করতে পারি।
স্মুডেট

এটি এমন একজনের পক্ষে হতে পারে যারা একটি সাধারণ pythonদোভাষী
দ্বৈত

1
আমি আমার নমুনা আপডেট করেছি। বাইনারি পরিচয় প্রমাণ করা একটি কঠিন সমস্যা যদিও এই কারণেই আমি এখানে সম্পূর্ণরূপে সম্বোধন করি না (সংস্করণগুলির মধ্যে আকারগুলি বৈধভাবে পৃথক হতে পারে, আচরণগুলি পরিবর্তন করতে পারে - আমি আমার আপডেট উত্তরে পোস্ট হিসাবে প্রমাণিতভাবে এই সিস্টেমটি কীভাবে বিপরীতে আচরণ করে তা প্রমাণিত হয়) একটি ভ্যানিলা পাইথন ইনস্টলেশন আচরণ করার কথা is তবে আমি আপনার বক্তব্য বুঝতে পেরেছি।
স্মুডেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.