Terminal

zsh 可以訪問上次執行程序的標準輸出嗎?

  • November 16, 2021

我經常使用findorlocate來查找路徑。

(~) locate foobar.mmpz
/home/progo/lmms/projects/foobar.mmpz

下一步通常是打開或以其他方式操作文件。在像上面這樣的快樂情況下,我可以這樣做:

(~) ls `!!`
ls `locate foobar.mmpz`
/home/progo/lmms/projects/foobar.mmpz

但是當有很多行輸出時,沒有人會太高興,其中一些可能不是路徑或其他類似的東西。此外,重新執行可能浪費的命令也不是那麼優雅。

有沒有辦法連接 zsh 以將標準輸出儲存到數組中以供以後操作?畢竟,將流重定向到使用者是 shell 的工作。我認為它可以將前 N 行和最後 N 行儲存在一個變數中以供以後立即使用,例如$?和其他。

好的,這很酷:https ://unix.stackexchange.com/a/59704/5674 。我現在詢問 zsh 的專有技術(並將程式碼移植到 zsh),以便在每個執行行之後進行這種擷取。

大多數終端仿真器沒有從螢幕擷取輸出的功能。我似乎記得 xterm(“參考”終端仿真器)的作者說它很難實現。即使有可能,shell 也必須跟踪最後一次提示的位置。

因此,除非您使用特定於終端的手動機制,例如在 xterm 中使用滑鼠或在 Screen 中使用鍵盤進行複制粘貼,否則您將不必再次執行該命令。

shell 自動擷取命令的輸出是非常不切實際的,因為它無法區分具有復雜終端和使用者互動的命令與僅輸出可列印字元的命令。

您可以重新執行該命令並擷取其輸出。每一個都有不同的方法。要重新執行該命令,您可以使用:

  • !!歷史替換——最方便輸入;
  • fc -e -,可以在函式中使用。

要擷取輸出,您可以使用命令替換或類似以下的函式:

K () {
 lines=("${(f@)$(cat)}")
}
!! |K

lines會將數組設置為通過管道傳輸到其中的命令的輸出。

引用自:https://unix.stackexchange.com/questions/117054