Использование exec
с &
имеет мало смысла (хотя это не будет исходным вашей проблемы), это не избавит от дополнительной вилки. С компонентами канала я вижу только сохранение форка с оболочкой zsh
, но только если применяется к последнему компоненту канала (cmd1 | exec cmd2
, и это означает zsh
больше не ожидает другие компоненты трубы).
Здесь вы не перенаправляете скрипт python stderr на ts
, хотя вы отправляете его в файл log
.Вы, вероятно, захотите:
su -s /bin/sh -c '
"$0" "$@" 2>&1 |
ts "[%Y-%m-%d %H:%M:%S]"
' user -- test.python "$FULLPATH" > log 2>&1 &
Да.
for name in /home/imp/imp/msgs/*.PK1; do
mv "$name" "${name%.PK1}.BRD"
done
for name in /home/imp/imp/msgs/*.PK2; do
mv "$name" "${name%.PK2}.MIX"
done
Первый цикл будет перебирать все файлы *. PK1
в / home / imp / imp / msgs
и заменять суффикс имени файла на .BRD
.
Второй цикл делает то же самое с другим набором файлов.
Расширение переменной $ {name% .PK2} .MIX
удалит строку .PK2
из конца значения, хранящегося в переменной name
а затем добавьте строку .MIX
в конец результата этого.
set -- "BRD" "MIX"
for src in /home/imp/imp/msgs/*.PK[12]; do
eval "dest=\${src%.*}.\${${src#${src%?}}}"
/usr/bin/mv "$src" "$dest"
done
Основная идея заключается в том, что мы сохраняем отображение расширения имени файла src в новое расширение с помощью массива «$ @».
$ src
содержит name.PK1
$ {src%. *}
содержит name
$ {src # $ {src%?}}
содержит 1
, таким образом, dest
оценивается как "имя" "." "BRD" = "name.BRD"
cat - <<\eof | make -f - SRCDIR="/home/imp/imp/msgs"
.PHONY:all force
all:$(wildcard $(SRCDIR)/*.PK[12]);
%.PK1:force;/usr/bin/mv "$@" "$(@:.PK1=.BRD)";
%.PK2:force;/usr/bin/mv "$@" "$(@:.PK2=.MIX)";
eof
Команда cat создает makefile на лету. Цели all
и force
являются фальшивыми => цель всегда будет пересобираться, в нашем случае каждый раз выполняется mv
. Команда $(wildcard ...)
формирует список всех необходимых *.PK1, *.PK2
файлов.