Le problème ici n'est pas un problème avec la redirection Linux; il s'agit plutôt d'une incompréhension fondamentale du fonctionnement du pipeline. Ici, la redirection ne fonctionne pas car seule la découpe s'imprime réellement sur la sortie standard. stdout pour la commande echo a été canalisé vers stdin de cut (qui n'est pas utilisé dans ce cas car un fichier est spécifié).
echo "header line" > output_file && cut -c 1-5 input_file >> output_file
est ce que vous voulez, et pas du tout inélégant (j'ai remplacé votre ;
par &&
pour que la commande cut ne s'exécute que si l'en-tête est correctement écrit; de cette façon, il ne s'exécutera pas si vous n'avez pas les autorisations pour créer ou écrire dans le fichier de sortie ).
Vous pouvez également tout faire en sous-shell, par exemple.
(echo "header line"; cut -c 1-5 input_file) > output_file
mais cela ne présente aucun avantage réel et avec des exemples plus complexes, cela peut entraîner des problèmes si vous n'êtes pas familier avec la portée du sous-shell.
Si vous voulez couper pour passer stdin à stdout, vous pouvez essayer:
echo "header line" | cut -c 1-5 - input_file
(Le tiret est un raccourci commun pour stdin)
Cependant, cela effectuera également l'opération de coupure sur stdin (résultant en une ligne d'en-tête "en-tête"). Il est difficile de dire si c'est ce que vous voulez ou non à la question.
{ .... } > some_file 2>&1
(sera « clobber » un_fichier à ne pas clobber, mais au lieu d'y ajouter du , il suffit de changer le.>
En>>
:{ ... } >> some_file 2>&1
)Pour compléter les réponses, il y a exec.
la source