【问题标题】:Running csh script from bash script从 bash 脚本运行 csh 脚本
【发布时间】:2017-06-10 15:30:39
【问题描述】:

我正在编写一个需要初始设置的脚本。 该设置采用 csh 脚本的形式,在环境变量中有许多工件。 现在当我在 bash 中执行 csh 时,bash 子shell 中的变量保持不变。

示例:

#!/bin/bash 
echo $PATH
setevnvar.csh -dir $ROOT_DIR/
echo $PATH

在这个例子中,我会看到 PATH 变量在运行 csh 脚本后发生了变化(这是结果之一)

如果有任何想法,将不胜感激。

【问题讨论】:

  • csh 脚本(如果有的话,应该有类似.csh 的扩展名,而不是.sh)不能直接在bash 脚本中设置变量。
  • 当你说is in the form of csh script that has many artifacts on the environment variables --> cshbash下的环境变量?
  • 变量是在csh里面设置的
  • @YardenOren:所以,如果我理解正确,您想运行一个 csh 脚本来为您更改一些 bash 环境变量?
  • @Inian 是的!我希望 .csh 更改 .sh 脚本子shell中的变量

标签: bash csh


【解决方案1】:

不能从任何子进程修改 shell 的变量。由于从bash 启动csh 会启动一个子进程,所以没有办法做到。

您的选择:

  • 将您的csh 脚本转换为bash,并将source 转换为您的bash 脚本。
  • 将您的bash 脚​​本转换为csh,然后再将source 转换为另一个脚本
  • 确保您需要的变量在csh 脚本中标记为export,并从csh 脚本内部启动您的bash 脚本(这可能会或可能不会满足您的特定需求),从而扭转局面由内而外
  • 将两个脚本中的代码合并为一个(bashcsh)脚本

“采购”通过 . 或(非 POSIX)source 内置函数完成。例如:

#!/bin/bash 
echo $PATH
. setevnvar.converted_to_bash -dir "$ROOT_DIR/"
echo $PATH

“Sourcing”使当前进程从其他文件读取命令并像它们是当前脚本的一部分一样执行它们,而不是启动一个新的 shell 来执行该其他文件。这就是为什么变量赋值可以使用这种方法的原因。

请注意,我在您的 "$ROOT_DIR/" 扩展中添加了双引号,以防止其中包含特殊字符(如空格)。

【讨论】:

  • 谢谢!所以如果我有两个 csh 脚本,那么源命令会影响外部 shell(脚本终止后)?
  • 你必须有两个脚本由同一个解释器运行(如果你愿意,可以是csh),但你必须通过源代码调用脚本,如上所示,如果不是,您将遇到同样的问题。 “Sourcing”导致当前进程从其他文件读取命令,就好像它们是当前脚本的一部分一样,而不是启动一个新的 shell 来执行该其他文件。
  • 请注意,source 不是bash 特定的,它来自csh!它的效果在 POSIX 中未指定。
  • @cdarke 感谢您的澄清!