shell 脚本是否可以在同一脚本中同时包含 tcsh 和 bash 命令?

shell 脚本是否可以在同一脚本中同时包含 tcsh 和 bash 命令?

比如说,我修改了很多使用 tcsh 的代码,但是由于很多人说 bash 更现代,所以我也想一路学习 bash。我是否可以使用同时包含这两个命令的脚本?由于这是供个人使用的,因此优雅不是问题。

答案1

我不建议在脚本中混合和匹配 shell 类型。

  1. 您会失去启动 shell 来执行命令并返回结果的效率。
  2. 将脚本所需的所有内容保留在脚本中的原因之一是该脚本可以访问从函数等声明和返回的所有变量。将整个变量堆栈传递到另一个 shell 只是为了执行几个命令然后返回,似乎有点违反直觉。

我想说你最好的选择是复制一个已知的脚本并更改调用 shell,然后看看有什么问题,这样你就知道语法上的差异在哪里,需要解决。

但是,简而言之,尝试在脚本中进行混合和匹配似乎是一个坏主意。 (亲自)

答案2

我同意其他答案,这通常不是一个好主意。

但您可以从脚本调用 shell。如果您当前编写了一个使用 tcsh 的脚本,并且想要使用一些特定于 bash 的功能,则可以显式调用 bash。例如,bash 使独立重定向 stdout 和 stderr 变得更加容易。

#!/bin/tcsh -f

echo Hello, tcsh
bash -c 'echo Hello, bash 1>&2' # writes to stderr
echo Good-bye, tcsh

但从长远来看,将整个脚本转换为使用 bash 可能会更好。

强制链接:http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/

答案3

不,这是不可能的。

原因是 shell 在执行时读取文件块,并且一个块可能包含您想要在不同 shell 中运行的 shell 代码,但由于第一个 shell 已经读取了它,所以第二个 shell 无法读取如果它要接管脚本的执行。(如果 shell 能够访问lseek()该文件,这可能会起作用,但 shell 语言并不那么先进)

然而,有一种肮脏的方法可以做到这一点;嘘。
zsh 有一个名为 的命令emulate,可以让您动态切换 shell 语言。但是仅仅使用 zsh 来模拟 tcsh 和 bash 就很肮脏,更不用说过于复杂了。

我也不认为 bash 更现代。它确实更广泛,但它采用功能的速度非常慢。 Bash 更注重兼容性。

相关内容