Bash-在后台运行程序仍然会导致脚本等待

Bash-在后台运行程序仍然会导致脚本等待,bash,Bash,我为我最喜欢的编辑器nedit编写了一个简单的包装器脚本。它将获取一个参数列表,并在一个窗口中打开所有非gzip文件,它将获取每个gzip文件,并将它们转换为一个临时文件,然后在单独的窗口中打开这些文件。但是,运行nedit会导致脚本等待窗口关闭,即使我使用&或nohup。我是不是遗漏了什么 #!/bin/bash declare -a nongzipped for file in $@; do if file $file | grep -q gzip; then ti

我为我最喜欢的编辑器nedit编写了一个简单的包装器脚本。它将获取一个参数列表,并在一个窗口中打开所有非gzip文件,它将获取每个gzip文件,并将它们转换为一个临时文件,然后在单独的窗口中打开这些文件。但是,运行
nedit
会导致脚本等待窗口关闭,即使我使用
&
nohup
。我是不是遗漏了什么

#!/bin/bash

declare -a nongzipped
for file in $@; 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
您真的需要这里的
$(命令)
?此语法通常用于获取
命令的输出并将其分配给变量。这可能就是脚本必须等待的原因

您最好在不使用任何特殊语法的情况下调用您的程序,只需
程序arg1 arg2&

此处是否确实需要
$(命令)
?此语法通常用于获取
命令的输出并将其分配给变量。这可能就是脚本必须等待的原因


您最好在不使用任何特殊语法的情况下调用您的程序,只需
程序arg1 arg2&

命令替换所导致的shell在后台作业完成之前无法退出。(将
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    

在后台作业完成之前,由命令替换
$(…)
生成的shell无法退出。(将
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    

您过度使用命令替换;它们只是捕获命令输出所必需的,而不是简单地运行命令;它们只是捕获命令的输出所必需的,而不是简单地运行命令。我想我不知道什么时候使用反勾号或命令替换。我的印象是,在shell脚本中,您需要使用反勾号或命令替换来运行外部程序,如
ls
rm
、或
zcat
。不,只有当您想将输出捕获为字符串时才需要它们。例如,
result=$(some_command arg1 arg2)
some_command
的输出存储在变量
result
中,而
some_command“$(other_command)”
捕获
other_command
的输出,用作
some_command
的参数。(
some_command other_command
,另一方面,会传递文本字符串“other_command”作为参数。)我想我不明白什么时候使用反勾号或命令替换。我的印象是,在shell脚本中,您需要使用反勾号或命令替换来运行外部程序,如
ls
rm
、或
zcat
。不,只有当您想将输出捕获为字符串时才需要它们。例如,
result=$(some_command arg1 arg2)
some_command
的输出存储在变量
result
中,而
some_command“$(other_command)”
捕获
other_command
的输出,用作
some_command
的参数。(
另一方面,some_command other_command
将传递文本字符串“other_command”作为参数。)