2

我必须很密集,但我根本无法解决这个问题。我在这里用谷歌搜索和搜索过,但没有找到任何东西。

我有一个简单的 shell 脚本。目前它看起来如下。diff 命令失败,第二个参数(下面红色的那个)上显示“没有这样的文件或目录”。

#!/bin/bash

set -x

cd "/Volumes/$1/Backups.backupdb/SkiAddict’s Mac/Latest"
time diff -qr /Users/n/Documents/Code "SkiAddict’s Mac/Users/n/Documents/Code"

我从终端调用这样的脚本:

bash myScript.sh Quadra

我不太了解 shell 脚本(实际上,一点也不了解),但这真的不可能是火箭科学!

我花了一个多小时把头撞在墙上,让第一个命令 (cd) 起作用;事实证明,除非“SkiAddict's”中的引号字符是智能引号,否则我得到了同样的错误(没有这样的文件或目录)。现在该行工作正常,即使我从该行复制文本并将其粘贴到 diff 命令中,它也不起作用。

整个脚本是从一个已经在工作的 QuicKeys 宏中复制的,该宏将文本输入到终端窗口中,所以我真的认为制作一个 shell 脚本不会是一件大事。宏首先将这一行“键入”到一个新的终端选项卡中:

cd /Volumes/Quadra/Backups.backupdb/SkiAddict’s\ Mac/Latest

然后它按 Enter 并“键入”这一行:

time diff -qr /Users/n/Documents/Code "SkiAddict's Mac/Users/n/Documents/Code"

然后,它再次按 Enter。这件事完美无缺。

我尝试过在任一端使用双引号,在任一端使用单引号,转义引号,无论两端是否有双引号或单引号。没有任何效果。

帮助???

4

2 回答 2

1

我昨晚找到了答案,但由于我是新来的,所以我无法回答我自己的问题。感谢Bash 常见问题解答,我能够了解 $'...' 这使得路径中的单引号可以被反斜杠,这使得diff命令很开心。

不,cd不能以同样的方式处理命令。如果我对该行进行任何更改,它将不再起作用!!!叹...

所以,这两行看起来像这样:

cd "/Volumes/$1/Backups.backupdb/SkiAddict’s Mac/Latest"
time diff -qr /Users/n/Documents/Code $'SkiAddict\'s Mac/Users/n/Documents/Code'

非常感谢@askewchan 的帮助。即使我们没有与它在一起,但有人可以“谈论”它仍然非常好:-)

于 2013-02-24T19:26:21.130 回答
1

要查看您的脚本实际在做什么,请在您的脚本中添加一些 echo 命令,以查看它是否按照您的预期扩展引号和转义。只需替换为time diffecho如果它打印出的路径与您希望它们运行的​​方式不同,请相应地修改它们


我认为实际上您尝试打开的第二个文件可能存在。您想要的路径很可能是:

/Users/n/Documents/Code

在 Unix(或 mac)机器上,所有路径都从 'root' 目录开始,也简称为:

/

不是您计算机的“名称”,它对您来说是SkiAddict's Mac


另一方面,如果您实际上是在尝试访问TimeMachine卷中的目录,则需要有一个相对路径,这在您的脚本中可能只是不正确。尝试使用完整路径,从/Volumes/...行开始diff。就目前而言,在cdthis 之后,它将尝试与以下文件进行比较:

"/Volumes/$1/Backups.backupdb/SkiAddict’s Mac/Latest/SkiAddict’s Mac/Users/n/Documents/Code"

您可以通过cd /Volu...在终端中键入并使用制表符完成来确定正确的路径,直到您在TimeMachine. 制表符补全将正确转义空格和特殊字符,并找到现有路径。也许这将帮助您找到路径名中的错误。

于 2013-02-24T04:48:05.037 回答