为什么这个别名在 .bash_profile 脚本中不起作用?

Why does this alias not work in .bash_profile script?

我正在尝试在我的 Mac OSX 上为 Chromium 写一个 bash 别名。它在不在 bash 别名脚本中时有效,但在我尝试创建别名时无效。

我在我的终端中尝试了这些命令,一个接一个:

cd /Applications/Chromium.app/Contents/MacOS/
./Chromium --pro-server="socks5://localhost:1234
cd -

然后,我尝试将这些全部放入我的 .bash_profile 脚本中的一个别名命令中:

alias launch_chromium='cd /Applications/Chromium.app/Contents/MacOS/; ./Chromium --pro-server="socks5://localhost:1234" ; cd -'

现在,当我像这样启动 bash 时:bash --login,我得到

unexpected EOF while looking for matching `''

而且,当我将别名命令中的确切内容复制并粘贴到终端时,它起作用了 perfectly:L

cd /Applications/Chromium.app/Contents/MacOS/; ./Chromium --pro-server="socks5://localhost:1234" ; cd -

我做错了什么?

您问题中发布的别名定义没有解释您的症状 - 它应该有效。

但是,使用 shell 函数 而不是别名可以更好地解决您的问题:

launch_chromium() ( 
 cd /Applications/Chromium.app/Contents/MacOS/
 exec ./Chromium --pro-server="socks5://localhost:1234" "$@"
)

注意方法:

  • ( ... )用于封装函数体,导致它在subshell中运行 ,这就不需要 return 到以前的工作目录。

  • exec 用于提高效率:它 subshell 替换为 Chromium 进程,因为 subshell 然后就不再需要了。为这一点和下一点向 Charles Duffy 致敬。

  • 附加
  • "$@" 以传递潜在参数。

使用函数有两个重要的优点:

  • 调用它是一个单个命令,而您的别名包含多个命令,这会导致意外行为例如管道。

  • 函数可以接受 参数 - 不同于别名。

实际上不需要更改工作目录。

alias launch_chromium='/Applications/Chromium.app/Contents/MacOS/Chromium --pro-server="socks5://localhost:1234"'