Zdobądź absolutną ścieżkę skryptu w Bash

Zdobądź absolutną ścieżkę skryptu w Bash
Ścieżka to lokalizacja do katalogu lub pliku. Istnieją dwa różne rodzaje ścieżek w Linuksie - bezwzględne i względne. Ścieżka względna jest określana za pomocą bieżącego katalogu roboczego. Z drugiej strony ścieżka bezwzględna jest pełną ścieżką do pliku lub katalogu. W szczególności pełna ścieżka jest określona z katalogu głównego. Łatwy sposób zapamiętania, który jest za pomocą /. Ścieżka względna nie zaczyna się od A / (Folder root). W tym samouczku nauczymy się, jak uzyskać absolutną ścieżkę scenariusza w Bash.

Absolutna ścieżka

Na początek utwórzmy prosty katalog, podwodnione i pliki.

W tym przykładzie, jeśli Linuxhint jest naszym obecnym katalogiem roboczym, to bezwzględna ścieżka skryptu pliku.SH to:

/home/kalyani/teSktop/Linuxhint/Project2/Script.cii

Nasza względna ścieżka to:

Project2/Script.cii

Można tu zauważyć, że w celu odzyskania pliku o nazwie skrypt.sh, jeśli mamy bezwzględną ścieżkę, możemy ją odzyskać z dowolnego miejsca w ekosystemie Linux. Nasza względna ścieżka nie jest tak elastyczna; Z drugiej strony zależy od aktualnego katalogu roboczego. W poprzednim przypadku, gdybyśmy byli w katalogu Linuxhint i był to nasz obecny katalog roboczy, a następnie uzyskać dostęp do skryptu.Sh, musielibyśmy wpisać w projekcie 2/skrypt.cii. Zwróć uwagę, jak nie ma / na początku względnej ścieżki.

Naszym celem jest odzyskanie pełnego adresu lub ścieżki skryptu (ścieżka bezwzględna).SH, biorąc pod uwagę względną ścieżkę.

Readlink

Jednym z polecenia, którego możesz użyć do przechwytywania pełnego adresu pliku lub wykonywania, jest odczytLink. ReadLink jest zwykle używany do przechwytywania ścieżki symbolicznego łącza lub pliku kanonicznego. Jednak Readlink może również obliczyć bezwzględną ścieżkę, biorąc pod uwagę ścieżkę względną. We wszystkich przypadkach będziesz musiał dołączyć flagę, aby odczytać. Najczęściej stosowaną flagą w takich przypadkach jest flaga F.

Przykład nr 1 - ReadLink za pomocą flagi F

scenariusz.cii
#!/bin/bash
ścieżka = 'readLink -f „$ bash_source: -$ 0”' '
Dir_path = 'dirname $ ścieżka'
echo „Bezwzględną ścieżką jest„ $ ścieżka
Echo '---------------------------------------------'
echo „ścieżka katalogu to” $ dir_path

Zazwyczaj 0 USD służy do uzyskania ścieżki skryptu; Jednak to nie zawsze działa. Tak więc bardziej niezawodnym lub solidnym sposobem uzyskania względnej ścieżki skryptu jest użycie $ bash_source:-$ 0.

Załóżmy, że dla jednego przypadku piszę echo $ bash_source:-0 $, wynik, który otrzymuję ./scenariusz.cii. To jest ścieżka bez Absolute do naszego bieżącego pliku skryptu. To znaczy, lokalizacja wykonywanego skryptu jest przechowywana w $ bash_source:-0 $.

Gdy niezawodnie przyciągniemy ścieżkę skryptu, możemy przekazać ją do odczytu z flagą F. Możemy następnie użyć polecenia dirname, aby pobrać ścieżkę katalogu. Polecenie dirname pominie ostatnią wartość ścieżki i zwróci resztę.

Więc jeśli mamy ścieżkę/dom/kalyani/komputer/linuxhint/projekt2/skrypt.sh, a my stosujemy do niego dirname, dostaniemy/Home/kalyani/Desktop/Linuxhint/Project2. To rozebrało nazwę podstawy lub nazwę scenariusza z adresu lub ścieżki.

Realpath

