1

我又来了。今天我写了一个小脚本,它应该在我的 debian 环境中静默启动一个应用程序。简单如

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

4 回答 4

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 &"
于 2013-10-03T09:34:00.030 回答
2

您可以逐步应用它,而不是构建一个在末尾添加重定向的命令:

#!/bin/sh

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

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

exec $1

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

我删除了与号 (&),因为静音与在后台运行无关。exec如果它是您想要的,您可以将其添加回来(并删除最后一行的)。

exec在最后添加了它,因为它的效率略高。由于它是 shell 脚本的结尾,所以没有什么可做的,所以你也可以完成它,因此exec.

于 2013-10-03T09:55:23.617 回答
1

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

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

意味着您将输出重定向到某种垃圾,这就是您看不到任何东西的原因。

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

cmdLine='$1 >/dev/null' 
于 2013-10-03T09:14:19.787 回答
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
于 2013-10-03T10:05:52.767 回答