Вы можете использовать индексацию квадратных скобок для всех объектов в jq, поэтому [$name]
работает для того, что вы пытаетесь:
jq --arg key1 true --arg name "$name" '.Linux.script_executed[$name] = $key1...'
Использование квадратных скобок не очень хорошо задокументировано в руководстве , из-за чего кажется, что вы можете использовать только .[xyz]
, но ["x"]
работает везде, где .x
имел бы такую же длину. так как это неправильно в начале выражения (, то есть .a.x
и .a["x"]
одинаковы, но ["x"]
является конструкцией массива ).
Обратите внимание на использование одинарных кавычек над -, чтобы Bash не пытался интерпретировать $name
и $key1
как переменные оболочки. Вы должны держать --arg name "$name"
в двойных кавычках, потому что на самом деле — это переменная оболочки, и ее следует заключать в кавычки, чтобы ее было безопасно использовать.
Я нашел причину вышеупомянутой проблемы с ответом @A.B . Я сравнил вывод lsof после запуска экземпляра tomcat на двух серверах Linux. Один сервер возвращает большое значение (Связано с моим первоначальным вопросом ), тогда как второй сервер всегда возвращает меньше 2000.
Причиной проблемы было наличие двух разных версий lsof на обоих серверах. (4.82 и 4.87 )Последняя версия включает результаты, относящиеся к потокам.
lsof -4.87:(Есть столбец TID )
Таким образом, при наличии 100 потоков один и тот же файл будет открыт 100 раз, (Как упомянул @A.B. )Что будет считаться только 1 открытым файлом. Но | wc -l
возвращает количество повторяющихся строк для разных потоков. (Что действительно неверно)