রিয়েলপথ কমান্ড পাওয়া যায় নি


24

আমার ডিবিয়ান স্কিজেড amd64 আছে। আমার বর্তমান শেল বাশ। আমি যদি আমার টার্মিনালে নিম্নলিখিতটি লিখি, এটি কাজ করে:

$ uname -a
Linux core 2.6.32-5-amd64 #1 SMP Fri May 10 08:43:19 UTC 2013 x86_64 GNU/Linux
$ echo $SHELL
/bin/bash                                                                                                                                                                                     
$ echo $(realpath test.sh)                                                                                                                                                     
/home/ffortier/test.sh

আমার টেস্ট.শ ফাইলটি দেখতে এমন দেখাচ্ছে:

#!/bin/bash
echo $(realpath "$1")

আমি যদি নিম্নলিখিতটি সম্পাদন করার চেষ্টা করি তবে আমি একটি ত্রুটি পেয়েছি

$ ./test.sh test.sh 
./test.sh: line 2: realpath: command not found

বাশ ফাইলের মধ্যে কীভাবে আমি রিয়েলপ্যাট কমান্ডটি ব্যবহার করতে পারি?

অতিরিক্ত তথ্য

$ type -a realpath
realpath is a function                                                                                                                                                                        
realpath ()                                                                                                                                                                                   
{                                                                                                                                                                                             
    f=$@;                                                                                                                                                                                     
    if [ -d "$f" ]; then                                                                                                                                                                      
        base="";                                                                                                                                                                              
        dir="$f";                                                                                                                                                                             
    else                                                                                                                                                                                      
        base="/$(basename "$f")";                                                                                                                                                             
        dir=$(dirname "$f");                                                                                                                                                                  
    fi;                                                                                                                                                                                       
    dir=$(cd "$dir" && /bin/pwd);                                                                                                                                                             
    echo "$dir$base"                                                                                                                                                                          
}           

উত্তর:


9

রিয়েলপথ কি প্রকৃত আদেশ বা স্ক্রিপ্ট? এটি কোথা থেকে আসছে তা আমি খতিয়ে দেখতে চাই।

$ type -a realpath

আমি এই সরঞ্জামটির সাথে পরিচিত নই এবং তাই এটি সম্ভবত আপনার সাধারণ বিতরণের অংশ নয়, সম্ভবত এটি কোনও একটি মানসম্পন্ন স্থানে ইনস্টল করা আছে যা বাশের উপস্থিত নেই $PATHতবে এটি আপনার লগইন পরিবেশের মধ্যে রয়েছে $PATH

যে কোনও ইভেন্টে, উপরের typeকমান্ডটি আপনাকে নির্দেশ দেবে যে কমান্ডটি কোথা থেকে আসছে, সেই বিন্দুতে আপনি যে পদ্ধতিটি আপনি এটির স্ক্রিপ্টে কল করছেন তা পরিবর্তন করতে পারবেন:

echo $(/path/to/realpath test.sh)

বা আপনার স্ক্রিপ্টটির সংশোধন করুন $PATHযাতে এটিতে এই অ-মানক অবস্থানও অন্তর্ভুক্ত থাকে।

শেল মধ্যে ফাংশন

আপনি যখন শেল স্ক্রিপ্ট শুরু করেন তখন আপনার বেশিরভাগ পরিবেশের কল হয় না। আপনি যদি এটির বিষয়ে চিন্তা করেন তবে এটি অনেক অর্থবোধ করে, যেহেতু আপনি সাধারণত স্ক্রিপ্টগুলিতে ব্যবহারকারীর পরিবেশে থাকা অতিরিক্ত সমস্ত জিনিসপত্র রাখতে চান না।

আপনি হয় কোন উত্স ফাইলটি এই ফাংশনটি সরবরাহ করছে তা নির্ধারণ করতে পারেন এবং হয় উত্সটি সরবরাহ করতে পারেন বা আপনার লগইন পরিবেশকে অন্তর্ভুক্ত করার জন্য বাশকে কেবল নির্দেশ দিতে পারেন।

#!/bin/bash -l
echo $(realpath "$1")

এটি একটি ফাংশন, সম্পাদনা দেখুন
ফ্রান্সিস

@ ফ্রেঞ্চিস - আপনি যখন আপনার স্ক্রিপ্টটি চালু করবেন তখন হ্যাঁ ফাংশনগুলি অন্তর্ভুক্ত নয়। আপনি যদি তাদের সাথে আসতে চান তবে আপনার সেগুলি উত্পন্ন করতে হবে। কোন ফাইলটি ফাংশন সরবরাহ করছে এবং এটি উত্সটি সরবরাহ করুন। আপনি যদি চান আপনার পুরো vর্ষা। তারপরে আপনার কলটিকে ব্যাশে সংশোধন করুন #!/bin/bash -l,।
slm

এই ফাংশনটি কোথা থেকে এসেছে তা আমি কীভাবে খুঁজে পাব?
ফ্রান্সিস

1
@ মাইকজার - ধন্যবাদ, আমি যখন এটি লিখেছিলাম তখনও আমি ফেডোরা 14 ব্যবহার করছিলাম যা অন্তর্ভুক্ত ছিল না realpath। আমার ফেডোরা 19 সিস্টেমে এখন এই সরঞ্জামটি অন্তর্ভুক্ত নেই। এছাড়াও লক্ষ্য করুন যে ওপিতে একটি ডেবিয়ান ডাব্লু / 2.6 কার্নেল ব্যবহার করা হয়েছিল, সুতরাং তার সিস্টেমটিও realpathতার বয়স অনুসারে অনুপস্থিত হবে ।
slm

