Comment # 24 on bug 1051465 from
(In reply to Franck Bui from comment #23)
> Couldn't we try to do the string mangling in the rule file directly instead,
> something like that instead ?
> 
> > IMPORT{program}="/bin/sh -c 'ID_SERIAL=$env{ID_SERIAL}; echo ID_SERIAL_TRUNCATED=${ID_SERIAL:0:16}'
> 
> The shell expression looks simple enough to be embedded in the rule.

That doesn't work because you can't expand ID_SERIAL within the shell.
e.g. the following rule:

KERNEL=="nvme*", ENV{DEVTYPE}=="disk", IMPORT{program}="/bin/sh -c
'ID_SERIAL=$env{ID_SERIAL}; echo ID_SERIAL_TRUNCATED=${ID_SERIAL:0:16}'"

leaves ID_SERIAL_TRUNCATED empty:

-->
IMPORT '/bin/sh -c 'ID_SERIAL=; echo ID_SERIAL_TRUNCATED=${ID_SERIAL:0:16}''
/usr/lib/udev/rules.d/60-persistent-storage-compat.rules:47
starting '/bin/sh -c 'ID_SERIAL=; echo ID_SERIAL_TRUNCATED=${ID_SERIAL:0:16}''
'/bin/sh -c 'ID_SERIAL=; echo ID_SERIAL_TRUNCATED=${ID_SERIAL:0:16}''(out)
'ID_SERIAL_TRUNCATED='
Process '/bin/sh -c 'ID_SERIAL=; echo ID_SERIAL_TRUNCATED=${ID_SERIAL:0:16}''
succeeded.
--<

because ID_SERIAL is not present in the shell environment.
But passing an udev variable/attribute to a shell script works, e.g. the rule:

KERNEL=="nvme*", ENV{DEVTYPE}=="disk", ATTRS{model}=="?*",
IMPORT{program}="/tmp/echo_args.sh $attr{model}"

using a script like:

--> 
# cat /tmp/echo_args.sh 
#!/bin/sh

IN=${@/ /_}
OUT=$(echo ${IN/ /_})
echo ID_MODEL_TRUNCATED=${OUT:0:16}
--<

produces the correct output:

-->
IMPORT '/tmp/echo_args.sh INTEL SSDPEDMD800G4'
/usr/lib/udev/rules.d/60-persistent-storage-compat.rules:50
starting '/tmp/echo_args.sh INTEL SSDPEDMD800G4'
'/tmp/echo_args.sh INTEL SSDPEDMD800G4'(out)
'ID_MODEL_TRUNCATED=INTEL_SSDPEDMD80'
Process '/tmp/echo_args.sh INTEL SSDPEDMD800G4' succeeded.
--<


You are receiving this mail because: