【问题标题】:How to run csh script in bash shell如何在 bash shell 中运行 csh 脚本
【发布时间】:2022-01-03 10:56:21
【问题描述】:

我的默认 shell 是 Ubuntu 14.04 中的 bash。我有一个名为 clean.sh 的 csh 脚本文件,其中包含以下 make 命令:

#! /bin/csh -f
make -f commande.make del

而commande.make 有

CKHOME=../CHEMKIN/DATA_BASES
LIN_DATA=${CKHOME}/LIN_FILES/
LINK_CKTP=${CKHOME}/LINK_CKTP_FILES/
#-----------------------------------------------------
include schema_cinetique.make
LINKFILE=${NAME}_LINK
LINKTPFILE=${NAME}_LINKTP
LINKFILE_OLD=${NAME_OLD}_LINK
LINKFILE_NEW=${NAME_NEW}_LINK
#-----------------------------------------------------
cplink :    
    ${COPY} ${LINK_CKTP}${LINKFILE} LINK
cplink2 :   
    ${COPY} ${LINK_CKTP}${LINKFILE} LINKZ1
tplink :    
    ${COPY} ${LINK_CKTP}${LINKTPFILE} LINKTPZ1
calcul :
    ${COPY} jobtimp1  LJOBNZ1
    ${COPY} unsteadyf.dat1 DATZ1
del :
    ${DELETE} LINKZ1 LINKTPZ1 LJOBNZ1 DATZ1 SOLASUZ1

我打开终端并移动到该位置并尝试

./clean.sh

或

csh clean.sh & 

或

csh -f clean.sh 

没有任何效果。

我在终端中得到以下行,

LINKZ1 LINKTPZ1 LJOBNZ1 DATZ1 SOLASUZ1
make: LINKZ1: Command not found
make: *** [del] Error 127

那么,如何运行clean.sh文件?

【问题讨论】:

  • Nothing worked 是什么意思?你能发布错误信息吗?
  • 您的脚本使用commande.make。但是您的文件名为command.make。
  • @hek2mgl,请再次检查编辑后的问题,出现错误
  • 无需更改任何内容。只需以bash clean.sh 运行即可。您可能想要删除/更新最初的 #!线,如果你愿意。或者,您也可以直接从命令行调用make(为什么要使用脚本,如果它所做的只是调用make???)但是,我觉得有些地方出了问题Makefile 本身,因此这与恰好用于调用 make 的 shell 无关。不幸的是,你的帖子在这方面是不完整的,所以我在这里帮不上什么忙。好像make变量DELETE是空的。
  • 如果您在与make 命令相同的命令行中指定export,则它实际上并不是必需的。这仅在命令执行期间设置变量。答案实际上试图解释这一点;如果您需要更详细的解释,也许可以阅读 export 的作用。

标签: bash makefile csh


【解决方案1】:

你很困惑。 Csh 脚本包含一个在 Bash 中实际运行相同的命令。

#!/bin/bash
make -f commande.make del

或者,就此而言,与#!/bin/sh 相同。或者,在这种情况下,甚至是sh clean.sh,因为shebang 只是一个注释,文件中的命令在sh 和csh 中都可用。

一旦make 运行,that 将解析并执行commande.make 中的命令。 make 不是“Fortran 命令”,它是用于构建项目的实用程序(但名为 commande.make 的 makefile 可能包含一些关于如何编译 Fortran 代码的说明)。

在一般情况下,Csh 和 Bash 是不兼容的,但区别在于 shell 的语法本身(因此,循环和条件等的语法,以及变量赋值和各种其他 shell 内置)。

顺便说一句,Csh 命令文件可能不应该有 .sh 扩展名,因为这模糊地暗示了 Bourne shell (sh) 语法。 Unix 上的文件扩展名只是对人类读者的提示,因此在技术上并不重要;但请不要混淆他们/我们。

(顺便说一句,2022 年应该没有人使用Csh。曾经有一段时间,C shell 与其竞争对手相比具有吸引力,但那是在 40 年前。)

您报告的后续错误似乎表明makefile 依赖于您尚未安装的某些实用程序。弄清楚这一点是一个足够重要且足够独立的问题,您可能应该就此提出一个新问题,可能还有更多调试细节。但简而言之,似乎make 需要与参数一起运行,以指示NAME 和COPY(可能还有其他一些变量)应该是什么。尝试使用 make -f commande.make COPY=cp DELETE=rm NAME=foobar 作为开始,但可能还远远不够。

(我实际上假设会有一个README 文件或类似文件来实际指导您如何使用commande.make,因为它似乎有自己的一些本地约定。)

【讨论】:

  • 如果你没有得到csh: command not found它实际上工作了,唯一的问题是你需要弄清楚如何正确运行commande.make中的命令。
  • faqs.org/faqs/unix-faq/shell/csh-whynot 解释了 Csh 的一些问题,并且巧合地为许多有问题的行为提供了相同或几乎相同的 sh 构造。
  • 如果这解决了您的问题,请考虑接受它。或者,您可以发布自己的答案并接受。接受答案通过将问题标记为已解决来帮助未来的访问者。另见help.
【解决方案2】:

似乎编写脚本时考虑了可移植性,即cp 和rm 二进制文件的名称保存在变量中,而不是硬编码。我最好的猜测是,这样做是为了使脚本可以在非 UNIX 系统(如 Windows)上运行。

要使其工作,请在运行脚本之前导出相应的变量。对于您正在调用的del 操作,只需要DELETE 变量。它应该设置为rm,这是用于在 Linux 上删除文件的命令:

export DELETE=rm
./clean.sh

注意:在调用脚本时,也可以在一行中导出变量,方法是将其添加到命令行:

DELETE=rm ./clean.sh

bash manual 中描述了此行为:

任何简单命令或函数的环境都可以通过在其前面加上参数分配来临时扩充,如外壳参数中所述。这些赋值语句只影响该命令看到的环境。

【讨论】:

    猜你喜欢
    • 2017-06-10
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多