Это зависит от точной функциональности find
то, что Вы полагаетесь. Если это - (преимущественно) функциональность открытия, некоторые оболочки поддерживают рекурсивные шарики. Например, с zsh
:
% find . -name \*c
./a/b/foo.c
./a/bar.c
./baz.c
inoshiro% ls *.c
baz.c
% ls **/*.c
a/bar.c a/b/foo.c baz.c
Zsh имеет намного больше подобных находке возможностей через спецификаторы шарика (взгляд около конца man zshexpn
). Например:
ls -l **/*(.)
≈ find -type f -ls
ls *(m-2u:$USER:)
≈ find -mtime -2 -user $USER
Bash 4 также имеет **/
(необходимо включить его с shopt -s globstar
), но ничто как спецификаторы шарика.
Ваш код похож на полностью выровненный по ширине пример использования tempfiles мне. Я остался бы: палка с этим подходом. Единственной вещью, которая действительно должна быть изменена, является способ, которым Вы создаете tempfile. Используйте что-то как
TMP=$(tempfile)
или
TMP=$(mktemp)
или по крайней мере
TMP=/tmp/myscript_$$
Таким образом, Вы не будете позволять имени быть легко предсказанным (безопасность) и управлять интерференцией между несколькими экземплярами сценария, работающего одновременно.
Вы могли использовать переменную:
info="$(getInfo $SERVICE)"
SERV_NAME="$(head -1 $TMPFILE <<<"$info" | sed -e 's/ $//')"
...
От man ksh
:
<<<word A short form of here document in which word becomes the
contents of the here-document after any parameter expan-
sion, command substitution, and arithmetic substitution
occur.
Преимущества включают:
man
страница (не было никакого упоминания о номере версии на веб-странице:/)
– l0b0
28.09.2011, 16:45
<<<
удар, 'здесь представляют в виде строки'. Я не думаю, что это появляется в любой другой оболочке. (О, zsh
возможно...)
– rozcietrzewiacz
29.09.2011, 09:31
sleep 3 <<<"here string" & lsof -p $! | grep 0r
→ sleep 30251 anthony 0r REG 253,0 12 263271 /tmp/sh-thd-7256597168 (deleted)
— да, это использует tempfile.
– derobert
24.08.2012, 20:04
У Вас есть две опции:
Вы получаете данные однажды (в Вашем примере с getInfo
) и сохраните его в файле, как Вы делаете.
Вы выбираете данные по каждому разу и не храните их локально, т.е. Вы звоните getInfo
каждый раз
Я не вижу проблемы в создании временного файла для предотвращения reprocessing/re-fetching.
Если Вы волнуетесь по поводу отъезда временного файла где-нибудь, можно всегда использовать trap
убеждаться удалить его в случае, если сценарий уничтожается/прерывается
trap "rm -f $TMPFILE" EXIT HUP INT QUIT TERM
и используйте mktemp
создать уникальное имя файла для Вашего временного файла.
Вместо того, чтобы генерировать файл, создайте операторы присваивания оболочки и оцените тот вывод.
for SERVICE in $(myfunc); do
eval $(getInfo $SERVICE |
sed -n -e '1/\(.*\) *$/SERV_NAME="\1"/p' \
-e '/HOSTNAME/s/^[^=]*=\([^=]*\).*/SERV_HOSTNAME="\1"/p' \
-e '/Arguments/^[^:]*:\([^:]*\).*/SERV_ARGS="\1"/p')
print $SERV_NAME $SEP $SERV_HOSTNAME $SED $SERV_ARGS
done
Или если Вы просто хотите распечатать информацию:
for SERVICE in $(myfunc); do
getInfo $SERVICE | awk -vsep="$SEP" '
BEGIN{OFS=sep}
NR == 1 { sub(/ *$/,""); SERV_NAME=$0 }
/HOSTNAME/ { split($0, HOST, /=/; SERV_HOSTNAME=HOST[2]; }
/Arguments/ { split($0, ARGS, /:/; SERV_ARGS }
END { print SERV_NAME, SERV_HOSTNAME, SERV_ARGS }'
done
var=$(echo lots of spaces); echo "$var"
прекрасен и должен произвестиlots of spaces
как произведено. Реальный протест, который никто не упомянул, является полосами замены команды все запаздывающие новые строки. Это не проблема здесь и только имеет значение, например, если у Вас был поврежденныйmktemp
это создало имена файлов с запаздывающими новыми строками. Обычная работа вокруг при необходимостиvar=$(echo command with trailing newline; echo x); var=${var%x}
. – jw013 24.08.2012, 16:42