是否可以在另一种 shell 类型中使用在 shell 风格中声明的函数

是否可以在另一种 shell 类型中使用在 shell 风格中声明的函数

我有一个 bash 脚本,其中包含 Linux 系统的许多常用函数定义。

是否可以获取它并使用其他 shell 风格(csh 和 ksh)的函数?

答案1

正如斯特凡·查泽拉斯 (Stéphane Chazelas) 在评论csh以及相关的tcsh没有函数,因此您无论如何都无法获取您拥有的函数文件。

然而,类似 bourne 的 shell 通常共享语法和功能,并且实际上bash借用了很多功能ksh,但这些 shell 的某些功能不兼容dash- 上的默认 shell乌班图并且在行为上更接近原始的 Bourne shell。

出现的另一个问题不仅与函数有关,还与函数可能调用的命令有关。如果您在 Ubuntu 上使用这些功能,然后突然转到 FreeBSD,您很快就会发现类似findps经常具有行为不同或缺失的选项。

因此,为了确保您可以使用函数,我建议两件事:考虑命令及其选项的可移植性,另外两点是编写尽可能遵循 POSIX 标准和原始 Bourne shell 语法的函数。

sudo或者,如果您有能力始终安装所需的 shell(如果您在正在使用的系统上没有特权,则可能不会发生这种情况),然后用一种特定 shell 的语法编写您的函数。

编写可移植脚本什么时候很重要?获取更多信息。

答案2

一般来说,没有。

特别是,csh( 和) 与派生 shell ( , , , )tcsh的语法差异太大,因此它们很可能无法理解脚本,反之亦然。shshbashkshzshsh

这些shshell 有时可以共享函数甚至整个脚本,但前提是它们是为“最小公分母 shell”(通常是sh.然而,这通常不是一个好主意。

将每个 shell 视为一种单独的脚本语言,例如 Perl、Ruby 和 Python。不要混合它们,并且通常不要假设一个解释器可以理解另一个解释器的来源。

答案3

围绕函数创建包装脚本应该很容易;对于重击:

#!/bin/bash

doSomething()
{
    ...
}

doSomethingElse()
{
    ...
}

FUNCTION_NAME=$1
shift
${FUNCTION_NAME} "$@"

exit $?

称呼:

/path/to/functionWrapper.sh doSomething [<param1>] [...]

答案4

特别是对于 C Shell,您不能这样做,因为 C Shell 不支持函数。除此之外,C Shell 使用不同的语法。例如,以下 C Shell 片段与 Bash 使用的片段不同。

if ( $days > 365 ) then
   echo This is over a year.
endif
set i = 2
set j = 1
while ( $j <= 10 )
   echo '2 **' $j = $i
   @ i *= 2
   @ j++
end

相关内容