Использовать переменную env в целевом файле makefile

Вам нужно добавить -w, чтобы соответствовать только целым словам. Поскольку у вас нет шаблонов, а есть фиксированная строка, вы можете добавить -F.

$ grep -wFf file1 file2
chr10 31120 A T Descriptions

Другим хорошим инструментом для этого задания является join, но по умолчанию он печатает сначала поле join, а затем остальные поля, что может вам не нравиться:

$ join -2 2 file1 file2
31120 chr10 A T Descriptions

-2 2означает, что поле соединения для второго файла равно 2.

Имейте в виду, что для joinвходные данные должны быть лексически отсортированы по полю соединения. Если они еще не отсортированы и если ваша оболочка поддерживает подстановку процессов (AT&T ksh, zsh, bash ), вы можете сделать:

join -2 -2 <(sort -k1,1 file1) <(sort -k2,2 file2)
0
20.09.2021, 18:45
1 ответ

Знаки доллара используются make, поэтому вам нужно экранировать их, если вы хотите, чтобы они передавались оболочке. Вы делаете это, удваивая их.

test:
        @bash -c "\
        echo 'need to run some program before assigning env variable';\
        echo 'The make CC variable is set to :${CC}:';\
        export TEST=\"\$$(date)\";\
        echo 'printing env';\
        echo \$${TEST};\
        "

testwithout:
        @echo 'need to run some program before assigning env variable';\
        echo 'The make CC variable is set to :${CC}:';\
        export TEST="$$(date)";\
        echo 'printing env';\
        echo $${TEST};

Другие проблемы вызваны двойной интерпретацией строки. makeберет рецепт, преобразует обратную косую черту последовательности в новую строку и передает результат оболочке для выполнения. Поскольку вы используете двойные кавычки для своего bash -c ".... ", это приводит к тому, что оболочка расширяет знаки доллара, поэтому вы получаете `bash -c "echo 'need...' ;export TEST=Mon Sep...; эхо ;". Добавление некоторых символов обратной косой черты защищает знаки доллара и внутренние двойные кавычки.

Вероятно, нет необходимости использовать bash -c. как показано в тесте без цели. Вам все равно нужно построить команду как одну строку.Gnu make имеет возможность .ONESHELLиспользовать одну оболочку для выполнения рецепта, а не одну оболочку на логическую строку, что позволяет избежать искажений.

1
20.09.2021, 22:09

Теги

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