#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 . Лучше всего не рекомендовать и не учить этому.