از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
مسیر مطلق یک اسکریپت را در Bash دریافت کنید
سرفصلهای مطلب
مسیر مکانی برای یک دایرکتوری یا یک فایل است. دو نوع مسیر متمایز در لینوکس وجود دارد – مطلق و نسبی. مسیر نسبی با استفاده از دایرکتوری فعلی تعیین می شود. از سوی دیگر، مسیر مطلق، مسیر کامل یک فایل یا دایرکتوری است. مسیر کامل، به ویژه، از دایرکتوری ریشه مشخص می شود. یک راه آسان برای به خاطر سپردن استفاده از / است. یک مسیر نسبی با / (پوشه ریشه) شروع نمی شود. در این آموزش یاد می گیریم که چگونه مسیر مطلق یک اسکریپت را در Bash بدست آوریم.
مسیر مطلق
برای شروع، اجازه دهید یک دایرکتوری ساده، زیر شاخه ها و فایل ها ایجاد کنیم.
در این مثال، اگر LinuxHint دایرکتوری فعلی ما باشد، مسیر مطلق فایل script.sh این است:
مسیر نسبی ما این است:
چیزی که در اینجا می توانید متوجه شوید این است که برای بازیابی فایلی به نام script.sh، اگر یک مسیر مطلق داشته باشیم، می توانیم آن را از هر کجای اکوسیستم لینوکس بازیابی کنیم. مسیر نسبی ما چندان انعطاف پذیر نیست. آی تی، روی از طرف دیگر بستگی دارد روی دایرکتوری کاری فعلی در مورد قبلی، اگر در دایرکتوری LinuxHint بودیم، و دایرکتوری فعلی ما بود، برای دسترسی به script.sh، باید Project2/script.sh را تایپ کنیم. توجه کنید که چگونه / در ابتدای مسیر نسبی وجود ندارد.
هدف ما بازیابی آدرس یا مسیر کامل اسکریپت (مسیر مطلق).sh با یک مسیر نسبی است.
پیوند خواندن
یکی از دستوراتی که می توانید برای گرفتن آدرس کامل یک فایل یا یک فایل اجرایی استفاده کنید readlink است. Readlink معمولاً برای ثبت مسیر یک پیوند نمادین یا یک فایل متعارف استفاده می شود. با این حال، readlink همچنین می تواند مسیر مطلق داده شده در یک مسیر نسبی را محاسبه کند. در همه موارد، باید یک پرچم را به readlink ضمیمه کنید. رایج ترین پرچم مورد استفاده در چنین مواردی پرچم f است.
مثال شماره 1 – پیوند خواندن با استفاده از پرچم f
#!/صندوقچه/bash
مسیر=’لینک خواندن -ف “${BASH_SOURCE:-$0}“‘
DIR_PATH=’dirname مسیر $‘
اکو “مسیر مطلق است” مسیر $
اکو ‘———————————————
اکو “مسیر دایرکتوری است” $DIR_PATH
به طور معمول، $0 برای دریافت مسیر اسکریپت استفاده می شود. با این حال، این همیشه کار نمی کند. بنابراین یک راه مطمئن تر یا قوی تر برای بدست آوردن مسیر نسبی اسکریپت استفاده از ${BASH_SOURCE:-$0} است.
برای یک مثال فرض کنید که من echo ${BASH_SOURCE:-$0} را مینویسم، نتیجهای که دریافت میکنم ./script.sh است. این مسیر غیر مطلق فایل اسکریپت فعلی ما است. به عبارت دیگر، مکان اسکریپت در حال اجرا در ${BASH_SOURCE:-$0} ذخیره می شود.
هنگامی که مسیر اسکریپت را به طور قابل اعتماد واکشی کردیم، میتوانیم آن را با پرچم f به readlink منتقل کنیم. پس از آن می توانیم از دستور dirname برای واکشی مسیر دایرکتوری استفاده کنیم. دستور dirname آخرین مقدار مسیر را حذف می کند و بقیه را برمی گرداند.
بنابراین اگر مسیری از /home/kalyani/Desktop/LinuxHint/Project2/script.sh داشته باشیم و dirname را به آن اعمال کنیم، /home/kalyani/Desktop/LinuxHint/Project2 را دریافت می کنیم. این باعث حذف نام پایه یا نام اسکریپت از آدرس یا مسیر شد.
Realpath
دستور دیگری که می توان از آن استفاده کرد realpath است. Realpath یک دستور لینوکس است که برای چاپ نام فایل مطلق حل شده استفاده می شود. مستلزم آن است که همه مؤلفه ها به جز آخرین مؤلفه وجود داشته باشند.
#!/صندوقچه/bash
مسیر=$(مسیر واقعی”${BASH_SOURCE:-$0}”)
اکو “مسیر مطلق است” مسیر $
اکو “———————————–“
DIR_PATH=$(dirname مسیر $)
اکو “مسیر دایرکتوری است” $DPATH
در اینجا، یک بار دیگر، مسیر اسکریپت را با استفاده از ${BASH_SOURCE:-$0} دریافت میکنیم. Realpath مسیر کامل را برای شما واکشی می کند و dirname تمام مقدار مسیر مطلق به جز آخرین مقدار را دریافت می کند.
جایگزین شماره 1
حالا فرض کنید که شما امتیاز استفاده از realpath یا readlink را نداشتید. با همه سیستم های لینوکس نمی آید! من به اندازه کافی خوش شانس بودم که از اوبونتو استفاده می کردم و بنابراین می توانستم به آن دسترسی داشته باشم. با این حال، یک راه طولانی برای انجام همین کار به شرح زیر است:
#!/صندوقچه/bash
DIR_PATH=$(سی دی $(dirname “${BASH_SOURCE:-$0}”) && pwd)
مسیر=$DIR_PATH/$(نام پایه “${BASH_SOURCE:-$0}”)
اکو “مسیر مطلق است” مسیر $
اکو “———————————–“
اکو “مسیر دایرکتوری است” $DIR_PATH
در این حالت ابتدا به مسیر اسکریپت فعلی نیاز داریم و از آن از dirname برای دریافت مسیر دایرکتوری فایل اسکریپت استفاده می کنیم. وقتی آن را داشتیم، داخل پوشه سی دی می کنیم و دایرکتوری کاری را چاپ می کنیم. برای بدست آوردن مسیر کامل یا مطلق، نام پایه فایل اسکریپت را به مسیر دایرکتوری یا $DIR_PATH متصل می کنیم.
بازیابی مسیر یک اسکریپت دیگر (غیر از خود)
در مثال های قبلی، مسیرهای مطلق و دایرکتوری خود فایل اسکریپت را بازیابی کردیم. اگر بخواهیم مسیرهای مطلق و دایرکتوری یک فایل غیر از اسکریپتی که در آن کار می کنیم (غیر از خود) را بازیابی کنیم، چه؟
بنابراین در اینجا، ما یک فایل جدید به نام script2.sh ایجاد کردهایم، و میخواهیم مسیرهای مطلق و دایرکتوری script2.sh را دریافت کنیم.
در script.sh:
#!/صندوقچه/bash
مسیر=$(realpath script2.sh)
اکو “مسیر مطلق است” مسیر $
اکو “———————————–“
DIR_PATH=$(dirname مسیر $)
اکو “مسیر دایرکتوری است” $DPATH
هر یک از روش های قبلی باید در اینجا نیز کار کند. با این حال، در اینجا، ما از مسیر نسبی script2.sh برای بازیابی مسیر مطلق استفاده خواهیم کرد.
بازیابی مسیر یک فرمان
اکنون، می توانید مسیرهای مطلق و دایرکتوری هر اسکریپت و دستورات را دریافت کنید. بیایید برای لحظه ای فرض کنیم که می خواهیم مسیرهای مطلق و دایرکتوری دستور ls را بدست آوریم. می نوشتیم:
#!/صندوقچه/bash
مسیر=$(که ls)
اکو “مسیر مطلق است” مسیر $
اکو “———————————–“
DIR_PATH=$(dirname مسیر $)
اکو “مسیر دایرکتوری است” $DIR_PATH
مسیر آدرسی است که برای مکان یابی یک فایل یا یک پوشه استفاده می شود. مسیر مطلق یک آدرس یا مکان کامل است به طوری که مهم نیست کجا هستید، می توانید فایل مورد نظر خود را بازیابی کنید. از طرف دیگر، یک مسیر نسبی در رابطه با دایرکتوری کاری فعلی تعیین می شود. که در bash، چندین راه برای بازیابی آدرس کامل یک اسکریپت وجود دارد. به طور خاص، ما می توانیم از realpath، readlink یا حتی اسکریپت کوچک سفارشی خود استفاده کنیم. هنگامی که می خواهیم مسیر دایرکتوری را بدانیم، می توانیم از دستور dirname در ما استفاده کنیم bash اسکریپت برای بازیابی مسیر دایرکتوری ما. به دست آوردن آدرس کامل با استفاده از یک آدرس نسبی کاملاً آسان است.
کد نویسی مبارک!
لطفا در صورت وجود مشکل در متن یا مفهوم نبودن توضیحات، از طریق دکمه گزارش نوشتار یا درج نظر روی این مطلب ما را از جزییات مشکل مشاهده شده مطلع کنید تا به آن رسیدگی کنیم
زمان انتشار: 1402-12-30 01:38:05