我又来了。今天我写了一个小脚本,应该在我的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) &
答案 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