আমি কীভাবে ম্যাক ওএস এক্সের শেল স্ক্রিপ্টে পরম ফাইলের নামটি পেতে পারি?


19

আমি বর্তমানে সম্পাদিত স্ক্রিপ্ট ফাইলটির পরম ফাইলের নামটি পুনরুদ্ধার করতে চাই। লিঙ্কগুলিও সমাধান করা উচিত।

লিনাক্স-এ, এটি এইভাবে করা হবে বলে মনে হচ্ছে:

$(readlink -mn "$0")

তবে readlinkমনে হয় ম্যাক ওএস এক্সে খুব আলাদাভাবে কাজ করবে

আমি পড়েছি যে এটি ব্যবহার করে সম্পন্ন হয়েছে

$(realpath $0)

বিএসডি তে কিন্তু তাও কাজ করে না। ম্যাক ওএস এক্স নেই realpath

কোন ধারণা?


1
এই প্রশ্নটি এসও তে দেখুন: স্ট্যাকওভারফ্লো.com
ম্যাকাস


উত্তর:


19

আমি এই জিনিসটির জন্য প্রতারণা করি এবং পার্ল ব্যবহার করি:

#!/bin/bash
dirname=`perl -e 'use Cwd "abs_path";print abs_path(shift)' $0`
echo $dirname

আপনি ভাববেন যে আমি কেবল পুরো স্ক্রিপ্টটি পার্লে লিখব, এবং প্রায়শই আমি করি তবে সবসময় না।


এটি কাজ করে, অনেক অনেক ধন্যবাদ। আমি যত তাড়াতাড়ি পারব আপনাকে একটি উঁচুতে উপহার দেব। কারও কাছে কি "খাঁটি শেল" উপায় আছে?
হুশি

1
আমি আশঙ্কা করি এটি যেমনটি পায় তেমন ভাল। (বহু বহু-লাইনের "খাঁটি শেল" হ্যাকের ফলে গুগলে যে কেউ খুঁজে পেতে পারে))
আরজান

আরেকটি সম্ভাবনা (যদিও কুৎসিত) হ'ল '..' পথ অতিক্রম করা, মুখস্থ করা (পুনরাবৃত্তি বা একটি অ্যারের মাধ্যমে) যতক্ষণ না '..' আপনার সবেমাত্র একই ফাইলটি ফেরত দেয় (যেমন: আপনি শীর্ষে আছেন), তবে একত্র হয়ে ফিরে আসুন আপনি যেতে পথ। আমি 'লিগাটো'র নেটওয়ার্কার ব্যাকআপ সফ্টওয়্যারটিকে' সত্য 'পথ অর্জনের পদ্ধতি হিসাবে স্ট্রেসের সময় এটি করতে দেখেছি (তবে সম্ভবত পরম নয়)। তবে উপরের তুলনায় এটি অনেক বেশি কোড হবে।
এরিক্সলা

কেউ কেন কোডটি $ 0 এর পরিবর্তে $ 1 ব্যবহার করতে সংশোধন করেছেন তা নিশ্চিত নন। $ 1 কি বাশ স্ক্রিপ্টের প্রথম আরগ নয়? আমি বাশ স্ক্রিপ্ট কার্যকর করার পথটি চেয়েছিলাম, এটি প্রথম যুক্তি নয়।
এরিক্সলা

27
#!/usr/bin/env bash
scriptDir="$(cd "$(dirname "$0")" && pwd -P)"

ম্যাকওএসএক্স-এও কাজ করে।
অ্যালেক্সার

1
এটি সুপার! আশেপাশে ভাসমান আরও অনেক জটিল উত্তর রয়েছে।
জেসন এস

3
এটি কেবল একটি সিমলিংকড ডিরেক্টরিতে থাকা ফাইলগুলির জন্য কাজ করে, সাধারণভাবে সিমলিংকযুক্ত ফাইলগুলির জন্য নয়
গারহার্ড বার্গার

1
unset -v CDPATHসিডির পূর্বে এটিও সহায়ক since
বাইনারি ফিলি

ফাইলের সিমলিংকিংয়ের কমপক্ষে একটি একক স্তরকে মোকাবেলা করতে আপনি রিডলিংকের সাথে একটি সামঞ্জস্যপূর্ণ পদ্ধতিতেও পরীক্ষা করতে পারেন (ম্যাকস-এফ নেই): scriptDir=$(unset -v CDPATH; cd "$(dirname "$(readlink "$BASH_SOURCE" || echo "$BASH_SOURCE)")" && pwd -P)
বাইনারি ফাইলে

0

এটি কম্বোস সিমলিঙ্কগুলি পরিচালনা করে এবং এটি ফাইল এবং ফোল্ডারগুলিতে কাজ করে:

#!/usr/bin/env bash
realpath()
{
    if ! pushd $1 &> /dev/null; then 
        pushd ${1##*/} &> /dev/null
        echo $( pwd -P )/${1%/*}
    else
        pwd -P
    fi
    popd > /dev/null
}

তবে এটি রিয়েলপ্যাটের - সম্পর্কিত সম্পর্কিতটিকে সমর্থন করে না। এটির জন্য এখানে বর্ণিত রূপান্তর প্রয়োজন ।


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