2012-05-28 65 views
3

我一直认为当前目录是用户的东西,而不是脚本,因为它取决于用户的位置,每次脚本执行时都可能会有所不同。你应该改变shell脚本中的当前目录吗?

所以当我遇到Java jar实用程序-C选项时,我有点困惑。


对于那些谁也不知道-C选项指定一个文件/文件夹中的广口瓶中,包括之前使用。由于该文件/文件夹的路径在罐子被复制,在-C选项更改目录包括前档:

换句话说:

jar -C flower lily.class 

将包含一罐lily.class文件,而:

jar flower/lily.class 

会让flower文件夹中包含lily.class

01罐子

对于我正在使用的Bourne通配符folder/*而言,由于它仅适用于下一个立即参数,因此无法使用-C

所以使用通配符的唯一方法是从当前目录运行;但我仍然不愿意改变和使用脚本中的当前目录。

在脚本中使用当前目录是否有任何缺点?也许是因为某种原因而皱起了眉头?

+2

我不明白为什么仇恨,因为'cd'是子进程本地的。试试这个:'pwd; (cd ..; PWD); pwd',看到当你退出子shell(用圆括号表示)时,当前目录返回到它开始的地方。无论脚本做什么(除非你“源”而不是执行它),这对用户无关紧要。 – Amadan

+2

没关系,只要把它放回原来的位置即可。 –

+0

@Amadan我意识到这一点,但Gotos也工作,但他们皱起了眉头。我想知道在脚本中是否有类似的改变目录。 – Hawken

回答

1

我不认为从shell脚本更改当前目录有什么内在的错误。当然,如果单独采取,它不会造成任何不好的事情发生。

其实,我有我使用的用于启动的基于Java的服务器标准的脚本,第一行是:

cd `dirname $0` 

这确保了命令的脚本其余的都是在包含脚本文件本身的目录中执行(在单台机器托管多个服务器实例时很有用),而不管shell脚本实际从哪里调用。在不更改脚本中的当前目录的情况下,如果用户在运行脚本之前记得手动将cd手动放入相应的目录中,则只能正常工作。

在这种情况下,从脚本内部执行cd操作会从服务器启动/关闭过程中删除一个手动步骤,从而使事情的结果略微不太容易出错。

因此,与大多数情况一样,这类事情也有合法用途。我相信也有一些可疑的问题。这实际上取决于什么最适合您的特定用例。这是我不能真正评论的东西...我总是让maven为我建立我的JAR。

+0

是的,'\'dirname $ 0''也是我用过的,我想知道我是否应该**。 – Hawken

+1

@霍金:请参阅[BashFAQ/028](http://mywiki.wooledge.org/BashFAQ/028)关于脚本的位置。 –

+1

@霍金 - _should_的问题真的取决于你。没有什么可以阻止你这样做,尽管可能会出现一些可能出现的晦涩难懂的警告,按照丹尼斯的链接提出。你只需要决定你是否乐意接受这些警告。就我个人而言,他们并不打扰我,因为我更愿意拥有一个独立的服务器部署,而不是一个防弹解决方案,如果有人在运行它时有人将mv的脚本从我的底下移出,那么这个解决方案不会中断。如果另一个系统管理员正在“围绕”我的东西,那么我就有更严重的问题担心了。 – aroth