如何在.bash_profile别名中使用pbpaste?

时间:2015-02-14 14:35:43

标签: macos shell terminal

我尝试制作一个小别名脚本来自动重置我的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?我理解错误的基本原理是什么?

2 个答案:

答案 0 :(得分:1)

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

$(pbpaste)

然而,这是一种更简单的方法。我没有看到任何理由通过粘贴缓冲区传递sshfs PID;只需使用直接包含它:

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

...但是它仍然比它需要的更复杂,因为OS X包含一个alias mount-reset='kill -9 $(pgrep sshfs);echo my_password|pbcopy; sudo umount path/to/my/mount/folder;' 命令,它按名称杀死进程,因此不再需要pgrep:

killall

(顺便说一句,有些unix包含一个名为alias mount-reset='killall -9 sshfs;echo my_password|pbcopy; sudo umount path/to/my/mount/folder;' 的命令,does something much more dangerous - 此别名可移植!)

答案 1 :(得分:0)

在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; }