哪个命令找不到可执行的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
是指定脚本中的行号。
我有一个前队友编写的 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
是指定脚本中的行号。