Проблема тут не проблема з перенаправленням Linux; скоріше, це фундаментальне нерозуміння того, як працює трубопровід. Перенаправлення тут не працює, тому що тільки вирізання насправді друкується до stdout. stdout для команди echo був прокладений для вирізання stdin (який у даному випадку не використовується, оскільки вказаний файл).
echo "header line" > output_file && cut -c 1-5 input_file >> output_file
це те, що ви хочете, і зовсім неелегантний (я замінив вашу ;на &&так, що команда cut буде виконуватися лише в тому випадку, якщо заголовок успішно записаний; таким чином він не буде виконуватись, якщо у вас немає дозволів на створення або запис у output_file ).
Ви також можете зробити все це в передпласті, наприклад.
(echo "header line"; cut -c 1-5 input_file) > output_file
але реальної користі від цього немає, і за допомогою складніших прикладів це може спричинити проблеми, якщо ви не знайомі з визначенням рівня нижньої частини.
Якщо ви хочете вирізати, щоб пройти stdin через stdout, ви можете спробувати:
echo "header line" | cut -c 1-5 - input_file
(Тире - це звичайний ярлик для stdin)
Однак це також виконає операцію зрізання на stdin (в результаті вийде рядок заголовка "header"). Важко сказати, чи це ви хочете чи ні з питання.
{ .... } > some_file 2>&1(буде «ганчірки» some_file НЕ ганчірки, але запис в нього замість цього, просто змінити.>У>>:{ ... } >> some_file 2>&1)