我很擅长使用终端来运行命令以及使用bash脚本。话虽如此,我正在使用subversion以及Amazon S3命令行工具。当我在终端中运行svn命令或s3cmd命令时都可以正常工作。
当在bash脚本中运行时,subversion工作,而我似乎需要先更改目录(cd /Users/my_username/s3cmd-master
),然后运行:
./s3cmd sync -r /Users/my_username/some_folder s3://some_s3_place
例如,否则我会收到一条错误,指出命令不存在(注意开头的“./”)。我担心后者是基于我拥有的Dropbox脚本的试验和错误。有人可以解释为什么我需要在后一种情况下更改目录,这样我在将来使用第三方命令行工具时就不必猜测这种方法了吗?
谢谢!
答案 0 :(得分:2)
./foo
表示run 'foo' from the current directory
。因此,如果您在运行该命令时不在包含“foo”的目录中,则会收到错误。
如果您只是致电foo
,那么shell会尝试从路径中查找它。如果它不在路径中,您将收到错误。
在Windows cmd
上,当前目录始终位于路径中,因此您通常无需调用.\foo
。但是你可以,而且你可能会看到习惯于unix风格的shell的人经常这样做。
答案 1 :(得分:2)
当运行不完全限定的命令时,会发生别名扩展,搜索shell函数,搜索内置函数,检查包含先前PATH查找中的已记忆位置的哈希表,然后检查列出的目录(搜索结肠分隔的$PATH
变量。
./s3cmd
......完全合格;它只能引用当前目录(.
)
s3cmd
......不完全合格;它可以是一个别名,它可以是一个shell函数,它可以是一个外部命令,位于环境变量PATH
中给出的目录之一。要找出它真正 的内容,您可以运行命令type s3cmd
。
让我们假设您有一个名为s3cmd
的shell函数,如果您在运行真实s3cmd
之前没有安装一个默认配置文件,则会下载默认配置文件: / p>
s3cmd() {
[[ -e $HOME/.s3cfg ]] || { curl -O "$HOME/.s3cfg" http://example.com/s3cfg || exit; }
command s3cmd "$@"
}
type s3cmd
会告诉你:
s3cmd is a function
s3cmd() {
[[ -e $HOME/.s3cfg ]] || { curl -O "$HOME/.s3cfg" http://example.com/s3cfg || exit; }
command s3cmd "$@"
}
在您的特定用例中,您可能希望将/Users/my_username/s3cmd-master
添加到PATH中。一个合适的地方可能是$HOME/.bash_profile
:
PATH=$PATH:$HOME/s3cmd-master
请注意,不需要在此处明确运行export
,因为PATH
已被标记为导出到您的环境。