Quel est le nom de cet opérateur? Je voudrais trouver un manuel à ce sujet.
Vlad T.15
96
l'opérateur> redirige la sortie vers un fichier écrasant le fichier s'il en existe un. Le >> s'ajoutera à un fichier existant.
Triton Man
4
Merci, voici le lien vers la page wiki, au cas où quelqu'un en aurait besoin en.wikipedia.org/wiki/…
Vlad T.
11
Si vous devez le faire avec des privilèges root, faites-le de cette façon:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
1
Que faire si mon texte est quelque chose comme ça et pour une raison quelconque, je ne peux pas utiliser curlou wget?
asedsami
145
#!/bin/sh
FILE="/path/to/file"/bin/cat <<EOM >$FILE
text1
text2 # This comment will be inside of the file.The keyword EOM can be any text, but it must start the line and be alone.
EOM # This will be also inside of the file, see the space in front of EOM.
EOM # No comments and spaces around here, or it will not work.
text4
EOM
Les débutants gagneraient à savoir exactement quoi faire avec ce fichier. Comment l'enregistrer, comment l'exécuter, etc.
Danny
14
Veuillez expliquer plutôt que de simplement mettre en place un morceau de code. Cela le rendrait beaucoup plus utile à tout le monde - en particulier aux débutants.
Casper B. Hansen
2
Dans ce cas, les scripts avec des variables comme $ some_var se perdent. Comment peut-il être corrigé?
Une explication de votre code contribuerait grandement à le rendre plus utilisable par les autres. Même les légendes de vocabulaire comme «ici document» et «redirection» peuvent diriger les chercheurs vers d'autres ressources.
Palpatim
2
L'explication n'est pas si nécessaire pour quelque chose comme ça.
Bhargav Nanekalva
6
L'explication n'est jamais nécessaire lorsque vous connaissez déjà la réponse. Pour moi, le code ci-dessus n'est pas utile en raison du manque de détails.
Je sais que c'est une sacrée vieille question, mais comme l'OP concerne les scripts, et pour le fait que Google m'a amené ici, l'ouverture de descripteurs de fichiers pour la lecture et l'écriture en même temps doit également être mentionnée.
#!/bin/bash# Open file descriptor (fd) 3 for read/write on a text file.
exec 3<> poem.txt
# Let's print some text to fd 3
echo "Roses are red">&3
echo "Violets are blue">&3
echo "Poems are cute">&3
echo "And so are you">&3# Close fd 3
exec 3>&-
Ensuite, catle fichier sur le terminal
$ cat poem.txt
Roses are red
Violets are blue
Poems are cute
And so are you
Cet exemple entraîne l'ouverture du fichier poem.txt pour la lecture et l'écriture sur le descripteur de fichier 3. Il montre également que les boîtes * nix connaissent plus de fd que stdin, stdout et stderr (fd 0,1,2). Cela tient vraiment beaucoup. Habituellement, le nombre maximum de descripteurs de fichiers que le noyau peut allouer peut être trouvé dans /proc/sys/file-maxou /proc/sys/fs/file-maxmais l'utilisation de tout fd supérieur à 9 est dangereuse car elle pourrait entrer en conflit avec les fd utilisés par le shell en interne. Alors ne vous embêtez pas et utilisez uniquement les 0-9 de fd. Si vous avez besoin de plus de 9 descripteurs de fichiers dans un script bash, vous devez quand même utiliser une langue différente :)
Quoi qu'il en soit, les fd peuvent être utilisés de nombreuses façons intéressantes.
Vous voudrez peut-être éviter d'exécuter un shell racine juste pour imprimer une chaîne. Essayez echo "some data for the file" | sudo tee -a fileName >/dev/nulld'exécuter uniquement en teetant que root.
tripleee
6
Pour les environnements où les documents ne sont pas disponibles ici ( Makefile, Dockerfile, etc.) , vous pouvez souvent utiliser printfune solution raisonnablement lisible et efficace.
printf '%s\n''#!/bin/sh''# Second line' \
'# Third line' \
'# Conveniently mix single and double quotes, too' \
"# Generated $(date)" \
'# ^ the date command executes when the file is generated' \
'for file in *; do' \
' echo "Found $file"' \
'done'>outputfile
Votre commentaire ci-dessus Essayez d'écho "quelques données pour le fichier" | sudo tee -a fileName> / dev / null pour exécuter uniquement tee en tant que root. était vraiment utile!
Kojo
5
J'ai pensé qu'il y avait quelques réponses parfaitement fines, mais aucun résumé concis de toutes les possibilités; Donc:
Le principal principe derrière la plupart des réponses ici est la redirection . Deux sont des opérateurs de redirection importants pour l'écriture dans des fichiers:
Redirection de la sortie:
echo 'text to completely overwrite contents of myfile' > myfile
Ajout d'une sortie redirigée
echo 'text to add to end of myfile' >> myfile
Ici Documents
D'autres ont mentionné, plutôt que d'une source d'entrée fixe comme echo 'text', vous pouvez également écrire de manière interactive dans des fichiers via un "document ici", qui sont également détaillés dans le lien vers le manuel bash ci-dessus. Ces réponses, par exemple
cat > FILE.txt <<EOF ou cat >> FILE.txt <<EOF
utilisez les mêmes opérateurs de redirection, mais ajoutez une autre couche via "Here Documents". Dans la syntaxe ci-dessus, vous écrivez dans le FILE.txt via la sortie de cat. L'écriture n'a lieu qu'après que l'entrée interactive a reçu une chaîne spécifique, dans ce cas 'EOF', mais cela peut être n'importe quelle chaîne, par exemple:
cat > FILE.txt <<'StopEverything' ou cat >> FILE.txt <<'StopEverything'
fonctionnerait tout aussi bien. Ici, les documents recherchent également divers délimiteurs et autres caractères d'analyse intéressants, alors consultez les documents pour plus d'informations à ce sujet.
Ici les cordes
Un peu compliqué, et plus d'un exercice pour comprendre à la fois la redirection et la syntaxe Here Documents, mais vous pouvez combiner la syntaxe de style Here Document avec les opérateurs de redirection standard pour devenir une chaîne Here:
Redirection de la sortie de l'entrée cat
cat > myfile <<<'text to completely overwrite contents of myfile'
Ajout de la sortie redirigée de l'entrée cat
cat >> myfile <<<'text to completely overwrite contents of myfile'
sudo sh -c 'echo "some data for the file" >> fileName'
curl
ouwget
?la source
Vous pouvez rediriger la sortie d'une commande vers un fichier:
ou y ajouter
Si vous voulez écrire directement, la commande est
echo 'text'
la source
sudo sh -c 'cat file > /etc/init/gunicorn.conf'
(grâce au commentaire de lukaserat ci-dessus)la source
cat > FILE.txt
puis appuyez sur ctrl + D lorsque vous avez terminé .Je sais que c'est une sacrée vieille question, mais comme l'OP concerne les scripts, et pour le fait que Google m'a amené ici, l'ouverture de descripteurs de fichiers pour la lecture et l'écriture en même temps doit également être mentionnée.
Ensuite,
cat
le fichier sur le terminalCet exemple entraîne l'ouverture du fichier poem.txt pour la lecture et l'écriture sur le descripteur de fichier 3. Il montre également que les boîtes * nix connaissent plus de fd que stdin, stdout et stderr (fd 0,1,2). Cela tient vraiment beaucoup. Habituellement, le nombre maximum de descripteurs de fichiers que le noyau peut allouer peut être trouvé dans
/proc/sys/file-max
ou/proc/sys/fs/file-max
mais l'utilisation de tout fd supérieur à 9 est dangereuse car elle pourrait entrer en conflit avec les fd utilisés par le shell en interne. Alors ne vous embêtez pas et utilisez uniquement les 0-9 de fd. Si vous avez besoin de plus de 9 descripteurs de fichiers dans un script bash, vous devez quand même utiliser une langue différente :)Quoi qu'il en soit, les fd peuvent être utilisés de nombreuses façons intéressantes.
la source
J'aime cette réponse:
mais suggérerais
cat >> FILE.txt << EOF
si vous voulez simplement ajouter quelque chose à la fin du fichier sans effacer ce qui existe déjàComme ça:
la source
Déplacer mon commentaire comme réponse, comme demandé par @lycono
Si vous devez le faire avec des privilèges root, procédez comme suit:
la source
echo "some data for the file" | sudo tee -a fileName >/dev/null
d'exécuter uniquement entee
tant que root.Pour les environnements où les documents ne sont pas disponibles ici (
Makefile
,Dockerfile
, etc.) , vous pouvez souvent utiliserprintf
une solution raisonnablement lisible et efficace.la source
J'ai pensé qu'il y avait quelques réponses parfaitement fines, mais aucun résumé concis de toutes les possibilités; Donc:
Le principal principe derrière la plupart des réponses ici est la redirection . Deux sont des opérateurs de redirection importants pour l'écriture dans des fichiers:
Redirection de la sortie:
echo 'text to completely overwrite contents of myfile' > myfile
Ajout d'une sortie redirigée
echo 'text to add to end of myfile' >> myfile
Ici Documents
D'autres ont mentionné, plutôt que d'une source d'entrée fixe comme
echo 'text'
, vous pouvez également écrire de manière interactive dans des fichiers via un "document ici", qui sont également détaillés dans le lien vers le manuel bash ci-dessus. Ces réponses, par exemplecat > FILE.txt <<EOF
oucat >> FILE.txt <<EOF
utilisez les mêmes opérateurs de redirection, mais ajoutez une autre couche via "Here Documents". Dans la syntaxe ci-dessus, vous écrivez dans le FILE.txt via la sortie de
cat
. L'écriture n'a lieu qu'après que l'entrée interactive a reçu une chaîne spécifique, dans ce cas 'EOF', mais cela peut être n'importe quelle chaîne, par exemple:cat > FILE.txt <<'StopEverything'
oucat >> FILE.txt <<'StopEverything'
fonctionnerait tout aussi bien. Ici, les documents recherchent également divers délimiteurs et autres caractères d'analyse intéressants, alors consultez les documents pour plus d'informations à ce sujet.
Ici les cordes
Un peu compliqué, et plus d'un exercice pour comprendre à la fois la redirection et la syntaxe Here Documents, mais vous pouvez combiner la syntaxe de style Here Document avec les opérateurs de redirection standard pour devenir une chaîne Here:
Redirection de la sortie de l'entrée cat
Ajout de la sortie redirigée de l'entrée catcat > myfile <<<'text to completely overwrite contents of myfile'
cat >> myfile <<<'text to completely overwrite contents of myfile'
la source
Peut également utiliser ici le document et vi, le script ci-dessous génère un FILE.txt avec 3 lignes et interpolation variable
Le fichier aura alors 3 lignes comme ci-dessous. "i" consiste à démarrer le mode d'insertion vi et de même à fermer le fichier avec Esc et ZZ.
la source
c'est ma réponse. $ cat file> copy_file
la source