linux - 终端如何知道它要应用哪个功能?

标签 linux bash

我对使用终端运行命令以及使用 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/

相关文章:

python - botocore.exceptions.WaiterError : Waiter StackCreateComplete failed: Max attempts exceeded

linux - 如何修复 Linux bash 的 'find' 命令中包含空格的路径

linux - shell 安装并检查方向是否存在

bash - 如何在 sed 脚本中使用 sed 删除括号内的字符串?

linux - 如何使用 wget -i 下载和设置文件名?

linux - mkdir $HOME/错误

php - 引用的列名必须是目标实体类上的主键列

bash - sed 替换每行内的新行字符

Bash通过多字符定界符将多行字符串拆分为数组

linux - 如何将 find 和 grep 的结果输出为 filename => found