我对使用终端运行命令以及使用 bash 脚本还很陌生。话虽如此,我正在使用 subversion 以及 Amazon S3 命令行工具。当我在终端中运行 svn 命令或 s3cmd 命令时,两者都有效。
在 bash 脚本中同时运行时,颠覆有效,而我似乎需要先更改目录 (cd/Users/my_username/s3cmd-master
),然后运行:
./s3cmd sync -r/Users/my_username/some_folder s3://some_s3_place
例如,否则我会收到一条错误消息,指出该命令不存在(注意开头的“./”)。我担心后者基于我拥有的 Dropbox 脚本而无法反复试验。有人可以解释为什么我需要在后一种情况下更改目录,这样我以后使用第三方命令行工具时就不必猜测方法了吗?
谢谢!
最佳答案
当运行一个不完全限定的命令时,会发生别名扩展,搜索 shell 函数,搜索内置函数,检查包含先前 PATH 查找的内存位置的哈希表,然后在(冒号 -分隔)$PATH
变量被搜索。
./s3cmd
...完全合格;它只能引用当前目录中的外部可执行文件 (.
)
s3cmd
...不完全合格;它可能是一个别名,它可能是一个 shell 函数,它可能是环境变量 PATH
中给定的目录之一的某个地方的外部命令。要找出它到底是什么,您可以运行命令 type s3cmd
。
假设您有一个名为 s3cmd
的 shell 函数,如果您在运行真正的 s3cmd
之前没有默认配置文件,它会下载一个默认配置文件:
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
已经被标记为导出到您的环境。
关于linux - 终端如何知道它要应用哪个功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23587340/