请解释一下 shell 的行为(假设是 csh)

请解释一下 shell 的行为(假设是 csh)

在我的 Linux 机器上,echo $SHELL结果是/bin/csh。所以我假设我的默认 shell 是 c-shell。我试图理解 shell 脚本的行为。
场景 1 - 脚本包含 -

echo $1 $2 $3
echo $*
echo $argv[1] $argv[2]
$argv[3]
echo $argv[*]
echo $#argv

输出 -

arg1 arg2 arg3
arg1 arg2 arg3 arg4
[1] [2]
./test.sh: line 4: [3]: command not found
[*]
4argv
  • 因此显然 c-shell 无法执行应由 csh 执行的脚本中的最后 4 行。

#!/bin/csh但是 - 当我在脚本顶部添加 shebang 行时,它会正确打印所有输出。

问题 - 为什么 csh 在第一种情况下不能正确执行最后 4 行,为什么我必须明确包含 shebang 行?

答案1

当文件以 开头时#!/bin/csh,您明确告诉内核使用该程序运行脚本。但是,如果文件开头没有#!,则执行失败 - exec() 系统调用失败 - 并且您的 shell 尝试使用更老的方法运行脚本,方法是将文件直接传递给/bin/sh

Bourne shell在出现sh之前就实现了这种行为,因此以这种方式编写的脚本应该在兼容的 shell#!下运行。csh 是sh远的兼容,因此它在. 您的 $SHELL 不相关。

tcsh

因为许多系统使用标准版本 6 或版本 7 的 shell,而这些版本的 shell 脚本与此 shell 不兼容,所以该 shell 使用这样的“标准”shell 来执行首个字符不是“#”的脚本(即,该脚本不是以注释开头的脚本)。

相关内容