2014-09-03 34 views
0

我想要一個方式腳本來通過沉默標誌在一個bash中,以便所有輸出將被定向到/dev/null,如果它存在如果不是,則返回到屏幕。Bash:重定向到屏幕或/ dev/null取決於國旗

我的劇本的MWE是:

#!/bin/bash 

# Check if silent flag is on.  
if [ $2 = "-s" ]; then 
    echo "Silent mode." 
    # Non-working line. 
    out_var = "to screen" 
else 
    echo $1 
    # Non-working line. 
    out_var = "/dev/null" 
fi 

command1 > out_var 

command2 > out_var 

echo "End." 

我打電話有兩個變量的腳本,第一個是不相關的,而第二個($2)是實際無聲標誌-s):

./myscript.sh first_variable -s 

顯然out_var線不工作,但他們給我想要的東西的想法:以直銷的方式的command1和輸出根據-s是否存在與屏幕或/dev/null

我該怎麼做?

+2

大約有'='殼任務沒有空格。假設你想要默認的標準輸出位置,如果你用'/ dev/stdout'替換''screen''並在重定向中使用'$ out_var',我相信你的腳本應該可以正常工作。 – 2014-09-03 02:21:30

+0

http://www.tldp.org/LDP/abs/html/io-redirection.html也是有趣的閱讀。 – 2014-09-03 02:30:29

+0

大提示@EtanReisner! – Gabriel 2014-09-03 11:43:02

回答

3

您可以使用裸體exec命令重定向當前程序,而無需啓動新程序。

因此,-s標誌可以用類似處理:

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

下完整的腳本顯示瞭如何做到這一點:

#!/bin/bash 

echo XYZZY 

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

echo PLUGH 

如果用-s運行它,你就會得到XYZZY但沒有PLUGH輸出(嗯,在技術上,你得到PLUGH輸出,但它的發送到/dev/null位桶)。

如果你運行它沒有-s,你會得到兩條線。

echo語句之前和之後的語句顯示exec正如所描述的那樣工作,只是簡單地改變當前程序的重定向而不是嘗試重新執行它。


順便說一句,我認爲你的意思是「篩選」是「以目前的標準輸出」,這可能如果它已經被重定向到是也可能不是實際的終端設備(例如別的地方)。如果你想要想要實際的終端設備,它仍然可以完成(例如使用/dev/tty),但這將是一個不尋常的要求。

+1

我提供了另一種觀點,但我認爲'exec'是OP的正確方法。但是,在更長的腳本中,exec可能會對管道產生令人驚訝的後果,或者如果想要將輸出發送回原始接收器。好答案! – 2014-09-03 02:23:26

1

有很多東西可能是錯誤的,你的腳本;我不會試圖猜測,因爲你沒有發佈任何實際的輸出或錯誤。

不過,也有幾件事情,可以幫助:

  1. 你需要弄清楚您的輸出是真的。標準輸出和標準錯誤是兩個不同的東西,重定向一個不一定會重定向另一個。

  2. 在bash中,你可以將輸出發送到的/ dev /標準輸出的/ dev /標準錯誤,所以你可能想嘗試這樣的:

    # Send standard output to the tty/pty, or wherever stdout is currently going. 
    cmd > /dev/stdout 
    
    # Do the same thing, but with standard error instead. 
    cmd > /dev/stderr 
    
  3. 標準錯誤重定向到標準輸出,然後將標準輸出發送到/dev/null。訂單在這裏重要。

    cmd 2>&1 > /dev/null 
    

可能還有其他的問題,你的腳本,但出於與Bash shell redirections問題GNU Bash的手冊是信息的權威來源。希望能幫助到你!

0

如果您不想重定向腳本中的所有輸出,則可以使用eval。例如:

$ fd=1 
$ eval "echo hi >$a" >/dev/null 

$ fd=2 
$ eval "echo hi >$a" >/dev/null 
hi 

請務必使用雙引號,這樣的變量被替換eval評估之前。

0

就你而言,你只需要將out_var = "to screen"更改爲out_var = "/dev/tty"即可。而且使用這樣command1 > $out_var(見「$」你所缺乏的)

我實現它像這樣

# Set debug flag as desired 
DEBUG=1 
# DEBUG=0 

if [ "$DEBUG" -eq "1" ]; then 
    OUT='/dev/tty' 
else 
    OUT='/dev/null' 
fi 

# actual script use commands like this 
command > $OUT 2>&1 

# or like this if you need 
command 2> $OUT 

當然,你也可以從一個命令行選項設置調試方式,請參閱How do I parse command line arguments in Bash?

而且你可以有多個調試或詳細級別這樣

# Set VERBOSE level as desired 
# VERBOSE=0 
VERBOSE=1 
# VERBOSE=2 

VERBOSE1='/dev/null' 
VERBOSE2='/dev/null' 

if [ "$VERBOSE" -gte 1 ]; then 
    VERBOSE1='/dev/tty' 
fi 

if [ "$VERBOSE" -gte 2 ]; then 
    VERBOSE2='/dev/tty' 
fi 

# actual script use commands like this 
command > $VERBOSE1 2>&1 

# or like this if you need 
command 2> $VERBOSE2