Absolutt sti
Til å begynne med, la oss lage en enkel katalog, underkataloger og filer.
I dette eksemplet, hvis Linuxhint er vår nåværende arbeidskatalog, så er den absolutte banen til filskriptet.SH er:
/Home/Kalyani/Desktop/Linuxhint/Project2/Script.sh
Vår relative vei er:
Project2/Script.sh
Det du kan legge merke til her er at for å hente filen som heter skript.SH, hvis vi har en absolutt vei, kan vi hente den hvor som helst i Linux -økosystemet. Vår relative vei er ikke så fleksibel; Det avhenger derimot av den gjeldende arbeidskatalogen. I forrige tilfelle, hvis vi var i Linuxhint -katalogen, og det var vår nåværende arbeidskatalog, for å få tilgang til skriptet.SH, vi må skrive inn Project2/Script.sh. Legg merke til hvordan det ikke er noen / i begynnelsen av den relative banen.
Målet vårt er å hente skriptets fulle adresse eller bane (Absolute Path).SH gitt en relativ vei.
Readlink
En kommando som du kan bruke til å fange hele adressen til en fil eller en kjørbar er Readlink. Readlink brukes vanligvis til å fange banen til en symbolsk lenke eller en kanonisk fil. Imidlertid kan readlink også beregne den absolutte banen gitt en relativ bane. I alle tilfeller må du feste et flagg til Readlink. Det mest brukte flagget i slike tilfeller er F -flagget.
Eksempel nr. 1 - Readlink ved hjelp av F -flagget
manus.sh
#!/bin/bash
bane = 'readlink -f “$ bash_source: -$ 0”'
Dir_path = 'dirname $ sti'
ekko 'den absolutte banen er' $ bane
ekko '---------------------------------------------'
ekko 'Katalogstien er' $ dir_path
Vanligvis brukes $ 0 for å få skriptets vei; Dette fungerer imidlertid ikke alltid. Så en mer pålitelig eller robust måte å få den relative banen til skriptet på er ved å bruke $ Bash_Source:-$ 0.
Anta for en forekomst at jeg skriver Echo $ Bash_Source:-$ 0, resultatet jeg får er ./manus.sh. Dette er den ikke-absolute banen til vår nåværende skriptfil. Det vil si at plasseringen av skriptet som blir utført lagres i $ Bash_Source:-$ 0.
Når vi først henter skriptets vei, kan vi deretter gi den til Readlink med F -flagget. Vi kan deretter bruke DIRNAME -kommandoen for å hente katalogstien. Dirname -kommandoen vil utelate den siste verdien av banen og returnere resten.
Så hvis vi har en vei til/Home/Kalyani/Desktop/Linuxhint/Project2/Script.SH, og vi bruker Dirname på det, vi får/Home/Kalyani/Desktop/Linuxhint/Project2. Dette strippet basenavnet eller skriptets navn fra adressen eller banen.
Realpath
En annen kommando som kan brukes er realpath. RealPath er en Linux -kommando som brukes til å skrive ut det løste absolutte filnavnet. Det krever at alle komponenter eksisterer bortsett fra den siste komponenten.
manus.sh
#!/bin/bash
Path = $ (RealPath “$ Bash_Source:-$ 0”)
ekko 'den absolutte banen er' $ bane
ekko '-----------------------------------'
Dir_path = $ (dirname $ sti)
ekko 'Katalogstien er' $ dpath
Her får vi nok en gang veien til manuset ved å bruke $ Bash_Source:-$ 0. RealPath vil hente hele veien for deg, og Dirname vil få alt annet enn den siste verdien av den absolutte banen.
Alternativ nr. 1
Anta nå at du ikke hadde privilegiet å bruke realpath eller readlink. Det følger ikke med alle Linux -systemer! Jeg var heldig nok til å ha brukt Ubuntu og kunne dermed få tilgang til den. En lang måte å gjøre det samme er imidlertid som følger:
manus.sh
#!/bin/bash
Dir_path = $ (cd $ (dirname “$ bash_source:-$ 0”) && pwd)
bane = $ dir_path/$ (basename “$ bash_source:-$ 0”)
ekko 'den absolutte banen er' $ bane
ekko '----------------------------------'
ekko 'Katalogstien er' $ dir_path
I dette tilfellet trenger vi først den nåværende skriptets vei, og fra den bruker vi Dirname for å få katalogstien til skriptfilen. Når vi har det, CD inn i mappen og skriver ut arbeidskatalogen. For å få den fulle eller absolutte banen, fester vi basenavnet til skriptfilen til katalogstien eller $ dir_path.
Hente banen til et annet manus (annet enn seg selv)
I de forrige eksemplene hentet vi de absolutte og katalogveiene til selve skriptfilen. Hva om vi ønsket å hente de absolutte og katalogveiene til en annen fil enn skriptet vi jobber i (annet enn seg selv)?
Så her har vi opprettet en ny fil som heter Script2.SH, og vi vil gjerne få de absolutte og katalogveiene til Script2.sh.
I skript.SH:
manus.sh
#!/bin/bash
bane = $ (realpath script2.sh)
ekko 'den absolutte banen er' $ bane
ekko '-----------------------------------'
Dir_path = $ (dirname $ sti)
ekko 'Katalogstien er' $ dpath
Noen av de tidligere metodene bør også fungere her. Imidlertid bruker vi den relative banen til Script2.SH for å hente den absolutte banen.
Hente banen til en kommando
Nå kan du få de absolutte og katalogstiene til eventuelle skript du ønsker og kommandoer. La oss anta et øyeblikk at vi ønsker å få de absolutte og katalogveiene til kommandoen LS. Vi ville skrevet:
manus.sh
#!/bin/bash
bane = $ (hvilken ls)
ekko 'den absolutte banen er' $ bane
ekko '-----------------------------------'
Dir_path = $ (dirname $ sti)
ekko 'Katalogstien er' $ dir_path
En bane er en adresse som brukes til å finne en fil eller en mappe. En absolutt bane er en full adresse eller et sted slik at uansett hvor du er, kan du hente filen du vil ha. På den annen side bestemmes en relativ bane i forhold til den nåværende arbeidskatalogen. I bash er det en rekke måter å hente hele adressen til et skript. Spesielt kan vi bruke RealPath, Readlink, eller til og med lage vårt tilpassede lille manus. Når vi vil kjenne katalogstien, kan vi bruke Dirname -kommandoen i bashskriptet vårt for å hente katalogstien vår. Det er ganske lett å få full adresse ved hjelp av en relativ adresse.
Glad koding!