我發現了一個叫espeak的好命令。 它可以從標準輸入讀取並說出結果。如何在當前輸入的末尾插入管道和命令?
$ du -sh . | espeak
$ ls -a | grep foobar | espeak
etc
無論如何,它工作正常,但我認爲把| espeak
成一條線的每一次到底是不是有效的。 所以我想自動插入而不用手工輸入。 有沒有很好的方法來實現這一目標?
我發現了一個叫espeak的好命令。 它可以從標準輸入讀取並說出結果。如何在當前輸入的末尾插入管道和命令?
$ du -sh . | espeak
$ ls -a | grep foobar | espeak
etc
無論如何,它工作正常,但我認爲把| espeak
成一條線的每一次到底是不是有效的。 所以我想自動插入而不用手工輸入。 有沒有很好的方法來實現這一目標?
假設你也想看到的輸出,你可以這樣做:
exec > >(tee >(espeak))
重定向stdout
到tee
過程,將一切的espeak
過程中,以及在將其發送到控制檯或任何stdout
之前發送到。 (對於那些一起在家裏以下,stdout
爲tee
進程尚未啓動時重定向,所以它仍然是相同的,因爲它是exec
命令之前。)
有樂趣。
要關閉:
exec > /dev/tty
啊,使用exec看起來是最高效和最簡單的方式。謝謝! – moutend
在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
輸出..
在第二想到有一種辦法畢竟。將stdout(如果你想要的話)全局重定向到一個文件,然後從調試陷阱中發出'espeak'。 – 4ae1e1
標記bash **或** zsh,不是兩個;它們是不同的shell,使用不同的語法。 –