【问题标题】:setenv with list in cshsetenv 与 csh 中的列表
【发布时间】:2013-07-23 21:47:18
【问题描述】:

以下工作在 tcsh 中:

set SOMEVAR=(1 2 3 4 5 6 7)

我需要将 SOMEVAR 传播到子进程,但是

truffles:rlaplant[154] setenv SOMEVAR (1 2 3 4 5 6 7)
Badly placed ()'s.

(我必须在 csh 中执行此操作,因为我必须 source 一些非常复杂的脚本的输出,并且将它们全部转换为 Bash 会很费力。)

有没有办法做到这一点?

【问题讨论】:

  • 看来区别可能是set VAR=(...) vs. setenv VAR (...)。我相信这是两种完全不同的说法。文档说set VAR=(...) 应该在csh 中工作。
  • 我承认,我真的不知道 csh,但是 -- set SOMEVAR=(1 2 3 4 5 6 7) 不是创建一个数组吗?而且环境变量不是必须是字符串吗?
  • @abiessu 是的,它工作得很好,但这并不能解决问题,因为我需要 setenv 将变量导出到子进程的行为。
  • @ruakh -- 啊,是的,可能。但如果是这样的话,csh 是可恶的,因为它允许它们以相同的方式被操纵。
  • @aestrivex 也许您可以在 bash 脚本中使用 csh ./myotherscripts 命令运行其他脚本?

标签: shell unix csh tcsh


【解决方案1】:

csh 的内部 shell 变量可以是字符串或数组。环境变量只能是字符串。

例如,csh shell 变量$path 镜像环境变量$PATH$path 是一个目录名数组; $PATH 是一个字符串,由相同的目录名组成,由: 字符分隔。

您将不得不将数组值放入单个字符串中,使用一些一致的语法来表明它们是数组。如果元素永远不能包含任何空格,那么用空格分隔单词就足够了。否则,您可以考虑使用 $PATH 使用的相同机制,并使用 : 字符分隔元素。

如果元素可以包含: 字符,并且您不能选择其他永远不会出现的字符,那么事情会变得更加复杂。你只需要做一些编程。

Obligatory link

【讨论】:

    【解决方案2】:

    您可以使用此解决方法:

    set tempvar=(1 2 3 4 5 6 7)
    setenv somevar "$tempvar"
    

    虽然我不确定它是否会保留为数组。

    【讨论】:

    • 不会的;它将是一个带有嵌入空格的字符串。
    • 不,它没有。它最终成为一个字符串。 csh 显然有一些魔力,可以将字符串作为可以分离的伪数组处理,但是如果我使用字符串,我源代码的脚本将会崩溃。 fwiw,我设法找到了一个不同的、hacky 的解决方案,它与所提出的问题没有直接关系。我认为这个问题的正确答案是数组不是环境变量,而 csh 处理它们很糟糕。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    相关资源
    最近更新 更多