对于linux来说,我相对来说还是个新手,因为我已经从Windows转到了一个无头媒体中心。我正在运行KODIBuntu。
我正在努力实现一个自动翻录系统,以备份我的硬拷贝媒体收集。我喜欢linux的概念:‘如果你能梦想它,你就能实现它’。
我的目标是实现的是,一个光盘被放入驱动器和脚本撕裂内容到我的驱动器。
例如,磁盘插入的->媒体类型决定了->正确的撕裂脚本运行
通过谷歌搜索,我使用了很多有用的网页来创建脚本,这些脚本本身就可以完成翻版工作。我已经做了大量的阅读,并被指向使用‘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运行撕裂脚本1,如果DVD运行撕裂脚本2,如果蓝光运行撕裂脚本3其他没有插入cd。
我做了一些更多的googling,并在不同的地方找到了一些代码,这些代码使用环境变量来工作。然而,从google的进一步信息来看,这些变量似乎是在UDEV引用之前没有定义的。
我通常的方法是构建一行代码,在终端中运行,如果我得到了我想要的,那么我就把所有的行放在一个shell脚本中?
我正在处理的代码如下所示。我认为,从逻辑上讲,如果我能够让脚本输出它认为是在一个文件/log驱动器中的东西,那么一半的战斗就会胜利,我可以用它来代替脚本位置来执行相应的撕裂任务……有什么想法吗,伙计们,为什么这不像我想的那样有效?
我用这些网页从以下网站获得信息:
这是我的代码:
#!/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发布于 2015-05-05 10:16:18
变量在任何地方都没有设置。
通常这是在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的区别。我没有任何蓝光检查的东西。
发布于 2015-05-15 16:52:42
解决了!
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用撕取脚本的路径替换回波行应该会导致自动无头系统的出现。
在ubuntu论坛上,Jim获得了代码,Keith_Helms和blm_ubunet用于posix代码,并更正了if语句和变量指针在这里的Ixer
希望这能有所帮助
詹姆斯
https://stackoverflow.com/questions/29973884
复制相似问题