J'avais l'impression qu'il pourrait être plus sûr à utiliser ./*.fastq
lors de la recherche de fichiers se terminant par .fastq
. Par exemple, ./
empêcherait la capture du fichier .fastq
. C'est évidemment faux, comme le montre l'exemple ci-dessous:
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
Ni , *.fastq
ni ./*.fastq
correspondre au fichier .fastq
. Je me demande donc maintenant, est-il utile d'utiliser ./*.fastq
ici, ou ./*
en général?
./*
est qu'il garantit que les noms commençant par-
ne sont pas traités comme des options.Réponses:
C'est initialement un comportement générique surprenant, car la description du
*
caractère générique dit:... jusqu'à ce que vous vous rendiez compte que cette période est légèrement spéciale lorsqu'il s'agit du premier caractère d'un nom de fichier. Le texte d'introduction le
3.5.8 Filename Expansion
dit:Le "modèle d'utilisation" consistant à préfixer les caractères génériques avec
./
est utile pour gérer les noms avec un tiret en tête dans le shell bash , comme l'a expliqué Steeldriver. Cela n'a aucun effet sur l'expansion du caractère générique / nom de fichier, mais rend plus sûr / plus facile de gérer les noms de fichiers lorsque vous vous y référez, s'ils commencent par des caractères que ces programmes pourraient mal interpréter comme des options. Par exemple:... et maintenant que j'ai un fichier nommé
-n
, si j'arrive en boucle sur elle avec un caractère générique:... je n'ai pas de sortie!
Mais si je préfixe le caractère générique avec
./
,... Je vois le nom du fichier.
Ceci est un exemple simple à des fins de démonstration; voir aussi Pourquoi printf est meilleur qu'echo? pour cette raison et d'autres. D'autres utilitaires seront déclenchés par d'autres options, il est donc préférable de présenter les noms de fichiers aux utilitaires de la manière la plus sûre possible. Si vous ne préfixez pas le caractère générique pour "échapper" les noms de fichiers, vous devrez "protéger" vos utilitaires par d'autres moyens; l'une des plus courantes consiste à signaler la fin des options avec
--
, par exemple:... qui passera le
-n
nom de fichier en toute sécuritémv
(comme vu ci-dessousset -x
):la source