2015-09-24 35 views
2

通常在unix系統上,可以通過將STDIN和/或STDERR重定向到文件或/ dev/null來禁止命令輸出。但是,如果您需要通過bash腳本中的STDIN將內容傳遞給管道命令?如何安全地禁止命令輸出?

下面的例子應該明確是什麼意思。不過這只是一個例子 - 我並不是在尋找針對這個命令的解決方案,而是針對這種情況。令人遺憾的是,在許多情況下,您希望在腳本中抑制輸出,但當命令沒有切換以其他方式提交信息時,需要通過STDIN傳遞內容。

我的「問題」是我編寫了一個函數來執行具有適當錯誤處理的命令,並且我希望將執行的命令產生的所有輸出重定向到日誌文件。

例題:

[18:25:35] [V] [email protected]:~# echo 'test' |read -p 'Test Output' TMP &>/dev/null 
[18:25:36] [V] [email protected]:~# echo $TMP 

[18:25:36] [V] [email protected]:~# 

如何解決我的問題,任何想法?

+3

'禁用了javascript -s lastpipe'或使用PROC ess替換即'read -p'測試輸出'TMP&gt;/dev/null <(echo'test')' – user000001

+0

即使'shopt -s lastpipe && echo'test'| read -p'測試輸出'TMP&>/dev/null'留下一個空的'$ TMP'。令人高興的是,您的命令示例甚至可以在'&>/dev/null'中使用,因此它是該函數的一個選項。 – David

+0

請注意,'lastpipe'選項僅適用於非交互式shell。如果你在終端上測試它不會工作 – user000001

回答

4

user000001在說什麼是在bash管道中的所有命令都是在子殼中執行的。因此,當處理read命令的子shell退出時,$ TMP變量也會消失。你必須考慮到這一點,並且:

  1. 避免子shell(以上評論給出的實例)
  2. 做變量的所有工作在同一個子shell

    echo test | { read value; echo subshell $value; }; echo parent $value 
    
  3. 使用不同的殼

    $ ksh -c 'echo test | { read value; echo subshell $value; }; echo parent $value' 
    subshell test 
    parent test 
    
+0

@ user000001提到的**進程替換**做了訣竅 - 'read -p'測試輸出'TMP <<(echo'test')&>/dev/null'完全按照我的意願工作。學習從不停止。 :) – David

+0

我剛剛意識到這在某些情況下不會幫助我,但這與答案無關。即當通過我的函數向文件回送內容時,輸出會完全重定向到日誌。但是我意識到在這種情況下將'2> $ {LOGFULL}#'放在'「$ {2}」'末尾是可行的。^^ – David