【问题标题】:Why does this alias not work in .bash_profile script?为什么这个别名在 .bash_profile 脚本中不起作用?
【发布时间】:2017-04-30 03:04:07
【问题描述】:

我正在尝试在我的 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 `''

而且,当我将别名命令中的内容复制并粘贴到终端中时,它可以完美运行:L

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

我做错了什么?

【问题讨论】:

  • 你能把alias的定义用双引号括起来吗?
  • 一般来说,.bash_profile 仅对登录 shell 运行。并非所有交互式 shell 都是登录 shell,并且别名不会通过环境继承,因此您确实应该将别名定义放在 .bashrc 中。
  • 请注意,在 macOS 中,终端仿真器倾向于启动登录 shell,因此确保 .bashrc 来自 .bash_profile 变得更加有用。
  • 我会考虑运行你的整个.bash_profileshellcheck.net,顺便说一下——这应该确定你的语法错误在哪里,因为它实际上并没有出现在这个别名中。
  • 运行non-login shell 而不是login shell 的原因是什么?

标签: bash macos shell alias chromium


【解决方案1】:

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

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

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

注意方法:

  • ( ... )用于封装函数体,使其运行在一个subshel​​l中,这样就无需返回之前的工作目录。

  • exec 用于提高效率:它用 Chromium 进程替换子shell,因为不再需要子shell。Charles Duffy致敬对于这一点和下一点。

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 也许 OP 有时将其工作目录放在可移动媒体上,并且希望能够在不终止浏览器会话的情况下将其删除。
    猜你喜欢
    • 2015-06-16
    • 2020-12-14
    • 1970-01-01
    • 2013-08-23
    • 2013-10-20
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多