Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用UDEV和脚本确定光学媒体类型(音频CD、DVD、蓝光)_Linux_Ubuntu_Sh_Udev - Fatal编程技术网

Linux 使用UDEV和脚本确定光学媒体类型(音频CD、DVD、蓝光)

Linux 使用UDEV和脚本确定光学媒体类型(音频CD、DVD、蓝光),linux,ubuntu,sh,udev,Linux,Ubuntu,Sh,Udev,我对linux比较陌生,已经从Windows切换到了无头媒体中心。我在经营科迪班图 我正在尝试实现一个自动翻录系统来备份我的硬拷贝媒体收藏。我喜欢linux的概念,即“如果你能梦想它,你就能实现它” 我的目标是将一张光盘放入驱动器,脚本将内容撕入驱动器 e、 g插入光盘->确定介质类型->运行正确的翻录脚本 我通过谷歌搜索使用了很多有用的网页来创建脚本,这些脚本本身就能完成翻录工作。我读了很多书,有人指出要使用“HAL”……然后我发现他的函数已经被弃用,并被udev取代。我读了很多书,了解了如何

我对linux比较陌生,已经从Windows切换到了无头媒体中心。我在经营科迪班图

我正在尝试实现一个自动翻录系统来备份我的硬拷贝媒体收藏。我喜欢linux的概念,即“如果你能梦想它,你就能实现它”

我的目标是将一张光盘放入驱动器,脚本将内容撕入驱动器

e、 g插入光盘->确定介质类型->运行正确的翻录脚本

我通过谷歌搜索使用了很多有用的网页来创建脚本,这些脚本本身就能完成翻录工作。我读了很多书,有人指出要使用“HAL”……然后我发现他的函数已经被弃用,并被udev取代。我读了很多书,了解了如何使用UDEV,并创建了以下规则,通过直接链接到翻录脚本,我已经证明了这些规则是有效的

    ACTION=="change", SUBSYSTEMS=="scsi", KERNEL=="s[rg][0-9]*", ATTRS{vendor}=="TSSTcorp", MODE="0660", GROUP="optical", RUN+="/home/jlivin25/myscripts/DiscTypeTest.sh"
我意识到我需要一个中间脚本来完成确定光媒体类型的“工作”。进一步的阅读让我相信我需要使用某种“如果”语句

如果插入光盘 然后 如果音频cd运行rip脚本1 如果DVD运行rip脚本2 如果蓝光运行rip脚本3 否则没有插入cd

我做了更多的谷歌搜索,在不同的地方找到了一些使用环境变量工作的代码。然而,从谷歌的进一步信息来看,这些变量在被UDEV引用之前似乎没有定义

我通常的方法是构造一行代码,在终端中运行,如果我得到了我想要的,那么我把所有的代码都放在一个shell脚本中

下面是我目前正在编写的代码。我认为,从逻辑上讲,如果我能让脚本将它认为在驱动器中的内容输出到一个文件/日志中,就可以赢得一半的战斗,我可以用它来代替执行相应的翻录任务的脚本位置。。。大家有什么想法,为什么这不是我想要的吗

我使用这些页面从以下位置获取信息:

这是我的密码:

#!/bin/bash
#
set -eu
#
# code below is derived from work by JimVanns, thanks
# https://github.com/jvanns/htpc/blob/master/dsc-trg-q
#
#
###########################################################################
###                        DEFINE VARIABLES HERE                        ###
### $HOME DOES NOT NEED DEFINING AS IT SEEMS TO BE BUILT INTO BASH FROM ###
###   WHAT POSTS I HAVE READ RELATING TO USING WHAT I THINK ARE UDEV    ###
###  ENVIRONMENTAL VARIABLES E.G. $ID_CDROM_MEDIA_CD DO NOT APPEAR TO   ###
###    NEED DEFINING THEMSELVES, ALSO PART OF BASH OR LINUX COMMAND     ###
###                      STRUCTURE CALLED BY BASH?                      ###
###########################################################################
#
MEDIA=
#
##############################################################################
### LEFT IN SO AS TO ALTER AS LITTLE AS POSSIBLE, I HAVE READ THAT DELAYS  ###
###  OFTEN IRON OUT KINKS IN CODE,  PLUS ALSO FOUND IT USEFULL TO ALLOW A  ###
###    SMALL DELAY FOR CD-DRIVE TO DO ITS THING AFTER PUTTING DISK IN      ###
##############################################################################
#
sleep 2
#
mkdir -p $HOME/myscripts/scriptlogs
#
#
if [ "$ID_CDROM_MEDIA_BD" = "1" ]
then
    MEDIA=bluray
    (
    echo "$MEDIA" >> $HOME/myscripts/scriptlogs/DiscTypeTest.log
    ) &
if [ "$ID_CDROM_MEDIA_DVD" = "1" ]
then
    MEDIA=dvd
    (
    echo "$MEDIA" >> $HOME/myscripts/scriptlogs/DiscTypeTest.log
    ) &
