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
sh
ou ksh
émulation, pour les redirections sans commande, dans zsh, une commande par défaut est supposée (un pager pour la redirection stdin uniquement, cat
sinon), 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 ( bash
ne 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
, cp
et printf
sont en général (les oblige Posix)).
- Si la redirection échoue, cela quitte le shell.
file
Cependant, s'il s'agit d'un lien symbolique vers un fichier inexistant, certaines cp
implé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/null
en 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 file
mais 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 cp
faire par défaut puisse penser que vous essayez également de fabriquer file
un null
appareil.
eval > file
ou 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.
eval
est garanti pour être construit dans toutes les coquilles. :
est intégré partout où il est disponible (Bourne / csh aime). true
est intégré dans des coquilles de type Bourne uniquement.
printf
est intégré dans la plupart des coquilles de type Bourne et fish
.
cp
et cat
ne sont généralement pas intégrés.
N'invoque cp /dev/null file
pas 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 : > file
dans des coquilles de type Bourne, et je n'utilise rien d'autre que des coquilles de type Bourne de nos jours.