哪个命令找不到可执行的Unix脚本

Executable Unix script cannot be found by which command

我有一个前队友编写的 Unix bash 脚本,它必须在我的 PATH 中,但我无法通过手动检查找到它(见下文)。但是,我可以通过键入

在任何地方执行它
$ my_script

我想查看和编辑此脚本。但是,当我尝试通过 which 命令查找它时,我得到的是空白响应。 Return代码表示错误:

$ which my_script
$ echo $?
1

然而,我可以 运行 脚本。我手动梳理了我的PATH也没找到。老实说,我已经 20 多年没有遇到过这样的事情了。除了 which、and/or 之外还有其他命令可以隐藏这样的脚本吗?

尝试
1. type my_script
或者
2. find / -name my_script -print

请注意,如果您 运行 以普通用户身份执行此操作,find 将抛出大量权限错误。您可以 运行 它作为 root 来避免这种情况,或者通过管道将 STDERR 传递给 /dev/null

找到了。我将留下问题和答案,以防其他人遇到类似情况。我将一个不同的答案标记为最终答案,因为它包含一些更有用的工具来查找我找到的内容(见下文)。

总结

"script" 实际上是一个 bash 函数,已写入源 . 文件。

详情

帐户的 .bashrc 文件正在获取另一个 . 文件:

. ~/.other-dot-file

在另一个 . 文件中,bash 函数称为 my_script

function my_script {
....
}

由于这是来源,该函数可以从命令行执行,模仿成熟脚本的行为。没有其他代码调用此函数 - 它纯粹是为了从命令行调用,就好像它是一个脚本一样。

这种故意的含糊其词是作者不再与我们在一起的部分原因。

要确定可从 shell 调用的 任何命令 类型 使用 type builtin.

在你的例子中,由于假定的 script 变成了 shell 函数,你会看到(假设bash):

$ type my_script  # Bash: option -t would output just 'function`
my_script is a function
my_script () 
{                
...               # The function's definition

从那里 - 正如您所做的那样 - 您可以检查配置文件(例如,~/.bash_profile)和/或初始化脚本(例如,~/.bashrc)以确定函数的来源。

警告type 输出的函数签名被规范化为 <name> () 形式 - 即使您将函数定义为 function <name>

bash 中,您甚至可以 直接找到 定义给定函数的位置 (提示 this superuser.com answer and Charles Duffy 鼓励我找到它并提出最简洁的形式):

$ (shopt -s extdebug; declare -F my_func)
my_func 112 /Users/jdoe/.bashrc   # sample output

112 是指定脚本中的行号。