我正在使用 wsl bash,并且在我的~/.bashrc
文件中定义了以下函数:
function clip { /mnt/c/Windows/System32/clip.exe "${@%\n}"; }
\n
然而,这并没有从参数中删除尾随。我该如何改进以满足我的特定需求?
非常感谢
编辑:在帮助下卡米尔的答案,我能够弄清楚到底发生了什么。事实证明,生成的子进程(cmd.exe)正在添加正在插入的回车符clip.exe
(因为我正在使用 Pipes.ex. pwd | clip
)。
我能够通过以下方式获得所需的结果:
function clip { /mnt/c/Windows/System32/WindowsPowershell/v1.0/powershell.exe Set-Clipboard "${@:-$(cat)}"; }
它有点慢,因为它依赖于
- 电源外壳
- cat(外部二进制文件应替换为 read 内置文件)
但对于我的需求来说这不是问题:)
答案1
"${@%\n}"
删除尾随n
."${@%\\n}"
将删除尾随\n
(文字字符串,而不是换行符)。
要删除换行符,您需要传递换行符。在 Bash 中,这个语法应该有效:
"${@%$'\n'}"
在哪里$'\n'
负责生成实际的换行符。字面换行符也可以工作:
"${@%
}"
笔记:
- 该解决方案从每个参数中删除尾随换行符,而不仅仅是最后一个参数(因为这就是
$@
工作原理)。 - 在 Linux 中,命令行参数中尾随换行符是不常见的。我不了解WSL,不知道你的使用场景;我希望你知道你想要什么*。
例子:
$ set a $'b\n' c
$ printf '<%s>\n' "$@"
<a>
<b
>
<c>
$ printf '<%s>\n' "${@%$'\n'}"
<a>
<b>
<c>
$ printf '<%s>\n' "${@%
}"
<a>
<b>
<c>
\n
* 如果“从参数中删除尾随”不是你想要的,那么或许您在(来源?)脚本中调用该函数,并且该脚本受到 DOS 行结尾的影响。查看这个问题。