Я часто пишу сценарии оболочки KSH, которые следуют той же схеме:
- (1) получить вывод из одной или нескольких команд
- (2) отформатируйте его, используя grep | cut | awk | sed, и распечатайте его на экране или в файле
Для этого я часто сохраняю вывод (1) в временном файле, а затем выполняю форматирование в (2) для этого файла.
Возьмите этот код, например:
TMPFILE=file.tmp
# If tmpfile exists rm it.
[ -f $TMPFILE ] && rm -f $TMPFILE
for SERVICE in $(myfunc); do
getInfo $SERVICE > $TMPFILE # Store raw output in the TMPFILE
# I retrieve the relevant data from the TMPFILE
SERV_NAME=$(head -1 $TMPFILE | sed -e 's/ $//')
SERV_HOSTNAME=$(grep HOSTNAME $TMPFILE | cut -d "=" -f2)
SERV_ARGS=$(grep Arguments $TMPFILE | cut -d ":" -f2)
print $SERV_NAME $SEP $SERV_HOSTNAME $SEP $SERV_ARGS
rm -f $TMPFILE #rm the TMPFILE in vue of next iteration
done
Есть ли способ, используя каналы, перенаправления и т. Д., Чтобы избежать записи файла на диск каждый раз?
Если это поможет, я использую ksh Версия M-11/16 / 88i
PATH
или другие переменные оболочки или среды.TMPFILE
может быть хорошо, ноTMPDIR
это особенное, так что вы действительно хотите идти по канату?Ответы:
Ваш код выглядит как вполне оправданный пример использования мне временных файлов. Я бы остался: придерживайтесь этого подхода. Единственное, что действительно нужно изменить, - это способ создания временного файла. Используйте что-то вроде
или
или по крайней мере
Таким образом, вы не сможете легко предсказать имя (безопасность) и исключите вмешательство правил между несколькими экземплярами скрипта, работающими одновременно.
источник
var=$(echo lots of spaces); echo "$var"
это нормально и должен производитьlots of spaces
как выходной. Реальное предостережение, о котором никто не упомянул, - замена команд удаляет все завершающие строки. Это не проблема здесь, а имеет значение, например, если у вас есть сломанный,mktemp
который создал имена файлов с конечными символами новой строки. Обычная работа вокруг, если требуется, естьvar=$(echo command with trailing newline; echo x); var=${var%x}
.Вы можете использовать переменную:
От
man ksh
:Преимущества включают в себя:
источник
man
страницу (там не было упоминания номера версии на веб-странице: /)<<<
это баш «здесь строка». Я не думаю, что это появляется в любой другой оболочке. (О,zsh
может быть ...)man ksh
. Это было, конечно, упомянуто там.sleep 3 <<<"here string" & lsof -p $! | grep 0r
→sleep 30251 anthony 0r REG 253,0 12 263271 /tmp/sh-thd-7256597168 (deleted)
- да, он использует временный файл.У вас есть два варианта:
Вы получаете данные один раз (в вашем примере с
getInfo
) и сохраняете их в файле, как и вы.Вы извлекаете данные каждый раз и не сохраняете их локально, то есть звоните
getInfo
каждый разЯ не вижу проблемы в создании временного файла, чтобы избежать повторной обработки / повторной выборки.
Если вы беспокоитесь о том, чтобы оставить временный файл где-нибудь, вы всегда можете использовать его,
trap
чтобы быть уверенным, что удалите его в случае, если сценарий убит / прервани использовать
mktemp
для создания уникального имени файла для вашего временного файла.источник
Вместо создания файла создайте операторы присваивания оболочки и оцените этот вывод.
Или, если вы просто хотите распечатать информацию:
источник