вы также можете просто отбросить подоболочку. очевидно, это вложенные оболочки, которые мешают друг другу:
TIMESEC=$(
echo blah |
/usr/bin/time -f %e grep blah 2>&1 >/dev/null |
awk -F. '{print $1}'
)
Если вы это сделаете:
...| ( subshell ) 2>pipe | ...
... вы получите подоболочку, запущенную для обработки этого участка конвейера , содержащего подоболочку внутри . Поскольку оболочка без перенаправления даже отладочного вывода подоболочки в (как и для любого другого вида составной команды {
;}> перенаправить
, вы можете выбрать use) на свой участок конвейера накручиваете смешивание потоков. Это связано с порядком перенаправления.
Вместо этого, если вы сначала просто перенаправляете только вывод ошибок команд, которые вы пытаетесь измерить, и позволяете выводам оболочки хоста передавать его на stderr, вы не столкнетесь с той же проблемой. .
и так ...
... | command 2>pipe 1>/dev/null | ...
... оболочка хоста может продолжать писать свой stderr там, где ей заблагорассудится, перенаправляя только вывод команд, которые она вызывает, в конвейер.
bash -x time.sh
+++ echo blah
+++ /usr/bin/time -f %e grep blah
+++ awk -F. '{print $1}'
++ TIMESEC=0
++ echo ABC--0--DEF
ABC--0--DEF
++ '[' 0 -eq 0 ']'
++ echo 'we are here!'
we are here!
Если на то пошло ...
TIMESEC=$(
echo blah |
/usr/bin/time -f %e grep blah 2>&1 >/dev/null
)
printf %s\\n "ABC--${TIMESEC%%.*}--DEF"
if [ "${TIMESEC%%.*}" -eq 0 ] ; then
echo "we are here!"
fi
Ctrl + C здесь убивает ваш скрипт. Все дети получают сигнал, и они реагируют на сигнал о том, что их родитель умирает.
Вы можете попробовать nohup
вместоatom
#!/bin/bash
cd /home/jhn/src/eth/ten
nohup atom. &
npm start
Это потому, что atom
запускается в текущем скрипте текущей оболочки. Запустите его как демон -, если этот параметр доступен -, или запустите его в фоновом режиме, в конечном итоге с помощью команды nohup
, или disown
после нее.