2015-10-20 118 views
0

我为我最喜欢的编辑器nedit写了一个简单的包装脚本。它将获取参数列表,并在一个窗口中打开所有非gzip文件,并将每个gzip文件,zcat到一个临时文件,并在单独的窗口中打开它们。但是,运行nedit会导致脚本等待,直到窗口关闭,即使我使用&nohup。我在这里错过了什么吗?Bash - 在后台运行程序仍然导致脚本等待

#!/bin/bash 

declare -a nongzipped 
for file in [email protected]; do 
    if file $file | grep -q gzip; then 
     timestamp=$(date +"%F_%T") 
     tempfile="tmp_$timestamp" 
     $(zcat $file > $tempfile) 
     $(nedit -background lightskyblue3 $tempfile &) 
     $(rm $tempfile) 
    else 
     nongzipped+=("$file") 
    fi 
done 

if [ ${#nongzipped[@]} -ne 0 ]; then 
    $(nedit ${nongzipped[@]} &) 
fi 
+2

您正在过度使用命令替换;它们仅用于捕获命令的输出,而不是简单地运行该命令。 – chepner

回答

4

由命令替换$(...)引起的外壳不能退出,直到它的后台作业完成。 (比较sleep &$(sleep &)。)无论如何你都不需要它们,所以只需将它们移除即可。

if file $file | grep -q gzip; then 
    timestamp=$(date +"%F_%T") 
    tempfile="tmp_$timestamp" 
    zcat $file > $tempfile 
    nedit -background lightskyblue3 $tempfile & 
    rm $tempfile 
else 
    nongzipped+=("$file") 
fi  
+0

我想我不理解何时使用反引号或命令替换。我的印象是,在shell脚本中,您需要使用反引号或命令替换来运行外部程序,例如'ls','rm'或'zcat'。 – jktstance

+0

不,你只需要它们,如果你想捕捉输出为一个字符串。例如,'result = $(some_command arg1 arg2)'将'some_command'的输出存储在变量'result'中,'some_command“$(other_command)''捕获'other_command'的输出作为参数到'some_command'。 ('some_command other_command',另一方面,会传递字符串“other_command”作为参数。) – chepner

1

真的需要$(command)在这里?此语法通常用于获取command的输出并将其分配给一个变量。这可能是你的脚本需要等待的原因。

你最好打电话给你的程序没有任何特殊的语法,只是program arg1 arg2 &

相关问题