Как отправить вывод как в файл журнала, так и в консоль?

Если ваша оболочка похожа на оболочку Bourne -и ее [встроенная функция реализует -ntтест для проверки того, является ли один файл новее другого, вы можете использовать

newest=
for file in./*./.*; do
    if [ -f "$file" ]; then
        if [ -z "$newest" ] || [ "$file" -nt "$newest" ]; then
            newest=$file
        fi
    fi
done

if [ -f "$newest" ]; then
    printf 'The latest file is "%s"\n' "$newest"
else
    echo 'Could not find files here' >&2
    exit 1
fi

Это будет перебирать все обычные (и символические ссылки на обычные )файлы (, включая скрытые )файлы в текущем каталоге, а затем сообщать вам, какой файл оказался самым новым. Вы должны заменить оператор printfфактической командой, которую вы хотите запустить на "$newest".

В качестве функции оболочки, которая дополнительно принимает в качестве аргумента список файлов:

newest () (
    newest=
    for file do
        if [ -f "$file" ]; then
            if [ -z "$newest" ] || [ "$file" -nt "$newest" ]; then
                newest=$file
            fi
        fi
    done

    if [ -f "$newest" ]; then
        printf '%s\n' "$newest"
    else
        echo 'No files found' >&2
        return 1
    fi
)

Тогда

tail -f "$(newest./filename*)"
2
24.03.2020, 08:58
1 ответ

Я не уверен, как это сделать в sh, но в bash вы можете сделать это с помощью Замены процесса и tee, которые должны делать то, что вы хотели

#!/usr/bin/env bash

logfile=logfile.txt

exec 3>&1 4>&2

trap 'exec 2>&4 1>&3' 0 1 2 3

exec > >(tee -a "$logfile") 2>&1  ##: Print to stdout and logfile.
2
28.04.2021, 23:19

Теги

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