我的项目中有一些脚本运行良好,没有第一行(如#!/bin/
) - 没有任何解释器路径。
所以这些脚本运行正常,在某些情况下它们会失败,但是当它们运行时 - 它们执行得很好。
我需要修改并将shell解释器作为第一行。
这里的问题是,当我使用#!/bin/ksh
时,某些脚本会失败,而当我使用#!/bin/bash
时其他脚本会失败。
谁能告诉我何时使用哪个选项?
我如何确保它们能够正常工作,以及任何其他方式来概括并使解释器对所有脚本都通用?
答案 0 :(得分:2)
每个脚本都是用某种编程语言编写的 - bash,ksh,zsh,python,Perl ....你不能编写Python程序并希望Perl可以运行它。类似地,ksh程序需要由bsh执行bsh程序ksh执行。
现在,由于bash,ksh,zsh和Posix shell do 具有公共子集,因此可以使用任何这些命令处理器执行它。如果 - 而且只有! - 你确定这适用于这些脚本,我建议使用Posix shell,因为这是最严格的一个。
但是如果人们将脚本指定为bash或ksh,或者其他什么,脚本的维护者可能迟早会使用仅对其中一种shell语言特有的功能。当然你可以要求每个人都在编程,比如说ksh,但这是一个政治问题,而不是技术问题。
答案 1 :(得分:0)
是否使用bash
或ksh
是一个意见问题。但是,当#!
丢失时,会使用/bin/sh
的默认shell(或者,我认为假定到; bash
似乎执行脚本使用bash
。),以及该shell的工作方式由POSIX标准定义。如果编写符合该标准的shell代码,则可以使用任何 POSIX兼容的shell(bash
,ksh
,dash
等执行它。)并且在每种情况下都期望得到相同的结果。
如果选择使用特定于给定shell的功能,则需要确保使用该shell执行脚本。使用特定于ksh
的功能的脚本无法正常运行,例如,在bash