Используйте tee
(здесь предполагается система с поддержкой /dev/fd/
):
{
lines=$(function_call 3>&- | tee -a /dev/fd/3 | wc -l)
} 3>&1
if [ "$lines" -gt 1 ]; then
do_stuff
fi
В Linux со странной реализацией /dev/fd/
, если stdout перенаправляется в файл, вывод будет вставлен в конец этого файла, даже если текущее положение stdout в сценарии в этом файле не в конце (в общем, это нормально, так как редко когда stdout идет внутрь файла).
Альтернативно, вы можете сделать
{
lines=$(function_call 3>&- | sed -ne 'w /dev/fd/3' -e '$=')
} 3>&1
Или:
{
lines=$(function_call 3>&- | awk '{print > "/dev/fd/3"}; END {print NR}')
} 3>&1
(учтите, что в зависимости от реализации sed
или awk
, это может дать на один больше, чем wc -l
, если function_call
выводит дополнительные данные после последнего символа новой строки).
Если вы обслуживаете программу, заставьте ее хранить историю. В Python используйте библиотеку readline
и сохраните в ней файл истории .
Если вы не хотите изменять программу, вы можете использовать оболочку, такую как rlwrap
.
rlwrap -H ~/.myprogram.history myprogram
Для такого рода вещей вы хотите использовать какой-то файл конфигурации. Обычно для этого достаточно точечного файла в домашнем каталоге пользователя.
Вы должны хранить вашу информацию в файле, расположение которого соответствует XDG Base Directory Specification.
Поскольку ваш материал - это данные, а не конфигурация, вам следует проверить, существует ли переменная окружения XDG_DATA_HOME
и создать файл или поддиректорию, специфичную для утилиты, в которой вы будете хранить файл. Если эта переменная окружения не существует, по умолчанию используется ~/.local/share
:
base_dir = os.environ.get('XDG_DATA_HOME',
os.path.join(os.environ['HOME'], '.local', 'share'))
util_data_dir = os.path.join(base_dir, util_name)