Shell
我如何將所有這些“管道”到 xclip 保留換行符
因此,我在報告錯誤時為系統資訊創建了這個方便的小命令。
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 ...)
不會(無論如何,這無關緊要,因為不會重新解釋命令)。