➜ ~ cat .zshrc | grep xclip
alias c="xclip -selection c"
alias -g v='"$(xclip -selection c -o)"'
➜ ~ v
zsh: 没有那个文件或目录: file:///home/roach/Downloads/pure.png
➜ ~
中文“没有那个文件或目录”的意思是“没有文件或目录”。
我想复制一个位于/home/roach/Downloads/pure.png
. 在dolphin KDE中选择它并复制(单击鼠标右键,然后单击复制)后,有没有办法得到/home/roach/Downloads/pure.png
而不是file:///home/roach/Downloads/pure.png
上面显示的?
我认为是使用sed
删除额外file://
字符之类的命令,但没有得到正确的方法。
➜ ~ alias -g v='"$(xclip -selection c -o)|sed -e 's/file:\/\///'"'
➜ ~ v
zsh: 没有那个文件或目录: file:///home/roach/Downloads/pure.png|sed -e s/file:////
➜ ~
那么,如何纠正我的alias -g v
?
shell 本身可以执行这种替换,避免更昂贵的外部程序的 fork 和 exec。详见“参数扩展”
zshexpn(1)
。所以在你的情况下,也许像
请注意,这
v
是一个比较常见的字母,因此可能不适合作为全局别名。您可能还想决定如何处理名称中带有空格的内容;将
print -l
揭示以下之间的区别:当剪贴板内容中有空格时。
如您所知,别名
这意味着,当您调用 时
v
,shell 会尝试执行一个名为剪贴板内容的命令。这就是您的第一个代码片段中发生的情况。但是,调用v
和观察其效果会产生误导,因为此全局别名的预期用途是作为其他命令的参数。sed
如果您正确使用命令替换 ($(...)
) 并引用,您的基于 - 的解决方案将起作用:在这里,
xclip
将剪贴板的内容通过管道传输到sed
,这将删除file://
其开头的部分(模式已锚定,请注意^
)。避免/
作为脚本s
中的命令分隔符sed
使其更具可读性,并消除了/
在模式中转义的需要。命令替换意味着在
v
调用的地方替换管道的输出。然后,您可以将其用作:
请注意,这将使
v
对当前工作目录中命名的文件的操作变得更加困难,因为文字v
将始终被替换。作为一种解决方法,您将能够使用相对路径./v
。(另外,考虑到一些程序接受不带前缀的单字母选项,例如完全合法的(但非 POSIX)
ps v
。单字母全局别名是不安全的)。而且,最后但并非最不重要的一点是,这样的全局别名不适用于名称中包含空格字符的文件,因为在替换别名后它们将被 shell 拆分。
或者,您可以避免使用全局别名并定义:
可以用作:
这也适用于带有空格字符的文件名。
但请注意:
Dolphin 显示并复制到剪贴板的文件名是经过编码的,因此只要它们包含不常见的字符,就不适合被 shell 使用。例如: