如何在macOS上用空格写一个bash脚本别名

时间:2018-04-05 07:04:19

标签: bash macos shell sh

更新:

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

有关以下内容的任何见解?
注意:如果我输入" / 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,它可以正常工作。

解决方案/思想?

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

3 个答案:

答案 0 :(得分:2)

您可以通过将目录添加到路径中来避免功能和别名:

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

然后vmrun本身就可以了。

答案 1 :(得分:1)

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

$ 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上测试。

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

答案 2 :(得分:0)

你需要引用两次:

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\""

小心第二和第三次逃跑的方式。他们不同。

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

修改

即使我回答了这个问题,你发布的别名也很合适。可能是因为bash版本的差异:

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