Решение mikeserv хорошее, но он не прав в том, что fn
передается строке trap
$LINENO
при выполнении ловушки. Вставьте строку перед trap ...
и вы увидите, что fn
на самом деле всегда передается 1
, независимо от того, где была объявлена ловушка.
PS4='DEBUG: $LINENO : ' \
bash -x <<\EOF
echo Foo
trap 'fn "$LINENO"' EXIT
fn() { printf %s\\n "$LINENO" "$1"; }
echo "$LINENO"
exit
EOF
DEBUG: 1 : echo Foo
Foo
DEBUG: 2 : trap 'fn "$LINENO"' EXIT
DEBUG: 4 : echo 4
4
DEBUG: 5 : exit
DEBUG: 1 : fn 1
DEBUG: 3 : printf '%s\n' 3 1
3
1
Поскольку первый аргумент ловушки, fn "$LINENO"
, заключен в одинарные кавычки, $LINENO
получает расширение, если и только когда EXIT сработал и поэтому должен расшириться до fn 5
. Так почему же этого не происходит? На самом деле так и было, вплоть до bash-4.0, когда он был намеренно изменен таким образом, что $LINENO сбрасывается в 1, когда срабатывает ловушка, и поэтому расширяется до fn 1
. [источник] Однако для ловушек ERR сохраняется оригинальное поведение, вероятно, потому что часто что-то вроде trap 'echo "Error at line $LINENO"'. ERR
используется.
#!/bin/bash
trap 'echo "exit at line $LINENO"' EXIT
trap 'echo "error at line $LINENO"' ERR
false
exit 0
error at line 5
exit at line 1
проверено с GNU bash, версия 4.3.42(1)-release (x86_64-pc-linux-gnu)
Сразу после публикации этого вопроса я нашел ответ на StackExchange. Вместо pmount LABEL
мне нужно использовать udiskctl mount -b BLOCKDEVICE
. Замените это в сценарии и адаптируйте правило udev, и оно заработает.