Shell

我如何將所有這些“管道”到 xclip 保留換行符

  • March 29, 2021

因此,我在報告錯誤時為系統資訊創建了這個方便的小命令。

alias clip="xclip -selection clipboard -in"
alias bug="echo $(lsb_release -irs && uname -r && free --human --giga) | clip"

問題是/是雙重的,當我沒有這樣做時,echo $()它沒有擷取所有命令的標準輸出,只是最後一個。然而,這樣做會去掉換行符,使其可讀性大大降低。

另外,我注意到$()當我實際執行別名時會這樣做,但當我bug直接執行沒有別名的命令時不會這樣做。

❯ bug                                                                                                                           # IdeaProjects
Fedora 33
zsh: 5.11.7-200.fc33.x86_64: command not found...
zsh: 10:20:16: command not found...
zsh: total: command not found...
zsh: Mem:: command not found...
zsh: Swap:: command not found...

而只是在互動式外殼上執行它

❯ echo $(lsb_release -irs && uname -r && uptime && free --human --giga) | clip                                                  # IdeaProjects

❯ Fedora 33 5.11.7-200.fc33.x86_64 10:39:11 up 3 days, 20:44, 1 user, load average: 0.70, 1.02, 0.97 total used free shared buff/cache available Mem: 15G 5.9G 2.3G 1.8G 7.6G 7.8G Swap: 12G 72M 11G

我不明白為什麼會有所不同。

我怎樣才能把它寫成一個別名/命令(我想一個函式是可以接受的,在這種情況下zsh)並保留換行符?

ps 如果您對如何改進報告有任何建議,也請隨時發表評論。

使用子外殼:

alias bug="(lsb_release -irs && uname -r && free --human --giga) | clip"

這會將所有三個命令的標準輸出發送到clip,而不處理空格。

兩個別名可以組合:

alias bug="(lsb_release -irs && uname -r && free --human --giga) | xclip -selection clipboard -in"

我不會free過早格式化輸出;四捨五入會引起混淆:

alias bug="(lsb_release -irs && uname -r && free) | xclip -selection clipboard -in"

您在bug別名中看到的問題來自於在定義別名時評估命令替換的事實;跑去alias看看我的意思:

$ alias
...
bug=$'echo Fedora 33\n5.11.7-200.fc33.x86_64\n              total        used        free      shared  buff/cache   available\n ...

所以別名變成了別名

echo Fedora 33
5.11.7-200.fc33.x86_64
total used free shared buff/cache available
...

這解釋了為什麼你得到你引用的輸出。當直接執行而不是通過別名執行時,該命令有效,因為它沒有被第二次評估:擴展$(lsb_release ...)作為 的參數給出echo,它按原樣輸出它(在 shell 處理空白之後)。

引號很重要

IFS如果替換沒有用雙引號括起來,則使用參數將輸出分成單詞。

因此alias bug="echo $(lsb_release ...)"保留換行符,從而在執行別名時產生多個命令,而echo $(lsb_release ...)不會(無論如何,這無關緊要,因為不會重新解釋命令)。

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