Strona 1 z 1

Bash katalog ze skryptem

: 20 lis 2010, 21:28
autor: sauron
Witam, chcę użyć katalogu w którym znajduje się skrypt i jego pliki. Katalog na pewno się będzie zmieniał i dlatego chcę w jakiś sposób rozwiązać problem dowiązań w skrypcie do plików w tym katalogu.
Próbowałem na rożne sposoby z kropką, z $0, ale nic z tego mi nie wyszło.

Chcę aby to wyglądało mniej więcej tak: mam katalog i w nim skrypt i jakieś pliki i chciałbym otworzyć te pliki skryptem znajdującym się w tym katalogu. Chcę uniknąć pisania ścieżki np. /home/, bo jak się zmieni ścieżka katalogu to skrypt nie zadziała :(

Mam nadzieję, że ktoś będzie w stanie pomóc :]

Pozdrawiam

Odp: Bash katalog ze skryptem

: 20 lis 2010, 23:04
autor: borzole

Kod: Zaznacz cały

#!/bin/bash

abs_dir_path="$(readlink -f `dirname $0`)"
abs_file_path="$(readlink -f `dirname $0`)/$(basename $0)"

ls "$abs_dir_path"/*

echo "$abs_file_path"

Odp: Bash katalog ze skryptem

: 20 lis 2010, 23:35
autor: sauron
Niestety to nie działa :(

Jeżeli skrypt ma nazwę qwerty to dostaję taki zwrot: ścieżka do skrytpu/qwerty
Tyle samo z $0 otrzymywałem :(

Odp: Bash katalog ze skryptem

: 21 lis 2010, 12:03
autor: borzole
Ok, źle zrozumiałem. Myślałem, że chcesz mieć ścieżkę absolutną (to nie zawsze to samo co $0, czy pwd).
Postaraj się lepiej opisać co chcesz zrobić i jaki ma być końcowy efekt. Dlaczego katalog się będzie zmieniał? To ma być zależne od instalacji?
Więcej szczegółów proszę.

Odp: Bash katalog ze skryptem

: 21 lis 2010, 15:20
autor: sauron
Ma to działać tak:
Mam katalog o nazwie skrypt np. tutaj: "/home/user/Skrypt"
w środku mam skrypt o nazwie np. "1.sh" oraz plik txt o nazwie "plik.txt", chcę aby skrypt wykorzystywał plik.txt (otwierał, kopiował gdzie indziej itd.)
jeżeli wywołam $0 to dostaję zwrot : "/home/user/Skrypt/1.sh", a bardziej pragnąłbym ścieżki samej tzn. "/home/user/Skrypt" to wtedy już plik zawsze będzie ok bo jak skopiuję cały katalog np. na "/Skrypt" to plik txt będzie się znajdował tu: "/Skrypt/plik.txt".

Potrzebuję ścieżki skryptu po prostu, bez samej nazwy skryptu :)
W pierwszym wypadku "/home/user/Skrypt" a w drugim "/Skrypt".

Mam nadzieję że już teraz napisałem to jakoś zrozumiale :]

Odp: Bash katalog ze skryptem

: 21 lis 2010, 16:16
autor: ethanak
sauron pisze:Mam nadzieję że już teraz napisałem to jakoś zrozumiale :]
Napisałeś zrozumiale, ale sposób myslenia masz windowsiany.

Takie coś akurat jest niemożliwe do zrealizowania (choćby ze względu na istnienie hardlinków), nie jesteś w stanie stwierdzić gdzie w rzeczywistości siedzi wykonywany skrypt/program. W Windowsie jest to możliwe, ale tam akurat hardlinków nie ma, a ichniejsze "skróty" to niezupełnie to samo co Uniksowe softlinki.

Nie wiem jak przy skryptach (nie próbowałem), ale przy normalnej binarce, jeśli nie jest to jakiś link, to można wydłubać rzeczywiste położenie programu z proca - coś w stylu /proc/<twój_pid>/exe. Tyle że na tym bym nie polegał.

Pytanie: dlaczego nie chcesz zrobić tego po ludzku (tzn. jakiś instalator)?

Odp: Bash katalog ze skryptem

: 21 lis 2010, 19:21
autor: borzole
Albo ja nie umiem czytać ze zrozumieniem, albo Ty nadal coś plączesz.
Potrzebuję ścieżki skryptu po prostu, bez samej nazwy skryptu
no to Ci podałem, tyle że Ty nie potrafisz z tego skorzystać:
abs_dir_path - absolutna ścieżka do katalogu
abs_file_path - absolutna ścieżka do skryptu
Polecenie readlink -f rozwija zwykłe linki nawet jeśli jest to link na link na link ...itd.
Poza tym zawsze można obciąć ostatni człon ścieżki tak ${0##/*} lub użyć dirname $0
Nie próbowałem nigdy sprawdzać odwołań do twardych linków, ale też można, bo mi kiedyś system wywalał błąd a pro po ilości odwołań (skoro wie ile ich jest, to musi też wiedzieć gdzie są).
Rozumiemy się, czy nadal nie? :)

Odp: Bash katalog ze skryptem

: 21 lis 2010, 19:35
autor: ethanak
borzole pisze:Albo ja nie umiem czytać ze zrozumieniem, albo Ty nadal coś plączesz.
Stawiałbym na oba ;)
Nie próbowałem nigdy sprawdzać odwołań do twardych linków, ale też można, bo mi kiedyś system wywalał błąd a pro po ilości odwołań (skoro wie ile ich jest, to musi też wiedzieć gdzie są).
Wie ile, wie gdzie, ale hardlinki są nieodróżnialne. Czyli nie ma tak jakw Windowsie że "exe siedzi w c:\gdzieś\tam" i tam siedzi. Jeśli zrobię coś w stylu:

Kod: Zaznacz cały

echo 'HORTENSJA' > /tmp/HORTENSJA.txt
ln /tmp/HORTENSJA.txt /var/lib/HORTENSJA
to ten sam (nie taki sam, a ten sam) plik będzie widziany jako "/tmp/HORTENSJA.txt" i "var/lib/HORTENSJA".
Czyli jeśli zrobię sobie katalog typu "/o/jejku/jaki/fajny/katalog" i "/mnt/disk/spartolony/", w katalogu "/mnt/disk/spartolony" umieszczę plik "wybitnie.txt" a potem zrobię:

Kod: Zaznacz cały

ln /mnt/disk/spartolony/wybitnie.txt /o/jejku/jaki/fajny/katalog/zplikiem.txt
[code]
oba pliki będą równorzędne.

I co wtedy powiesz na istnienie jakiegoś "cośtam.txt" w tym samym katalogu? Który to mianowicie jest "ten sam"?

PS. Proszę uprzejmie Pana Administratora o zamianę "HORTENSJA" na "begonia" :)

Odp: Bash katalog ze skryptem

: 21 lis 2010, 20:41
autor: borzole
wiem czym są hardlinki, ale nie wiem, o co chodzi sauronowi (że o pierścieniu nie wspomnę) :)

Odp: Bash katalog ze skryptem

: 23 lis 2010, 21:01
autor: sauron
Problem już rozwiązany, a sposób było prozaiczne i wygląda tak:

Kod: Zaznacz cały

dirname $0
Dzięki za wszystkie odpowiedzi. Tylko o to mi chodziło. Czy ja wiem czy windowsiany, nie siedziałem na windowsie już dobrych 6 lat w ogóle, a w poście #5 chciałem opisać wszystko jak najprościej, aby nic nie zamotać.

PS. Pierścień chwilowo jest poza moim wzrokiem, ale cały czas Nazgule poszukują :)