我可以.csh
从.sh
shell 脚本文件调用脚本文件吗?
例如,我有a.sh
,b.csh
。我可以在a.sh文件中调用b.csh吗?如果是这样,怎么办?
我试过写这是ash文件
variable= source /path/to/b.csh
- 没用sh ./path/to/b.csh
- 没用
我想补充一点,该b.csh
文件的 shebang 行提到为#!/bin/csh -fx
答案1
你可以执行 b.csh
from a.sh
,就像您可以执行任何程序,如grep
或cat
。
您不能期望执行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
,您将直接将文件处理给名为 的程序sh
。sh
将忽略第一行,因为它碰巧会将以开头的行解释#
为注释。
所以,你不应该写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
命令一样。