cat /dev/null > file.txt
est une utilisation inutile du chat .
Fondamentalement, cela ne cat /dev/null
génère cat
rien. Oui, cela fonctionne, mais il est mal vu par beaucoup car il entraîne l'invocation d'un processus externe qui n'est pas nécessaire.
C'est une de ces choses qui est courante simplement parce qu'elle est commune.
Utiliser juste > file.txt
fonctionnera sur la plupart des shells, mais ce n'est pas complètement portable. Si vous voulez être complètement portable, voici de bonnes alternatives:
true > file.txt
: > file.txt
Les deux :
et true
ne produisent aucune donnée, et sont des commandes intégrées au shell (alors qu'il cat
s'agit d'un utilitaire externe), ils sont donc plus légers et plus «appropriés».
Mise à jour:
Comme tylerl l'a mentionné dans son commentaire, il y a aussi la >| file.txt
syntaxe.
La plupart des shells ont un paramètre qui les empêchera de tronquer un fichier existant via >
. Vous devez utiliser à la >|
place. C'est pour éviter les erreurs humaines lorsque vous vouliez vraiment ajouter >>
. Vous pouvez activer le comportement avec set -C
.
Donc, avec cela, je pense que la méthode la plus simple, la plus appropriée et portable de tronquer un fichier serait:
:>| file.txt
:
est également mandaté par POSIX pour être intégré, et en fait est différent dutrue
fait qu'il est considéré comme un intégré "spécial" .>| file
est un tronçon plus explicite.true
n'est requis pour être intégré et ce n'était pas le cas traditionnellement.:
est construit dans toutes les coquilles de la famille Bourne.:
est un prédéfini spécial par POSIX (ainsi: > file
quittera le shell par exemple s'ilfile
ne peut pas être ouvert pour écrire dans des shells POSIX) ettrue
ne l'est pas. POSIX mentionne même que cela:
peut être plus efficace quetrue
sur certains systèmes.En termes de portabilité:
Remarques:
sh
ouksh
é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
:
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.:
eteval
étant des fonctions intégrées spéciales, si la redirection échoue, cela quitte le shell (bash
ne le fait qu'en mode POSIX).(t)csh
, cela définit une étiquette nulle (pourgoto
), doncgoto ''
il y aurait une branche là-bas. Si la redirection échoue, cela quitte le shell.$PATH
(:
est généralement pas,true
,cat
,cp
etprintf
sont en général (les oblige Posix)).file
Cependant, s'il s'agit d'un lien symbolique vers un fichier inexistant, certainescp
implémentations comme GNU refuseront de le créer.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
enfile
?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 direcp /dev/null file
mais toujours compréhensible.cp /dev/null file
. Copie le contenu du fichier vide dansfile
. Cela a du sens, bien que quelqu'un qui ne sait pas commentcp
faire par défaut puisse penser que vous essayez également de fabriquerfile
unnull
appareil.eval > file
oueval '' > file
. N'exécute rien et redirige sa sortie vers afile
. Ç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 etfish
.cp
etcat
ne sont généralement pas intégrés.N'invoque
cp /dev/null file
pas maintenant les redirections shell, donc des choses comme:vont être plus efficaces que:
(mais pas nécessairement:
).
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.la source
dd of=file count=0
?dd
(comme Solaris 10 au moins),count=0
est ignoré.dd if=/dev/null of=file
serait plus portable. Dans tous les cas, c'est indépendant du shell.cp /dev/null file
, non?cp /dev/null file
est un idiome commun. Je me limite à ceux-ci, il ne s'agit pas d'énumérer toutes les façons possibles.Vous voudrez peut-être regarder
truncate
, ce qui fait exactement cela: tronquer un fichier.Par exemple:
C'est probablement plus lent que l'utilisation
true > file.txt
.Cependant, mon point principal est:
truncate
est destiné à tronquer des fichiers, alors que l'utilisation de> a pour effet secondaire de tronquer un fichier.la source
truncate
serait disponible, mais ni>
ni lesunistd
bibliothèques C serait disponible?truncate
est un utilitaire FreeBSD, relativement récemment (2008) ajouté aux coreutils GNU (bien que le--size
style d'option long GNU soit spécifique à GNU), il n'est donc pas disponible dans les systèmes non GNU ou FreeBSD, et il n'est pas disponible dans les anciens systèmes GNU, Je ne dirais pas que c'est portable.cp /dev/null file
fonctionnerait sans redirection de shell et serait plus portable.La réponse dépend un peu de ce qui
file.txt
est et de la façon dont le processus y écrit!Je citerai un cas d'utilisation courant: vous avez un fichier journal de plus en plus appelé
file.txt
et vous souhaitez le faire pivoter.Par conséquent, vous copiez, par exemple,
file.txt
dansfile.txt.save
, puis tronquezfile.txt
.Dans ce scénario, SI le fichier n'est pas ouvert par
another_process
(ex:another_process
pourrait être un programme sortant vers ce fichier, par exemple un programme enregistrant quelque chose), alors vos 2 propositions sont équivalentes, et les deux fonctionnent bien (mais la 2e est préférable comme premier "cat / dev / null> file.txt" est une utilisation inutile de Cat et ouvre et lit également / dev / null).Mais le vrai problème serait si le
other_process
est toujours actif et a toujours une poignée ouverte pour le fichier.txt.Ensuite, 2 cas principaux se présentent, selon l'
other process
ouverture du fichier:Si l'
other_process
ouvre normalement, la poignée pointera toujours vers l'ancien emplacement dans le fichier, par exemple à un décalage de 1200 octets. La prochaine écriture commencera donc à l'offset 1200, et vous aurez donc à nouveau un fichier de 1200 octets (+ tout ce que other_process a écrit), avec 1200 premiers caractères nuls! Pas ce que tu veux , je présume.S'il est
other_process
ouvertfile.txt
en "mode d'ajout", chaque fois qu'il écrit, le pointeur cherchera activement à la fin du fichier. Par conséquent, lorsque vous le tronquerez, il "cherchera" jusqu'à l'octet 0, et vous n'aurez pas le mauvais effet secondaire! C'est ce que vous voulez (... généralement!)Notez que cela signifie que vous devez, lorsque vous tronquez un fichier, vous assurer que tous ceux
other_process
qui écrivent toujours à cet emplacement l'ont ouvert en mode "ajout". Sinon, vous devrez les arrêterother_process
et les redémarrer, afin qu'ils commencent à pointer vers le début du fichier au lieu de l'ancien emplacement.Références: /programming//a/16720582/1841533 pour une explication plus claire et un bel exemple court de différence entre la journalisation en mode normal et en mode ajout sur /programming//a/984761/1841533
la source
cat /dev/null > file
et a> file
est acat /dev/null
et cela ne fait aucune différence pour le fichier.J'aime cela et je l'utilise souvent car il a l'air plus propre et pas comme si quelqu'un avait accidentellement appuyé sur la touche de retour:
Devrait être intégré aussi?
la source
echo
implémentations ne prennent pas en charge-n
(et sortiraient-n<SPC><NL>
ici.printf '' > file.txt
Seraient plus portables (au moins sur les systèmes modernes / POSIX).