2016-01-06 40 views
1

我發現了一個叫espeak的好命令。 它可以從標準輸入讀取並說出結果。如何在當前輸入的末尾插入管道和命令?

$ du -sh . | espeak 
$ ls -a | grep foobar | espeak 
etc 

無論如何,它工作正常,但我認爲把| espeak成一條線的每一次到底是不是有效的。 所以我想自動插入而不用手工輸入。 有沒有很好的方法來實現這一目標?

+0

在第二想到有一種辦法畢竟。將stdout(如果你想要的話)全局重定向到一個文件,然後從調試陷阱中發出'espeak'。 – 4ae1e1

+1

標記bash **或** zsh,不是兩個;它們是不同的shell,使用不同的語法。 –

回答

4

假設你也想看到的輸出,你可以這樣做:

exec > >(tee >(espeak)) 

重定向stdouttee過程,將一切的espeak過程中,以及在將其發送到控制檯或任何stdout之前發送到。 (對於那些一起在家裏以下,stdouttee進程尚未啓動時重定向,所以它仍然是相同的,因爲它是exec命令之前。)

有樂趣。

要關閉:

exec > /dev/tty 
+0

啊,使用exec看起來是最高效和最簡單的方式。謝謝! – moutend

0

在zsh中有一個插件accept-line當輸入線被接受時被觸發。用你自己,這樣你可以覆蓋默認小部件:

function accept-line 
{ 
    #here, add espeak to the current command 
    BUFFER=$BUFFER" | espeak" 

    # to be clear, if the input string was 'ls -l', 
    # now it is 'ls -l | espeak', and this is the command that will be executed 

    # trigger the real widget to accept the line and run the input buffer 
    zle .accept-line 
} 
# register your new accept-line widget to replace the builtin one 
zle -N accept-line 

在這裏,我使用的名稱accept-line,但如果你希望把你的覆蓋功能my_superOverride你可以在與最終替代默認控件:

zle -N accept-line my_superOverride 

唯一的缺點是,對於像do something ; do something else命令,將只講do something else輸出..