我正在尝试了解此项目中的代码: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”。正确的吗?
答案 0 :(得分:1)
.
命令(在C shell中也称为source
,source
也被移植到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?