Проблема здесь не в перенаправлении Linux; скорее это фундаментальное недопонимание того, как работает трубопровод. Перенаправление здесь не работает, потому что на самом деле только обрезка печатает на стандартный вывод. 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
но в этом нет никакой реальной выгоды, и с более сложными примерами это может вызвать проблемы, если вы не знакомы с областью действия подоболочки.
Если вы хотите, чтобы cut передавал стандартный ввод в стандартный вывод, вы можете попробовать:
echo "header line" | cut -c 1-5 - input_file
(Тире это общий ярлык для стандартного ввода)
Тем не менее, это также будет выполнять операцию вырезания на stdin (в результате чего строка заголовка "header"). Трудно сказать, если это то, что вы хотите или нет из вопроса.
{ .... } > some_file 2>&1
(будет «тряпки» some_file не тряпки, но запись в него вместо этого, просто изменить.>
В>>
:{ ... } >> some_file 2>&1
)