Miałem wrażenie, że korzystanie z niej ./*.fastq
przy wyszukiwaniu plików z końcówką może być bezpieczniejsze .fastq
. Na przykład ./
zapobiegnie przechwytywaniu pliku .fastq
. Jest to oczywiście niewłaściwe, jak pokazano w poniższym przykładzie:
TMP_DIR=$(mktemp --directory)
mkdir -p ${TMP_DIR}
(cd ${TMP_DIR}
touch {a,b,c,}.fastq
ls -a
echo ""
echo "# match all:"
for f in *.fastq ; do
echo "${f}"
done
echo ""
echo "# with ./:"
for f in ./*.fastq ; do
echo "${f}"
done
)
rm -rf ${TMP_DIR}
.
..
a.fastq
b.fastq
c.fastq
.fastq
# match all:
a.fastq
b.fastq
c.fastq
# with ./:
./a.fastq
./b.fastq
./c.fastq
Ani *.fastq
też nie ./*.fastq
pasuje do pliku .fastq
. Zastanawiam się teraz, czy jest jakiś sens ./*.fastq
tutaj, czy ./*
ogólnie?
./*
to, że zapewnia, że nazwy zaczynające się od-
nie są traktowane jako opcje.Odpowiedzi:
Jest to początkowo zaskakujące zachowanie symboli wieloznacznych, ponieważ opis
*
znaku wieloznacznego brzmi:... dopóki nie zdasz sobie sprawy, że kropka jest nieco wyjątkowa, gdy jest to pierwszy znak nazwy pliku. Tekst wprowadzający
3.5.8 Filename Expansion
mówi:„Wzorzec użycia” poprzedzania symboli wieloznacznych za pomocą
./
jest użyteczny do obsługi nazw z wiodącym myślnikiem w powłoce bash , jak komentował Steeldriver. Nie ma to wpływu na rozszerzenie symbolu wieloznacznego / nazwy pliku, ale sprawia, że bezpieczniej / łatwiej jest obsługiwać nazwy plików, gdy się do nich odwołujesz, jeśli zaczynają się od znaków, które te programy mogą błędnie interpretować jako opcje. Na przykład:... a teraz, gdy mam plik o nazwie
-n
, jeśli przypadkiem zapętlę go za pomocą symbolu wieloznacznego:... nie mam wyjścia!
Ale jeśli poprzedzę znak wieloznaczny
./
,... widzę nazwę pliku.
Jest to prosty przykład do celów demonstracyjnych; zobacz także Dlaczego printf jest lepszy niż echo? z tego i innych powodów. Inne narzędzia będą wyzwalane przez inne opcje, więc lepiej przedstawić nazwy plików narzędziom tak bezpiecznie, jak to możliwe. Jeśli nie użyjesz wieloznacznika do „ucieczki” nazw plików, będziesz musiał „chronić” swoje narzędzia na inne sposoby; jedną wspólną jest zasygnalizowanie końca opcji
--
, na przykład:... który bezpiecznie przekaże
-n
nazwę pliku domv
(jak pokazano poniżejset -x
):źródło