1
@ মিকসার্ভ - হ্যাঁ আমি অবাক হয়েছি, এটি এখন একটি পুরানো প্রশ্ন, তবে commandএখনও তথ্যটি আমার পক্ষে কার্যকর ছিল। আমি পসিক্স শেল জুড়ে যা দেখছিলাম তা করার এটি আরও বহনযোগ্য উপায়।
slm

27

কমপক্ষে দুটি প্রোগ্রাম বলা হয় realpath:

  • জিএনইউ কোর্টিলগুলি অন্তর্ভুক্ত না করা হয়েছে এমন সময় থেকে পুরানো একটি প্রোগ্রাম readlink -f। এটি এখন অনুকূলে পড়েছে, এতগুলি readlink -fবিতরণ এটি বন্ধ করে দিয়েছে।
  • realpathজিএনইউ কোর্টিলস ৮.১৫ এ প্রোগ্রামটি চালু করা হয়েছে। এটি ডেবিয়ান চেপে বা এমনকি হুইজি রাখা খুব পুরানো; লেখার সময়, দেবিয়ান অস্থির এটি এটিকে পাঠায় না । এই প্রোগ্রামটি খুব কাছে readlink -f

কোনও কারণে, আপনার একটি শেল ফাংশন রয়েছে যা আংশিকভাবে আচরণের অনুকরণ করে realpath। এই অনুকরণটি আংশিক: আপনি যদি এটি একটি প্রতীকী লিঙ্কে কল করেন তবে এটি প্রতীকী লিঙ্কটি অনুসরণ করে না।

যেহেতু এটি শেল ফাংশন, সম্ভবত .bashrcএটি থেকে বা মাধ্যমে লোড করা , এটি কেবল আপনার ইন্টারেক্টিভ শেলটিতে চলমান কোডের জন্য উপলব্ধ। আপনি যদি লিনাক্স চালাচ্ছেন বলে ধরে নিয়ে আপনি যদি এটি অন্যান্য প্রোগ্রামগুলিতে উপলভ্য হতে চান তবে এমন একটি স্ক্রিপ্ট তৈরি করুন যা অনুকরণ করে realpath:

#!/bin/sh
readlink -f -- "$@"

(এটি realpathখুব কম ব্যবহৃত কমান্ড লাইন বিকল্পগুলি অনুকরণ করে না ))


2
কোরিউটিলস গিট রেপোতে আমি কোনও প্রমাণ পাই না যে realpathপ্রোগ্রামটি কোর্টিলস দ্বারা অবচিত বলে বিবেচিত হয়েছে, বা এটি ডিফল্টরূপে নির্মিত হয়নি। সুতরাং দেবিয়ান অবশ্যই এটি অপসারণ করবে।
কাজ

@ কাজ ওহ, ভাল, কেবল বিষয়গুলিকে জটিল করার জন্য, কোর্টিলগুলি সম্প্রতি (8.15) একটি realpathবাইনারি চালু করেছে , যা নিকটবর্তী তবে একেবারে একরকম নয় readlink -f। ডেবিয়ান স্থিতিশীল 8.13 বহন করে। দেবিয়ান অস্থির এই উত্তরাধিকার প্রোগ্রামটি রাখা বেছে নিয়েছে
গিলস'স 17-

এটা ছিল না যে সম্প্রতি - এটা জানুয়ারী 2012 ছিল savannah.gnu.org/forum/forum.php?forum_id=7076
mikeserv

1
প্রশ্নের উত্তর বিতরণ করার জন্য @ মেকিভেজার খুব সাম্প্রতিককালে (ডিবিয়ান স্কুইজ)। এমনকি বর্তমান দেবিয়ান স্থিতিশীলের জন্য খুব সাম্প্রতিক।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

এটা ভীতিজনক। তাদের বয়স কত openssl?
মাইকজার্ভ

8

এটি কেবল শেলটিতেই কাজ করে, কারণ স্ক্রিপ্ট ফাইলটির আলাদা স্কোপ রয়েছে এবং আপনার স্থানীয় ফাংশন এবং আপনার আরসি ফাইলগুলিতে সংজ্ঞা দেওয়া উপকরণগুলির অ্যাক্সেস নেই । এবং realpathকমান্ডটি আসলে আপনার সিস্টেমে বিদ্যমান নেই।

সুতরাং হয় realpathপ্যাকেজ থেকে ইনস্টল করুন, আপনার নিজের ফাংশনটি (স্ক্রিপ্টের অংশ হিসাবে কিছু উদাহরণ পরীক্ষা করুন ) সংজ্ঞায়িত করুন বা আপনার স্ক্রিপ্টে যেখানে আরসি ফাইলটি সংজ্ঞায়িত করা হয়েছে (উদাঃ . ~/.bashrc) source


realpathএটি উপস্থিত না থাকলে ইনস্টল করার পদক্ষেপ এখানে :

  • উবুন্টু: sudo apt-get install coreutils
  • ওএস এক্স: brew install coreutils

উবুন্টু এবং দেবিয়ান

ডেবিয়ান বা উবুন্টুতে এটি realpathডিফল্টরূপে ইনস্টল করা উচিত বলে মনে হয় । আমি সাম্প্রতিক ডেবিয়ান 8 (জেসি) পরীক্ষা করে দেখেছি এবং এটি coreutilsডিফল্টরূপে ইনস্টল করা আছে বলে মনে হয় ।

তাজা ভিএম চিত্র ব্যবহার করে পরীক্ষিত:

$ vagrant init debian/jessie64 && vagrant up --provider virtualbox && vagrant ssh
$ vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh

তারপরে ভিএম-এ:

$ type -a realpath
realpath is /usr/bin/realpath

পরিবর্তে realpath, আপনি প্যাকেজ দ্বারা সরবরাহিত readlink -f file(বা greadlink) পাশাপাশি ব্যবহার করতে পারেন coreutils


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