(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. --<