从 udev 规则文件向 shell 脚本传递参数

Posted

技术标签:

【中文标题】从 udev 规则文件向 shell 脚本传递参数【英文标题】:passing arguments to shell script from udev rules file 【发布时间】:2012-11-21 20:42:17 【问题描述】:

在规则文件中,通过传递参数“LABEL”和“DEVNAME”进行挂载来执行脚本

ACTION=="add", RUN+="/appmount/scripts/usb_mount.sh %EID_FS_LABEL %EDEVNAME"

在 usb_mount.sh 文件中将参数值打印为

echo "LABEL: $1 DEVNAME: $2" # this does not work reliably

一些设备的 LABEL 字段为空,因此 DEVNAME 被打印为标签。在 bash 脚本中,我们可以用双引号传递 args,即使 args 为空,它也能正常工作。

将 args 传递给 udev 规则的等价物是什么?

解决此问题的方法可能是切换参数的顺序。有什么靠谱的方法吗?

【问题讨论】:

【参考方案1】:

您应该能够使用单引号而不是您提到的双引号:

ACTION=="add", RUN+="/appmount/scripts/usb_mount.sh '%EID_FS_LABEL' '%EDEVNAME'"

注意:我没有对此进行测试。也许变量替换会在单引号内失败......

引用man udev关于“RUN”键的内容:

程序名和后面的参数用空格隔开。 单引号可用于指定带空格的参数。

【讨论】:

【参考方案2】:

只需设置和查询 udev 的 env,这里是检查系统是否正在运行 VMWare 的示例:

cat /etc/udev/rules.d/99-vmware.rules
KERNEL=="id", SUBSYSTEM=="dmi", ATTRsys_vendor=="VMware, Inc.", ENVVMWARE='defined'

udevadm info -e  | grep 'VMWARE='
E: VMWARE=defined

【讨论】:

以上是关于从 udev 规则文件向 shell 脚本传递参数的主要内容,如果未能解决你的问题,请参考以下文章

将 ATTRidVendor 作为 udev 脚本中的参数传递

[Shell]向shell脚本传递参数

从 Shell 脚本向 Python 传递参数

参数传递:shell脚本调用一个带参数的python函数

shell传递参数

Shell 传递参数