从 .sh 文件调用 .csh 文件

从 .sh 文件调用 .csh 文件

我可以.csh.shshell 脚本文件调用脚本文件吗?

例如,我有a.shb.csh。我可以在a.sh文件中调用b.csh吗?如果是这样,怎么办?

我试过写这是ash文件

  1. variable= source /path/to/b.csh- 没用
  2. sh ./path/to/b.csh- 没用

我想补充一点,该b.csh文件的 shebang 行提到为#!/bin/csh -fx

答案1

你可以执行 b.cshfrom a.sh,就像您可以执行任何程序,如grepcat

您不能期望执行b.csh会向 shell 运行的环境添加任何变量a.sh- b.csh 将在子进程中运行,并且子进程不允许更改父进程的环境(这是基本安全性)。

如果您需要从 通信数据b.csh,那么 b.csh 需要打印该数据,a.sh 可以通过命令替换来捕获它:data=$(b.csh)-- 尽管您可能必须-x从 csh shebang 行中删除该选项以减少噪音。

答案2

如果你写

./script.sh

您正在告诉您的 shell 它应该运行该脚本./script.sh。但shell不知道应该如何./script.sh运行。它是一个bash脚本吗?也许是吧csh?或者它可能是一个二进制 ELF 文件,例如ls?或者也许是一个python脚本。为了了解这一点,操作系统将查看文件的第一个字节。如果它找到一个 shebang,则意味着它应该将该文件处理到 shebang 中指定的程序。

所以,如果你的脚本的第一行是

#!/usr/bin/bash
...

它将处理文件到bash目录中指定的程序/usr/bin,有效地执行bash ./script.sh

但如果您编写sh ./path/to/b.csh,您将直接将文件处理给名为 的程序shsh将忽略第一行,因为它碰巧会将以开头的行解释#为注释。

所以,你不应该写sh ./path/to/b.csh,但./path/to/b.csh如果你想让 shebang 得到尊重。

请注意,这将生成一个新进程来运行脚本。如果您想像./path/to/b.csh直接在 中写入一样运行每一行a.sh,则应该这样做source ./path/to/b.csh(或. ./path/to/b.csh,以便可移植)。但它也会忽略 shebang,并且每一行都会像sh命令一样被评估,而不是像csh命令一样。

相关内容