【问题标题】:How to write a bash script alias with whitespace on macOS如何在 macOS 上编写带有空格的 bash 脚本别名
【发布时间】:2018-09-14 21:44:32
【问题描述】:

更新:

我取得了进步,但我仍然不确定我不理解什么。我已将脚本缩减为一行,但仍然遇到同样的问题。

对以下内容有任何见解吗?
注意:如果我输入“/Users/Da.../Docker”,或者如下所示,使用退格作为空格,结果是相同的。

for myvm in $(find /Users/David/Documents/Virtual\ Machines/Docker -name *.vmx); do echo -e "VM name: $myvm"; done VM name: /Users/David/Documents/Virtual VM name: Machines/Docker/RHEL7-DockerHost-Node04.vmwarevm/RHEL7-DockerHost-Node04.vmx ... VM name: /Users/David/Documents/Virtual VM name: Machines/Docker/RHEL7-DockerHost.vmwarevm/RHEL7-DockerHost.vmx VM name: /Users/David/Documents/Virtual VM name: Machines/Docker/RHEL7-DockerHost-Node01.vmwarevm/RHEL7-DockerHost-Node01.vmx

我错过了什么?

--------------

我发现了类似的问题,但答案对我不起作用。

我正在编写一个脚本,允许我在 VMware Fusion 中启动和停止多个虚拟机,而无需使用vmrun 命令(位于"/Applications/VMware Fusion.app/Contents/Library/vmrun")单击每个虚拟机。

问题

当我尝试给 vmrun 起别名时:

alias myvmcli='/Applications/VMware\ Fusion.app/Contents/Library/vmrun'

...我从 bash 收到以下错误:

第 3 行:/Applications/VMware\:没有这样的文件或目录

讨论

显然缺少空格,但我认为使用退格字符表示应该使用空格。

我在别名行中尝试了单引号和双引号,但无济于事。

如果我从命令行运行alias,它工作正常。

解决方案/想法?

我确信创建链接可以解决我的问题,但我真的很想知道为什么这不起作用。

【问题讨论】:

  • Bash documentation 声明“对于几乎所有目的,shell 函数都优于别名。”这是一个 shell 函数,您可以添加到 .bashrc 而不是您的别名。添加后,您应该执行souce ~/.bashrc 以使其在命令行中可用myvmcli() { "/Applications/VMware Fusion.app/Contents/Library/vmrun" ; }
  • @Inian:我同意你所说的关于别名的要点,但在这种情况下,只需要一个简单的变量赋值。
  • @cdarke:当然可以,但我绝不会鼓励初学者使用变量,所以这不是常规做法
  • @Inian:为什么不呢?请记住,这是我们正在讨论的脚本。
  • 问题不在于您是否可以使用别名来做到这一点,而是为什么您不能使用功能来做到这一点。 mivmcli () { /Applications/VMware\ Fusion.app/Contents/Library/vmrun "$@"; }.

标签: bash macos shell sh


【解决方案1】:

您可以通过将目录添加到您的路径来避免函数和别名:

PATH="/Applications/VMware Fusion.app/Contents/Library:$PATH"

然后vmrun 本身就可以工作了。

【讨论】:

    【解决方案2】:

    你需要引用两次:

    alias myvmcli='"/Applications/VMware Fusion.app/Contents/Library/vmrun"'

    或逃跑:

    alias myvmcli=\''/Applications/VMware Fusion.app/Contents/Library/vmrun'\'

    alias myvmcli="\"/Applications/VMware Fusion.app/Contents/Library/vmrun\""

    注意第 2 和第 3 的逃逸方式。它们不同。


    您需要双引号,因为您需要引用一次,因为别名命令需要它 (alias asd="echo asd"),然后再引用一次,因为别名中的命令需要它。


    编辑:

    即使我回答了这个问题,您发布的别名也可以正常使用。可能是由于 bash 版本的差异:

    [  0][s: ~ ]$ cd /tmp
    [  0][s: tmp ]$ alias asd='asd\ zxc/test'
    [  0][s: tmp ]$ asd
    woooo!
    

    【讨论】:

    • 如果在 select 语句中使用变量会发生什么?这就是我崩溃的地方(使用 macOS 10.13 bash 3.2.57(1)-release)。当我将分配拉到选择之前时,行为发生了变化。它仍然没有按预期工作,所以我正在寻找其他选择。谢谢!
    【解决方案3】:

    引号内不需要反斜杠\,它被保留。如果您不使用引号,则只需要反斜杠,但通常引号是好的。

    $ echo 'Hello\ world'
    Hello\ world
    $ echo "Hello\ world"
    Hello\ world
    $ echo Hello\ world
    Hello world
    $ echo "Hello world"
    Hello world
    

    在脚本中使用别名并不好,别名实际上是为提高命令行效率而设计的。

    在这种情况下,只需将其分配给变量,您不需要别名或函数。

    cmd='/Applications/VMware Fusion.app/Contents/Library/vmrun'
    

    然后,当你想运行它时:

    "$cmd"
    

    注意双引号,因为嵌入的空间是必需的。

    使用 vmware 在 OS X 上测试。

    正如其他人所说,比这更复杂的东西需要一个函数。

    【讨论】:

      猜你喜欢
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 2018-12-10
      • 2012-04-08
      • 2010-10-10
      • 2011-04-09
      • 1970-01-01
      相关资源
      最近更新 更多