Shell脚本:与& /&& / wait / sleep / pkill -HUP -P的复杂用法

时间:2015-02-01 06:28:22

标签: shell

我正在尝试了解此项目中的代码:https://github.com/benoitfragit/google2ubuntu/blob/master/record.sh

#!/bin/sh
# configuration file
CONFIGURATION="$HOME/.config/google2ubuntu/google2ubuntu.conf"

# default recording time
recording=5
if [ -f "$CONFIGURATION" ]; 
then
{
    # load the configuration
    . "$CONFIGURATION"

    # small security test
    if [ "$recording" = "" ];
    then
        recording=5
    fi
}
fi

# get the pid 
PID=$1
# kill the previous instance of rec to cascade commands
killall rec 2>/dev/null

# record during fixed seconds
( rec -r 16000 -d /tmp/voix_$PID.flac ) & pid=$!
( sleep "$recording"s && kill -HUP $pid ) 2>/dev/null & watcher=$!
wait $pid 2>/dev/null && pkill -HUP -P $watcher
exit 0;

我不明白这一点:. "$CONFIGURATION" # load the configuration运行.conf文件是什么样的加载?但它不是一个程序?

我也不明白最后五行。

( rec -r 16000 -d /tmp/voix_$PID.flac ) & pid=$! 

确定录制音频文件,将其保存到tmp / directory&什么? :)

( sleep "$recording"s && kill -HUP $pid ) 2>/dev/null & watcher=$!
wait $pid 2>/dev/null && pkill -HUP -P $watcher

我对这两行没有任何理解。

exit 0;

我认为这意味着“返回0”,它就像编程语言中的“返回True”。正确的吗?

1 个答案:

答案 0 :(得分:1)

.命令(在C shell中也称为sourcesource也被移植到Bash中),在其上下文中读取其参数中指定的文件目前的壳。这意味着文件中设置的任何变量都在当前shell中设置。

从概念上讲,登录shell会执行:

[ -f /etc/profile ] && . /etc/profile
[ -f $HOME/.profile ] && . $HOME/.profile

等。 (细节因shell而异)。

此机制用于您要显示的脚本中。请注意,包含的文件是通过$PATH找到的(如果名称中没有斜杠),但该文件不需要是可执行的(可读性就足够了)。


该行:

( rec -r 16000 -d /tmp/voix_$PID.flac ) & pid=$!

在子shell中运行rec命令,并在变量$pid中捕获子shell的PID。

( sleep "$recording"s && kill -HUP $pid ) 2>/dev/null & watcher=$!
wait $pid 2>/dev/null && pkill -HUP -P $watcher

第一行运行一个子shell,它睡眠$recording指定的时间,然后运行kill -HUP $pid以挂起先前在后台运行的rec命令。标准错误发送到/dev/null,PID在变量$watcher中捕获。

第二行等待$pid死亡,将错误重定向到/dev/null,当成功返回时,对pkill -HUP -P标识的进程执行$watcher。< / p>

因此,第一行设置了一个看门狗定时器,以确保rec不会持续太长时间。第二行等待rec进程死亡,并在看到它时杀死看门狗。

exit 0;

分号是多余的,但退出状态0表示成功,任何非零值(在1..255范围内)表示某种失败。另请参阅Exit codes bigger than 255 — possible?