Kolejnym poleceniem, które można użyć, jest realpath. RealPath to polecenie Linux używane do wydrukowania rozwiązanej nazwy pliku bezwzględnego. Wymaga, aby wszystkie elementy istniały, z wyjątkiem ostatniego komponentu.

scenariusz.cii
#!/bin/bash
ścieżka = $ (realpath „$ bash_source:-$ 0”)
echo „Bezwzględną ścieżką jest„ $ ścieżka
Echo '-----------------------------------'
Dir_path = $ (dirname $ ścieżka)
echo „ścieżka katalogu to” $ dpath

Tutaj jeszcze raz otrzymujemy ścieżkę skryptu za pomocą $ bash_source:-$ 0. Realpath przyniesie dla ciebie pełną ścieżkę, a Dirname dostanie całą oprócz ostatniej wartości bezwzględnej ścieżki.

Alternatywa nr 1

Załóżmy teraz, że nie miałeś przywileju korzystania z RealPath lub ReadLink. Nie jest wyposażony w wszystkie systemy Linux! Miałem szczęście, że korzystałem z Ubuntu i dlatego mogłem uzyskać do niego dostęp. Jednak długi sposób robienia tego samego jest następujący:

scenariusz.cii
#!/bin/bash
Dir_path = $ (cd $ (dirname „$ bash_source:-$ 0”) && pwd)
ścieżka = $ dir_path/$ (basename „$ bash_source:-$ 0”)
echo „Bezwzględną ścieżką jest„ $ ścieżka
Echo '----------------------------------'
echo „ścieżka katalogu to” $ dir_path

W tym przypadku najpierw potrzebujemy ścieżki aktualnego skryptu, a od niej używamy DirName, aby uzyskać ścieżkę katalogu pliku skryptu. Gdy to będziemy. Aby uzyskać pełną lub bezwzględną ścieżkę, dołączamy nazwę podstawy pliku skryptu do ścieżki katalogu lub $ dir_path.

Odzyskanie ścieżki innego skryptu (innego niż ja)

W poprzednich przykładach odzyskaliśmy ścieżki bezwzględne i katalogu samego pliku skryptu. Co jeśli chcielibyśmy odzyskać bezwzględne i katalogowe ścieżki pliku inne niż skrypt, w którym pracujemy (inne niż siebie)?

Więc tutaj utworzyliśmy nowy plik o nazwie Script2.SH, a my chcielibyśmy uzyskać bezwzględne i katalogowe ścieżki Script2.cii.

W skrypcie.cii:

scenariusz.cii
#!/bin/bash
ścieżka = $ (realpath script2.cii)
echo „Bezwzględną ścieżką jest„ $ ścieżka
Echo '-----------------------------------'
Dir_path = $ (dirname $ ścieżka)
echo „ścieżka katalogu to” $ dpath

Każda z poprzednich metod również powinna tu działać. Jednak tutaj będziemy używać względnej ścieżki Script2.SH w celu odzyskania bezwzględnej ścieżki.

Odzyskanie ścieżki polecenia

Teraz możesz uzyskać bezwzględne i katalogowe ścieżki dowolnych skryptów i ścieżek poleceń. Załóżmy przez chwilę, że chcemy uzyskać bezwzględne i katalogowe ścieżki polecenia LS. Napisalibyśmy:

scenariusz.cii
#!/bin/bash
ścieżka = $ (która ls)
echo „Bezwzględną ścieżką jest„ $ ścieżka
Echo '-----------------------------------'
Dir_path = $ (dirname $ ścieżka)
echo „ścieżka katalogu to” $ dir_path

Ścieżka to adres używany do zlokalizowania pliku lub folderu. Bezwzględna ścieżka to pełny adres lub lokalizacja, tak że bez względu na to, gdzie jesteś, możesz odzyskać żądany plik. Z drugiej strony, ścieżka względna jest określana w odniesieniu do obecnego katalogu roboczego. W Bash istnieje wiele sposobów odzyskania pełnego adresu skryptu. W szczególności możemy używać realpath, readLink, a nawet tworzyć nasz niestandardowy mały skrypt. Kiedy chcemy poznać ścieżkę katalogu, możemy użyć polecenia dirname w naszym skrypcie Bash, aby odzyskać naszą ścieżkę katalogu. Uzyskanie pełnego adresu za pomocą względnego adresu jest dość łatwe.

Szczęśliwe kodowanie!