pwd是我们经常使用的一个命令,它的作用是显示当前所在路径。
不过,很多时候我们使用pwd命令不仅仅是查看当前路径,而是复制路径。
通常情况下,使用pwd命令进行复制路径的操作如下:
- 使用
pwd显示路径(键盘) - 使用鼠标选中回显的路径 (鼠标)
- 按住
ctrl+shift+c复制路径 (键盘) - 使用
ctrl+shift+v粘贴路径 (键盘)
这里面包含了两次键盘、鼠标的切换,有没有觉得很麻烦?
此时,一个想法很自然的浮现在我们心中:
如果在使用
pwd的时候可以在显示路径的同时将路径复制到剪贴板就好了,这样只需要执行步骤1和4。
那么这个愿望是否可以实现呢?
答案是肯定的。
接下来就让我们来看看怎么实现吧。
思路
为了达到目的,我们要做的其实很简单,那就是将pwd输出的内容复制到剪贴板。
但是pwd本身不具备这个能力,因此,我们需要使用其它工具来辅助我们达到这个目的。
这个工具就是xclip,它可以将输入重定向到剪贴板。
所以,我们只需要将pwd的输出使用管道|传递给xclip就可以了。
原型
首先,安装xclip工具:
sudo apt install xclip
然后,使用以下命令将pwd的输出复制到剪贴板:
pwd | xclip -selection clipboard
接下来让我们先看下效果:
# 查看当前路径
➜ ~ pwd
/home/ubuntu
# 执行命令
➜ ~ pwd | xclip -selection clipboard
# 键盘按下ctrl+chift+v进行拷贝,查看结果
➜ ~ /home/ubuntu
➜ ~
可以看到,pwd的输出确实已经复制到了剪贴板上。
优化
经过上面的操作,我们的命令原型已经有了。
但是这里有一个问题,那就是路径的末尾有一个换行符(/home/ubuntu下有一个空行,那就是换行符导致的),这导致我们需要手动删除这个换行符,不方便。
为了去除路径末尾的换行符,我们可以使用echo -n 命令,从而直接输出 pwd 的结果而不带换行符:
echo -n $(pwd) | xclip -selection clipboard
再测试一下:
➜ ~ echo -n $(pwd) | xclip -selection clipboard
# 键盘按下ctrl+chift+v进行拷贝
➜ ~ /home/ubuntu
➜ ~
这次我们完美地复制了路径,末尾没有换行符。
最后,我们在命令的末尾添加&& pwd,这样我们就实现了既显示路径又将路径复制到剪贴板的功能:
echo -n $(pwd) | xclip -selection clipboard && pwd
部署
这条命令显然太长了。
敲这条命令的效率还不如使用鼠标呢。
因此,我们要简化操作,方法就是使用别名,即将命令命名为cpwd,并将其添加到.bashrc或.zshrc中:
# 添加命令
echo "alias cpwd='echo -n \$(pwd) | xclip -selection clipboard && pwd'" >> ~/.bashrc
# 使命令在当前终端生效
source ~/.bashrc
这样我们只需要在终端运行cpwd命令就可以了。
扩展
我们经常会使用ssh命令远程登录到其它计算机上,并且使用scp命令传输文件。
使用scp命令时需要指定路径,因此需要手动复制。
那么我们是否可以将cpwd部署到远程计算机上,从而实现路径的复制呢?
答案是可以的,并且部署方式一致。
但是当你远程使用cpwd命令时可能会遇到如下错误:
Error: Can't open display: (null)
这个错误的原因是xclip依赖于X11图形环境来访问剪贴板。
但是当我们通过ssh远程登录到计算机上时,默认情况下是没有访问本地X11图形环境的权限的。
因此远程计算机上的xclip无法操作我们本地的剪贴板,也就无法将路径拷贝到我们本地的剪贴板上。
为了解决这个问题,我们可以使用X11转发功能,将X11图形环境的显示输出从远程计算机重定向到本地主机。
原理解释清楚后,操作起来其实很简单,使用-X参数即可:
ssh -X user@remote_host
总结
我们通过各种命令的组合,创建了一个新的cpwd命令,从而让我们能够方便地复制当前路径,并且拓展到了远程登录的场景。希望对大家有帮助~
最后,欢迎大家关注我的公众号《嵌入式3分钟》,一起学习嵌入式!



















