如何在 .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 —— 这个别名 不可 可移植!)
我尝试制作一个小的别名脚本来自动重置我的 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 —— 这个别名 不可 可移植!)