我怎样才能将所有这些“管道”到 xclip 保留换行符

我怎样才能将所有这些“管道”到 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...

而只是在交互式 shell 上运行它

❯ 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如果您对如何改进报告有任何建议,也请随时发表评论。

答案1

使用子外壳:

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 ...)不会(在任何情况下,这都没关系,因为命令不会被重新解释)。

相关内容