首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mac脚本获取主目录

Mac脚本获取主目录
EN

Stack Overflow用户
提问于 2012-06-22 18:06:33
回答 4查看 25.6K关注 0票数 8

我需要在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复制所有文件和目录。

我失踪了什么?或者我该怎么做?

EN

回答 4

Stack Overflow用户

发布于 2012-06-22 18:10:40

正如错误消息所暗示的,-r是递归复制的不正确标志。您想要的标志是-R (标志区分大小写)。至于主目录,$HOME应该总是工作的。

票数 8
EN

Stack Overflow用户

发布于 2012-06-22 20:34:22

在这里谈几件事:

  1. 如何处理HOME目录,以及在未设置的情况下检索实际的HOME目录的方法。
  2. 如何正确地使用命令行参数,因为Linux上的GNU cp命令允许您以错误的方式进行操作,这造成了许多问题。
  3. 如何使用set -xv在脚本中调试。这将帮助您调试大约90%的shell脚本错误。

  1. ,我认为您的脚本实际上是错误的。不幸的是,由于缺乏信息,这是一个疯狂的猜测,但这是一个相当不错的猜测。

Mac如何处理主目录

Mac是真正的Unix版本。事实上,它甚至比Linux更像Unix。因此,它应该与几乎所有的系统都相当兼容。

Mac主目录存储在/Users目录下。在Mac使用的默认BASH中(甚至在旧的Turbo中),可以使用~作为$HOME的别名。

代码语言:javascript
运行
复制
 $ echo "$HOME"   # Use quotes around directory and file names to avoid 
 $                # problems with white spaces.
 $ echo ~         # Echos the `$HOME` directory.

如果有人更改了HOME环境变量,您可以使用~userName获得HOME目录的正确值:

代码语言:javascript
运行
复制
$ 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上,这是可以接受的:

代码语言:javascript
运行
复制
$ cp "$dir" "$dir2" -r

在Unix系统上,这可能会失败。您需要在命令之后使用-r参数:

代码语言:javascript
运行
复制
$ cp -r "$dir" "$dir2"

如果像第一个示例一样执行cp命令,它将不能在Unix上工作,也不会在Mac上工作。

调试Shell脚本

现在,我们已经做了一些准备工作,让我们看看如何调试您的问题.

set -xv放在#14行之前(为了确定起见,可能在前面几行)。这将打开脚本调试。在执行行之前,-x参数将用内插方式回显命令行。这样,您就可以看到实际执行的命令是什么。

-v参数将在没有插值的情况下回显这条线。这样,您就可以看到命令的样子,并可能检测到环境变量设置中的错误。

下面是一个简单的脚本:

代码语言:javascript
运行
复制
 name="David"
 echo "Hello $name!"

执行脚本,我们得到:

代码语言:javascript
运行
复制
 $ test.sh
 Hello David!
 $

现在,我要这么做:

代码语言:javascript
运行
复制
 set -xv
 name="David"
 echo "Hello $name!"
 set +xv     #Turns off the -xv flags

现在,我会得到这个:

代码语言:javascript
运行
复制
 $ ./test.sh
 name="David"
 + name=David
 echo "Hello $name!"
 + echo 'Hello David!'
 Hello David!

另一个巧妙的技巧是将PS4设置为"${LINENO}:“。这将使每行前面都有行号,而不仅仅是上面所示的+

可能的解决办法

我有一种感觉,问题是您有一个目录名,其中包含空格。引用目录和文件名以防止这些空格造成问题:

代码语言:javascript
运行
复制
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中记录为递归副本标志。

票数 7
EN

Stack Overflow用户

发布于 2016-04-23 04:38:33

我不喜欢脚本中的~,$HOME有时会失败,这取决于您正在使用的shell --也许不是在OSX上,但我不在乎。

在某个地方,系统记录了用户主目录的位置,并从中设置了$HOME。

具体来说,我通常试图为OSX找到另一个用户的主页(在脚本中也不是~缩写的粉丝-称为首选),我使用-

代码语言:javascript
运行
复制
 finger $username | awk '/^Directory/ {print $2}'

在其他地方,我通常都是grep /etc/passwd,但是仔细想想,手指可能会更普遍。

这是我的快速而肮脏的答案。如果您更好地了解OSX内部,那么会有一个更好的解决方案--但是关心因素呢?这个对我有用

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11161793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档