elif [ "$ID_CDROM_MEDIA_CD" = "1" ]
then
    MEDIA=cdrom
    (
    echo "$MEDIA" >> $HOME/myscripts/scriptlogs/DiscTypeTest.log
    ) &
fi

变量不在任何地方设置

通常这是在udev启动规则中设置的(在
/usr/lib/udev/rules.d/
中),看起来有点像

# ID_CDROM_MEDIA_BD = Bluray
# ID_CDROM_MEDIA_DVD = DVD
# ID_CDROM_MEDIA_CD = CD
SUBSYSTEM=="scsi", KERNEL=="sr0", ENV{ID_CDROM_MEDIA_BD}=="1", RUN+="/home/user/ripping_script.sh"
由于
udev
事先不知道介质类型,因此手动将其设置为环境变量。但是,由于您希望在某些条件下自动启动不同的脚本,因此这是没有用的

但是,您也可以在翻录脚本中确定和设置mediatype变量:

首先安装cdtool,它可以为您提供有关音频CD的一些信息(使用
cdir
)。
sudo-apt-get-install-cdtool

将以下内容添加到脚本的开头:

#!/bin/bash
# ripping_script.sh

CDDVD=`cdir -vd /dev/sr0  2>&1 |grep -q "no_disc" || echo "cd"`

if [ $CDDVD ]; then
 ID_CDROM_MEDIA_CD=1
 echo "CD detected" >> $HOME/myscripts/scriptlogs/rip.log  
else
 ID_CDROM_MEDIA_DVD=1         
 echo "DVD detected" >> $HOME/myscripts/scriptlogs/rip.log 
fi


# ... your rippingscript here 
/dev/sr0
很可能是您的cd/dvd

这只是audioCD和DVD之间的区别。我没有测试用的蓝光材料

解决了

Udev规则是这样的

# ID_CDROM_MEDIA_BD = Bluray
# ID_CDROM_MEDIA_DVD = DVD
# ID_CDROM_MEDIA_CD = CD
ACTION=="change", SUBSYSTEMS=="scsi", KERNEL=="s[rg][0-9]*",  ATTRS{vendor}=="TSSTcorp", ENV{ID_CDROM}=="?*", MODE="0660", GROUP="optical", RUN+="/usr/local/bin/DiscTypeTest3.sh"
触发翻录脚本的脚本如下所示:

#!/bin/bash
# ID_CDROM_MEDIA_BD = Bluray
# ID_CDROM_MEDIA_DVD = DVD
# ID_CDROM_MEDIA_CD = CD
MEDIA=
if [ $ID_CDROM_MEDIA_DVD = "1" ]
   then
   MEDIA=dvd
   (
   echo "$MEDIA" >> "/var/log/DiscTypeTest.log"
   ) &
elif [ $ID_CDROM_MEDIA_CD = "1" ]
    then
    MEDIA=cdrom
    (
    echo "$MEDIA" >> "/var/log/DiscTypeTest.log"
    ) &
fi
(set -o posix ; set) > "/var/log/DiscTypeTestVariables.log"
当插入音频cd后再插入dvd时,这将导致以下输出到日志文件

cdrom
cdrom
dvd
dvd
将回音线替换为翻录脚本的路径应可根据需要自动生成无头系统

Jim Vanns的代码、Keith_Helms和blm_ubunet在ubuntu论坛上的posix代码以及对if语句和Ixer变量指针的更正都值得称赞

希望这有帮助


James

链接不起作用。您好,非常感谢您抽出时间回答。我一定会尝试你的建议,看看它是否能给我一个有用的结果,我不会使用这个工具。坚持我的第一篇帖子,你知道为什么环境变量对我不起作用吗?或者甚至如何测试哪些不起作用?环境变量没有设置。我更新了答案,包括它。谢谢,我真的很感谢你的解释…我想我已经开始看到曙光了。是不是我需要稍微调整一下我的思维,这样我就有了三条udev规则。假设80-bluray.rule、81-dvd.rule和82-cd.rule,然后使用您的示例相应地填充udev规则。所以规则80将是
SUBSYSTEM==“scsi”,KERNEL==“sr0”,ENV{ID\u CDROM\u MEDIA\u BD}==“1”,RUN+=“/home/user/BLURip.sh”
规则81将是
SUBSYSTEM==“scsi”,KERNEL==“sr0”,ENV{ID\u CDROM MEDIA\u DVD}==“1”,RUN+=“/home/user/DVDRip.sh”
等等,但是没有。如果你这样做,那么每次你把cd放入设备时,所有3条规则都会开始,所以这不是你想要的。(但是,如果您有3个不同的专用驱动器,您可以这样做,但还必须设置sr0、sr1、sr2)。只需将我的代码放在脚本的开头,就可以设置媒体类型的正确变量(
ID\u CDROM\u MEDIA\u DVD
ID\u CDROM\u MEDIA\u CD
).ahhh我想我明白了…所以像往常一样,shebang然后
#ID#CDROM#MEDIA#DVD=DVD#ID#CDROM#MEDIA#u CD=CD
,然后是脚本的其余部分以及注释掉的变量,确保它们可供脚本使用。。。今晚我要试试这个。谢谢