因此,我在错误报告时创建了这个方便的小命令来获取系统信息。
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 ...)
不会(在任何情况下,这都没关系,因为命令不会被重新解释)。