Jak mówi tytuł, czy jest jakaś różnica w systemach plików * NIX? np. ls file
ils ./file
linux
filesystems
Siergiej Alaev
źródło
źródło
Odpowiedzi:
Nie jestem szalony na wyjaśnienie SmallLoanOf1M. Jest to technicznie poprawne, ale odpowiada w sposób niezgodny z przykładem użycia w pytaniu.
Oto przykład ważnej różnicy między tymi dwoma pytaniami: „plik” i „./plik”
Co jeśli nazwa pliku zawiera znak analizowany przez powłokę? Zwłaszcza w odniesieniu do znaków interpretowanych przez polecenie, które się uruchamia.
W szczególności znak „myślnik”: „-”. Ale inne postacie mają znaczenie dla powłoki.
Przykład. Mój plik otrzymał nazwę „-dingle”
Spróbuj wyświetlić plik:
Co gorsza, co jeśli plik miałby nazwę „
-rf rmbomb *
”? Teraz spróbuj go usunąćNawet nie spróbuję podać tego przykładu, ale mam nadzieję, że wpadłeś na ten pomysł.
Jak wyświetlić plik z myślnikiem? Użyj
./
z przodu.To samo dotyczy
rm
źródło
ls \-dingle
lubls \-rf\ rmbomb\ \*
. Może to być dobry sposób na upewnienie się, że dowolny zestaw poleceń jest co najmniej spójny, ponieważ określenie./
przed nazwą nie będzie poprzedzać znaków po znaku./
.rm "-rf rmbomb *"
, jakby zrobił coś złego, zamiast po prosturm
drukować błąd. Jest to niebezpieczne tylko wtedy, gdy zapomnisz zacytować nazwę pliku, co powoduje dzielenie słów. (szczególnie w skrypcie powłoki, w którym uruchamiasz sięrm $file
zamiastrm "$file"
. Ale w takim przypadku*
nie będzie się rozwijało, ponieważ rozszerzenie globalne nie dzieje się na zawartości zmiennej rozwijanej. Jeśli chcesz, potrzebujeszeval
.) W każdym razie, jeśli twoje skrypty dzielą nazwy plików przed przekazaniem do rm, utworzę plik o nazwiespace -rf .
lub coś takiego, więcrm ./$i
to nie pomaga.rm: invalid option -- ' '
od momentu, gdy próbuje on interpretować spację później-rf
jako przełącznik jednoznakowy, ponieważ jest częścią tego samego argumentu. (I tak, włączyłem to do pustego katalogu na wypadek, gdy coś przeoczyłem i było to naprawdę niebezpieczne: P)IFS=''
i-f
. Rzadszym przykładem jest to, żeawk
traktuje operand (inny niż pierwszy operand, którym jest skrypt) mający formęfoo=bar
jako zadanie do wykonania, ale./foo=bar
jako plik do odczytu.Tak.
Wydając
file
w wierszu poleceń, BASH przeszuka zmienną środowiskową $ PATH w poszukiwaniu pliku o tej nazwie. O ile plik nie znajduje się w katalogu w zmiennej $ PATH, nie zostanie znaleziony..
oznacza bieżący katalog../
oznacza w bieżącym katalogu, w kategoriach względnych. Jest to odpowiednik powiedzenia czegoś takiego jak/home/sheogorath/shivering/isles.img
podczas wywoływania./isles.img
podczas pracy w/home/sheogorath/shivering/
katalogu.Jako taki jest powszechnie używany do wykonywania plików w katalogu roboczym „na miejscu”.
EDYCJA: W twoim przykładzie
ls
jest wywoływany przez powłokę i znaleziony przy użyciu zmiennej path. Jego argument zostanie przetworzony w twoim katalogu roboczym, cokolwiek to może być. Ponieważ jest to ustawienie domyślnels
, nie zobaczysz żadnej różnicy między określaniemfile
a jawnym określaniem,./file
ponieważ oba wskazują na bieżący katalog.Nie wszystkie polecenia akceptują ścieżki do plików w katalogu roboczym, a niektóre oczekują, że ustawisz pliki w katalogu, który oni sami wstępnie określają poprzez konfigurację. Wśród poleceń, które akceptują pliki jako argumenty, polecenia te są mniej powszechne
źródło
ls
wspomniane w pierwotnym pytaniu. To jest bardziej różnica między odnowieniem ścieżki względnej (w stosunku do bieżącego katalogu roboczego) Tj.../../dir/filename
A ścieżką bezwzględną/path/to/dir/filename
ls
ponieważ zawsze będą one tą samą ścieżką, jedną określoną bardziej wyraźnie niż drugą. Nie wszystkie polecenia zachowują się w ten sposób podczas przetwarzania argumentów, ale większość tak.