Jak mówi tytuł, czy jest jakaś różnica w systemach plików * NIX? np. ls file
ils ./file
Jak mówi tytuł, czy jest jakaś różnica w systemach plików * NIX? np. ls file
ils ./file
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:
ls -dingle
# ls -dingle
ls: invalid option -- 'e'
Co gorsza, co jeśli plik miałby nazwę „ -rf rmbomb *
”? Teraz spróbuj go usunąć
rm "-rf rmbomb *"
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.
# ls ./-dingle
./-dingle
To samo dotyczy rm
ls \-dingle
lub ls \-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 prostu rm
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
zamiast rm "$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, potrzebujesz eval
.) W każdym razie, jeśli twoje skrypty dzielą nazwy plików przed przekazaniem do rm, utworzę plik o nazwie space -rf .
lub coś takiego, więc rm ./$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, że awk
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ślne ls
, nie zobaczysz żadnej różnicy między określaniem file
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
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.