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