用于静默启动应用程序的简单bash脚本

时间:2013-10-03 09:05:16

标签: bash

我又来了。今天我写了一个小脚本,应该在我的debian env中默默地启动一个应用程序。 轻松如

silent "npm search 1234556"

这有效,但根本没有。 正如你所看到的,我评论了我遇到麻烦的部分。

这一行:

$($cmdLine) &

不会隐藏应用程序输出,但是这个

$($1 >/dev/null 2>/dev/null) &

完美无缺。我错过了什么?非常感谢。

#!/bin/sh

# Daniele Brugnara
# October, 2013

# Silently exec a command line passed as argument

errorsRedirect=""

if [ -z "$1" ]; then
        echo "Please, don't joke me..."
        exit 1
fi

cmdLine="$1 >/dev/null"

# if passed a second parameter, errors will be hidden
if [ -n "$2" ]; then
        cmdLine="$cmdLine 2>/dev/null"
fi

# not working
$($cmdLine) &

# works perfectly
#$($1 >/dev/null 2>/dev/null) &

4 个答案:

答案 0 :(得分:2)

使用evil eval后续脚本将起作用:

#!/bin/sh

# Silently exec a command line passed as argument
errorsRedirect=""

if [ -z "$1" ]; then
   echo "Please, don't joke me..."
   exit 1
fi

cmdLine="$1 >/dev/null"

# if passed a second parameter, errors will be hidden
if [ -n "$2" ]; then
   cmdLine="$cmdLine 2>&1"
fi

eval "$cmdLine &"

答案 1 :(得分:2)

不是在最后添加重定向的命令,而是可以逐步应用它:

#!/bin/sh

if [ -z "$1" ]; then
    exit
fi

exec >/dev/null
if [ -n "$2" ]; then
    exec 2>&1
fi

exec $1

首先将shell脚本的stdout重定向到/ dev / null。如果给出第二个参数,它也会重定向shell脚本的stderr。然后它运行命令,该命令将从脚本继承stdout和stderr。

我删除了&符号(&),因为沉默与在后台运行无关。如果符合您的要求,您可以将其添加回去(并删除最后一行的exec)。

我最后添加了exec,因为效率稍高一些。因为它是shell脚本的结尾,所以没有什么可做的,所以你也可以完成它,因此exec

答案 2 :(得分:1)

&意味着你正在做多种任务,而

1 >/dev/null 2>/dev/null

意味着您将输出重定向到一种垃圾,这就是您没有看到任何内容的原因。

此外cmdLine="$1 >/dev/null"不正确,您应该使用'代替"

cmdLine='$1 >/dev/null' 

答案 3 :(得分:1)

您可以在var中构建命令行并在后台运行bash:

bash -c "$cmdLine"&

请注意,存储程序的输出(out / err)可能很有用,而不是将它们转换为null。 另外,为什么你需要errorsRedirect? 你甚至可以在最后添加一个等待,只是为了安全...如果你想......

#!/bin/sh

# Daniele Brugnara
# October, 2013

# Silently exec a command line passed as argument

[ ! $1 ] && echo "Please, don't joke me..." && exit 1
cmdLine="$1>/dev/null"
# if passed a second parameter, errors will be hidden
[ $2 ] && cmdLine+=" 2>/dev/null"
# not working
echo "Running \"$cmdLine\""
bash -c "$cmdLine" &
wait