Перенаправление блока Bash и трубопроводы

Для меня то, о чем вы спрашиваете, вполне нормально. Предположим, у вас есть три файла file1.log, file2.log and file3.logвнутри папки в /var/log/remote/, и вы хотите ежедневно менять их местами и сохранять последние 10 сжатыми. Вы можете сделать это следующим образом:

  1. Создайте файл в /etc/logrotate.d/myfiles.
  2. Вставьте в него следующее содержимое.

    /var/log/remote/*.log
    {
    rotate 10
    daily
    sharedscripts
    missingok
    compress
    }

  3. Вы можете протестировать его, запустив logrotateв режиме отладки.

    logrotate -d /etc/logrotate.d/myfiles

  4. Если вы действительно хотите выполнить это сейчас.

    logrotate -f /etc/logrotate.d/myfiles

2
01.02.2021, 10:57
3 ответа

Похоже, вы ожидаете, что направление re -сделает копию данных? Рассмотрите возможность использования tee. Пока вы учитесь, я не буду портить вам жизнь, говоря больше.

Также используйте shellcheckдля проверки кода. Это поможет вам быстрее найти большинство ошибок.

-1
18.03.2021, 22:33

ваша попытка:

{
    {
        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 также]

0
18.03.2021, 22:33

Насколько я могу судить, верно следующее.

Это

{
    {
        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 вместо канала.

0
18.03.2021, 22:33

Теги

Похожие вопросы