Проблема, вероятно, заключается в специфическом форматировании вывода lsusb
:
% usbid=1d6b:0001
% lsusb -d $usbid | awk '{ print "/dev/bus/usb/" $2 "/" $4 }'
/dev/bus/usb/001/001:
Обратите внимание на дополнительное двоеточие в конце. К счастью, вы можете легко удалить его как в awk, так и в оболочке, вот пример awk:
% usbid=1d6b:0001
% lsusb -d $usbid | awk '{ a = $4; sub(/:$/, "", a); print "/dev/bus/usb/" $2 "/" a }'
/dev/bus/usb/001/001
Если вы используете GNU make, вы можете использовать синтаксис define
для многострочных -строковых переменных:
define message =
You can also include make macros like
$$@ = $@
in a multi-line variable
endef
help:; @ $(info $(message)) :
Играя с функциейvalue
и директивой export
, вы также можете включить в свой Makefile целый скрипт, который позволит вам использовать многострочную команду -без глобального включения .ONESHELL
:
define _script
echo SHELL is $SHELL, PID is $$
cat <<'EOF'
literally $SHELL and $$
EOF
endef
export script = $(value _script)
run:; @ eval "$$script"
даст
SHELL is /bin/sh, PID is 12434
literally $SHELL and $$
Простой ответ — «не по умолчанию». Но вы можете настроить GNU make, чтобы разрешить это, используя.ONESHELL:
Обычно каждая строка рецепта выполняется в отдельной оболочке. Что еще хуже, есть способ сделать многострочные команды -в make, используя \
в конце строки для продолжения. К сожалению, это \
также передается в оболочку , что менее проблематично для других команд, но для heredoc это действительно портит синтаксис.
Однако, если вы включите .ONESHELL:
, эта логика изменится, и команды будут выполняться в одной оболочке, что позволит ему работать:
.ONESHELL:
all:
cat << EOF
aaa
bbb
EOF
Имейте в виду, что это повлияет на работу Make. В частности, Make может не заметить сбой одной строки сборки, если за ней следуют другие. Обычно проверяется результат каждой строки, но с .ONESHELL:
make может видеть только результат всех строк.