2013-10-03 66 views
1

這裏我再次。今天我寫了一個腳本,該腳本應該在我的debian env中默默啓動一個應用程序。 簡單簡單的bash腳本默默啓動應用程序

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

爲什麼你認爲'&'確實stdout或stderr的任何重定向? – Jens

+0

我不這麼認爲。 cmdLine具有輸出重定向。我做錯了嗎? –

+0

'&'在命令的末尾只能在後臺運行該命令,但仍然該命令的stdout和stderr轉到tty。 – anubhava

回答

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 &" 
+0

謝謝,這是一個可行的解決方案。我可以問你爲什麼我被迫在這種情況下使用* eval *嗎?非常感謝。 –

+1

這是因爲'>/dev/null 2>&1'實際上並不是你的命令的一部分,而是用於stdout和stderr重定向的特殊shell構造。 – anubhava

+1

你可以用'bash -c「替換eval $ cmdLine&」'也 – anubhava

1

&意味着你正在做排序的多任務而

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

意味着你的輸出重定向到一個垃圾分類的,這就是爲什麼你看不到任何東西。

此外cmdLine="$1 >/dev/null"不正確,你應該使用'而不是"

+0

這就是我想達到的=)。問題是爲什麼$(cmdLine)不起作用,但最後一條命令行。 –

+0

在末尾發出帶&符號的命令在後臺運行命令,但輸出仍然傳送到當前shell進程。 將'1'和'2'重定向到'/ dev/null'將所有輸出(標準*和*錯誤)發送到「無處」,因此進行無聲操作。如果要檢測故障,您可能需要考慮通過「tee」管道至少發生錯誤,並將其記錄到日誌中。 – Raad

+1

是的,我提前輸入=/ – Raad

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

+0

非常清楚。我想要做的是「開槍和忘記」,所以必須是:)感謝這個解決方案。 –

+0

這是*解決方案。如其他地方所建議的那樣需要「eval」。 +1。 – devnull

1

,你可以建立你的命令行中的一個變種,並用它在後臺運行一個bash:

bash -c "$cmdLine"& 

注意,這可能是存儲程序的輸出(輸出/錯誤)是有用的,而不是把它們放在空白處。 另外,你爲什麼需要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 
+0

好的「壓縮」版本:) –

相關問題