2010-04-08 135 views
2

对不起,如果这更适合在serverfault,但我认为它学习更多的东西在编程方面。Bash变量杀死脚本执行

我有一些代码,即将进行的/etc/rc.local检测什么类型的触摸屏显示器的插入和启动X.这里之前更改了xorg.conf中是一个小片段:

CURRENT_MONITOR=`ls /dev/usb | grep 'egalax_touch\|quanta_touch'` 
case $CURRENT_MONITOR in 
'') 
    CURRENT_MONITOR='none' 
    ;; 
esac 

如果其中一个触摸屏被插入,它就可以正常工作。如果有其他监视器插入,则停在“CURRENT_MONITOR =​​”。

为了测试我触摸了两个文件。在创建CURRENT_MONITOR之前创建一个,在CURRENT_MONITOR之后创建一个,仅创建之前创建的文件。

我不是bash程序员,所以这可能是非常明显的东西。

+1

尝试用'-x'参数运行脚本得到想象一下发生了什么 – jschmier 2010-04-08 18:33:29

回答

2

编辑:下面的答案实际上并不正确。正确的解决方案是在评论中:脚本包括set -e,所以一个失败的命令会终止脚本,并且在grep中没有插入任何监视器都会失败的情况。


如果CURRENT_MONITOR包含空格,那么你的case语句会变成(说)

case monitor1 monitor2 in 

这是一个语法错误。你需要引用变量:

case "$CURRENT_MONITOR" in 
'') 
    CURRENT_MONITOR='none' 
    ;; 
esac 
+0

尽管引用看起来不错,它甚至在它成为该案件声明之前仍然失败。 – Kyle 2010-04-08 18:31:57

+1

对不起,我误读了;如果它甚至没有得到案件陈述,那么引用不会帮助你。 也许使用'exec 2>/path/to/file',然后使用'set -x',就像jschmier写的那样,可以帮助你追踪这个问题。 虽然看起来很奇怪。 一个想法:你没有任何机会让'set -e'生效,对吗?这将使脚本在第一次失败时退出,如果没有插入任何监视器,则grep将失败。 – 2010-04-08 18:45:40

+0

事实证明,这是 - é做它和grep失败。我知道我现在需要做什么!非常感谢。 – Kyle 2010-04-08 19:03:23

0
CURRENT_MONITOR=`ls /dev/usb | grep 'egalax_touch\|quanta_touch'` 
echo $CURRENT_MONITOR | od -xa > some_file 
# This will let you see what is in the var that is failing, even if it has funky bytes in it. 
# some_file could be /dev/console or you could pipe it into logger or you could use tee and do both 
case $CURRENT_MONITOR in 
'') 
    CURRENT_MONITOR='none' 
    ;; 
esac 
1

我相信引用变量将解决您的问题:如果该目录为空

case "$CURRENT_MONITOR" in 

,不带引号这句话的计算结果为:

case in 

这是一个语法错误,会导致您的脚本中止。你是否在某处捕捉到了stderr。如果是的话,很可能你会看到:

bash: syntax error near unexpected token `''' 

此外,你应该避免parsing ls

for i in /dev/usb/* 
do 
    case i in 
     *egalax_touch*) 
... 

但是,你不显示您的完整case声明。如果这一切你用它做,那么为什么不:

if [[ -z $CURRENT_MONITOR ]]; then $CURRENT_MONITOR='none'; fi 

[[ ${CURRENT_MONITOR:=none} ]]  # assigns a default if null or unset 

: ${CURRENT_MONITOR:=none} 
+0

我喜欢for循环。感谢您向我展示这件事! – Kyle 2010-04-09 18:36:53