Преобразуйте json числа в строки в оболочке

{} просто собирает в группу команды в текущей оболочке, в то время как () запускает новую подоболочку. Однако то, что Вы делаете, помещает сгруппированные команды в фон, который является действительно новым процессом; если бы это было в текущем процессе, то это не мог бы возможно быть фон. Легче, по моему скромному мнению, видеть такого рода вещь с strace:

sauer@humpy:~$ strace -f -etrace=process bash -c '{ sleep 10; echo "Sleeping process", $BASHPID, $BASH_SUBSHELL; }  & echo $BASHPID;' > /tmp/file
execve("/bin/bash", ["bash", "-c", "{ sleep 10; echo \"Sleeping proce"...], [/* 20 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7f15a90da700) = 0
clone(Process 25347 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f15a90da9d0) = 25347
[pid 25346] exit_group(0)               = ?
clone(Process 25348 attached (waiting for parent)
Process 25348 resumed (parent 25347 ready)
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f15a90da9d0) = 25348
[pid 25348] execve("/bin/sleep", ["sleep", "10"], [/* 20 vars */] <unfinished ...>
[pid 25347] wait4(-1, Process 25347 suspended
 <unfinished ...>
[pid 25348] <... execve resumed> )      = 0
[pid 25348] arch_prctl(ARCH_SET_FS, 0x7f922ad16700) = 0
[pid 25348] exit_group(0)               = ?
Process 25347 resumed
Process 25348 detached
<... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 25348
--- SIGCHLD (Child exited) @ 0 (0) ---
wait4(-1, 0x7fffaa432ad8, WNOHANG, NULL) = -1 ECHILD (No child processes)
exit_group(0)                           = ?
Process 25347 detached

sauer@humpy:~$ cat /tmp/file
25346
Sleeping process, 25347, 1

Обратите внимание, что команда удара запускается, затем она создает нового ребенка с clone(). Используя-f опцию к средствам strace это также следует за дочерними процессами, показывая еще одно ветвление (хорошо, "клон"), когда это выполняет сон. Если Вы оставляете-f, Вы видите просто один вызов клона, когда он создает фоновый процесс:

sauer@humpy:~$ strace -etrace=clone bash -c '{ sleep 10; echo "Sleeping process", $BASHPID, $BASH_SUBSHELL; }  & echo $BASHPID;' > /tmp/file
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f2bdd5399d0) = 26394
sauer@humpy:~$ strace -etrace=process bash -c '{ sleep 10; echo "Sleeping process", $BASHPID, $BASH_SUBSHELL; }  & echo $BASHPID;' > /dev/null
execve("/bin/bash", ["bash", "-c", "{ sleep 10; echo \"Sleeping proce"...], [/* 20 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7fd01ae86700) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd01ae869d0) = 26706
exit_group(0)                           = ?

Если Вы действительно просто хотите знать, как часто Вы создаете новые процессы, можно упростить это еще больше, только наблюдая за ветвлением и клонировать вызовы:

sauer@humpy:~$ strace -etrace=fork,clone bash -c '{ sleep 10; echo "Sleeping process", $BASHPID, $BASH_SUBSHELL; }  & echo $BASHPID;' > /dev/null
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f467fa769d0) = 27025
3
14.07.2014, 20:56
1 ответ
[

]Вот простой скрипт python3, который можно вызвать в качестве фильтра в оболочке. Сохраните скрипт ниже в файле с именем []filter.py[], сделайте его исполняемым и позвоните с помощью []./filter.py <$file[][

] [

]Так как я не знаю структуру вашего JSON-файла, я предполагаю, что одна строка json на строку. Дайте мне знать, если вам понадобится его подстройка.[

] [
#!/usr/bin/python3
import json
import sys
for line in sys.stdin:
   try:
       print(json.dumps(json.loads(line, parse_float=str)))
   except (ValueError, TypeError):
       pass  # skip lines not parsable by json
       # print(line)  # uncomment to print non-json lines as-is
   # uncomment to ignore all other errors
   # except Exception:
   #    pass
exit(0)
] [

]Вот результаты моих тестов:[

] [
$ cat $file
{"a":200.12345678999999, "b":0.00001875}
{"a":200.1234567893029999, "b":0.03091875}
$ ./test.py <$file
{"a": "200.12345678999999", "b": "0.00001875"}
{"a": "200.1234567893029999", "b": "0.03091875"}
]
2
27.01.2020, 21:28

Теги

Похожие вопросы