我已经./bin/
在我的主目录中添加了一个文件夹。
我在./bin
文件夹中放置了两个文件,一个只有文件名,另一个是文件名.ext。
文件名为test
和test.sh
:
当我仅使用文件名运行时,终端不会显示任何输出,但是当我尝试使用 test.sh 时,脚本开始执行:
我的问题是,我是否可以仅通过在终端上使用文件名(如“test”)来运行脚本,而不是提供“test.sh”。
答案1
shell如何执行命令:
来自 bash 手册:
如果名称既不是 shell 函数也不是内置函数,并且不包含斜杠,则 bash 会在 PATH 的每个元素中搜索包含该名称的可执行文件的目录。
这意味着函数和 shell 内置命令优先,如果没有,它会在PATH
变量中指定的目录列表中搜索命令。
为什么我的‘测试’命令不起作用?
您遇到的是test
命令,它是一个内置命令与原始 Bourne shell 兼容在 中bash
。此命令是静默的,用于简单逻辑、算术评估和字符串评估。它用于逻辑和 if 语句:
bash-4.3$ test 1 -le 2 && echo "1 is less that or equal to 2"
1 is less that or equal to 2
bash-4.3$ if test 1 -le 2 ; then echo "1 is less than or equal to 2"; fi
1 is less than or equal to 2
请注意,test
和[
完全相同:
bash-4.3$ [ 1 -le 2 ] && echo "1 is less that or equal to 2"
1 is less that or equal to 2
bash-4.3$ if [ 1 -le 2 ] ; then echo "1 is less than or equal to 2"; fi
1 is less than or equal to 2
还有 ,/usr/bin/test
它是标准实用程序之一,存在是为了可移植性和兼容性。如果您的 shell 中没有test
内置程序,它会查看变量PATH
,如果/usr/bin/
恰好~/bin
在列表中您的变量之前 - 它会运行/usr/bin/test
。以下是一个例子:
bash-4.3$ enable -n test
bash-4.3$ PATH="$HOME/bin/:$PATH" test
I am ~/bin/test
使用enable -n
命令我们关闭内置的test
,并test
临时运行修改过的,PATH
例如我的~/bin
是列表中的第一个。shell 查看列表,找到我的 shell 脚本~/bin/test
并运行它。
笔记: 请不要这样做!以上示例仅用于演示!这不是运行脚本的好方法,不推荐。使用适当的命名,切勿将命令命名为与 shell 内置命令或现有实用程序相同的名称。您已收到警告。
test.sh 为什么能起作用?
您的情况test.sh
是,没有调用任何内置函数或函数test.sh
,因此 shell 搜索了PATH
列表中的每个目录,直到找到您的test.sh
文件并运行它。这就是它起作用的原因。
此行为是否与文件扩展名有关?
不。这与文件扩展名无关,事实上对于大多数文件来说,扩展名是无关紧要的。Shell 关心您在命令提示符中输入的内容的位置、它是内置的、函数还是别名,以及您提到的文件是否设置了可执行权限。
此外,它还关心适当的#!
线路(更正式地称为解释器指令#!
),因为如果您有为 C-shell 编写的 shell 脚本,但它顶部没有适当的行,并且您尝试用它运行它bash
- shell 将尝试运行它,但它会由于语法不兼容而中断。
更一般地说,Linux 和类 Unix 系统主要关心神奇数字它们是文件中用于标识文件类型的前几个字节。