Для меня то, о чем вы спрашиваете, вполне нормально. Предположим, у вас есть три файла file1.log, file2.log and file3.log
внутри папки в /var/log/remote/
, и вы хотите ежедневно менять их местами и сохранять последние 10 сжатыми. Вы можете сделать это следующим образом:
/etc/logrotate.d/myfiles
. /var/log/remote/*.log
{
rotate 10
daily
sharedscripts
missingok
compress
}
logrotate
в режиме отладки.logrotate -d /etc/logrotate.d/myfiles
logrotate -f /etc/logrotate.d/myfiles
Похоже, вы ожидаете, что направление re -сделает копию данных? Рассмотрите возможность использования tee
. Пока вы учитесь, я не буду портить вам жизнь, говоря больше.
Также используйте shellcheck
для проверки кода. Это поможет вам быстрее найти большинство ошибок.
ваша попытка:
{
{
ls | grep foo # goes to stdout (fd 1)
} 2>&1 1>&4 | grep bar # at this level: 2 now points to where fd1 is pointing (stdout), and 1 is *then* directed to the new fd 4 (ie to stdin of the outside curly)
} 4>&1 ## at this shell 'level', a new fd 4 is now pointing to where 1 is pointing: stdout
:панель grep для этого делается только на stderr из { ls | grep foo } и, таким образом, на пустом стандартном вводе, так как только stderr из { ls | grep foo } переходит на стандартный вывод {ls | grep foo }. Это никогда не увидит имена файлов. имена файлов идут в fd 4 попробуй:
{
{
ls | grep foo
} 2>&1 1>&4
} 4>&1 | grep bar
или
{
{
ls | grep foo
} 2>&1 1>&4 | <&4 grep bar
} 4>&1
и сравните...
примечание :если вы хотели, чтобы stderr внутренних команд также выводился на стандартный вывод, его необходимо продублировать во 2-й позиции :1>&4 2>&1 [т.е. :1 теперь переходит в fd 4, а затем 2 идет туда, куда теперь указывает 1, т.е. fd 4 также]
Насколько я могу судить, верно следующее.
Это
{
{
ls | grep foo
} 2>&1 1>&4 | grep bar
} 4>&1
эквивалентно
(ls | grep foo 2>&1 1>&4 | grep bar) 4>&1
И это не удается, потому что fd 4, например, /dev/pts/0, а 1>&4 приведет к тому, что fd 1 будет иметь тот же /dev/pts/0 вместо канала.