如何在 .bash_profile 别名中粘贴?

How to pbpaste in .bash_profile alias?

我尝试制作一个小的别名脚本来自动重置我的 OS X Fuse 连接。

如果我在我的终端中 运行 这个命令:

pgrep sshfs|pbcopy; kill -9 $(pbpaste);echo my_password|pbcopy; sudo
umount path/to/my/mount/folder;

它工作得很好。但是,如果我将它作为别名添加到我的 .bash_profile 中:

alias mount-reset="pgrep sshfs|pbcopy; kill -9 $(pbpaste);echo my_password|pbcopy; sudo umount path/to/my/mount/folder;"

它跳过 pbpaste 命令并回显 my_password。我一直认为别名命令的执行就像我将它们写入终端一样,但为什么这不起作用?如何在别名脚本中使用 pbpaste?我理解错了什么基础知识?

在OS中X别名命令应该添加到~/.bashrc

当 bash 是交互式非登录 shell 时,它使用 .bashrc,而不是 .bash_profile。如果 bash 作为交互式登录 shell 调用,它使用 .bash_profile,而不是 .bashrc

尝试将别名添加到 ~/.bashrc。如果您想将 mount-reset 命令作为交互式登录 shell 命令添加到 ~/.bash_profile 中,您可以使用如下内容:

# kill sshfs
mount-reset () { pgrep sshfs|pbcopy; kill -9 $(pbpaste); echo my_password|pbcopy;
sudo umount path/to/my/mount/folder; }

您需要将别名括在单引号中,而不是双引号中。相关的区别是 bash 在执行命令之前 在双引号 内扩展了 $something (包括 $(command))。你现在的方式是,pbpaste 在 .bash_profile 运行 时执行 ,并且当时粘贴缓冲区中的任何内容都包含在别名。使用单引号,它直接在别名中包含 $(pbpaste),因此当您使用别名时它会扩展。

alias mount-reset='pgrep sshfs|pbcopy; kill -9 $(pbpaste);echo my_password|pbcopy; sudo umount path/to/my/mount/folder;'

不过,还有更简单的方法。我看不出有任何理由通过粘贴缓冲区传递 sshfs PID;直接使用 include 即可:

alias mount-reset='kill -9 $(pgrep sshfs);echo my_password|pbcopy; sudo umount path/to/my/mount/folder;'

...但这仍然比它需要的更复杂,因为 OS X 包含一个 killall 命令,该命令按名称终止进程,因此无需 pgrep:

alias mount-reset='killall -9 sshfs;echo my_password|pbcopy; sudo umount path/to/my/mount/folder;'

(顺便说一句,一些 unix 包含一个名为 killall 的命令 does something much more dangerous —— 这个别名 不可 可移植!)