Используйте pygount в скрипте bash с переменным количеством файлов

#python #bash

Вопрос:

Я пытаюсь подсчитать строки кода в проекте, используя «pygount». Pygount получает список файлов или dir, затем подсчитывает строки кода, а затем выводит сводку на экран (по выбору). Однако я хочу использовать свой скрипт bash в других проектах, поэтому я хочу, чтобы список файлов был переменным и вводился в виде файла, содержащего все пути (файлы и dir).

Проблема в том, что pygount не видит, что моя переменная представляет собой список файлов, поэтому я не получаю надлежащего резюме. Это может быть проблема с башом? Я могу заставить его работать с помощью массива:

 --($:~/repos)-- x=( *.v *.vh *.sv *.svh )
--($:~/repos)-- echo ${x[*]}
axis_data_fifo_v2_0_vl_rfs.v axis_infrastructure_v1_1_0.vh xadc_controller.sv xil_common_vip_macros.svh
--($:~/repos)-- pygount -v -f summary ${x[*]}
INFO:pygount:axis_data_fifo_v2_0_vl_rfs.v: analyze as verilog using encoding utf-8
INFO:pygount:axis_infrastructure_v1_1_0.vh: unknown language
INFO:pygount:xadc_controller.sv: analyze as systemverilog using encoding utf-8
INFO:pygount:xil_common_vip_macros.svh: analyze as systemverilog using encoding utf-8
  Language     Files    %     Code    %     Comment    %
-------------  -----  ------  ----  ------  -------  ------
verilog            1   25.00   243   57.86      382   82.68
systemverilog      2   50.00   177   42.14       80   17.32
__unknown__        1   25.00     0    0.00        0    0.00
-------------  -----  ------  ----  ------  -------  ------
Sum total          4           420              462
 

Но это не работает, когда я помещаю имена файлов в файл с именем «w».:

 --($:~/repos)-- cat w
axis_data_fifo_v2_0_vl_rfs.v
axis_infrastructure_v1_1_0.vh
xadc_controller.sv xil_common_vip_macros.svh

--($:~/repos)-- cat w | pygount -v -f summary
INFO:pygount:/home/de770564/repos/sysver/system_sims/test/aioflex/lines_of_code/dut.loc: unknown language
INFO:pygount:/home/de770564/repos/sysver/system_sims/test/aioflex/lines_of_code/lines_of_code.out: unknown language
INFO:pygount:/home/de770564/repos/sysver/system_sims/test/aioflex/lines_of_code/loc_gen.sh: is generated code because line 4 matches re.compile('(?i).*automatically generated', re.IGNORECASE)
INFO:pygount:/home/de770564/repos/sysver/system_sims/test/aioflex/lines_of_code/w: unknown language
  Language     Files    %     Code    %     Comment    %
-------------  -----  ------  ----  ------  -------  ------
__unknown__        3   75.00     0    0.00        0    0.00
__generated__      1   25.00     0    0.00        0    0.00
-------------  -----  ------  ----  ------  -------  ------
Sum total          4             0                0
 

И я пробовал разные варианты этого:

 --($:~/repos)-- pygount -v -f summary $( cat w )
Language   Files    %     Code    %     Comment    %
---------  -----  ------  ----  ------  -------  ------
---------  -----  ------  ----  ------  -------  ------
Sum total      0             0                0
 

Я попробовал » cat w` в конце, но получил те же результаты.

Примечание: Файл не содержит глобусов, но он содержит переменные среды, которые не определены в my .bashrc. Переменные env определены в сценарии оболочки среды, который я запускаю для различных настроек, специфичных для проекта. Я полагаю, тогда в этом может быть проблема? Как я могу заставить оболочку расширить переменные env, которые являются частью значений переменных?

Комментарии:

1. Содержит ли файл глобусы или список имен файлов? Если это глобусы, вам нужна оболочка, чтобы расширить их перед переходом в pygount. Это должно сработать: x=($(< myfile)) затем используйте с "${x[@]}" .

2. Спасибо, Джордан, но это не сработало. Файл не содержит глобусов, но он содержит переменные среды, которые не определены в my .bashrc. Переменные env определены в сценарии оболочки среды, который я запускаю для различных настроек, специфичных для проекта. Я полагаю, тогда в этом может быть проблема? Как я могу заставить оболочку расширить переменные env, которые являются частью значений переменных?

3. Путем поиска файла с помощью . или source . Весь файл должен быть допустимой оболочкой.

4. Кстати, обратите внимание, что ${x[*]} это почти всегда неправильно: он объединяет все элементы списка в одну строку, а затем (поскольку он не имеет кавычек) запускает эту строку с помощью разделения слов и расширения глобуса. Если вы хотите расширить список в том виде, в каком он существует, используйте "${x[@]}"

5. @jordanm, x=( $(anything) ) как правило, считается антипаттером, согласно BashPitfalls #50 . Лучше всего не рекомендовать и не учить этому.