En termes de portabilité:
Bourne POSIX zsh csh/tcsh rc/es fish
> file Y Y N(1) N(1) N N
: > file N/Y(2) Y(3) Y Y(4) N(5) N(5)
true > file Y(5) Y Y Y(5) Y(5) Y(5)
cat /dev/null > file Y(5) Y Y(5) Y(5) Y(5) Y(5)
eval > file Y(3,8) Y(3) Y Y(6) Y Y
cp /dev/null file (7) Y(5) Y Y(5) Y(5) Y(5) Y(5)
printf '' > file Y(5) Y Y Y(5) Y(5) Y
Remarques:
- sauf dans
shou kshémulation, pour les redirections sans commande, dans zsh, une commande par défaut est supposée (un pager pour la redirection stdin uniquement, catsinon), qui peut être réglée avec les variables NULLCMD et READNULLCMD. C'est inspiré de la fonctionnalité similaire de(t)csh
- Les redirections n'étaient initialement pas effectuées
:dans UnixV7 comme cela a :été interprété à mi-chemin entre un leader de commentaire et une commande nulle. Plus tard, ils l'ont été et comme pour tous les buildins, si la redirection échoue, cela quitte le shell.
:et evalétant des fonctions intégrées spéciales, si la redirection échoue, cela quitte le shell ( bashne le fait qu'en mode POSIX).
- Fait intéressant, dans
(t)csh, cela définit une étiquette nulle (pour goto), donc goto ''il y aurait une branche là-bas. Si la redirection échoue, cela quitte le shell.
- À moins / si la commande correspondante est disponible en
$PATH( :est généralement pas, true, cat, cpet printfsont en général (les oblige Posix)).
- Si la redirection échoue, cela quitte le shell.
fileCependant, s'il s'agit d'un lien symbolique vers un fichier inexistant, certaines cpimplémentations comme GNU refuseront de le créer.
- Les versions initiales du shell Bourne ne prenaient cependant pas en charge la redirection des buildins
En termes de lisibilité:
(cette section est très subjective)
> file. Cela >ressemble trop à une invite ou à un commentaire. De plus, la question que je poserai en lisant cela (et la plupart des shells se plaindront de la même chose) est quelle sortie exactement redirigez-vous? .
: > file. :est connu comme la commande no-op. Donc, cela se lit immédiatement comme générant un fichier vide. Cependant, là encore, cela :peut facilement être manqué et / ou vu comme une invite.
true > file: qu'est - ce que le booléen a à voir avec la redirection ou le contenu des fichiers? Que veut-on dire ici? est la première chose qui me vient à l'esprit lorsque je lis cela.
cat /dev/null > file. Concaténer /dev/nullen file? catétant souvent considérée comme la commande pour vider le contenu du fichier, qui peut encore faire sens: vider le contenu du du fichier vide dansfile , un peu comme une façon alambiquée de dire cp /dev/null filemais toujours compréhensible.
cp /dev/null file. Copie le contenu du fichier vide dans file. Cela a du sens, bien que quelqu'un qui ne sait pas comment cpfaire par défaut puisse penser que vous essayez également de fabriquer fileun nullappareil.
eval > fileou eval '' > file. N'exécute rien et redirige sa sortie vers a file. Ça a du sens pour moi. Étrange que ce ne soit pas un idiome commun.
printf '' > file: n'imprime explicitement rien dans un fichier. Celui qui a le plus de sens pour moi.
En termes de performances
La différence va être de savoir si nous utilisons un shell intégré ou non. Sinon, un processus doit être bifurqué, la commande chargée et exécutée.
evalest garanti pour être construit dans toutes les coquilles. :est intégré partout où il est disponible (Bourne / csh aime). trueest intégré dans des coquilles de type Bourne uniquement.
printfest intégré dans la plupart des coquilles de type Bourne et fish.
cpet catne sont généralement pas intégrés.
N'invoque cp /dev/null filepas maintenant les redirections shell, donc des choses comme:
find . -exec cp /dev/null {} \;
vont être plus efficaces que:
find . -exec sh -c '> "$1"' sh {} \;
(mais pas nécessairement:
find . -exec sh -c 'for f do : > "$f"; done' sh {} +
).
Personnellement
Personnellement, j'utilise : > filedans des coquilles de type Bourne, et je n'utilise rien d'autre que des coquilles de type Bourne de nos jours.