终端如何知道应用哪个功能?

时间:2014-05-10 23:20:42

标签: linux bash

我很擅长使用终端来运行命令以及使用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脚本的试验和错误。有人可以解释为什么我需要在后一种情况下更改目录,这样我在将来使用第三方命令行工具时就不必猜测这种方法了吗?

谢谢!

2 个答案:

答案 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已被标记为导出到您的环境。