linux - 为什么默认情况下 bash(.sh) 脚本不可执行

标签 linux bash shell

为什么默认情况下 bash(.sh) 脚本不可执行。

我同意,虽然我们touch linux 中的任何文件都是为了阅读目的而创建的。 但是由于 sh 和 csh 等文件扩展名是用于执行目的。 在可执行模式下 touch 它们不是很理想吗?

这个问题听起来有些多余,但我还是想问一下:)

最佳答案

这个问题的最终答案是,这不是 touch 设计的目的。

事实上,touch 甚至不是为了创建文件而设计的;它在生活中的主要目的是更改文件时间戳。这只是该目的的副作用,事实上,设计师决定更慷慨一点,如果目标文件不存在(并且如果您没有提供 -c 选项),它允许您创建文件。

还需要提到的是,还有其他创建文件的技术,比如重定向(echo 'echo '\''我是脚本。'\'';' >|script.sh;)。创建文件的行为是通用的,文件的整个概念也是通用的。一个文件就是一个字节流;文件抽象层未指定字节流中的内容。正如@AdamGent 提到的,Windows 要求某些类型的可执行文件具有某些扩展名才能正确执行,但即使在 Windows 中,您也可以将可执行代码放在非可执行扩展文件中,并且您可以将不可执行内容放在可执行扩展文件。在文件层没有强制执行文件名/文件内容对应。

综上所述,如果您可以轻松地在 Unix 中创建自动设置可执行权限集的脚本, 通常会很方便。我实际上已经编写了一个脚本,允许我在 vim 中编辑一个新文件,然后在写入退出后将其权限设置为可执行。这种潜在的便利性尚未标准化为实用程序的原因可能与对安全性的担忧有关;您不希望人们不小心使文件可执行,因为这会增加安全漏洞的风险。

您始终可以编写自己的程序来创建文件并使其可执行,也许基于文件名的扩展名。

这里可以添加的另一件事是,即使是 shell 脚本也不一定总是可执行的。例如,如果您编写的脚本仅打算从现有的 shell 进程获取(通过 source 或经典的 . 内置函数),则脚本不需要完全可以执行。因此,在某些情况下,文件扩展名本身无法提供足够的信息来确定文件的适当权限。

关于linux - 为什么默认情况下 bash(.sh) 脚本不可执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28598635/

相关文章:

java - OpenShift Maven 没有使用正确的 JAVA_HOME

linux - 在 Linux/Sublime 上的所有文件中搜索未注释的字符串

linux - Shell脚本-将字符串拆分为数组时检查长度

linux - 查找 mpirun 命令的 pid

shell - Jenkins - java.io.IOException : Cannot run program "/usr/local/bin/bash"

java - 我可以从 Linux CLI 获得多少有关 JBoss 的信息

linux - Linux的选择

bash - 运行 shell 脚本并立即将其置于后台,但保留检查其输出的能力

bash - EMR 笔记本安装额外的库

linux - Netflow 列操作 bash