Disons que j'ai un script que je veux diriger vers une autre commande ou rediriger vers un fichier (la tuyauterie à sh
pour les exemples). Supposons que j'utilise bash.
Je pourrais le faire en utilisant echo
:
echo "touch somefile
echo foo > somefile" | sh
Je pourrais aussi faire presque la même chose en utilisant cat
:
cat << EOF
touch somefile
echo foo > somefile
EOF
Mais si je remplace "EOF" par "EOF | sh", cela signifie simplement que cela fait partie de l'heredoc.
Comment puis-je faire en sorte que le cat
texte en sortie de stdin, puis le dirige vers un emplacement quelconque?
shell
io-redirection
cat
here-document
combattant
la source
la source
touch
est à moins que, que voulez-vous exactement? est juste de lire le fichier d'entrée et de rediriger vers un autre avec stdout?echo
- je me demandais quel serait l'équivalent de celacat
.sh
script à partir de plusieurs chaînes et à le transmettre directement àsh
. J'ai trouvé votre Q cherchant à transmettre le texte de plusieurs commandes, y compris un document HERE, directement à une commande. C'est ce que fait le deuxième exemple de la réponse de Ash.Réponses:
Il y a plusieurs façons de le faire. Le plus simple est probablement ceci:
Une autre, qui est la syntaxe plus agréable à mon avis:
Cela fonctionne aussi, mais sans le sous-shell:
Plus de variations:
Ou:
En passant, je suppose que l'utilisation de
cat
votre question est un espace réservé pour autre chose. Sinon, sortez-le comme ceci:Ce qui pourrait être simplifié à ceci:
ou:
Rediriger la sortie au lieu de la tuyauterie
Utiliser
cat
pour obtenir l’équivalent deecho test > out
:Plusieurs documents ici
Ceci produit la sortie:
Voici ce qui se passe:
( ... )
et exécute les commandes incluses dans un sous-shell.cat <&3
dit de lancer un chat avec un descripteur de fichier (fd) 0 (stdin) redirigé depuis fd 3; autrement dit, supprimez l’entrée de fd 3.(...)
soit lancé, le shell voit ici les deux redirections de document et substitue fd 0 (<<EOF
) et fd 3 (3<<EOF2
) par le côté lecture des tuyauxla source
(cat; echo ---; exec <&3; cat) <<EOF 3<<EOF2 >out
et ensuite donner cette entrée de commande avec deux here-blocks dans une rangée.cat
équivalent de ce qui serait équivalentecho test > out
, en utilisant un heredoc. Considérant que votre exemple donné a ajouté une redirection à la fin du tuyau.Je veux juste souligner que l'utilisation
meow
est tout aussi valable queEOF
.Ce script va ajouter
Meow!
à un fichier nommécat
:Enregistrer sous
cats
et le rendre exécutable avecchmod +x cats
, puis exécutez-le avec./cats
:Explication:
cat <<meow
est la syntaxe ici du document . Il demande au script de saisir le bloc de texte qui suit cette ligne jusqu'à ce qu'il rencontre la chaînemeow
. Le contenu sera alors sorti (ou transmis).>> cat
tuyaux vers le fichier nommécat
.>
au lieu de>>
remplacer écraserait le fichier au lieu de l'ajouter.Meow!
est le contenu du document ici .meow
est le marqueur de fin pour le document ici . Le contenu est, avec l'utilisation de>>
, ajouté àcat
.Piping à la fois vers stdout et vers un fichier:
Pour faire la tuyauterie que vous demandez, aucun document ici n'est requis.
cat
ne peut pas à la fois produire du texte et le transmettre, maistee
correspond parfaitement à ce que vous demandez:Cela va à la fois sortir la chaîne
echo
et écrireecho
dans un fichier nommétee
.Vous pouvez également transmettre la sortie
cat
, si cela fait partie de l'exigence, soit avec:Ou juste:
Contenu du dossier:
la source
>
ne crée pas de tuyaux comme votre dernière puce implique.>
peut créer des pipeszsh
lorsque le même fd est redirigé plusieurs fois, comme dansecho foo >&1 > tee
ouecho foo > tee | cat
, oùzsh
implémente un internetee
pour alimenter la sortie desecho
deuxcat
et dutee
fichier.