我怎样才能让 bash 认为我 运行 二进制文件所在目录中的脚本?

How can I trick bash to think I ran a script from within the directory where the binary is located?

我有一个我经常使用的二进制文件(来自 Android SDK Toolsemulator)。我已将它添加到我的 $PATH 变量中,这样我就可以仅使用 emulator 轻松地 运行 命令。

然而,事实证明二进制文件使用了相对路径;如果我 运行 来自不同目录的脚本,它会抱怨。我真的很想 运行 来自任何文件夹的命令,而不必 cd 进入二进制文件所在的目录。有什么方法可以让 script/bash 认为我 运行 来自它所在目录的命令?

我会研究命令行别名。

如果您在 linux 并使用 bash,您可以转到 ~/.bash_profile 并添加一行,例如:

alias emulator='./path-to-binary/emulator"

在 windows 上有点不同。 Here 是关于如何在 windows 中做类似事情的示例。

为您的 ~/.bashrc 添加一个别名 (emu):

alias emu="(cd /dir/with/emulator; ./emulator)"

函数是适合该工作的工具:

emu() ( cd /dir/with/emulator && exec ./emulator "$@" )

让我们把它分解成几个部分:

  • 使用函数而不是别名允许在任意位置替换参数,而不仅仅是在别名定义的字符串的末尾。在这种情况下,这很关键,因为我们希望在 inside 子 shell 中计算参数,如下所述:
  • 使用圆括号而不是大括号,导致此函数的主体在子shell 中变为运行;确保 cd 仅对该子 shell 生效,而不会影响父级。
  • 使用 && 连接 cd 和以下命令确保我们在 cd 失败时正确中止。
  • 使用 exec 告诉 subshell 用模拟器替换内存中的自身,而不是让一个额外的 shell 坐在那里除了等待模拟器退出什么都不做.
  • "$@" 扩展为传递给函数的参数列表。