我需要在shell脚本中获得主目录,这样我的同事就可以运行它了。我的shell所做的非常简单,它只将一些目录复制到另一个目录。我用过:
$HOME
$(whoami)
即使是这样:
ABSPATH=$(cd "$(dirname“$0)”;pwd),
但是当我像这样使用变量时:
DIR= $ABSPATH/folder/bfolder/
运行它--我收到这个:
/Users/theUser/Desktop/folder/afolder/bfolder: /
/User/Desktop/FusionTest.命令:第14行:是一个目录
复制到用法: cp,-R,-H,-L,-P,-apvX,source_file,target_file,cp,-R,-H,-L,-P,-apvX,source_file .target_directory注销
过程已完成
我使用命令cp -r复制所有文件和目录。
我失踪了什么?或者我该怎么做?
发布于 2012-06-22 18:10:40
正如错误消息所暗示的,-r是递归复制的不正确标志。您想要的标志是-R (标志区分大小写)。至于主目录,$HOME应该总是工作的。
发布于 2012-06-22 20:34:22
在这里谈几件事:
HOME目录,以及在未设置的情况下检索实际的HOME目录的方法。cp命令允许您以错误的方式进行操作,这造成了许多问题。set -xv在脚本中调试。这将帮助您调试大约90%的shell脚本错误。,
Mac如何处理主目录
Mac是真正的Unix版本。事实上,它甚至比Linux更像Unix。因此,它应该与几乎所有的系统都相当兼容。
Mac主目录存储在/Users目录下。在Mac使用的默认BASH中(甚至在旧的Turbo中),可以使用~作为$HOME的别名。
$ echo "$HOME" # Use quotes around directory and file names to avoid
$ # problems with white spaces.
$ echo ~ # Echos the `$HOME` directory.如果有人更改了HOME环境变量,您可以使用~userName获得HOME目录的正确值:
$ echo $HOME
/Users/david
HOME=/tmp
$ echo $HOME
/tmp
$ echo ~
/tmp
$ echo ~david
/Users/david
$ HOME=~david #Fixed!命令行参数
这个错误可能与你电脑的Macness没有任何关系。这可能是一个标准的问题,你会发现几乎任何一台电脑。Mac的cp命令接受-r或-R命令。与在Linux系统上找到的GNU的cp不同,Mac正确地处理命令行参数。
例如,在Linux上,这是可以接受的:
$ cp "$dir" "$dir2" -r在Unix系统上,这可能会失败。您需要在命令之后使用-r参数:
$ cp -r "$dir" "$dir2"如果像第一个示例一样执行cp命令,它将不能在Unix上工作,也不会在Mac上工作。
调试Shell脚本
现在,我们已经做了一些准备工作,让我们看看如何调试您的问题.
将set -xv放在#14行之前(为了确定起见,可能在前面几行)。这将打开脚本调试。在执行行之前,-x参数将用内插方式回显命令行。这样,您就可以看到实际执行的命令是什么。
-v参数将在没有插值的情况下回显这条线。这样,您就可以看到命令的样子,并可能检测到环境变量设置中的错误。
下面是一个简单的脚本:
name="David"
echo "Hello $name!"执行脚本,我们得到:
$ test.sh
Hello David!
$现在,我要这么做:
set -xv
name="David"
echo "Hello $name!"
set +xv #Turns off the -xv flags现在,我会得到这个:
$ ./test.sh
name="David"
+ name=David
echo "Hello $name!"
+ echo 'Hello David!'
Hello David!另一个巧妙的技巧是将PS4设置为"${LINENO}:“。这将使每行前面都有行号,而不仅仅是上面所示的+:
可能的解决办法
我有一种感觉,问题是您有一个目录名,其中包含空格。引用目录和文件名以防止这些空格造成问题:
my_pictures=$HOME/"My Pictures"
cp -R $my_pictures $target #Won't work due to the space between "My" & "Pictures"
cp -R "$my_pictures" "$target" #The quotes solve the problem.结论
别担心你的Mac不一样。这只是另一个Unix系统。确保您正确地使用了命令行参数cp -R $dir1 $dir2而不是cp $dir $dir2 -R。使用set -xv帮助您定位错误,并养成引用环境变量的习惯,因为环境变量值中的空格或选项卡可能导致程序失败。
关于的注记
根据该手册,-r不再作为一种选项被记录下来。然而,它确实起作用。根据手册页:
历史版本的cp实用程序有一个-r选项。此实现支持该选项;但是,由于它不能正确复制特殊文件、符号链接或fife的文件,因此强烈禁止使用该选项。
但是,cp -R应该同时在Linux上工作,并且在Mac中记录为递归副本标志。
发布于 2016-04-23 04:38:33
我不喜欢脚本中的~,$HOME有时会失败,这取决于您正在使用的shell --也许不是在OSX上,但我不在乎。
在某个地方,系统记录了用户主目录的位置,并从中设置了$HOME。
具体来说,我通常试图为OSX找到另一个用户的主页(在脚本中也不是~缩写的粉丝-称为首选),我使用-
finger $username | awk '/^Directory/ {print $2}'在其他地方,我通常都是grep /etc/passwd,但是仔细想想,手指可能会更普遍。
这是我的快速而肮脏的答案。如果您更好地了解OSX内部,那么会有一个更好的解决方案--但是关心因素呢?这个对我有用
https://stackoverflow.com/questions/11161793
复制相似问题