Según la respuesta de Matteo Italia:
Doing the same experiment with killall, instead, usually yields the "killed" message immediately, sign that the time/context switches/whatever required to execute an external command cause a delay long enough for the process to be killed before the control returns to the shell.
En otras palabras, el retraso causado por llamar al externo /bin/true
causa un retraso, lo que permite que Shell imprima el mensaje.
También he realizado pruebas con /bin/echo
vsecho
:
#!/bin/bash
if [[ -n "$1" ]]; then
sleep 1 &
p=$!
kill $p &> /dev/null
/bin/echo "a line"
else
sleep 1 &
p=$!
kill $p &> /dev/null
fi
Con este guión:
$ bash./mystery.sh
$ bash./mystery.sh foo
a line
./mystery.sh: line 11: 10361 Terminated sleep 1
Con -integrado enecho
:
$ bash./mystery.sh
$ bash./mystery.sh foo
a line
En otras palabras, el hecho de que se llame a un ejecutable externo obliga al shell a realizar una verificación de procesos secundarios y trabajos en segundo plano cuando regresa el último elemento secundario. En caso de:
if [[ -n "$1" ]]; then
sleep 1 &
p=$!
kill $p &> /dev/null
de su secuencia de comandos original no se llama a ningún comando adicional, solo se incorporó por última vez.
Entre otras cosas, he realizado algunas pruebas constrace
:
Parece que el proceso padre sale y no espera al hijo. En otras palabras, el proceso principal del shell finaliza demasiado pronto para realizar una verificación explícita.
$ strace -s 1024 -e kill bash mystery.sh
kill(9830, SIGTERM) = 0
mystery.sh: line 11: 9830 Terminated sleep 1
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=9830, si_uid=1000, si_status=SIGTERM, si_utime=0, si_stime=0} ---
+++ exited with 0 +++
$ strace -s 1024 -e kill bash mystery.sh foo
kill(9839, SIGTERM) = 0
+++ exited with 0 +++
En particular, en el rastreo con parámetro posicional, la llamada de espera también está ausente:
$ strace -s 1024 -e kill,wait4 bash mystery.sh foo
kill(9910, SIGTERM) = 0
+++ exited with 0 +++
$ strace -s 1024 -e kill,wait4 bash mystery.sh
kill(9916, SIGTERM) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=9916, si_uid=1000, si_status=SIGTERM, si_utime=0, si_stime=0} ---
wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGTERM}], WNOHANG, NULL) = 9916
wait4(-1, 0x7ffe8e5bb110, WNOHANG, NULL) = -1 ECHILD (No child processes)
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 9917
mystery.sh: line 11: 9916 Terminated sleep 1
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=9917, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, 0x7ffe8e5bb250, WNOHANG, NULL) = -1 ECHILD (No child processes)
+++ exited with 0 +++
join
ожидает, что его входные данные будут отсортированы (по полям, которые должны быть объединены ). В этом случае (используется замена процесса оболочки bash):
$ join -t/ -1 1 -2 2 FILE1 <(sort -t/ -k2 FILE2)
1/temperature/2008-10-10/32
1/temperature/2008-10-01/45
1/temperature/2008-12-01/61
1/temperature/2008-10-01/68
1/temperature/2008-10-01/89
2/rainfall/2008-10-02/6
3/snowfall/2008-10-03/4
4/windspeed/2008-10-04/25
4/windspeed/2008-10-01/35
5/winddirection/2008-10-05/120
5/winddirection/2008-11-01/360
Обратите внимание, что необходима сортировка лексическая , а не числовая -, если значения первого столбца в FILE1
превышают 9, то вам, вероятно, потребуется предварительно -отсортировать и это.